Pytest 内置插件 hook 体系
接下来我们来学习如何使用 hook 体系开发内置插件。
简介
Pytest 提供了许多钩子(hooks)来扩展和自定义测试执行的行为。
钩子是在特定的事件点自动调用的函数,允许你在测试过程中进行自定义操作。
首先我们先来了解一下什么是 hook。其实 hook 就是 pytest 提供了一些非常有用的钩子函数,可以在测试执行的不同阶段自动触发一些自定义的操作。这些钩子函数允许我们对测试流程进行调整和扩展,从而满足项目的需求。比如,可以在测试开始前、执行中或结束后做一些额外的处理。
Pytest hook 函数的优点
-
自动触发机制:Pytest 钩子函数是在 Pytest 测试执行过程中自动触发的,无需显式调用。Pytest 根据特定的事件点在合适的时机自动调用这些函数。
-
预定义名称:每个 Pytest 钩子函数都有一个预定义的名称,这些名称是 Pytest 所认可的,你只需按照这些名称来定义函数,Pytest 就会自动调用它们。
-
自定义操作:Pytest 钩子函数允许你在测试执行过程中执行自定义操作,以满足特定需求。你可以在这些钩子函数中编写代码来修改配置、记录日志、动态生成测试用例、处理测试结果等。
-
扩展性:Pytest 钩子函数提供了灵活性和扩展性,允许你自定义测试框架的行为,以适应不同的项目和测试场景。
-
丰富的钩子函数库:Pytest 提供了许多不同的钩子函数,涵盖了测试的各个方面,包括配置、收集、执行、报告等,这使得你可以在测试过程中干预或扩展任何阶段的行为。
使用 hook 函数有哪些优点呢?首先,钩子函数最大的好处就是自动触发。你不需要手动去调用它们,pytest 会在适当的时机自动执行。比如,当测试用例收集完成时,pytest 会自动调用 pytest collection modifyitems 钩子,让你可以在测试执行前修改测试用例的顺序或者做一些其他处理。其次,pytest 为每个钩子函数都定义了一个标准的名称,只要你按照这个名称来定义函数,pytest 就会自动找到它并执行。这就减少了很多繁琐的配置工作。而且钩子函数非常灵活,可以在里面执行各种自定义操作,例如记录日志、动态生成测试用例、修改测试配置等等,完全取决于你项目的需求。再者,钩子函数的扩展性也很强。你可以根据项目的具体情况,定义自己需要的钩子,并将它们集成到 pytest 测试框架中。这使得 pytest 在应对不同测试需求时,变得更加灵活和适应性强。最后,pytest 提供了丰富的钩子函数库,涵盖了从配置、收集、执行到报告等各个测试阶段。几乎可以在任何阶段插入自定义操作。
Pytest hook 函数执行顺序
Pytest hook 函数的执行顺序在测试执行的不同阶段会有所不同。
以下是一些常见的 Pytest 钩子函数以及它们的执行顺序:
···
# 添加命令行参数,运时会先读取命令行参数
pytest_addoption
# 收集测试用例,收集之后(改编码,改执行顺序)
pytest_collection_modifyitems
# 收集之后的操作
pytest_collection_finish
# 在调用 pytest_runtest_call 之前调用
pytest_runtest_setup
# 运行测试用例,返回 setup,call,teardown 的执行结果
pytest_runtest_makereport
···
这么多钩子函数的执行顺序是怎么样的么?pytest 的钩子函数执行顺序是根据测试执行的不同阶段来决定的。举个例子,首先会触发 pytest addoption 钩子函数来解析命令行参数,然后在收集测试用例后,触发 pytest collection modifyitems 钩子,我们可以在这个阶段修改测试用例的顺序。接着是 pytest collection finish 钩子,表示测试用例收集完毕。在测试用例执行前,会调用 pytest runtest setup 来进行一些准备工作,然后才会真正运行测试用例,执行 pytest runtest makereport 钩子,返回测试用例的执行结果。每个钩子函数的作用和执行时机都非常清晰,便于在合适的时机做出自定义的操作。
需要注意的是,钩子函数的执行顺序可以根据具体的测试配置和需求而有所不同。不同的测试插件和配置选项也可能引入额外的钩子函数,从而影响执行顺序。 通常情况下,Pytest 会根据钩子的定义和命名规则来触发它们,但具体的执行顺序是由 Pytest 控制的。
需要特别注意的是,钩子函数的执行顺序也会受到测试配置和需求的影响,具体顺序可能会有所调整。比如不同的插件和配置选项也可能会增加额外的钩子函数,这些都会影响最终的执行顺序。不过,通常情况下,pytest 会遵循一定的规则来调用钩子函数。
总结
- Pytest hook 函数的优点。
- Pytest hook 函数执行顺序。
好了,关于 hook 的用法我们先介绍这么多。