本文共--字 阅读约--分钟 | 浏览: -- Last Updated: 2021-02-26
Cypress 采纳了 Mocha 的 BDD 语法,该语法非常适合集成测试和单元测试,Cypress 将 Mocha 硬编码在自己的框架中,在 Cypress 中,你要编写所有的测试用例都基于 Mocha 提供的如下基本功能模块:
对于一个可执行的测试来说,有以下两个必要的组成部分:
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
文件中通过配置 viewportHeight
和 viewportWidth
两个配置项来控制视窗大小。
Cypress 元素定位辅助器:右侧URL窗口左侧,可以帮助用户识别元素的唯一的定位表示。