如何修改unittest或pytest实现所有测试用例自动打印起止日志?
无侵入测试启停日志插桩方案
以下两种方案均不需要修改现有测试用例代码,可直接全局生效。
unittest 框架实现方案
unittest 内置的 TestCase 基类提供了每个测试用例执行前后的钩子方法 setUp 和 tearDown,我们可以通过 Monkey Patch 全局替换这两个方法,统一注入日志逻辑:
- 把以下代码放到测试执行入口的最顶部,或者单独存为一个 patch 脚本,在执行测试前先运行该脚本即可:
import unittest # 备份原始方法避免原有逻辑丢失 original_setUp = unittest.TestCase.setUp original_tearDown = unittest.TestCase.tearDown def patched_setUp(self): print("Start test") # 保留原有setUp逻辑 if original_setUp: original_setUp(self) def patched_tearDown(self): # 先执行原有tearDown逻辑 if original_tearDown: original_tearDown(self) print("End of test") # 全局替换基类方法 unittest.TestCase.setUp = patched_setUp unittest.TestCase.tearDown = patched_tearDown
该方案对所有继承自 unittest.TestCase 的测试类都生效,无需修改任何测试用例代码。
pytest 框架实现方案
pytest 可以通过全局自动生效的 fixture 实现该需求,不需要修改任何测试代码:
- 在测试根目录新建
conftest.py文件,写入以下内容:
import pytest # autouse=True 表示该fixture对所有测试用例自动生效,默认scope为function,每个测试用例执行一次 @pytest.fixture(autouse=True) def inject_test_log(): print("Start test") # yield 之前的代码在测试执行前运行,之后的代码在测试执行后运行 yield print("End of test")
执行测试时pytest会自动加载conftest.py中的配置,所有测试用例都会自动触发日志打印。
内容的提问来源于stack exchange,提问作者Ran Elbaz
相关产品推荐
相关产品推荐

