2026-10-19 15:51:54
Python单元测试框架unittest和pytest的区别
unittest和pytest是Python中常用的两个单元测试框架,它们各有特点,适用于不同的测试场景和需求。以下是两者的详细对比:
一、用例编写规则
unittest:
测试文件必须先import unittest。
测试类必须继承unittest.TestCase。
测试方法必须以“test_”开头。
测试类必须要有unittest.main()方法以运行测试。
pytest:
测试文件名必须以“test_”开头或者“_test”结尾。
测试方法必须以“test_”开头。
测试类命名以"Test"开头(非强制,但推荐)。
pytest可以执行unittest风格的测试用例,无须修改unittest用例的任何代码,具有较好的兼容性。
二、用例前置和后置
unittest:
提供了setUp/tearDown方法,用于在每个测试方法执行前后进行初始化和清理工作。但这两个方法只能针对所有用例,灵活性较低。
pytest:
提供了模块级、函数级、类级、方法级的setup/teardown,比unittest更灵活。
还可以使用@pytest.fixture()装饰器来定义fixture函数,fixture的使用范围可以是function、module、class、session,具有更高的灵活性和可重用性。
fixture相对于setup和teardown来说,命名方式更灵活,可以在conftest.py配置里实现数据共享,不需要import就能自动找到一些配置,可供多个py文件调用。
三、断言
unittest:
提供了丰富的断言方法,如assertEqual、assertIn、assertTrue、assertFalse等。
pytest:
直接使用assert表达式进行断言,简洁明了。
四、报告
unittest:
通常使用HTMLTestRunnerNew库来生成HTML格式的测试报告。
pytest:
提供了pytest-HTML插件来生成HTML格式的测试报告。
还可以使用allure插件生成更丰富的测试报告。
五、失败重跑
unittest:
无此功能。
pytest:
支持用例执行失败重跑,通过pytest-rerunfailures插件实现。
六、参数化
unittest:
需依赖ddt库来实现参数化测试。
pytest:
直接使用@pytest.mark.parametrize装饰器来实现参数化测试,更加简洁方便。
七、用例分类执行
unittest:
默认执行全部用例,但可以通过加载TestSuite来执行部分用例。
pytest:
可以通过@pytest.mark来标记类和方法,然后通过pytest.main加入参数("-m")来只运行标记的类和方法。
八、其他特点
unittest:
用例格式相对复杂,兼容性无,插件较少,但适合进行二次开发。
pytest:
用例格式简单,易于上手。
插件丰富,如flask插件可用于Web应用的测试,xdist插件可实现设备并行执行,提高测试效率。
总结表格

综上所述,unittest和pytest各有优缺点,选择哪个框架取决于具体的测试需求和项目特点。对于初学者来说,pytest可能更容易上手和理解;而对于需要进行复杂测试场景和二次开发的项目来说,unittest可能更加合适。