Test case là gì? Cách viết test case chuẩn kèm mẫu và ví dụ
Test case là sản phẩm đầu ra rõ ràng nhất của một tester, và cũng là thứ nhà tuyển dụng dùng để đánh giá bạn nhanh nhất. Một bộ test case tốt không phải bộ dài nhất — mà là bộ mà người khác đọc vào là chạy được, không cần hỏi lại bạn câu nào.
Test case là gì?
Test case là một tập hợp gồm điều kiện tiên quyết, dữ liệu đầu vào, các bước thực hiện và kết quả mong đợi, được xây dựng để kiểm tra xem phần mềm có hoạt động đúng như yêu cầu trong một tình huống cụ thể hay không.
Điểm cốt lõi nằm ở hai chữ "kết quả mong đợi". Nếu bạn không xác định trước hệ thống phải phản ứng thế nào, thì thao tác của bạn chỉ là dùng thử, không phải kiểm thử — vì bạn không có cơ sở nào để nói kết quả là đúng hay sai.
Phân biệt Test scenario và Test case
| Tiêu chí | Test scenario | Test case |
|---|---|---|
| Mức độ chi tiết | Khái quát, một câu mô tả | Chi tiết từng bước |
| Ví dụ | Kiểm tra chức năng đăng nhập | Đăng nhập với email đúng và mật khẩu sai 5 lần liên tiếp |
| Mục đích | Xác định phạm vi cần kiểm thử | Hướng dẫn thực thi cụ thể |
| Số lượng | Ít, mỗi scenario sinh ra nhiều test case | Nhiều |
Một test case gồm những thành phần nào?
| Trường | Ý nghĩa | Ví dụ |
|---|---|---|
| Test Case ID | Mã định danh duy nhất để tham chiếu | TC_LOGIN_007 |
| Tiêu đề / Test Summary | Mô tả ngắn gọn tình huống đang kiểm tra | Đăng nhập thất bại khi mật khẩu sai |
| Precondition | Điều kiện phải có trước khi chạy | Đã tồn tại tài khoản test@pinelab.vn ở trạng thái active |
| Test Data | Dữ liệu đầu vào cụ thể | Email: test@pinelab.vn — Mật khẩu: SaiMatKhau123 |
| Steps | Các bước thao tác, đánh số, mỗi bước một hành động | 1. Mở trang đăng nhập. 2. Nhập email. 3. Nhập mật khẩu. 4. Bấm Đăng nhập |
| Expected Result | Kết quả hệ thống phải trả về | Hiển thị thông báo "Email hoặc mật khẩu không đúng", vẫn ở trang đăng nhập |
| Actual Result | Kết quả quan sát được khi chạy | Điền khi thực thi |
| Status | Pass / Fail / Blocked / Not Run | Fail |
| Priority | Mức độ quan trọng của test case | High |
Ba nhóm test case cần có: Normal – Abnormal – Boundary
Đây là khung tư duy đơn giản nhất để không bỏ sót. Với bất kỳ chức năng nào, hãy tự hỏi ba câu theo thứ tự này.
1. Normal case — luồng đúng
Người dùng làm đúng mọi thứ thì hệ thống có chạy đúng không. Đây là nhóm ít lỗi nhất nhưng bắt buộc phải có, vì nếu luồng chính hỏng thì không cần test tiếp.
2. Abnormal case — luồng sai
Người dùng nhập sai, bỏ trống, nhập sai định dạng, thao tác sai thứ tự, mất mạng giữa chừng. Đây là nơi phần lớn khiếm khuyết ẩn náu, vì lập trình viên thường code cho luồng đúng trước.
3. Boundary case — giá trị biên
Các giá trị nằm ngay tại và sát ranh giới cho phép. Lỗi lệch một đơn vị là loại lỗi kinh điển của lập trình, nên đây là nhóm cho tỉ lệ tìm ra lỗi trên mỗi test case cao nhất.
Ví dụ: bộ test case cho chức năng đăng nhập
Giả sử yêu cầu: người dùng đăng nhập bằng email và mật khẩu; mật khẩu từ 8 đến 32 ký tự; sai quá 5 lần liên tiếp thì khoá tài khoản trong 15 phút.
| ID | Nhóm | Tình huống | Kết quả mong đợi |
|---|---|---|---|
| TC_01 | Normal | Email đúng, mật khẩu đúng | Đăng nhập thành công, chuyển tới trang dashboard |
| TC_02 | Abnormal | Email đúng, mật khẩu sai | Báo "Email hoặc mật khẩu không đúng", không tiết lộ trường nào sai |
| TC_03 | Abnormal | Email không tồn tại | Cùng một thông báo với TC_02 — tránh lộ thông tin tài khoản tồn tại |
| TC_04 | Abnormal | Bỏ trống cả hai trường | Báo lỗi bắt buộc trên từng trường |
| TC_05 | Abnormal | Email sai định dạng: "abc@" | Báo lỗi định dạng email ngay khi rời khỏi trường |
| TC_06 | Boundary | Mật khẩu 7 ký tự | Báo lỗi độ dài tối thiểu |
| TC_07 | Boundary | Mật khẩu 8 ký tự | Chấp nhận, đăng nhập thành công |
| TC_08 | Boundary | Mật khẩu 32 ký tự | Chấp nhận, đăng nhập thành công |
| TC_09 | Boundary | Mật khẩu 33 ký tự | Báo lỗi độ dài tối đa |
| TC_10 | Boundary | Sai mật khẩu lần thứ 5 | Vẫn báo lỗi thường, chưa khoá |
| TC_11 | Boundary | Sai mật khẩu lần thứ 6 | Khoá tài khoản 15 phút, hiển thị thời gian còn lại |
| TC_12 | Abnormal | Đăng nhập đúng khi tài khoản đang bị khoá | Từ chối đăng nhập dù mật khẩu đúng |
| TC_13 | Abnormal | Nhập chuỗi SQL injection vào ô email | Xử lý an toàn, không lỗi máy chủ, không truy vấn bất thường |
| TC_14 | Abnormal | Mật khẩu có khoảng trắng đầu và cuối | Theo đặc tả — nếu chưa quy định, đây là câu hỏi cần hỏi lại BA |
7 nguyên tắc viết test case tốt
- Mỗi test case kiểm tra đúng một điều. Gộp nhiều mục đích vào một test case khiến bạn không biết chính xác cái gì hỏng khi nó fail.
- Viết cho người khác đọc. Giả định người thực thi chưa từng thấy sản phẩm — nếu họ phải hỏi bạn, test case chưa đạt.
- Kết quả mong đợi phải cụ thể và kiểm chứng được. Tránh các từ như "đúng", "bình thường", "hợp lý".
- Độc lập với nhau. Test case sau không nên phụ thuộc vào trạng thái do test case trước để lại, trừ khi bạn cố tình thiết kế một chuỗi.
- Dữ liệu cụ thể, không nói chung chung. Ghi "nhập 100000000" thay vì "nhập số tiền lớn".
- Truy vết được về yêu cầu. Mỗi test case nên chỉ ra nó phủ yêu cầu nào — để khi yêu cầu thay đổi bạn biết cần sửa test case nào.
- Đặt tên có ý nghĩa. Đọc tiêu đề là hiểu tình huống, không cần mở chi tiết.
Mẫu test case dùng ngay
Nếu đội bạn quản lý test case bằng bảng tính, đây là bộ cột tối thiểu nên có. Thêm cột thì được, bớt cột thì nên cân nhắc kỹ.
Test Case ID | Module | Tiêu đề
Precondition | Test Data | Steps
Expected Result| Actual Result | Status
Priority | Requirement ID | Ghi chú
Ví dụ một dòng:
TC_LOGIN_007 | Đăng nhập | Khoá tài khoản sau 6 lần sai mật khẩu
Precondition: Tài khoản test@pinelab.vn active, bộ đếm sai = 0
Test Data: email hợp lệ + mật khẩu sai, lặp 6 lần
Steps: 1) Mở /login 2) Nhập email 3) Nhập mật khẩu sai 4) Bấm Đăng nhập 5) Lặp lại bước 3-4 sáu lần
Expected: Từ lần thứ 6, hệ thống khoá tài khoản 15 phút và hiển thị thời gian còn lại
Priority: High | Requirement: REQ-AUTH-012Câu hỏi thường gặp
Test case và test scenario khác nhau thế nào?
Test scenario là mô tả khái quát về điều cần kiểm thử, ví dụ "kiểm tra chức năng đăng nhập". Test case là hướng dẫn chi tiết cho một tình huống cụ thể trong scenario đó, có dữ liệu đầu vào, các bước và kết quả mong đợi rõ ràng. Một scenario thường sinh ra nhiều test case.
Một chức năng cần viết bao nhiêu test case là đủ?
Không có con số cố định. Tiêu chí đúng là phủ được các phân vùng tương đương, các giá trị biên và các luồng lỗi quan trọng của chức năng đó, ưu tiên theo mức rủi ro. Với một ô nhập đơn giản thường là 6 – 10 test case; với một luồng nghiệp vụ nhiều điều kiện có thể lên vài chục.
Viết test case bằng công cụ gì?
Phổ biến nhất vẫn là Excel hoặc Google Sheets cho đội nhỏ. Đội lớn hơn dùng công cụ quản lý kiểm thử như TestRail, Xray, Zephyr hoặc Qase để liên kết test case với yêu cầu và bug. Công cụ không quan trọng bằng việc test case có rõ ràng và truy vết được hay không.
Có nên viết test case trước khi có sản phẩm không?
Nên. Viết test case dựa trên tài liệu yêu cầu ngay khi có yêu cầu là cách hiệu quả nhất để phát hiện yêu cầu mơ hồ, thiếu hoặc mâu thuẫn. Nếu bạn không viết nổi kết quả mong đợi cho một tình huống, đó là dấu hiệu yêu cầu chưa đủ rõ.