测试用例的组织和编写

本文共--字 阅读约--分钟 | 浏览: -- Last Updated: 2021-02-26

关于 Mocha

Cypress 采纳了 Mocha 的 BDD 语法,该语法非常适合集成测试和单元测试,Cypress 将 Mocha 硬编码在自己的框架中,在 Cypress 中,你要编写所有的测试用例都基于 Mocha 提供的如下基本功能模块:

  • describe()
  • context()
  • it()
  • before()
  • after()
  • beforeEach()
  • afterEach()
  • after()
  • .only()
  • .skip()

对于一个可执行的测试来说,有以下两个必要的组成部分:

  • describe(),测试套件,可以在里面设定 context(),可包括多个测试用例 it(),也可以嵌套测试套件。

  • it(),用于描述测试用例,一个测试套件可以不包括任何钩子函数,但必须包含至少一个测试用例 it()

context() 是 describe() 的别名,其行为方式与 describe() 相同,使用 context() 只是提供一种测试更易于阅读和组织的方法

钩子函数

describe('钩子函数', () => {
  before(() => {
    // 当前测试套件中,所有测试用例执行之前运行
  })

  after(() => {
    // 当前测试套件中,所有测试用例执行结束后运行
  })

  beforeEach(() => {
    // 当前测试套件中,每个测试用例执行之前运行
  })

  afterEach(() => {
    // 当前测试套件中,每个测试用例执行结束后运行
  })
})

排除或包含测试用例

排除测试套件/测试用例

// 该测试套件整个都不会执行
descrbie.skip('登录', () => { 
  // ...
})

descrbie('测试demo', () => { 
  // ...

  // 这个会执行
  it('测试1=1', () => {
    // ...
  })

  // 这个会排除
  context.skip('测试排除', () => {
  
  })

  context('测试it排除', () => {
    // 这个会执行
    it('测试2=2', () => {
      // ... 
    })

    // 这个会排除
    it.skip('测试3=3', () => {
      // ... 
    })
  })
})

包含测试套件/测试用例

// 只有这个测试套件会执行
descrbie.only('登录', () => { 
  // ...
})

descrbie('测试demo', () => { 
  // ...
})
descrbie('测试demo', () => { 

  // 只有这个测试套件会执行
  context.only('测试包含', () => {
  
  })

  context('测试it包含', () => {
    it('测试2=2', () => {
      // ... 
    })
  })
})
descrbie('测试demo', () => { 
  context('测试it包含', () => {
    it('测试2=2', () => {
      // ... 
    })

    // 只有这个用例会执行
    it.only('测试3=3', () => {
      // ... 
    })
  })
})

需要注意的是,在 Cypress 中,同一个测试用例集下如果有多个测试用例被标记为 .only(),只有最后一个测试会被执行。

动态忽略测试用例

describe('登录', () => {
  const username = 'jack';
  const password = '123456';

  context('表单登录验证', () => {
    // 让 runFlag 为 0 的时,此条不执行
    it('登录成功,跳转到 dashboard 页面', () => {
      if (Cypress.env('runFlag') === 1) {
        cy.visit('http://localhost:7077/login');
        cy.get('input[name=username]').type(username);
        cy.get('input[name=password]').type(password);
        cy.get('form').submit();

        cy.url().should('include', '/dashboard');
        cy.get('h1').should('contain', 'jack');
      } else {
        this.skip();
        cy.log('runFlag 为 0 的时,此条不执行');
      }
    })
  })
})

执行命令,指定 runFlag 参数, npx cypress open -env runFlag=0

动态生成测试用例

const users = [
  {
    username: 'jack',
    password: '123456',
  },
  {
    username: 'andy',
    password: '334455',
  }
]

describe('登录', () => {
  context('表单登录验证', () => {
    for (const user of users) {
      it('验证多个用户', () => {
        cy.visit('http://localhost:7077/login');
        cy.get('input[name=username]').type(user.username);
        cy.get('input[name=password]').type(user.password);
        cy.get('form').submit();

        cy.get('h1').should('contain', user.username);
      })
    }
  })
})

断言

Cypress 的断言基于当下流行的 Chai 断言库,并且增加了对 Sinon-Chai,Chai-jQuery 断言库的支持,Cypress 支持多种风格的断言,其中就包括 BDD (expect/should) 和 TDD (assert) 格式的断言。

// 针对长度的断言
cy.get('li.selected').should('have.length', 3);

// 针对类的断言
cy.get('form').find('input').should('not.have.class', 'disabled');

// 针对值的断言
cy.get('textarea').should('have.value', 'iTesting');

// 针对文本的断言
cy.get('a').parent('span.help').should('not.contain', 'click me');

// 针对元素是否可见的断言
cy.get('button').should('be.visiblie');

// 针对元素是否存在的断言
cy.get('#loading').should('not.exist');

// 针对元素状态的断言
cy.get('.radio').should('be.checked');

// 针对 CSS 的断言
cy.get('.completed').should('have.css', 'text-decoration', 'line-through');

// 针对回调函数的断言
cy.get('div')
  .should(($div) => {
    expect($div).to.have.length(1);
    const className = $div[0].className;
    expect(className).to.match(/heading-/);
  })

观察测试运行

Cypress 自带的交互式测试运行器功能强大,它甚至允许你在测试运行期间就查看测试命令的执行情况,并监控在命令执行时,被检测程序所处的状态。 Cypress 的测试运行器由以下几个部分组成:

  • 测试状态目录:左侧顶部,展示测试用成功和失败的数目,并展示每个测试运行的时间

  • 命令日志:左侧主体,用于记录每个被执行的命令,单击该命令,可在 console 中查看命令用于哪个元素及其执行的详细信息,同时应用程序预览中会显示当命令执行时被测应用程序的状态。

  • URL预览:应用程序预览区会展示你的测试命令执行时被测试应用程序所处的 URL。

  • 应用程序预览:右侧主体,用于展示测试运行时被测程序所处的实时装填

  • 视窗大小:右侧URL窗口右边,可以通过设置视窗大小来测试页面的响应式布局,你可以在 cypress.json 文件中通过配置 viewportHeightviewportWidth 两个配置项来控制视窗大小。

  • Cypress 元素定位辅助器:右侧URL窗口左侧,可以帮助用户识别元素的唯一的定位表示。