Pairwise testing với AI: từ 24 test case xuống 12 và cách kiểm tra bảng AI sinh ra
Ba tham số với 2, 3 và 4 giá trị cho 24 tổ hợp, nhưng pairwise chỉ cần khoảng 12. Playbook này hướng dẫn nhờ AI trích tham số, sinh bảng tổ hợp và kiểm tra bảng đó có sót cặp nào không.
Sprint review sắp đến, PM thả thêm một màn hình thanh toán có ba ô chọn. Bạn mở sheet test case, nhân các giá trị lên và thấy con số vượt xa thời gian còn lại. Chạy hết thì không kịp. Chọn đại thì khó trả lời khi có người hỏi "sao không test trường hợp này?".
All-pairs testing (còn gọi là pairwise testing) sinh ra để giải bài toán này. AI giúp bạn phần việc tay chân: đọc spec, liệt kê tham số, dựng bảng tổ hợp, viết expected result. Phần kiểm tra vẫn là việc của bạn, và bài này kèm một đoạn script ngắn để làm việc đó.
Pairwise là gì và vì sao nó hợp lý
Pairwise là phương pháp kiểm thử tổ hợp (combinatorial). Với mỗi cặp tham số đầu vào, bạn kiểm tra tất cả các tổ hợp giá trị rời rạc của cặp đó. Các test vector được chọn sao cho một test case "gánh" nhiều cặp cùng lúc. Wikipedia mô tả đây là việc "song song hóa" (parallelizing) kiểm thử các cặp tham số, nhờ đó nhanh hơn nhiều so với vét cạn.
Cơ sở của cách làm này, theo nguồn:
Phần lớn lỗi đến từ một tham số đơn lẻ hoặc tương tác giữa hai tham số.
Lỗi cần từ ba tham số trở lên ngày càng hiếm và ngày càng tốn kém để tìm. Giới hạn của hướng đó là thử toàn bộ đầu vào.
Pairwise vì vậy là một thỏa hiệp chi phí/lợi ích: giảm đáng kể số test case mà không làm tụt mạnh độ phủ chức năng.
Về con số, tổng số test case vét cạn là tích số giá trị của các tham số. Với pairwise, số test thường cỡ n × m, trong đó n và m là số giá trị của hai tham số có nhiều lựa chọn nhất.
Ví dụ trong nguồn: ba tham số có 2, 3 và 4 giá trị cho 24 test vét cạn (2 × 3 × 4). Pairwise chỉ cần 3 × 4 = 12.
Nguồn cũng nhắc đến N-wise / T-wise, tức là mở rộng từ cặp sang bộ ba (3-wise) và hơn nữa. Trang này đánh dấu phần đó là "cần trích dẫn", nên hãy coi nó là gợi ý chứ chưa phải kết luận chắc chắn.
Quy trình 5 bước
Lấy tham số từ spec. Nhờ AI liệt kê tham số và giá trị rời rạc (ví dụ: thiết bị, phương thức thanh toán, loại voucher).
Chốt lại bằng mắt bạn. Bước này quyết định chất lượng. Thiếu một giá trị thì mọi thứ phía sau đều lệch.
Sinh bảng tổ hợp pairwise. Bạn có thể dùng công cụ chuyên dụng. Bảng ví dụ trong nguồn được tạo bằng pict của Microsoft, nhưng nguồn không nêu cú pháp lệnh nên bạn cần đọc tài liệu riêng của công cụ. Cách thứ hai là nhờ AI sinh bảng rồi kiểm tra ở bước 4.
Kiểm tra độ phủ cặp bằng script bên dưới.
Nhờ AI viết expected result và script (Playwright, pytest...) cho từng dòng, rồi review.
Prompt mẫu
Prompt 1: trích tham số từ spec
text
Bạn là QA engineer. Từ đặc tả bên dưới, liệt kê các tham số đầu vào
ảnh hưởng đến hành vi của <tên tính năng> và các giá trị rời rạc của từng tham số.
Trả về bảng: Tham số | Các giá trị | Trích dẫn dòng spec làm căn cứ.
Nếu một giá trị là suy đoán của bạn (spec không nói), đánh dấu "SUY ĐOÁN".
Không thêm tham số không có trong spec.
Spec:
<dán spec đã ẩn dữ liệu nhạy cảm>
Prompt 2: sinh bảng pairwise
text
Với các tham số sau: <bảng tham số đã chốt>
Hãy tạo bộ test case pairwise (mọi cặp giá trị của mọi cặp tham số
xuất hiện ít nhất một lần). Ràng buộc: <các tổ hợp không hợp lệ, nếu có>.
Xuất dạng CSV, mỗi dòng một test case. Sau bảng, liệt kê số dòng
và giải thích ngắn gọn cách bạn đảm bảo phủ đủ cặp.
Prompt 3: expected result
text
Dưới đây là bảng tổ hợp đầu vào và quy tắc nghiệp vụ: <quy tắc>.
Với mỗi dòng, viết: các bước, expected result, và trích quy tắc làm căn cứ.
Dòng nào quy tắc chưa đủ để kết luận thì ghi "CẦN XÁC NHẬN", đừng tự đoán.
Ví dụ: màn hình thanh toán
Giả sử có ba tham số, mô phỏng đúng cấu trúc 2 × 3 × 4 của ví dụ gốc:
Thiết bị: Desktop, Mobile
Thanh toán: Thẻ, Ví, COD
Voucher: Không, Giảm %, Giảm tiền, Freeship
Vét cạn là 24 test. Một bộ pairwise gồm 12 dòng (bảng này do tôi dựng tay để minh họa, không phải output của pict):
| Thiết bị | Thanh toán | Voucher |
|---|---|---|
| Desktop | Thẻ | Không |
| Mobile | Thẻ | Giảm % |
| Desktop | Thẻ | Giảm tiền |
| Mobile | Thẻ | Freeship |
| Mobile | Ví | Không |
| Desktop | Ví | Giảm % |
| Mobile | Ví | Giảm tiền |
| Desktop | Ví | Freeship |
| Desktop | COD | Không |
| Desktop | COD | Giảm % |
| Mobile | COD | Giảm tiền |
| Mobile | COD | Freeship |
Hai tham số có nhiều giá trị nhất (thanh toán × voucher) đã chiếm đủ 12 tổ hợp, nên không thể ít hơn 12 dòng. Phần còn lại là rải giá trị "thiết bị" sao cho cặp nào cũng được phủ.
Kiểm tra output của AI
AI có thể sinh ra một bảng "trông hợp lý" nhưng thiếu cặp. Đừng tin bằng mắt, hãy chạy script này. Bảng mẫu ở trên được điền sẵn, bạn thay bằng các dòng AI sinh ra:
python
from itertools import combinations, product
params = {
"device": ["Desktop", "Mobile"],
"payment": ["Thẻ", "Ví", "COD"],
"voucher": ["Không", "Giảm %", "Giảm tiền", "Freeship"],
}
rowsraw = [ # thay bằng các dòng AI sinh ra
("Desktop", "Thẻ", "Không"),
("Mobile", "Thẻ", "Giảm %"),
("Desktop", "Thẻ", "Giảm tiền"),
("Mobile", "Thẻ", "Freeship"),
("Mobile", "Ví", "Không"),
("Desktop", "Ví", "Giảm %"),
("Mobile", "Ví", "Giảm tiền"),
("Desktop", "Ví", "Freeship"),
("Desktop", "COD", "Không"),
("Desktop", "COD", "Giảm %"),
("Mobile", "COD", "Giảm tiền"),
("Mobile", "COD", "Freeship"),
]
rows = [dict(zip(params, r)) for r in rowsraw]
missing = []
for a, b in combinations(params, 2):
for va, vb in product(params[a], params[b]):
if not any(r[a] == va and r[b] == vb for r in rows):
missing.append((a, va, b, vb))
print("Thiếu cặp:", missing or "không")
Script này chỉ kiểm tra độ phủ cặp. Nó không biết tổ hợp nào không hợp lệ, phần đó bạn tự soát.
Ngoài script, hãy soát thêm:
Số dòng. Khi không có ràng buộc, ít hơn tích hai tham số lớn nhất (ở đây là 12) thì chắc chắn thiếu cặp. Nhiều hơn nhiều thì bảng có thể đang dư, nên xem lại.
Expected result. Đối chiếu từng dòng với spec. Chỗ AI "tự suy ra" quy tắc là chỗ dễ sai nhất.
Tổ hợp không hợp lệ. Ví dụ COD kèm một loại voucher bị cấm. Nguồn không bàn về ràng buộc, nên hãy khai báo rõ trong prompt rồi tự kiểm tra lại bảng.
Selector trong script. Nếu nhờ AI viết Playwright hay Selenium, hãy chạy thử và sửa selector bất ổn trước khi đưa vào pipeline.
Giới hạn cần nhớ
Đây là nhận định của tôi, dựa trên những gì nguồn nói: pairwise không bắt được lỗi chỉ lộ ra khi ba tham số trở lên cùng xảy ra. Nguồn nói loại lỗi này hiếm hơn, không nói là không có. Với luồng rủi ro cao như tiền hay phân quyền, hãy cân nhắc bổ sung vài test 3-wise có chủ đích.
Pairwise cũng không thay thế kiểm thử giá trị biên hay kiểm thử âm (negative testing), vì nó chỉ lo phần tổ hợp.
An toàn dữ liệu
Đừng dán dữ liệu production, thông tin khách hàng, token hay mật khẩu vào công cụ AI công khai.
Với spec nội bộ, hãy thay tên hệ thống, tên khách hàng và endpoint thật bằng placeholder trước khi dán.
Dữ liệu test trong script nên là dữ liệu giả hoặc dữ liệu từ môi trường test.
Checklist nhanh
[ ] Tham số và giá trị đã được người thật duyệt, không chỉ tin AI
[ ] Ràng buộc tổ hợp không hợp lệ đã ghi rõ và đã soát lại bảng
[ ] Bảng pairwise chạy qua script kiểm tra cặp, kết quả không thiếu
[ ] Số dòng hợp lý so với tích hai tham số lớn nhất
[ ] Expected result có căn cứ trong spec, dòng nào chưa rõ đã gắn "CẦN XÁC NHẬN"
[ ] Luồng rủi ro cao đã được cân nhắc thêm test 3-wise
[ ] Không có dữ liệu thật hay credential trong prompt