Повторный запуск нестабильных тестов
С помощью тестового раннера WebdriverIO вы можете повторно запускать определенные тесты, которые оказываются нестабильными из-за таких факторов, как ненадежная сеть или состояние гонки. (Однако не рекомендуется просто увеличивать частоту повторных запусков, если тесты становятся нестабильными!)
Повторные запуски тестовых наборов в Mocha
Начиная с версии 3 Mocha, вы можете повторно запускать целые тестовые наборы (всё внутри блока describe). Если вы используете Mocha, вам следует использовать этот механизм повторного запуска вместо реализации WebdriverIO, которая позволяет повторно запускать только определенные тестовые блоки (всё внутри блока it). Чтобы использовать метод this.retries(), блок набора describe должен использовать несвязанную функцию function(){} вместо стрелочной функции () => {}, как описано в документации Mocha. Используя Mocha, вы также можете установить количество повторных попыток для всех спецификаций с помощью mochaOpts.retries в вашем wdio.conf.js.
Вот пример:
describe('retries', function () {
// Retry all tests in this suite up to 4 times
this.retries(4)
beforeEach(async () => {
await browser.url('http://www.yahoo.com')
})
it('should succeed on the 3rd try', async function () {
// Specify this test to only retry up to 2 times
this.retries(2)
console.log('run')
await expect($('.foo')).toBeDisplayed()
})
})
Повторный запуск отдельных тестов в Jasmine или Mocha
Для повторного запуска определенного тестового блока можно просто указать количество повторных запусков в качестве последнего параметра после функции тестового блока:
- Mocha
- Jasmine
describe('my flaky app', () => {
/**
* spec that runs max 4 times (1 actual run + 3 reruns)
*/
it('should rerun a test at least 3 times', async function () {
console.log(this.wdioRetries) // returns number of retries
// ...
}, 3)
})
То же самое работает и для хуков:
describe('my flaky app', () => {
/**
* hook that runs max 2 times (1 actual run + 1 rerun)
*/
beforeEach(async () => {
// ...
}, 1)
// ...
})
describe('my flaky app', () => {
/**
* spec that runs max 4 times (1 actual run + 3 reruns)
*/
it('should rerun a test at least 3 times', async function () {
console.log(this.wdioRetries) // returns number of retries
// ...
}, jasmine.DEFAULT_TIMEOUT_INTERVAL, 3)
})
То же самое работает и для хуков:
describe('my flaky app', () => {
/**
* hook that runs max 2 times (1 actual run + 1 rerun)
*/
beforeEach(async () => {
// ...
}, jasmine.DEFAULT_TIMEOUT_INTERVAL, 1)
// ...
})
Если вы используете Jasmine, второй параметр зарезервирован для тайм-аута. Чтобы применить параметр повторного запуска, вам нужно установить тайм-аут на его значение по умолчанию jasmine.DEFAULT_TIMEOUT_INTERVAL, а затем применить количество повторных запусков.
Этот механизм повторного запуска позволяет повторять только отдельные хуки или тестовые блоки. Если ваш тест сопровождается хуком для настройки приложения, этот хук не запускается повторно. Mocha предлагает встроенный механизм повторного запуска тестов, который предоставляет такое поведение, в то время как Jasmine этого не делает. Вы можете получить доступ к количеству выполненных повторных попыток в хуке afterTest.