pytest的钩子函数

pytest中的钩子函数的使用

1 pytest_collect_file

它允许你自定义 pytest 如何从文件系统中收集测试文件。这个钩子函数在你想要自定义 pytest 收集测试文件的行为时非常有用。

接收两个参数:

  1. file_path:文件路径
  2. parent:Collector 收集器,指向py文件或者yaml文件的父目录,即package

下面的代码实现的是,找到所有以yaml结尾的文件,从文件路径中根据运行目录匹配出要运行的yaml文件,进行yaml文件的数据处理,构建以test_开头的测试方法并规定了方法里面要执行的内容,然后将方法包装为item去执行。参考的是:https://blog.csdn.net/Hogwartstester/article/details/129876861?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171578310616800211547150%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=171578310616800211547150&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-129876861-null-null.nonecase&utm_term=%E6%95%B0%E6%8D%AE%E9%A9%B1%E5%8A%A8&spm=1018.2226.3001.4450

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 将钩子函数写在conftest.py文件中
def pytest_collect_file(file_path: Path, parent):
if file_path.suffix == ".yaml" and "mall" in str(file_path):
pytest_module = Module.from_parent(parent, path=file_path)
# 动态创建module
myModule = types.ModuleType(file_path.stem)
# 解析yaml内容
yaml_info_dict = YamlUtil(file_path).read_yaml()
# 进行yaml内容格式检查

# 参数化,利用fixture的带参传递
# 处理yaml中的config
if yaml_info_dict['config']['variables'] is not None:
CaseConfigHandle().get_config_dict(yaml_info_dict['config']['variables'])
# 获取测试步骤数据
yaml_steps = yaml_info_dict["teststeps"]
# 遍历测试用例
for step in yaml_steps:
# 定义要动态创建的方法

def function_template(*arge, **kwargs):
# allure报告信息
allure.dynamic.epic(step['epic'])
allure.dynamic.feature(step['feature'])
allure.dynamic.story(step['story'])
allure.dynamic.title(step['title'])
# 2. 将请求信息进行处理
CaseInfoHandle().case_core(step)
# 动态向myModule中加入函数,函数名称取值为yaml中的func_name
# 构建函数名称
if step['mark'] is not None:
func_name = step['func_name'] + "_" + step["mark"]
else:
func_name = step['func_name'] + "_" + "nomark"
setattr(myModule, func_name, function_template)
# 重写_getobj属性,使用了lambda匿名函数
pytest_module._getobj = lambda: myModule
return pytest_module

2 pytest_collection_modifyitems

pytest_collection_modifyitems 是 pytest 的一个内置钩子函数,它允许你在测试用例被收集完成之后,但在执行之前,对它们进行修改或重新排序。这个钩子函数通常用于定制测试用例的执行顺序、添加或删除标记(markers)、更改测试用例的名称等。

pytest_collection_modifyitems 钩子函数接收三个参数:

  1. session:一个表示 pytest 会话的对象,它包含了有关整个测试会话的信息。
  2. config:pytest 的配置对象,它包含了从命令行选项、配置文件等中解析出的配置信息。
  3. items:一个包含所有已收集测试用例(item)的列表。每个测试用例都是一个 Item 对象,包含了关于测试用例的所有信息,如名称、标记、执行函数等。

可以通过修改 items 列表中的 Item 对象来改变测试用例的执行顺序或添加其他属性。例如,你可以使用 items.sort() 方法对测试用例进行排序,或者使用 item.add_marker() 方法给测试用例添加标记。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 将钩子函数写在conftest.py文件中
def pytest_collection_modifyitems(session, config, items):
for item in items:
if "skip" in item.name:
item.add_marker(pytest.mark.skip(reason="跳过"))
elif "xfail" in item.name:
item.add_marker(pytest.mark.xfail(reason="预期失败"))
elif "nomark" in item.name:
pass
else:
mark_name = item.name.split('_')[-1]
# 添加标记
item.add_marker(mark_name)
------------- End -------------