Pytest fixture如何识别测试跳过状态以跳过teardown清理逻辑
解决方案
要让fixture感知关联测试用例是否被跳过,核心是借助pytest内置的request fixture获取测试执行上下文,配合pytest的测试报告钩子存储用例执行状态,步骤如下:
- 第一步:在项目根目录的
conftest.py文件中添加如下钩子函数,将每个测试用例各阶段的执行结果挂载到测试节点对象上,方便fixture后续读取:
import pytest @pytest.hookimpl(tryfirst=True, hookwrapper=True) def pytest_runtest_makereport(item, call): outcome = yield test_report = outcome.get_result() setattr(item, f"rep_{test_report.when}", test_report)
- 第二步:修改原有
create_docker_imagefixture,注入request对象,在teardown逻辑执行前判断测试用例的执行状态,若测试被跳过则终止删除逻辑:
@pytest.fixture def create_docker_image(request): image_name = get_image_name_for_local_test() yield image_name # 校验测试执行状态,跳过场景下不执行镜像删除 if hasattr(request.node, "rep_call") and request.node.rep_call.skipped: return delete_result = delete_docker(image_name)
补充说明
- 上面的判断只覆盖test函数运行时触发的跳过,如果测试在fixture初始化(setup)阶段就被跳过,可以再加一层
request.node.rep_setup.skipped的判断。 - 如果测试失败的时候你也不想删镜像,就在判断条件里加上
or request.node.rep_call.failed就行。 request是pytest自带的内置fixture,不用自己实现,直接在fixture参数里声明就能用。
内容的提问来源于stack exchange,提问作者Shurik
相关产品推荐
相关产品推荐

