CYBERSOFT
Đăng nhập

Data-driven testing cho người mới: chạy 1 kịch bản với nhiều bộ dữ liệu (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,519 lượt xem👤 82 người đọc

Bài cho người mới: học data-driven testing qua app TMĐT ShopEasy. Vì sao cần tách dữ liệu khỏi logic test, cách dùng mảng/JSON, đặt tên ca test theo dữ liệu, viết vòng lặp for...of + test() bằng Playwright chạy được, hai tình huống thật (copy-paste 20 test, tên test mơ hồ khi fail), 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 — Data-driven testing là cách viết MỘT kịch bản test dùng chung logic, rồi chạy lặp lại với NHIỀU bộ dữ liệu (hợp lệ/không hợp lệ/biên). Bài này bám màn thanh toán của app TMĐT ShopEasy, cụ thể là ô nhập mã giảm giá: bạn học vì sao cần tham số hoá test, cách tách dữ liệu khỏi logic bằng mảng/JSON, cách đặt tên ca test theo dữ liệu, và viết vòng lặp for...of + test() bằng Playwright chạy được thật. Nhiều hình minh hoạ và trắc nghiệm cuối bài.

Chào bạn mới! Khi vừa học automation, phản xạ tự nhiên là viết 1 test cho 1 trường hợp: mở trang, nhập mã 'SUMMER10', bấm áp dụng, kiểm tra thông báo thành công. Nhưng thực tế 1 ô nhập mã giảm giá cần kiểm tra rất nhiều trường hợp: mã hợp lệ, mã hết hạn, mã không tồn tại, mã để trống, mã quá ngắn/quá dài... Nếu viết riêng từng test cho mỗi trường hợp, bạn sẽ có hàng chục file gần giống hệt nhau, chỉ khác đúng 2 dòng: giá trị nhập và kết quả mong đợi. Data-driven testing giải quyết vấn đề này: viết đúng 1 kịch bản, rồi 'nạp' nhiều bộ dữ liệu vào chạy lặp lại. Chúng ta sẽ học qua ô mã giảm giá thật của ShopEasy, có hình minh hoạ và code Playwright chạy được.

🔒 shopeasy.vn/thanh-toan ShopEasy · TMĐT ShopEasy · Áp dụng mã giảm giá Mã giảm giá SUMMER10Áp dụng Locator: #coupon-input Locator: #btn-apply-coupon✓ Áp dụng thành công! Giảm 10% — còn lại 358.200đLocator thông báo: #coupon-message
Màn hình test: ô nhập mã giảm giá ShopEasy khi thanh toán, chú thích locator ô nhập/nút/thông báo
📖 Data-driven testing: cách viết một kịch bản kiểm tra dùng chung logic, rồi chạy lặp lại với nhiều bộ dữ liệu đầu vào khác nhau, thay vì viết nhiều test gần giống hệt nhau.

2. Vấn đề: khi bạn có 20 test gần giống hệt nhau

Hãy hình dung bạn được giao kiểm tra ô mã giảm giá của ShopEasy. Bạn viết test đầu tiên: nhập 'SUMMER10', kiểm tra thông báo 'Áp dụng thành công'. Rồi bạn copy file đó, đổi giá trị thành 'ABCXYZ', đổi kỳ vọng thành 'Mã không hợp lệ'. Rồi lại copy tiếp cho mã hết hạn, mã để trống, mã quá dài... Chỉ sau vài giờ, bạn có 8, 10, rồi 20 file test — mỗi file giống hệt nhau 95%, chỉ khác đúng giá trị nhập và câu kiểm tra kết quả.

Vấn đề thật sự xuất hiện khi bạn cần thay đổi logic kiểm tra — ví dụ sếp yêu cầu thêm bước kiểm tra số tiền cuối cùng sau khi áp dụng mã, không chỉ thông báo. Với 20 file gần giống nhau, bạn phải mở từng file, sửa từng chỗ, rất dễ bỏ sót 1-2 file. Đây chính là lúc bạn nhận ra: cái mình cần không phải 20 kịch bản khác nhau, mà là 1 kịch bản và 20 bộ dữ liệu.

Bảng bộ dữ liệu test: mã giảm giá ShopEasy (input → kết quả mong đợi) Tên ca test (đặt theo dữ liệu)Mã nhậpKết quả mong đợihop-le - ma con hanSUMMER10Áp dụng thành công, giảm 10%hop-le - khong phan biet hoa/thuongsummer10Áp dụng thành công, giảm 10%khong-hop-le - ma khong ton taiABCXYZMã không hợp lệhet-han - ma tung dungTET2024Mã đã hết hạnbien-duoi - do dai 3 ky tu (min 4)S10Mã không hợp lệbien-tren - do dai 20 ky tu (max 15)SUMMER10SUMMER10SUMMã không hợp lệrong - khong nhap gi(để trống)Vui lòng nhập mã giảm giáco-khoang-trang - tu dong trim SUMMER10 Áp dụng thành công, giảm 10%1 ô nhập, 1 nút bấm — nhưng có tới 8 bộ dữ liệu cần kiểm tra: hợp lệ, không hợp lệ, biên.
Bảng bộ dữ liệu test cho ô mã giảm giá: mỗi dòng là 1 trường hợp cần kiểm tra
📖 Tham số hóa test (test parameterization): kỹ thuật thiết kế 1 kịch bản test nhận dữ liệu đầu vào như tham số, để có thể chạy lại với nhiều giá trị khác nhau mà không sửa code.

3. Data-driven testing là gì & nguyên tắc cốt lõi

Nguyên tắc cốt lõi của data-driven testing là 'tách dữ liệu khỏi logic': logic kiểm tra (mở trang, nhập liệu, bấm nút, so sánh kết quả) được viết đúng 1 lần, còn dữ liệu (mã nào, mong đợi kết quả gì) được gom vào một bảng riêng — thường là mảng object trong JavaScript, hoặc file JSON/CSV. Một vòng lặp (phổ biến nhất là for...of) sẽ đọc từng dòng dữ liệu và sinh ra 1 ca test tương ứng, chạy đúng cùng 1 logic nhưng với giá trị khác nhau.

Sơ đồ 1 kịch bản test × N bộ dữ liệu (data-driven) for (const tc of testCases) nhập tc.code, kiểm tra tc.expectedBảng dữ liệucouponTestCases[]Vòng lặp for...oftest() sinh N ca chạy thậtForm ShopEasy#coupon-input, #btn-apply-coupon
Sơ đồ: bảng dữ liệu được vòng lặp for...of đọc, sinh ra N ca test chạy trên form ShopEasy

Nói cách khác: bảng dữ liệu 'biết' phải test cái gì và mong đợi kết quả ra sao, còn kịch bản test chỉ 'biết' cách thực hiện và cách so sánh. Khi cần thêm 1 trường hợp mới, bạn chỉ thêm 1 dòng dữ liệu — không đụng tới logic. Khi cần sửa cách kiểm tra (ví dụ thêm kiểm tra số tiền), bạn chỉ sửa đúng 1 chỗ trong thân vòng lặp — mọi bộ dữ liệu tự động dùng logic mới. Đây là lý do data-driven testing giúp bộ test bền vững và dễ mở rộng hơn hẳn khi số lượng trường hợp cần kiểm tra tăng lên.

Trước và sau khi áp dụng data-driven testing Tiêu chíKHÔNG data-driven (copy-paste)CÓ data-drivenSố file/test cho 8 bộ dữ liệu8 test gần giống hệt nhau, mỗi file 1 mã1 mảng dữ liệu + 1 vòng lặp for...of + test()Thêm 1 bộ dữ liệu mớiCopy-paste thêm 1 file test nữaThêm đúng 1 dòng vào mảng testCasesSửa logic kiểm tra (assert)Phải sửa lại ở mọi file test đã copy-pasteChỉ sửa đúng 1 chỗ trong thân vòng lặpĐọc hiểu bộ dữ liệu đang testPhải mở từng file mới biết đang test mã gìNhìn thẳng vào mảng testCases là thấy hếtCI báo đỏ, biết bộ nào fail?Tên test giống nhau, khó biết mã nào gây lỗiTên test gắn theo dữ liệu, biết ngay mã nào failCùng kiểm tra 1 ô nhập mã giảm giá, chỉ khác cách tổ chức — nhưng công sức bảo trì khác nhau rất nhiều.
Bảng so sánh: cùng ô mã giảm giá, tổ chức test KHÔNG có data-driven và CÓ data-driven
💡 Luôn tự hỏi trước khi copy-paste 1 test: 'phần khác nhau giữa 2 test này chỉ là dữ liệu, hay có logic khác nhau thật sự?' — nếu chỉ khác dữ liệu, đó là dấu hiệu nên chuyển sang data-driven.

4. Chọn bộ dữ liệu: hợp lệ, không hợp lệ và biên

Data-driven testing chỉ mạnh khi bộ dữ liệu được chọn tốt. Với ô mã giảm giá ShopEasy, ta chia dữ liệu thành 3 nhóm: dữ liệu HỢP LỆ (mã đúng, còn hạn — kỳ vọng áp dụng thành công), dữ liệu KHÔNG HỢP LỆ (mã sai, mã hết hạn, mã không tồn tại — kỳ vọng thông báo lỗi tương ứng), và dữ liệu BIÊN (độ dài tối thiểu/tối đa, ô để trống, khoảng trắng thừa — nơi lỗi hay ẩn náu nhất). Nếu bạn chưa quen kỹ thuật chọn giá trị biên, có thể xem thêm bài phân vùng tương đương và giá trị biên trong phần liên kết cuối bài.

Chú ý bảng dữ liệu ở chương 2: dòng 'khong-phan-biet-hoa/thuong' và 'co-khoang-trang' không phải trường hợp 'hiển nhiên' — chúng kiểm tra những giả định ngầm (hệ thống có tự động chuẩn hoá chữ hoa/thường và khoảng trắng hay không). Đây chính là giá trị của data-driven testing: một khi đã có sẵn cơ chế chạy nhiều bộ dữ liệu, việc bổ sung thêm các trường hợp 'ngầm định' như vậy chỉ tốn thêm 1 dòng, gần như miễn phí.

🔒

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!