gpt4 book ai didi

node.js - 使用 cy.task 动态创建测试

转载 作者:太空宇宙 更新时间:2023-11-03 23:53:09 25 4
gpt4 key购买 nike

我想在 Cypress 中使用可变数据生成相同的测试。这个想法是测试人员可以在 fixtures 中创建新文件夹。文件夹,这些文件夹将被自动选取并用于生成新的测试。

我在我的 plugins/index.js 中创建了这个片段。当 cy.task('getAllDirectories', 'someURL')被称为它会给我一个 someURL 内所有子目录的列表.

const { readdirSync, lstatSync } = require('fs');
const { join } = require('path');
const _ = require('lodash');

const isDirectory = source => lstatSync(source).isDirectory();

module.exports = (on, config) => {
on('task', {
getAllDirectories(source) {
const fullSource = `${process.cwd()}/cypress/${source}`;

return readdirSync(fullSource)
.map(name => join(fullSource, name))
.filter(isDirectory)
.map(name => _.last(name.split('/')));
},
});
};

这似乎工作得很好,我已经成功地在 it() 内调用它和before()在赛普里斯。然而问题是,由于这些动态生成的测试是该文件中唯一的测试,因此我的上下文中的这段代码根本不运行。

let TESTS = [];

before(() => {
cy.task('getAllDirectories', '').then((output) => {
TESTS = output;
cy.log(TESTS);
});
});

即使我添加了像 it('dummy', () => {}) 这样的虚拟测试,TESTS 变量被设置为新的名称数组,但是当我尝试在 before 方法下面迭代它时,生成测试已经太晚了。

TESTS.forEach((TEST) => {
it(`Validates request: ${TEST}`, () => {
...

所以我想我需要打电话cy.task测试之外或 before钩子(Hook),但是只将其放在 context() 内说cy.task必须在测试中运行。

最佳答案

好的,我的要求几乎与我在评论中所说的类似。我发现在 cypress 中没有直接的方法可以做到这一点。

所以我以间接的方式做到了,但仍然可以实现目标,可能不是 100% 好的解决方案。

我制作了脚本,用于收集必要的信息并将数据导出为 cypress/fixtures 中的 json。我将把步骤写成伪代码:

Let say file named: load-test-data.ts1. Search for all spec files in my project2. Find directory having data in each spec file's directory3. Build object of information which contains:  {     [specFilePath]: {       componentName,       data,     }  }where 'data' is data for which I want to generate tests.4. Generate JSON and save in cypress/fixtures/test-data.json

Then in my test utility (which generates tests)

describe('Should test component', () => {

const path = Cypress.spec.relative;
const fixtureData = require('../../../cypress/fixtures/test-data.json');

const info = fixtureData[path];

info.data.forEach((datum) => {
it(`Should pass test for ${datum}`, () => {
cy.visit(`http://localhost:9001/?page=${datum}`); // this is not real, just for demo purpose!!

// and do something more
});
});

});

然后当我想运行 cypress 时,我会这样做:

#!/usr/bin/env bash

# Generate fixture which will contain test-data to generate tests
./node_modules/.bin/ts-node load-test-data.ts

# Run cypress
./node_modules/.bin/cypress run

希望这会有所帮助!

关于node.js - 使用 cy.task 动态创建测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58518715/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com