Повторне запускання нестабільних тестів
Ви можете повторно запускати певні тести з WebdriverIO testrunner, які виявляються нестабільними через такі фактори як нестабільна мережа або умови гонки (race conditions). (Однак, не рекомендується просто збільшувати кількість повторних запусків, якщо тести стають нестабільними!)
Повторний запуск сюїтів у 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
.