Chạy Lại Các Bài Kiểm Tra Không Ổn Định
Bạn có thể chạy lại một số bài kiểm tra nhất định với testrunner của WebdriverIO mà trở nên không ổn định do các yếu tố như mạng không ổn định hoặc điều kiện xung đột. (Tuy nhiên, không nên đơn giản chỉ tăng tỷ lệ chạy lại nếu các bài kiểm tra trở nên không ổn định!)
Chạy lại bộ kiểm tra trong Mocha
Kể từ phiên bản 3 của Mocha, bạn có thể chạy lại toàn bộ bộ kiểm tra (mọi thứ bên trong khối describe
). Nếu bạn sử dụng Mocha, bạn nên ưu tiên cơ chế chạy lại này thay vì triển khai của WebdriverIO, chỉ cho phép bạn chạy lại một số khối kiểm tra nhất định (mọi thứ trong khối it
). Để sử dụng phương thức this.retries()
, khối bộ kiểm tra describe
phải sử dụng hàm không ràng buộc function(){}
thay vì hàm mũi tên () => {}
, như được mô tả trong tài liệu Mocha. Khi sử dụng Mocha, bạn cũng có thể đặt số lần chạy lại cho tất cả các đặc tả bằng cách sử dụng mochaOpts.retries
trong tệp wdio.conf.js
.
Dưới đây là một ví dụ:
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()
})
})
Chạy lại các bài kiểm tra đơn lẻ trong Jasmine hoặc Mocha
Để chạy lại một khối kiểm tra nhất định, bạn chỉ cần áp dụng số lần chạy lại làm tham số cuối cùng sau hàm khối kiểm tra:
- 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)
})
Điều tương tự cũng hoạt động cho các hooks:
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)
})
Điều tương tự cũng hoạt động cho các hooks:
describe('my flaky app', () => {
/**
* hook that runs max 2 times (1 actual run + 1 rerun)
*/
beforeEach(async () => {
// ...
}, jasmine.DEFAULT_TIMEOUT_INTERVAL, 1)
// ...
})
Nếu bạn đang sử dụng Jasmine, tham số thứ hai được dành cho thời gian chờ. Để áp dụng tham số chạy lại, bạn cần đặt thời gian chờ thành giá trị mặc định của nó jasmine.DEFAULT_TIMEOUT_INTERVAL
và sau đó áp dụng số lần chạy lại của bạn.
Cơ chế chạy lại này chỉ cho phép chạy lại các hook hoặc khối kiểm tra đơn lẻ. Nếu bài kiểm tra của bạn đi kèm với một hook để thiết lập ứng dụng, hook này không được chạy. Mocha cung cấp các lần chạy lại kiểm tra gốc cung cấp hành vi này trong khi Jasmine thì không. Bạn có thể truy cập số lần chạy lại đã thực hiện trong hook afterTest
.
Chạy lại trong Cucumber
Chạy lại toàn bộ bộ kiểm tra trong Cucumber
Đối với cucumber >=6, bạn có thể cung cấp tùy chọn cấu hình retry
cùng với tham số tùy chọn retryTagFilter
để có tất cả hoặc một số kịch bản thất bại của bạn nhận được các lần thử lại bổ sung cho đến khi thành công. Để tính năng này hoạt động, bạn cần đặt scenarioLevelReporter
thành true
.
Chạy lại Định nghĩa Bước trong Cucumber
Để xác định tỷ lệ chạy lại cho một định nghĩa bước nhất định, chỉ cần áp dụng tùy chọn chạy lại cho nó, như:
export default function () {
/**
* step definition that runs max 3 times (1 actual run + 2 reruns)
*/
this.Given(/^some step definition$/, { wrapperOptions: { retry: 2 } }, async () => {
// ...
})
// ...
})
Chạy lại chỉ có thể được định nghĩa trong tệp định nghĩa bước của bạn, không bao giờ trong tệp tính năng của bạn.
Thêm chạy lại trên cơ sở mỗi tệp đặc tả
Trước đây, chỉ có sẵn các lần chạy lại ở cấp độ kiểm tra và bộ ki ểm tra, điều này tốt trong hầu hết các trường hợp.
Nhưng trong bất kỳ bài kiểm tra nào liên quan đến trạng thái (như trên máy chủ hoặc trong cơ sở dữ liệu), trạng thái có thể được để lại không hợp lệ sau lần thất bại kiểm tra đầu tiên. Bất kỳ lần chạy lại nào tiếp theo có thể không có cơ hội vượt qua, do trạng thái không hợp lệ mà chúng sẽ bắt đầu.
Một phiên bản browser
mới được tạo cho mỗi tệp đặc tả, điều này làm cho nó trở thành nơi lý tưởng để hook và thiết lập bất kỳ trạng thái nào khác (máy chủ, cơ sở dữ liệu). Chạy lại ở cấp độ này có nghĩa là toàn bộ quá trình thiết lập sẽ đơn giản được lặp lại, giống như nếu nó dành cho một tệp đặc tả mới.
export const config = {
// ...
/**
* The number of times to retry the entire specfile when it fails as a whole
*/
specFileRetries: 1,
/**
* Delay in seconds between the spec file retry attempts
*/
specFileRetriesDelay: 0,
/**
* Retried specfiles are inserted at the beginning of the queue and retried immediately
*/
specFileRetriesDeferred: false
}