如何重试失败的测试?

bku*_*era 13 continuous-integration cypress

我有时会有 1 或 2 个在 CI 中失败的测试,并且重新运行构建会导致它们通过。

如何自动重新运行这些不稳定的测试,以便我的构建第一次通过?有什么类似mochathis.retries

例如,我有一个测试失败,“元素的有效高度为 0x0”大约有 10% 的时间:

cy.visit('/')
cy.get('.my-element').click() // sometimes fails with not visible error
Run Code Online (Sandbox Code Playgroud)

bku*_*era 13

更新 (v5.0.0)

Cypress 现在具有内置的重试支持。

您可以通过配置在 Cypress 5.0 中设置测试重试 cypress.json

{
  "retries": 1
}
Run Code Online (Sandbox Code Playgroud)

或者为 runMode 和 openMode 指定不同的选项:

{
  "retries": {
    "runMode": 1,
    "openMode": 3
  }
}
Run Code Online (Sandbox Code Playgroud)

runMode 允许您在运行 cypress run 时定义测试重试次数

openMode 允许您在运行 cypress open 时定义测试重试次数

您可以通过测试选项为单个测试或套件打开测试重试:

it('my test', {
  retries: 2
}, () => {
  // ...
})

// or

describe('my suite', {
  retries: 2
}, () => {
  // ...
})
Run Code Online (Sandbox Code Playgroud)

如果测试中失败beforeEachafterEach或在测试体内,就会被重试。beforeAll 和 afterAll 钩子中的失败将不会重试。


旧答案:

对测试重试的官方支持正在进行中,但有一个插件。 cypress-plugin-retries

披露:我是插件的创建者。

安装

将插件添加到 devDependencies

npm install -D cypress-plugin-retries
Run Code Online (Sandbox Code Playgroud)

在顶部cypress/support/index.js

require('cypress-plugin-retries')
Run Code Online (Sandbox Code Playgroud)

用法

使用环境变量CYPRESS_RETRIES设置重试次数:

CYPRESS_RETRIES=2 npm run cypress
Run Code Online (Sandbox Code Playgroud)

使用Cypress.env('RETRIES')你的spec文件:

Cypress.env('RETRIES', 2)
Run Code Online (Sandbox Code Playgroud)

或者在每个测试或每个挂钩的基础上,设置重试次数:

注意:此插件添加了 Cypress.currentTest,您只能在此插件的上下文中访问它。

npm install -D cypress-plugin-retries
Run Code Online (Sandbox Code Playgroud)

注意:请参考此 issue 了解官方 cypress 重试支持的更新