- Áp dụng phân vùng tương đương và giá trị biên
- Lập bảng quyết định và sơ đồ chuyển trạng thái
- Biết khi nào dùng hộp trắng và kiểm thử khám phá
Thiết kế ca kiểm thử tốt là kỹ năng cốt lõi của người kiểm thử: ít ca hơn nhưng tìm được nhiều lỗi hơn.
Vì sao cần kỹ thuật thiết kế ca kiểm thử?
Không thể kiểm thử mọi tổ hợp đầu vào – đó là nguyên lý đầu tiên của kiểm thử (kiểm thử toàn diện là bất khả thi). Vì vậy ta dùng các kỹ thuật thiết kế ca kiểm thử để chọn ra tập nhỏ nhưng có khả năng phát hiện lỗi cao. ISTQB CTFL 4.0 chia chúng thành ba nhóm: hộp đen (dựa trên đặc tả), hộp trắng (dựa trên cấu trúc mã) và dựa trên kinh nghiệm.
Phân vùng tương đương (Equivalence Partitioning)
Chia miền đầu vào thành các lớp tương đương: mọi giá trị trong cùng lớp được hệ thống xử lý giống nhau, nên chỉ cần thử một đại diện mỗi lớp. Ví dụ ô nhập tuổi hợp lệ từ 18 đến 60:
| Lớp | Miền giá trị | Đại diện | Kết quả mong đợi |
|---|---|---|---|
| Không hợp lệ (thấp) | < 18 | 10 | Báo lỗi |
| Hợp lệ | 18–60 | 35 | Chấp nhận |
| Không hợp lệ (cao) | > 60 | 70 | Báo lỗi |
| Không phải số | chữ, rỗng | "abc" | Báo lỗi |
Phân tích giá trị biên (Boundary Value Analysis)
Lỗi thường nằm ở biên của các lớp (sai < thay vì <=). Với miền 18–60, hãy thử các giá trị 17, 18, 19, 59, 60, 61. Hãy kết hợp với phân vùng tương đương: chọn đại diện ở giữa và hai đầu biên.
import pytest
def hop_le_tuoi(tuoi):
return isinstance(tuoi, int) and 18 <= tuoi <= 60
@pytest.mark.parametrize("tuoi, mong_doi", [
(17, False), (18, True), (19, True), # biên dưới
(59, True), (60, True), (61, False), # biên trên
(35, True), ("abc", False), (None, False),
])
def test_tuoi(tuoi, mong_doi):
assert hop_le_tuoi(tuoi) == mong_doiDùng @pytest.mark.parametrize để biến bảng ca kiểm thử thành code: thêm một dòng dữ liệu là thêm một ca, không phải viết lại hàm kiểm thử.
Bảng quyết định (Decision Table)
Dùng khi kết quả phụ thuộc tổ hợp nhiều điều kiện. Ví dụ giảm giá: khách là thành viên và đơn từ 500.000đ.
| Điều kiện / Ca | 1 | 2 | 3 | 4 |
|---|---|---|---|---|
| Là thành viên | Có | Có | Không | Không |
| Đơn ≥ 500.000đ | Có | Không | Có | Không |
| Giảm giá | 15% | 5% | 5% | 0% |
Mỗi cột là một ca kiểm thử. Với n điều kiện nhị phân có tối đa 2n cột; hãy gộp các cột có cùng kết quả để rút gọn bảng.
Kiểm thử chuyển trạng thái (State Transition)
Phù hợp với đối tượng có vòng đời trạng thái: đơn hàng (Mới → Đã thanh toán → Đã giao → Hoàn tất), tài khoản bị khoá sau 3 lần nhập sai mật khẩu… Hãy vẽ sơ đồ trạng thái, rồi thiết kế ca để phủ mọi chuyển trạng thái hợp lệ và thử vài chuyển không hợp lệ (ví dụ huỷ đơn đã giao).
Hộp trắng và dựa trên kinh nghiệm
Hộp trắng: phủ câu lệnh (statement coverage) và phủ nhánh (branch coverage). Phủ nhánh 100% mạnh hơn phủ câu lệnh 100%. Với Python dùng pytest --cov, với JavaScript dùng báo cáo coverage của Vitest/Jest.
Dựa trên kinh nghiệm: đoán lỗi (error guessing), danh sách kiểm tra (checklist) và đặc biệt là kiểm thử khám phá (exploratory testing) – vừa học hệ thống, vừa thiết kế và chạy ca kiểm thử trong một khoảng thời gian định sẵn (session), ghi chú lại những gì tìm thấy.
Độ phủ cao không đồng nghĩa với kiểm thử tốt: một ca kiểm thử chạy qua dòng lệnh nhưng không có assert vẫn tính vào độ phủ. Hãy xem độ phủ như công cụ tìm vùng chưa được kiểm thử, không phải mục tiêu cần "đạt".
- Thiết kế ca kiểm thử cho ô nhập điểm (0–10, có một chữ số thập phân) bằng phân vùng tương đương và giá trị biên.
- Lập bảng quyết định cho chức năng đăng nhập (đúng/sai tài khoản, đúng/sai mật khẩu, tài khoản bị khoá).
- Chuyển bảng ca ở bước 1 thành test parametrize bằng pytest và xem báo cáo độ phủ.
Bạn đã học bốn kỹ thuật hộp đen chính (phân vùng tương đương, giá trị biên, bảng quyết định, chuyển trạng thái), độ phủ hộp trắng và kiểm thử khám phá. Hãy làm phần Thực hành để ghi nhớ.

