Python测试: unitest
已于 2025年07月20日 11:06 修改
访问次数:0
下面是一个简明而全面的 Python unittest 和 unittest.mock 的使用教程,适合初学者和希望巩固基础的开发者。
🧪 一、unittest 基础使用
Python 内置的 unittest 模块是一个用于编写和运行单元测试的标准库。
1.1 编写一个简单测试
假设我们有一个被测试的函数:
# calculator.py
def add(a, b):
return a + b
编写对应的测试文件:
# test_calculator.py
import unittest
from calculator import add
class TestCalculator(unittest.TestCase):
def test_add(self):
self.assertEqual(add(2, 3), 5)
self.assertEqual(add(-1, 1), 0)
self.assertNotEqual(add(2, 2), 5)
if __name__ == '__main__':
unittest.main()
运行测试:
python test_calculator.py
🧰 二、常用断言方法
| 方法 | 说明 |
|---|---|
assertEqual(a, b) | 断言 a == b |
assertNotEqual(a, b) | 断言 a != b |
assertTrue(x) | 断言 bool(x) is True |
assertFalse(x) | 断言 bool(x) is False |
assertIs(a, b) | 断言 a is b |
assertIsNone(x) | 断言 x is None |
assertIn(a, b) | 断言 a in b |
assertRaises(Exception) | 断言某个异常被抛出 |
示例:
def div(a, b):
return a / b
class TestMath(unittest.TestCase):
def test_div_zero(self):
with self.assertRaises(ZeroDivisionError):
div(1, 0)
🧪 三、使用 unittest.mock 模拟依赖
unittest.mock 模块用于替换代码中某些部分,以便隔离测试。
3.1 mock 一个函数
# weather.py
import requests
def get_weather(city):
response = requests.get(f"https://api.weather.com/{city}")
return response.json()
测试时我们不希望真的请求 API:
# test_weather.py
import unittest
from unittest.mock import patch
from weather import get_weather
class TestWeather(unittest.TestCase):
@patch('weather.requests.get')
def test_get_weather(self, mock_get):
mock_get.return_value.json.return_value = {'temp': 25}
result = get_weather('beijing')
self.assertEqual(result['temp'], 25)
if __name__ == '__main__':
unittest.main()
3.2 mock 方法返回值
mock_obj.method.return_value = 123
3.3 mock.side_effect
用于模拟抛异常或多次返回不同值:
mock_obj.method.side_effect = ValueError("error")
mock_obj.method.side_effect = [1, 2, 3]
🧪 四、常用 Mock 工具
| 工具 | 说明 |
|---|---|
patch | 临时替换对象 |
patch.object | 替换对象的属性 |
MagicMock() | 自动支持大部分魔法方法的 Mock 对象 |
Mock() | 基本的可配置模拟对象 |
🔁 五、组织测试代码的结构
my_project/
│
├── calculator.py
├── weather.py
├── tests/
│ ├── __init__.py
│ ├── test_calculator.py
│ └── test_weather.py
运行所有测试:
python -m unittest discover -s tests
✅ 小结
- 用 unittest 进行结构化测试。
- 用 unittest.mock 替换外部依赖(如 HTTP 请求、数据库等)。
- 使用 patch() 是最常用的 mock 技术。
- 测试结构清晰有助于维护和 CI/CD。
如果你希望我生成一个完整的可运行项目模板(zip 文件)或想学习 pytest(更现代的测试框架),也可以告诉我!
评论(0)