Unit Test Trong Python: Hướng Dẫn Chi Tiết
📌 Nội dung chính:
1️⃣ Unit Test là gì?
2️⃣ Tại sao cần viết Unit Test?
3️⃣ Các công cụ Unit Test trong Python
4️⃣ Viết Unit Test với unittest
5️⃣ Viết Unit Test với pytest
6️⃣ Mocking trong Unit Test
7️⃣ Tích hợp Unit Test vào CI/CD
1. Unit Test là gì?
💡 Unit Test (Kiểm thử đơn vị) là quá trình kiểm thử từng đơn vị nhỏ nhất của code (hàm, class, module) để đảm bảo chúng hoạt động đúng như mong đợi.
🚀 Mục tiêu của Unit Test:
- Kiểm tra tính đúng đắn của từng thành phần.
- Phát hiện lỗi sớm trong quá trình phát triển.
- Giúp code dễ bảo trì, mở rộng.
- Tự động hóa kiểm thử, giảm lỗi do con người.
2. Tại sao cần viết Unit Test?
✅ Giúp phát hiện lỗi sớm trước khi code được đưa vào hệ thống.
✅ Đảm bảo các chức năng hoạt động chính xác sau khi chỉnh sửa code.
✅ Giúp tự tin refactor code mà không sợ phá vỡ chức năng cũ.
✅ Tiết kiệm thời gian kiểm thử thủ công.
📌 Ví dụ thực tế:
Giả sử bạn có một hàm tính tổng:
def add(a, b):
return a + b
Nếu không có Unit Test, bạn phải chạy thủ công nhiều lần để kiểm tra. Nhưng nếu có Unit Test, chỉ cần chạy pytest hoặc unittest là đủ.
3. Các công cụ Unit Test trong Python
Python có nhiều công cụ để viết Unit Test:
🔹 unittest (có sẵn trong Python)
🔹 pytest (dễ dùng, hỗ trợ nhiều tính năng hơn)
🔹 nose2 (mở rộng từ unittest)
📌 Công cụ khuyên dùng: pytest vì đơn giản, dễ đọc, dễ mở rộng.
4. Viết Unit Test với unittest
unittest là framework kiểm thử có sẵn trong Python.
👉 Cài đặt (Python đã có sẵn unittest, không cần cài thêm).
Ví dụ 1: Test Hàm Đơn Giản
import unittest
def add(a, b):
return a + b
class TestMath(unittest.TestCase):
def test_add(self):
self.assertEqual(add(2, 3), 5) # Kiểm tra 2 + 3 = 5
self.assertEqual(add(-1, 1), 0) # Kiểm tra -1 + 1 = 0
if __name__ == '__main__':
unittest.main()
📌 Giải thích:
unittest.TestCase: Định nghĩa một bộ kiểm thử.self.assertEqual(): So sánh kết quả với giá trị mong đợi.
✅ Chạy Unit Test:
python test_math.py
Ví dụ 2: Test Class
import unittest
class Calculator:
def add(self, a, b):
return a + b
class TestCalculator(unittest.TestCase):
def setUp(self): # Chạy trước mỗi test
self.calculator = Calculator()
def test_add(self):
self.assertEqual(self.calculator.add(2, 3), 5)
def tearDown(self): # Chạy sau mỗi test
del self.calculator
if __name__ == '__main__':
unittest.main()
📌 Giải thích:
setUp(): Chuẩn bị dữ liệu trước mỗi test.tearDown(): Dọn dẹp sau mỗi test.
5. Viết Unit Test với pytest
🔥 pytest dễ dùng hơn unittest và hỗ trợ nhiều tính năng mạnh mẽ.
👉 Cài đặt pytest
pip install pytest
👉 Viết Unit Test đơn giản với pytest
def add(a, b):
return a + b
def test_add():
assert add(2, 3) == 5
assert add(-1, 1) == 0
✅ Chạy test với pytest:
pytest test_math.py
📌 Lợi ích của pytest:
✔ Không cần kế thừa class unittest.TestCase.
✔ Sử dụng assert thay vì self.assertEqual().
6. Mocking trong Unit Test
Mocking là kỹ thuật dùng đối tượng giả thay thế đối tượng thật khi test.
👉 Ví dụ: Mock API Call
import requests
from unittest.mock import patch
def get_user():
response = requests.get("https://api.example.com/user")
return response.json()
def test_get_user():
with patch('requests.get') as mock_get:
mock_get.return_value.json.return_value = {"name": "Thảo"}
assert get_user() == {"name": "Thảo"}
📌 Lợi ích của Mocking:
✔ Test nhanh hơn, không cần gọi API thật.
✔ Kiểm soát dữ liệu đầu vào của test.
7. Tích hợp Unit Test vào CI/CD
Unit Test có thể được tích hợp vào CI/CD pipeline để tự động kiểm tra code trước khi deploy.
Tích hợp Unit Test với GitHub Actions
📌 Tạo file .github/workflows/test.yml
name: Run Unit Tests
on: [push]
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Setup Python
uses: actions/setup-python@v2
with:
python-version: '3.10'
- name: Install dependencies
run: pip install pytest
- name: Run tests
run: pytest
📌 Lợi ích:
✔ Tự động chạy Unit Test khi push code.
✔ Báo lỗi ngay lập tức nếu test thất bại.
8. Khi Nào Nên Viết Unit Test?
✅ Khi viết hàm tính toán quan trọng.
✅ Khi có chức năng phức tạp, dễ lỗi.
✅ Khi làm việc trong nhóm (giúp tránh bug khi nhiều người sửa code).
🚨 Không cần viết Unit Test nếu:
❌ Hàm quá đơn giản (chỉ return giá trị cố định).
❌ Code chỉ chạy một lần và không dùng lại.
9. Tổng Kết
✔ Unit Test giúp kiểm tra code chính xác, tránh lỗi khi phát triển.
✔ Dùng unittest cho dự án nhỏ, pytest cho dự án lớn.
✔ Mocking giúp kiểm thử nhanh hơn, không cần gọi API thật.
✔ Tích hợp Unit Test vào CI/CD giúp tự động kiểm tra code trước khi deploy.
💡 Bạn có câu hỏi gì về Unit Test? Hãy để lại bình luận bên dưới!