如何 运行 在单机上使用 cypress 并行进行不同数据集的单一测试
How to run the single test with different data set in parallel by using cypress on single machine
我的夹具文件夹中只有以下 Test.json 文件:
[
{
"searchKeyword":"cypress"
},
{
"searchKeyword":"QA automation"
},
{
"searchKeyword":"Whosebug"
}
]
以上文件包含三个不同的数据集。
我只有下面的规格文件,它包含一个 It(测试用例),它会根据上面的输入 运行 多次。
Test.spec.js 文件:
describe("Run the test parallel based on the input data",() =>{
const baseUrl = "https://www.google.com/";
before("Login to consumer account", () => {
cy.fixture('Test').then(function (data) {
this.data = data;
})
});
it("Search the keyword", function () {
this.data.forEach((testData) =>{
cy.visit(baseUrl);
cy.xpath("//input[@name='q']").type(testData.searchKeyword);
cy.xpath("//input[@value='Google Search']").click();
cy.get("//ul/li[2]").should("be.visible");
});
});
});
以上代码按预期工作。但我只想 运行 使用不同的数据集并行进行上述单个测试。
示例: 三个浏览器实例打开,它应该从 Test.json 文件和 运行 中可用的单个测试中选择三个不同的数据Test.spec.js 文件。
我只需要为我的一个项目实现逻辑,但我无法共享更复杂的代码,这就是我创建一些虚拟测试数据和测试脚本来实现我的逻辑的原因。
有人可以分享你的想法来实现这一点。
并行 运行 多个 Cypress 实例的一种方法是通过 Module API,它基本上是使用 Node 脚本启动多个实例。
节点脚本
// run-parallel.js
const cypress = require('cypress')
const fixtures = require('./cypress/fixtures/Test.json')
fixture.forEach(fixture => {
cypress.run({
env: {
fixture
},
})
})
测试
describe("Run the test for given env data",() =>{
const testData = Cypress.env('fixture')
...
it("Search the keyword", function () {
cy.visit(baseUrl);
cy.xpath("//input[@name='q']").type(testData.searchKeyword);
...
});
});
等待结果
cypress.run()
returns一个承诺,所以可以整理一下结果如下
视频和截图很麻烦,因为它试图保存在同一个名字下,但你可以为每个灯具指定一个文件夹
const promises = fixtures.map(fixture => {
return cypress.run({
config: {
video: true,
videosFolder: `cypress/videos/${fixture.searchKeyword}`,
screenshotsFolder: `cypress/screenshots/${fixture.searchKeyword}`,
},
env: {
fixture
},
spec: './cypress/integration/dummy.spec.js',
})
})
Promise.all(promises).then((results) => {
console.log(results.map(result => `${result.config.env.fixture.searchKeyword}: ${result.status}`));
});
我的夹具文件夹中只有以下 Test.json 文件:
[
{
"searchKeyword":"cypress"
},
{
"searchKeyword":"QA automation"
},
{
"searchKeyword":"Whosebug"
}
]
以上文件包含三个不同的数据集。
我只有下面的规格文件,它包含一个 It(测试用例),它会根据上面的输入 运行 多次。
Test.spec.js 文件:
describe("Run the test parallel based on the input data",() =>{
const baseUrl = "https://www.google.com/";
before("Login to consumer account", () => {
cy.fixture('Test').then(function (data) {
this.data = data;
})
});
it("Search the keyword", function () {
this.data.forEach((testData) =>{
cy.visit(baseUrl);
cy.xpath("//input[@name='q']").type(testData.searchKeyword);
cy.xpath("//input[@value='Google Search']").click();
cy.get("//ul/li[2]").should("be.visible");
});
});
});
以上代码按预期工作。但我只想 运行 使用不同的数据集并行进行上述单个测试。
示例: 三个浏览器实例打开,它应该从 Test.json 文件和 运行 中可用的单个测试中选择三个不同的数据Test.spec.js 文件。
我只需要为我的一个项目实现逻辑,但我无法共享更复杂的代码,这就是我创建一些虚拟测试数据和测试脚本来实现我的逻辑的原因。
有人可以分享你的想法来实现这一点。
并行 运行 多个 Cypress 实例的一种方法是通过 Module API,它基本上是使用 Node 脚本启动多个实例。
节点脚本
// run-parallel.js
const cypress = require('cypress')
const fixtures = require('./cypress/fixtures/Test.json')
fixture.forEach(fixture => {
cypress.run({
env: {
fixture
},
})
})
测试
describe("Run the test for given env data",() =>{
const testData = Cypress.env('fixture')
...
it("Search the keyword", function () {
cy.visit(baseUrl);
cy.xpath("//input[@name='q']").type(testData.searchKeyword);
...
});
});
等待结果
cypress.run()
returns一个承诺,所以可以整理一下结果如下
视频和截图很麻烦,因为它试图保存在同一个名字下,但你可以为每个灯具指定一个文件夹
const promises = fixtures.map(fixture => {
return cypress.run({
config: {
video: true,
videosFolder: `cypress/videos/${fixture.searchKeyword}`,
screenshotsFolder: `cypress/screenshots/${fixture.searchKeyword}`,
},
env: {
fixture
},
spec: './cypress/integration/dummy.spec.js',
})
})
Promise.all(promises).then((results) => {
console.log(results.map(result => `${result.config.env.fixture.searchKeyword}: ${result.status}`));
});