代码之家  ›  专栏  ›  技术社区  ›  dmtree

Cypress中的参数化测试解决方案

  •  0
  • dmtree  · 技术社区  · 1 年前

    我正在尝试使用参数化测试合并一堆具有相同操作和检查的测试,但不断出现错误。我是Cypress和JS的新手,来自.net背景。如有任何帮助,我们将不胜感激。

    我的固定装置看起来像这样:

    {
      "username": "username",
      "password": "password",
      "inputErrorMessageText": "Invalid username or password.",
      "homePageWelcomeText": "Welcome, bla bla bla",
      "testCases": [
        {
          "description": "blank username and password",
          "username": "",
          "password": ""
        },
        {
          "description": "blank password",
          "username": "username",
          "password": ""
        }
      ]
    }
    

    我已经尝试了Cypress.each和data.testCases.forEach:

    describe("Tests for login page", () => {
        let loginPage;
        let homePage;
        let data;
    
        before(() => {
            cy.fixture("login_data").then((fixtureData) => {
                data = fixtureData;
                cy.wrap(fixtureData).should("have.property", "testCases");
            });
        });
    
        beforeEach(() => {
            loginPage = new LoginPage();
            homePage = new HomePage();
            cy.visit("/");
        });
    
        Cypress.each(data.testCases, (testCase) => {
            it(`Invalid username or password error appears when attempting login with ${testCase.description}`, () => {
                loginPage.login(testCase.username, testCase.password);
                loginPage.verifyErrorMessage(data.inputErrorMessageText);
            });
        });
    
        it("Successful login with valid username and password", () => {
            loginPage.login(data.username, data.password);
            homePage.verifyProfileDropDownExists();
        });
    
        it("Welcome text is displayed after successful log in", () => {
            loginPage.login(data.username, data.password);
            homePage.verifyWelcomeText(data.homePageWelcomeText);
        });
    
        data.testCases.forEach((testCase) => {
            it(`Invalid username or password error appears when attempting login with ${testCase.description}`, function () {
                loginPage.login(testCase.username, testCase.password);
                loginPage.verifyErrorMessage(data.inputErrorMessageText);
            });
        });
    

    不断出现以下错误:

    TypeError:以下错误源于您的测试代码,而不是Cypress。 >无法读取未定义的属性(正在读取“testCases”)

    1 回复  |  直到 1 年前
        1
  •  1
  •   agoff    1 年前

    问题

    1. (这是罪魁祸首)直接使用 data.testCases.forEach() 不起作用,因为Cypress(Mocha,但在这里分叉)需要在测试真正开始运行之前知道要运行什么测试。在这种情况下,由于 data.testCases 当Cypress开始收集要运行的测试时(因为数据在 before() 块),当 数据测试案例 未定义。
    2. 我不认为 Cypress.each 是一个函数。有 Cypress._.each() (使用Cypress Lodash)和 cy.each() (这不是你想要的)。

    解决方案

    直接导入夹具,而不是通过加载 cy.fixture() ,应允许您访问 数据测试案例 在Cypress发现要运行的测试之前的变量。然后,您应该能够通过 data.testCases.forEach() 柏树每个 .

    import data from '../path/to/data.json';
    
    describe("Tests for login page", () => {
      ...
      Cypress._.each(data.testCases, (testCase) => {
        it(`Invalid username or password error appears when attempting login with ${testCase.description}`, () => {
                loginPage.login(testCase.username, testCase.password);
                loginPage.verifyErrorMessage(data.inputErrorMessageText);
            });
      });
    });
    

    您仍然可以运行数据验证 data 具有的属性 testCases ,没有 cy.fixture() .