一起冲鸭
20.73 MB · 2025-12-17
软件开发越做越大,你会发现:
这个时候,自动化测试就是你的“安全网”。 Python 提供两个主流的单元测试框架:
这篇文章带你一次搞懂:
它的特点很“企业级”:
unittest.TestCase更像 Java、C# 那类标准单元测试体系。
假设我们有一个待测试的函数:
def add(a, b):
return a + b
unittest 的写法:
import unittest
from main import add
class TestMath(unittest.TestCase):
def test_add(self):
self.assertEqual(add(2, 3), 5)
self.assertNotEqual(add(2, 3), 6)
if __name__ == "__main__":
unittest.main()
运行方式:
python test_math.py
| 方法 | 描述 |
|---|---|
| assertEqual(a, b) | a == b |
| assertNotEqual(a, b) | a != b |
| assertTrue(x) | x 为 True |
| assertFalse(x) | x 为 False |
| assertIn(x, y) | x in y |
| assertRaises(err, func, args) | 检查是否抛出异常 |
unittest 比较强调规范和结构,适合大型工程。
pytest 是现在最流行的 Python 测试框架,它的目标就是——“简单,强大”。
它的特点:
assert(语法自然)还是刚才的 add 函数:
def test_add():
assert add(2, 3) == 5
assert add(2, 3) != 6
运行方式:
pytest
是不是清爽很多?
pytest 会自动解析出详细的断言对比信息:
assert add(2, 3) == 10
输出:
E assert 5 == 10
E + where 5 = add(2, 3)
调错体验直接拉满。
import pytest
@pytest.mark.parametrize("a,b,res", [
(2, 3, 5),
(1, 1, 2),
(-1, 1, 0)
])
def test_add(a, b, res):
assert add(a, b) == res
一个函数跑多组测试数据,适用于 API 测试、算法验证。
写测试时,不用重复初始化环境:
import pytest
@pytest.fixture
def user():
return {"name": "Tom", "age": 18}
def test_user(user):
assert user["age"] == 18
类似于 Django 的 test client、Flask 的 app fixture,都可以自动提供。
pytest --cov=myproject
直接生成项目的覆盖率报告。
| 对比项 | unittest | pytest |
|---|---|---|
| 是否内置 | 自带 | 需要 pip install |
| 使用风格 | 面向对象 | 更 Pythonic |
| 扩展性 | 一般 | 非常强(插件丰富) |
| 编写难度 | 偏重 | 偏轻松 |
| 自动发现 | 一般 | 很强 |
| 断言 | 专门的断言方法 | 直接用 assert |
一句话总结:
推荐结构:
project/
app/
utils/
tests/
test_utils.py
test_api.py
conftest.py
pytest 会自动识别:
test_ 开头的文件test_ 开头的函数完全可以。 pytest 能自动识别 unittest 的测试类并执行。
比如你公司的老代码用 unittest,你可以逐步迁移到 pytest,不会冲突。
这篇文章帮你梳理了 Python 的两大测试框架:
如果你问我项目里用哪个?
99% 的情况用 pytest 因为它是真·好用,同时更适合现代 Python 工程。