Nếu như định vị phần tử là điều đầu tiên bạn cần tiếp cận khi tìm hiểu một framework auto testing, thì điều tiếp theo chúng ta xem xét tới là cách thức để đánh giá một bài kiểm thử là pass hay fail. Và assertion sẽ làm điều này. Hãy cùng tìm hiểu cùng mình trong bài viết hôm nay nhé!
Assertion Là Gì?
Assertions trong Playwright được sử dụng để kiểm tra trạng thái của ứng dụng trong quá trình kiểm thử. Chúng giúp đảm bảo rằng ứng dụng hoạt động đúng như mong đợi bằng cách xác minh các điều kiện như URL, tiêu đề, trạng thái phần tử, nội dung văn bản, và nhiều hơn nữa. Khi một assertion không thành công, quá trình thực thi bài kiểm tra Playwright sẽ dừng lại và các bước sau sẽ không chạy được.
Các loại assertion phổ biến khi thực hiện kiểm thử tự động bao gồm:
// Kiểm tra URL await expect(page).toHaveURL("<https://testviewpoint.com/>"); // Kiểm tra tiêu đề trang await expect(page).toHaveTitle("Test Viewpoint - I'm a tester"); // Kiểm tra trạng thái phần tử // Hiển thị (Visible) await expect(page.locator("#success-message")).toBeVisible(); // Ẩn (Hidden): Kiểm tra xem phần tử không hiển thị hoặc không tồn tại. await expect(page.locator("#loading-spinner")).toBeHidden(); // Kiểm tra nội dung văn bản await expect(page.locator("#welcome-message")).toHaveText("Welcome to Test Viewpoint"); // Kiểm tra thuộc tính của phần tử await expect(page.locator("#submit-button")).toHaveAttribute("disabled", ""); // Kiểm tra giá trị của ô nhập liệu await expect(page.locator("#username")).toHaveValue("testuser"); // Kiểm tra số lượng phần tử await expect(page.locator(".list-item")).toHaveCount(5); // Kiểm tra trạng thái của checkbox hoặc radio button //Được chọn (Checked): await expect(page.locator("#terms-checkbox")).toBeChecked(); //Không được chọn (Unchecked): await expect(page.locator("#terms-checkbox")).not.toBeChecked(); // Kiểm tra trạng thái của phần tử //Được bật (Enabled): await expect(page.locator("#submit-button")).toBeEnabled(); //Bị vô hiệu hóa (Disabled): await expect(page.locator("#submit-button")).toBeDisabled();
Các Loại Assertion Trong Playwright
Playwright cung cấp nhiều loại khẳng định khác nhau để phù hợp với các tình huống kiểm thử khác nhau. Trong đócó hai loại chính cho các khẳng định linh hoạt và các khẳng định cứng nhắc, dễ vỡ, không thử lại.
Auto-retrying assertions
Với Auto-retrying assertions, Playwright sẽ lấy lại phần tử và kiểm tra nhiều lần, cho tới khi điều kiện được đáp ứng hoặc cho đến khi hết thời gian chờ. Bạn có thể vượt qua thời gian chờ này hoặc định cấu hình nó một lần thông qua giá trị testConfig.expect trong cấu hình kiểm thử.
Lưu ý rằng việc thử lại khẳng định là không đồng bộ, vì vậy bạn phải đợi chúng.
Ví dụ:
await expect(page.getByTestId('status')).toHaveText('Submitted');
Non-retrying assertions
Khẳng định không thử lại chỉ đánh giá các điều kiện một lần. Chúng được sử dụng khi bạn mong đợi một điều kiện mang tính xác định và muốn tránh bất kỳ logic thử lại nào. Điều này hợp lý nhất khi sử dụng Playwright để chạy các bài kiểm tra đầu cuối đơn lẻ trong môi trường được kiểm soát.
Ví dụ:
expect(response.status()).toEqual(200);
Negating matchers
Negating matchers cho phép bạn khẳng định rằng một điều kiện không đúng. Ví dụ, bạn có thể sử dụng toBeFalsy hoặc not.toContain để đưa ra các khẳng định phủ định.
Ví dụ:
expect(await manageDoctorInforPage.isEmptyForm()).toBeFalsy();
Soft assertions
Soft assertion (khẳng định mềm0 thu thập tất cả các lỗi trong một khối trước khi không vượt qua được bài kiểm tra, thay vì dừng lại ở lỗi đầu tiên. Cách tiếp cận này hữu ích để thu thập thông tin đầy đủ hơn trong quá trình chạy thử nghiệm. Khẳng định mềm là một thành phần quan trọng của quá trình giám sát sản xuất, vì khi đo lường những thứ như thời gian tải, thời gian phản hồi không đạt có thể không có nghĩa là chúng ta muốn dừng kiểm tra hoàn toàn. Bất kỳ bài kiểm tra Playwright nào có khẳng định mềm không đạt sẽ được liệt kê là không đạt, nhưng bài kiểm tra vẫn sẽ chạy cho đến khi hoàn thành (hoặc khẳng định cứng tiếp theo không đạt).
// Make a few checks that will not stop the test when failed... await expect.soft(page.getByTestId('status')).toHaveText('Success'); await expect.soft(page.getByTestId('eta')).toHaveText('1 day'); // ... and continue the test to check more things. await page.getByRole('link', { name: 'next page' }).click(); await expect.soft(page.getByRole('heading', { name: 'Make another order' })).toBeVisible();
Lời Khuyên Khi Sử Dụng Khẳng Định Trong Playwright
Implementing best practices can make your tests more reliable and easier to maintain.
- Test Granularity: Structure tests to cover distinct, isolated behaviors, making debugging easier. The choice between one ‘super test’ and 5 or 10 smaller tests should always go with the more granular option. Since tests can be run in parallel, it’s likely that better test granularity will also improve test execution time.
- Create Concise Statements: Keep assertions simple and focused. Asserting that five different page components is an indicator that you’re testing multiple ideas with one test, and want to consider either breaking up your test or should at least have multiple steps.
- Use Descriptive Messages: Adding clear messages to assertions helps identify failures quickly. It’s also good to use test steps to add more description to the exact phase where the test failed. Read further to see how to add test steps programatically with Typescript decorators.
- Parameterize Assertions: Use variables for assertion parameters to improve test readability and maintainability.
- Leverage Libraries: Utilize existing libraries for common assertions where possible. Note that if you’re running tests on a cadence, a full set of libraries may not be available in your execution environment.
- Be Specific: Make sure your assertions are as targeted as possible to avoid false positives. Bet on auto-waiting and web-first assertions. Even a change from checking if a text label has the needed text with
.toContain()
rather thantoBe()
can improve the reliability of a page monitor. - Leverage Built-in Timeout: Use Playwright’s built-in timeout features to handle flaky conditions gracefully. Avoid hard waits whenever possible.
Việc triển khai các khẳng định tốt có thể giúp các bài kiểm tra của bạn đáng tin cậy hơn và dễ bảo trì hơn. Hãy lưu ý những điều sau đây khi viết bài kiểm thử của bạn:
- Độ chi tiết của bài kiểm thử: Cấu trúc các bài kiểm thử bao gồm các hành vi riêng biệt, biệt lập, giúp việc gỡ lỗi dễ dàng hơn. Lựa chọn giữa một ‘siêu bài kiểm tra’ và 5 hoặc 10 bài kiểm tra nhỏ hơn luôn phải đi kèm với tùy chọn chi tiết hơn.
- Tạo các câu lệnh ngắn gọn: Giữ cho các khẳng định đơn giản và tập trung. Khẳng định rằng năm thành phần trang khác nhau là dấu hiệu cho thấy bạn đang kiểm tra nhiều ý tưởng bằng một bài kiểm tra và muốn cân nhắc chia nhỏ bài kiểm tra của mình hoặc ít nhất nên có nhiều bước.
- Sử dụng thông báo mô tả: Thêm thông báo rõ ràng vào các khẳng định giúp xác định lỗi nhanh chóng. Cũng tốt khi sử dụng các bước kiểm tra để thêm mô tả vào giai đoạn chính xác mà bài kiểm tra không thành công.
- Tham số hóa các khẳng định: Sử dụng các biến cho các tham số khẳng định để cải thiện khả năng đọc và khả năng bảo trì của bài kiểm tra.
- Tận dụng các thư viện: Sử dụng các thư viện hiện có cho các khẳng định chung khi có thể. Lưu ý rằng nếu bạn đang chạy thử nghiệm theo nhịp, thì có thể không có sẵn một bộ thư viện đầy đủ trong môi trường thực thi của bạn.
- Hãy cụ thể: Đảm bảo các khẳng định của bạn được nhắm mục tiêu càng nhiều càng tốt để tránh các kết quả dương tính giả. Đặt cược vào các khẳng định tự động chờ và ưu tiên web. Ngay cả khi thay đổi từ việc kiểm tra xem nhãn văn bản có văn bản cần thiết hay không bằng
.toContain()
thay vìtoBe()
cũng có thể cải thiện độ tin cậy của trình giám sát trang. - Tận dụng thời gian chờ tích hợp: Sử dụng các tính năng thời gian chờ tích hợp của Playwright để xử lý các điều kiện không ổn định một cách nhẹ nhàng. Tránh chờ đợi cứng bất cứ khi nào có thể.
test("should create doctor infor successfully", async ({ page, log }) => { log.step("Create a new user with role = doctor"); const doctor = await createUserByApi(getToken(), "Doctor"); const doctorInforData = await randomDoctorInforData(doctor.id); log.step("Go to the Magage Doctor Infor Page"); const manageDoctorInforPage = new ManageDoctorInforPage(page); await manageDoctorInforPage.goto(); await manageDoctorInforPage.waitForLoad(); log.step("Choose the doctor from doctor list"); await manageDoctorInforPage.doctorCombobox.click(); await manageDoctorInforPage.selectDoctorByDoctorId(doctor.id); log.step("Create doctor infor"); await manageDoctorInforPage.fillForm(doctorInforData); await manageDoctorInforPage.saveButton.click(); log.step("Verify the success message"); await manageDoctorInforPage.verifyAlertMessage("Add doctor info is success!"); log.step("Verify clear form after adding clinic successfully"); await manageDoctorInforPage.description.click(); await expect(await manageDoctorInforPage.isEmptyForm()).toBeTruthy(); log.step("Verify the doctor infor is added"); await manageDoctorInforPage.selectDoctorByDoctorId(doctor.id); await manageDoctorInforPage.verifyFormByDoctorId(doctor.id); });
Bài viết hôm nay hơi dài nhưng mình hi vong bạn đã bắt đầu thích Playwright. Cám ơn bạn đã ghé đọc blog của mình. Hẹn gặp các bạn trong bài viết tiếp theo.
Happy testing!