CYBERSOFT
Đăng nhập

Kiểm thử hình ảnh (visual testing) cho người mới: bắt lỗi hiển thị bằng Playwright (có code chạy được)

Chuyên công nghệNền tảngNgười mớiChuẩn SEO
🗓 1 tháng trước19 phút đọc·👁 1,565 lượt xem👤 244 người đọc

Bài cho người mới: học kiểm thử hình ảnh (visual/screenshot testing) qua app TMĐT ShopEasy. Vì sao test chức năng pass mà giao diện vẫn vỡ, cách hoạt động Baseline/Actual/Diff, viết test toHaveScreenshot của Playwright, đặt ngưỡng khác biệt (threshold/mask), khi nào nên dùng, cách cập nhật baseline hợp lệ, hai tình huống thật, nhiều mockup giao diện, FAQ và trắc nghiệm 5 câu. Chuẩn SEO, dẫn về khóa Tester CyberSoft.

1. Tóm tắt nhanh & màn hình bạn sẽ test

⭐ TL;DR — Kiểm thử hình ảnh (visual testing / screenshot testing) là so sánh ảnh chụp giao diện thực tế (actual) với ảnh đã duyệt trước đó (baseline) để bắt lỗi hiển thị — lệch vị trí, sai màu, sai font — mà test chức năng thông thường bỏ sót. Bài này bám web TMĐT ShopEasy, dùng expect(page).toHaveScreenshot() của Playwright, học cách đặt ngưỡng khác biệt và xử lý khi ảnh baseline cần cập nhật. Trong thời đại nhiều đội dùng AI để sinh test case nhanh hơn, visual testing vẫn cần con người xác nhận giao diện đúng ý đồ thiết kế — kỹ năng này được dạy bài bản tại khóa Software Testing chuyên nghiệp của CyberSoft: https://cybersoft.edu.vn/software-testing-chuyen-nghiep-tu-zero-toi-duoc-nhan-viec-manual-automation-testing/ . Có mockup, code chạy được và trắc nghiệm cuối bài.

Chào bạn mới! Nếu bạn từng viết test tự động chỉ kiểm tra 'bấm nút có hoạt động không', 'dữ liệu có đúng không', bạn sẽ ngạc nhiên khi biết rằng một trang có THỂ pass toàn bộ test chức năng nhưng giao diện vẫn... vỡ: nút bị lệch vị trí, banner sai màu thương hiệu, chữ bị tràn ra ngoài khung. Đó là vì test chức năng không 'nhìn' vào giao diện — nó chỉ kiểm tra hành vi và dữ liệu. Visual testing sinh ra để lấp đúng khoảng trống này: chụp ảnh màn hình thật, so sánh với ảnh chuẩn đã được duyệt, và báo lỗi nếu có khác biệt đáng kể. Chúng ta sẽ học qua trang sản phẩm thật của ShopEasy, có hình minh hoạ và code Playwright chạy được.

Sơ đồ so sánh ảnh: Baseline vs Actual tạo ra ảnh Diff so khớp từng pixel so khớp từng pixelẢnh Baselinechụp trước, đã được duyệtẢnh Actualchụp ngay lúc chạy testẢnh Diffvùng khác biệt tô đỏ/hồng
Sơ đồ so sánh ảnh: ảnh Baseline (đã duyệt) và ảnh Actual (chụp lúc chạy test) tạo ra ảnh Diff
📖 Visual testing: kỹ thuật kiểm thử so sánh ảnh chụp giao diện thực tế với ảnh chuẩn (baseline) đã được duyệt, để phát hiện khác biệt về mặt hiển thị.

2. Vấn đề: test chức năng pass nhưng giao diện vỡ

Đội automation của ShopEasy có bộ test chức năng khá đầy đủ cho trang sản phẩm: bấm 'Mua ngay' có chuyển tới giỏ hàng không, giá hiển thị có đúng với dữ liệu backend không, nút có disable đúng lúc hết hàng không. Toàn bộ các test này chạy xanh mỗi ngày trên CI. Nhưng một buổi sáng, bộ phận chăm sóc khách hàng nhận được phản ánh: nút 'Mua ngay' trên trang sản phẩm bỗng đổi màu tím kỳ lạ, khó nhìn thấy trên nền sáng, và bị đẩy lệch sang phải so với thiết kế gốc.

Vấn đề là: KHÔNG một test chức năng nào trong bộ trên phát hiện ra chuyện này, vì câu assert của chúng chỉ kiểm tra thuộc tính DOM, URL sau khi click, hay text hiển thị — hoàn toàn không kiểm tra màu sắc CSS thực tế hay toạ độ pixel trên màn hình. Nút vẫn có đúng id, vẫn dẫn đúng tới trang giỏ hàng, dữ liệu vẫn khớp — nên mọi assert vẫn pass. Đây gọi là 'false negative' của test chức năng: test báo ổn trong khi thực tế người dùng đang gặp trải nghiệm tệ.

🔒 shopeasy.vn/san-pham/tai-nghe-abc ShopEasy · TMĐT ShopEasy · Trang sản phẩm FLASH SALE HOM NAYTai nghe Bluetooth ABC - giam 30%Tai nghe Bluetooth ABC699.000dMua ngay Banner sai màu: hồng thay vì xanh thương hiệu #0891b2 Nút bị đẩy lệch phải ~180px so với thiết kế gốc
Trang sản phẩm ShopEasy thực tế: banner sai màu thương hiệu và nút Mua ngay bị lệch vị trí, chú thích lỗi
📖 False negative của test chức năng: trường hợp test chức năng báo PASS dù giao diện thực tế đã có lỗi hiển thị mà câu assert không kiểm tra tới.

3. Visual testing là gì & cách hoạt động: Baseline, Actual, Diff

Visual testing hoạt động dựa trên 3 ảnh. Ảnh 'baseline' là ảnh chuẩn, đã được con người xem qua và xác nhận là đúng thiết kế, thường được lưu ngay trong repo dưới một thư mục -snapshots đi kèm mã nguồn. Ảnh 'actual' là ảnh được chụp mới mỗi lần chạy test, phản ánh đúng giao diện thật tại thời điểm đó. Khi so sánh hai ảnh này theo từng pixel, công cụ sẽ tự sinh ra ảnh 'diff' — highlight rõ những vùng khác biệt bằng màu nổi bật (thường là đỏ hoặc hồng) để người xem nhận ra ngay chỗ nào đã đổi.

Với Playwright, lần đầu tiên bạn chạy expect(page).toHaveScreenshot() cho một trang chưa từng có ảnh baseline, Playwright sẽ tự động CHỤP và LƯU ảnh đó làm baseline, đồng thời báo cho bạn biết là đã tạo mới (không phải test fail thật). Từ lần chạy thứ hai trở đi, ảnh actual mới chụp sẽ được so với baseline đã lưu trước đó; nếu tỉ lệ pixel khác nhau vượt quá ngưỡng cho phép, test sẽ fail và Playwright đính kèm cả 3 ảnh — baseline, actual, diff — trong báo cáo HTML để bạn đối chiếu trực quan.

💡 Đừng commit ảnh baseline ngay khi vừa auto-tạo mà chưa xem qua — hãy mở ảnh lên, đối chiếu với thiết kế thật của ShopEasy trước, để chắc chắn bạn không lỡ lưu luôn cả một bug đang có sẵn làm 'chuẩn'.

4. Viết test toHaveScreenshot đầu tiên (thực hành)

Giờ ta viết test visual đầu tiên cho trang sản phẩm ShopEasy. Làm theo thứ tự dưới đây để có một test toHaveScreenshot chạy được ngay.

▶ Bước 1: Tạo thư mục tests/visual/ và file product-page.spec.js bên trong.

▶ Bước 2: Import test, expect từ @playwright/test ở đầu file.

▶ Bước 3: Trong test, goto trang sản phẩm ShopEasy rồi gọi expect(page).toHaveScreenshot('ten-anh.png').

🔒

Nội dung bị khoá

Bạn đang xem bản xem trước. Đăng nhập để mở khoá toàn bộ bài viết và tất cả tài liệu Tester/QA.

Đã xem 24% nội dung
  • Đọc trọn vẹn mọi bài viết
  • Lưu bài & ghi chú cá nhân
  • Theo dõi tiến độ đã đọc
  • Luyện phỏng vấn, ISTQB, Mock
Đăng nhập để đọc tiếp

Chưa có mã? Lấy mã qua Fanpage / Zalo CyberSoft.

0

💬 Bình luận (0)

Bạn có thể đọc mọi bình luận. Đăng nhập để bình luận

Chưa có bình luận nào. Hãy là người đầu tiên!