如何 运行 在单机上使用 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}`));
});