pytest默认执行用例是根据项目下的文件名称按ascii码去收集运行的;文件中的用例是从上往下按顺序执行的。
【严格意义上来说,我们在用例设计原则上用例就不要有依赖顺序,这样才能更好的体现出测试用例的意义。(测试用例的执行不需要按照顺序来执行,而是随即执行)】
在Python的测试框架pytest中,钩子函数是一种特殊类型的函数,可以在测试执行的不同阶段进行干预。这些钩子函数提供了在测试过程中插入自定义逻辑的机会,使测试更加灵活和可配置。其中,pytest_collection_modifyitems
是一个非常有用的钩子函数,允许在测试收集阶段对测试项进行修改或过滤。
功能和作用pytest_collection_modifyitems
钩子函数允许用户在测试收集完成后、测试执行开始之前,对收集到的测试项进行修改或过滤。这意味着你可以基于收集到的测试项的信息,动态地决定是否跳过某些测试、修改测试的参数或条件等。
使用场景
- 动态过滤测试用例:基于某些条件(如环境变量、配置文件等),你可能希望动态地决定是否执行某些测试用例。使用
pytest_collection_modifyitems
,你可以在收集完所有测试用例之后,根据需要过滤掉不需要的测试项。 - 动态修改测试参数:在某些情况下,你可能需要根据环境或配置来动态地改变测试的参数。通过在
pytest_collection_modifyitems
中修改测试项,你可以实现这一目标。 - 集成第三方库或插件:当集成第三方库或插件时,你可能需要调整或修改已收集的测试项以适应这些库或插件的特定要求。
pytest_collection_modifyitems
提供了一个机会来调整这些测试项。
实现方式
要使用pytest_collection_modifyitems
钩子函数,你需要在你的pytest配置文件(通常是conftest.py
)中定义一个函数,并使用pytest.mark.hookwrapper
装饰器来标记它。这样,pytest将自动在收集阶段调用这个函数,并确保它按照期望的方式工作。
下面是一个简单的示例:import pytest
@pytest.mark.hookwrapper
def pytest_collection_modifyitems(session, config, items):
# 在这里进行你的自定义逻辑
# 例如,根据条件过滤掉某些测试项
for item in items:
if some_condition(item):
items.remove(item) # 移除满足条件的测试项
yield # 确保钩子函数正常结束
pytest_collection_modifyitems
的钩子函数,并使用pytest.mark.hookwrapper
装饰器标记它。在函数内部,我们遍历收集到的测试项,并根据某些条件(如some_condition
函数)决定是否移除它们。最后,我们使用yield
关键字确保钩子函数正常结束。
请注意,上述示例仅用于说明目的。在实际应用中,你需要根据你的具体需求来实现自定义逻辑。
示例: