3

我在夹具文件夹中只有以下 Test.json 文件:

[
    {
        "searchKeyword":"cypress"
    },
    {
        "searchKeyword":"QA automation"
    },
    {
        "searchKeyword":"stackoverflow"
    }
]

上述文件包含三个不同的数据集。

我只有以下规范文件,它包含一个它(测试用例),它将根据上述输入运行多次。

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 文件中可用的单个测试。

我只需要为我的一个项目实现逻辑,但我无法共享更复杂的代码,这就是为什么只创建一些虚拟测试数据和测试脚本来实现我的逻辑。

有人可以分享你的想法来实现这一目标。

4

1 回答 1

3

并行运行多个 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()返回一个承诺,因此您可以按如下方式整理结果

视频和截图很麻烦,因为它会尝试以相同的名称保存所有内容,但是您可以为每个灯具指定一个文件夹

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}`));
});
于 2021-10-01T20:33:22.070 回答