unittest框架 核心知识的系统复习及与pytest的对比
1. unittest 介绍
-
是什么:Python 标准库自带的单元测试框架,遵循 xUnit 架构(类似Java的JUnit)。
-
核心概念:
-
TestCase
:测试用例的基类,所有测试类需继承它。 -
TestSuite
:测试套件,用于聚合多个测试用例。 -
TestLoader
:加载测试用例。 -
TestRunner
:执行测试并输出结果。
-
-
适用场景:单元测试、集成测试,适合需要与Python标准库深度集成的项目。
2. 环境搭建
-
无需安装:Python 自带,直接导入即可:
python
复制
import unittest
3. 用例规则
-
测试类:必须继承
unittest.TestCase
。 -
测试方法:以
test_
开头(如test_login
)。 -
断言方法:使用
self.assertXxx()
(如self.assertEqual()
)。
4. 用例编写示例
python
复制
import unittest
class TestMath(unittest.TestCase):
def test_add(self):
self.assertEqual(1 + 1, 2)
def test_multiply(self):
self.assertTrue(2 * 3 == 6)
if __name__ == "__main__":
unittest.main()
5. 断言方法
方法 | 说明 |
---|---|
self.assertEqual(a, b) | 断言 a == b |
self.assertNotEqual(a, b) | 断言 a != b |
self.assertTrue(x) | 断言 x 为 True |
self.assertFalse(x) | 断言 x 为 False |
self.assertIn(a, b) | 断言 a 在 b 中 |
self.assertRaises(Error) | 断言代码块抛出指定异常 |
6. 测试夹具(Setup/Teardown)
-
类级别:
python
复制
@classmethod def setUpClass(cls): # 类初始化(整个类执行前运行一次) @classmethod def tearDownClass(cls):# 类清理(整个类执行后运行一次)
-
方法级别:
python
复制
def setUp(self): # 每个测试方法执行前运行 def tearDown(self): # 每个测试方法执行后运行
7. 用例跳过
-
无条件跳过:
python
复制
@unittest.skip("跳过原因") def test_skip(self): pass
-
条件跳过:
python
复制
@unittest.skipIf(sys.platform == "win32", "Windows不支持") def test_linux_only(self): pass
8. 测试套件(TestSuite)
-
手动聚合用例:
python
复制
suite = unittest.TestSuite() suite.addTest(TestMath("test_add")) suite.addTest(TestLogin("test_login"))
-
自动发现用例:
python
复制
loader = unittest.TestLoader() suite = loader.loadTestsFromModule(test_module) # 从模块加载 suite = loader.loadTestsFromTestCase(TestMath) # 从类加载
9. 参数化
-
原生不支持:需借助第三方库
parameterized
或ddt
。 -
使用
ddt
示例:python
复制
import ddt @ddt.ddt class TestDataDriven(unittest.TestCase): @ddt.data((1, 2, 3), (0, 0, 0)) @ddt.unpack def test_add(self, a, b, expected): self.assertEqual(a + b, expected)
10. 与 pytest 的对比
特性 | unittest | pytest |
---|---|---|
语法简洁性 | 需继承 TestCase ,断言方法较繁琐 | 无需继承,直接使用 assert |
参数化 | 依赖第三方库(如ddt) | 原生支持 @pytest.mark.parametrize |
夹具 | setUp/tearDown | 更灵活的 @pytest.fixture |
插件生态 | 较少 | 丰富(如并发、Allure报告) |
执行效率 | 较低 | 更高(支持并发) |
11. 集成 HTMLTestRunner(生成测试报告)
步骤:
-
下载
HTMLTestRunner.py
(非标准库,需单独放置)。 -
在代码中调用:
python
复制
with open("report.html", "wb") as f: runner = HTMLTestRunner.HTMLTestRunner( stream=f, title="测试报告", description="用例执行详情" ) runner.run(suite)
12. 生成测试报告
-
控制台输出:
bash
复制
python -m unittest discover -s tests # 自动发现并执行测试
-
XML 报告(用于CI集成):
bash
复制
python -m unittest discover -s tests -p "test_*.py" -v > report.xml
总结
-
适用场景:适合需要与Python标准库无缝集成的项目,或团队习惯xUnit风格。
-
优势:
-
无需额外安装,兼容性强。
-
清晰的类与方法结构。
-
-
劣势:灵活性较低,扩展依赖第三方库。
-
推荐搭配:结合
ddt
(参数化)、coverage
(覆盖率)、HTMLTestRunner
(报告)提升效率。