【问题标题】:Cypress e2e testing of a project, Enable or disable a it block dependent on condition项目的赛普拉斯 e2e 测试,根据条件启用或禁用 it 块
【发布时间】:2021-07-28 09:14:25
【问题描述】:

假设我有以下规范,其中包含 2 个 it 块,一个检查菜单项的教师角色,另一个检查学生角色。变量 rolesToCheck 包含将激活 it 块的角色,目前,rolesToCheck 变量仅包含学生,因此它将仅运行第二个 it 块。有可能吗?

   describe('side menu check', () => {
    var sideMenuHelper;
    var rolesToCheck = ['student'];
    beforeEach(() => {
        cy.login();
        cy.wait(5000);
    });

    it('menu item check for teacher', () => {
        .....
    })

    it('menu item check for student', () => {
        .....
    })

})

【问题讨论】:

    标签: testing cypress e2e


    【解决方案1】:

    请看这个问题How to add test case grouping in Cypress 可以适应使用rolesToCheck 数组。

    const rolesToCheck = ['student'];
    
    beforeEach(function() {
    
      const testName = Cypress.mocha.getRunner().test.fullTitle();
      if (!rolesToCheck.some(role => testName.includes(role))) {
        this.skip();
      }
    })
    
    it('menu item check for teacher', () => {        // skipped
        .....
    })
    
    it('menu item check for student', () => {        // run
        .....
    })
    

    你可能会发现当有很多测试时,按测试名称过滤有点困难,所以你可以使用标签来代替

    const rolesToCheck = ['student'];
    
    beforeEach(function() {
    
      const tag = Cypress.mocha.getRunner().test._testConfig?.tag;
      
      if (!tag) return;    // no tag, run it 
    
      if (!rolesToCheck.includes(tag)) {
        this.skip();
      }
    })
    
    it('menu item check for teacher', { tag: 'teacher' }, () => {     // skipped
        .....
    })
    
    it('menu item check for student', { tag: 'student' }, () => {     // run
        .....
    })
    

    注意optional chaining_testConfig?.tag,以防测试中没有定义标签。

    【讨论】:

    • 在beforEach 块内this.skip() 抛出错误,表明this.skip 不是函数。你能告诉我背后的原因吗?
    • 我认为你使用了箭头函数beforeEach(() => {,但上面我有beforeEach(function() {。 Mocha 库(赛普拉斯使用)建议不要使用箭头函数,而更喜欢“普通”函数,以便可以使用 this
    【解决方案2】:

    您可以遍历 rolesToCheck 数组并根据数组中的角色运行测试。

    describe('side menu check', () => {
        var sideMenuHelper;
        var rolesToCheck = ['student'];
        beforeEach(() => {
            cy.login();
            cy.wait(5000);
        });
    
        rolesToCheck.forEach(role => {
            it(`menu item check for ${role}`, () => {
                .....
            })
        })    
    })
    

    【讨论】:

      【解决方案3】:

      您可以遍历 rolesToCheck 数组并根据角色登录以检查该角色的菜单项,而不是使用不同的it阻止不同的角色。

      你可以这样做。

      const rolesToCheck = ['teacher', 'student'];
      rolesToCheck.forEach((role) => {
          describe('side menu check', () => {
              before(() => {
                  if (role === 'teacher') {
                      login as teacher
                  } else if(role === 'student') {
                      login as student
                  }
              });
      
              it(`menu items check for ${role}`, () => {
      
              });
          });
      });
      

      【讨论】:

      • 可能用户和角色是正交的,即分配给一个用户的多个角色。
      猜你喜欢
      • 2023-02-14
      • 2021-10-29
      • 2019-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多