Hướng Dẫn Viết Test Case Đầu Tiên Bằng unittest Trong Python: Nền Tảng Kiểm Thử Chuyên Nghiệp

Trong hành trình phát triển phần mềm, việc viết code chạy được chỉ mới là thành công một nửa. Nửa còn lại — và cũng là yếu tố phân định giữa một lập trình viên thông thường và một Software Engineer chuyên nghiệp — chính là khả năng viết kiểm thử tự động (Unit Testing).
Nếu bạn chưa từng viết test case bao giờ, đừng lo lắng! Thư viện chuẩn unittest tích hợp sẵn trong Python sẽ là bước đệm hoàn hảo giúp bạn làm chủ kỹ năng này. Bài viết này sẽ dẫn dắt bạn qua cấu trúc chuẩn của một file test và các câu lệnh khẳng định (Assertions) cốt lõi.
🟩 PHẦN 1: CẤU TRÚC FILE TEST (STRUCTURE)
Một file kiểm thử tự động với unittest luôn tuân thủ một cấu trúc khung xương cố định gồm 4 thành phần bắt buộc:
- Import thư viện: Luôn có dòng lệnh import unittest ở dòng đầu tiên của file.
- Kế thừa TestCase: Lớp kiểm thử (Test Class) phải được khai báo kế thừa từ unittest.TestCase (Ví dụ: class TestMathOperations(unittest.TestCase):).
- Tiền tố tên hàm (test_): Từng hàm kiểm thử bên trong lớp bắt buộc phải bắt đầu bằng tiền tố viết thường test_ (Ví dụ: test_addition_success). Nếu bạn đặt tên hàm không có tiền tố này, Python sẽ hoàn toàn phớt lờ và không chạy hàm đó.
- Hàm kích hoạt (if __name__ == "__main__":): Cuối file cần có khối lệnh chuẩn để cho phép chạy trực tiếp file test qua dòng lệnh.
import unittest
class TestCalculator(unittest.TestCase):
def test_addition_success(self):
# Hàm kiểm thử bắt đầu bằng tiền tố test_
sum_result = 2 + 3
self.assertEqual(sum_result, 5)
if __name__ == "__main__":
unittest.main()
🟨 PHẦN 2: CÁC CÂU LỆNH KHẲNG ĐỊNH (ASSERTIONS)
Assertions (Các hàm khẳng định) là công cụ giúp bạn so sánh kết quả thực tế (actual) với kết quả mong đợi (expected). Nếu kết quả khớp, test case pass; nếu sai lệch, test case sẽ thất bại và báo cáo lỗi chi tiết.
1. self.assertEqual(actual, expected)
Dùng để kiểm tra tính bằng nhau giữa kết quả thực tế do hàm của bạn trả về và kết quả kỳ vọng.
def multiply(a: int, b: int) -> int:
return a * b
class TestMath(unittest.TestCase):
def test_multiply(self):
result = multiply(3, 4)
self.assertEqual(result, 12) # Khẳng định 12 bằng kết quả thực tế
2. self.assertTrue() và self.assertFalse()
Dùng để kiểm tra tính đúng/sai của một mệnh đề logic hoặc kết quả trả về từ một hàm kiểm tra điều kiện.
class TestConditions(unittest.TestCase):
def test_even_number(self):
is_even = (4 % 2 == 0)
self.assertTrue(is_even) # Khẳng định biểu thức là True
is_odd = (5 % 2 == 0)
self.assertFalse(is_odd) # Khẳng định biểu thức là False
3. self.assertIn(item, container)
Dùng để kiểm tra xem một phần tử (hoặc một chuỗi con) có thực sự nằm bên trong một list, tuple, dict, hay string hay không.
class TestCollections(unittest.TestCase):
def test_item_in_list(self):
fruits = ["apple", "banana", "orange"]
self.assertIn("banana", fruits) # Kiểm tra "banana" có trong list không
text = "Hello Python Developer"
self.assertIn("Python", text) # Kiểm tra chuỗi con trong string
4. self.assertRaises(Exception)
Đây là kỹ thuật viết test nâng cao cực kỳ quan trọng: kiểm tra xem hàm của bạn có chủ động ném ra lỗi (exception) chính xác khi người dùng truyền sai dữ liệu đầu vào hay không.
def calculate_square_root(x: float) -> float:
if x < 0:
raise ValueError("Không thể tính căn bậc hai của số âm!")
return x ** 0.5
class TestErrorHandling(unittest.TestCase):
def test_negative_input_raises_error(self):
# Dùng với dạng with-context để bắt lỗi ValueError
with self.assertRaises(ValueError):
calculate_square_root(-4)
📌 Lời Kết
Viết test case đầu tiên có vẻ là một bước nhỏ, nhưng nó đánh dấu cột mốc bạn chuyển dịch sang tư duy lập trình hướng chất lượng. Hãy mở IDE của bạn lên, tạo ngay một file test_*.py và thử áp dụng cấu trúc unittest cùng các câu lệnh assert ngay hôm nay!
Từ khóa tìm hiểu thêm: Python unittest tutorial, Writing first test case Python, Python assertions list, Unit testing best practices.
Bình luận