불안정한 테스트 재시도하기
WebdriverIO 테스트러너를 사용하면 불안정한 네트워크나 경쟁 조건과 같은 이유로 불안정한 테스트를 다시 실행할 수 있습니다. (그러나 테스트가 불안정해진다고 단순히 재시도 횟수를 늘리는 것은 권장하지 않습니다!)
Mocha에서 스위트 재실행
Mocha 버전 3부터는 전체 테스트 스위트(describe
블록 내부의 모든 것)를 재실행할 수 있습니다. Mocha를 사용하는 경우 특정 테스트 블록(모든 it
블록 내부)만 재실행할 수 있는 WebdriverIO 구현 대신 이 재시도 메커니즘을 선호해야 합니다. this.retries()
메서드를 사용하기 위해, 스위트 블록 describe
는 Mocha 문서에 설명된 대로 화살표 함수 () => {}
대신 바인딩되지 않은 함수 function(){}
를 사용해야 합니다. Mocha를 사용하면 wdio.conf.js
에서 mochaOpts.retries
를 사용하여 모든 스펙에 대한 재시도 횟수를 설정할 수도 있습니다.
예시:
describe('retries', function () {
// 이 스위트의 모든 테스트를 최대 4번까지 재시도
this.retries(4)
beforeEach(async () => {
await browser.url('http://www.yahoo.com')
})
it('should succeed on the 3rd try', async function () {
// 이 테스트는 최대 2번까지만 재시도하도록 지정
this.retries(2)
console.log('run')
await expect($('.foo')).toBeDisplayed()
})
})
Jasmine 또는 Mocha에서 단일 테스트 재실행
특정 테스트 블록을 재실행하려면 테스트 블록 함수 뒤에 마지막 매개변수로 재실행 횟수를 적용하면 됩니다:
- Mocha
- Jasmine
describe('my flaky app', () => {
/**
* 최대 4번 실행되는 스펙(1번 실제 실행 + 3번 재시도)
*/
it('should rerun a test at least 3 times', async function () {
console.log(this.wdioRetries) // 재시도 횟수 반환
// ...
}, 3)
})
훅에서도 똑같이 작동합니다:
describe('my flaky app', () => {
/**
* 최대 2번 실행되는 훅(1번 실제 실행 + 1번 재시도)
*/
beforeEach(async () => {
// ...
}, 1)
// ...
})
describe('my flaky app', () => {
/**
* 최대 4번 실행되는 스펙(1번 실제 실행 + 3번 재시도)
*/
it('should rerun a test at least 3 times', async function () {
console.log(this.wdioRetries) // 재시도 횟수 반환
// ...
}, jasmine.DEFAULT_TIMEOUT_INTERVAL, 3)
})
훅에서도 똑같이 작동합니다:
describe('my flaky app', () => {
/**
* 최대 2번 실행되는 훅(1번 실제 실행 + 1번 재시도)
*/
beforeEach(async () => {
// ...
}, jasmine.DEFAULT_TIMEOUT_INTERVAL, 1)
// ...
})
Jasmine을 사용하는 경우 두 번째 매개변수는 타임아웃용으로 예약되어 있습니다. 재시도 매개변수를 적용하려면 타임아웃을 기본값인 jasmine.DEFAULT_TIMEOUT_INTERVAL
로 설정한 다음 재시도 횟수를 적용해야 합니다.
이 재시도 메커니즘은 단일 훅이나 테스트 블록만 재시도할 수 있습니다. 애플리케이션을 설정하기 위한 훅이 테스트와 함께 있는 경우 이 훅은 실행되지 않습니다. Mocha는 이 동작을 제공하는 네이티브 테스트 재시도를 제공하지만 Jasmine은 제공하지 않습니다. afterTest
훅에서 실행된 재시도 횟수에 접근할 수 있습니다.