pytest这个框架提供了非常多的钩子。通过这些钩子我们可以对pytest 用例收集、用例执行、报告输出等各个阶段进行干预,根据需求去开发对应的插件,以满足自己的使用场景。
钩子函数在pytest称之为Hook函数,它pytest框架的开发者,为了让用户更好的去扩展开发预留的一些函数。而预留的这些函数,在整个测试执行的生命周期中特定的阶段会自动去调用执行。如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aJh4ShrP-1689820417032)(/api/attachments/426316)]
pytest中的钩子函数按功能一共分为6类:引导钩子,初始化钩子、用例收集钩子、用例执行钩子、报告钩子、调试钩子。
详细文档可以查看pytest官方文档https://docs.pytest.org/en/latest/reference/reference.html?highlight=hook#hooks
初始化钩子用来调用插件和conftest.py文件的初始化。
参数
触发时机:
作用:
pytest_addoption 钩子函数可以让用户注册一个自定义的命令行参数,以便于用户在测试开始前将数据从外部(如:控制台)传递给程序。
parser.addoption 方法接收以下几个参数:
# conftest.py
def pytest_addoption(parser, pluginmanager):
parser.addoption(
"--env",
dest="env_value",
action="store",
default="test",
choices=["test", "live"],
help="通过自定义命令行参数-env设置当前运行的环境"
)
# ----------------------------------------------------------------------------#
# test_demo.py
import pytest
cases = [
{"id": 1, "title": "demo 001", "username": "flora"},
# {"id": 2, "title": "demo 002", "username": "lucy"},
]
class TestDemo:
@pytest.mark.parametrize("case", cases)
def test_demo(self, case, request):
env = request.config.getoption("env_value")
# 由于 parser.addoption存在参数dest因此需要使用dest的值来获取命令行参数的值,如果没有dest,则可以采用env = request.config.getoption("env")获取命令行参数的值
print("获取到的env的值:", env)
assert case["username"] == "flora"
通过命令pytest -s --env=live
运行测试,结果如下:
parser.addini 方法用于向解析器添加配置文件选项。parser.addini 方法可以接收以下参数:
# conftest.py
import pytest
def pytest_addoption(parser, pluginmanager):
parser.addoption(
"--env",
# dest="env_value",
action="store",
default="test",
choices=["test", "live"],
help="通过自定义命令行参数-env设置当前运行的环境"
)
parser.addini(
'live_host',
type="string",
default="https://www.gitlink.org.cn/",
help='正式环境域名'
)
parser.addini(
'test_host',
type="string",
default="https://www.test.org.cn/",
help='测试环境域名'
)
# 获取 pytest.ini 配置参数
@pytest.fixture(scope="session")
def get_host(pytestconfig, request):
env = request.config.getoption("env")
if env == "test":
host = pytestconfig.getini('test_host')
elif env == "live":
host = pytestconfig.getini('live_host')
else:
host = ""
print(f"\n当前环境域名是:{host}")
通过命令pytest -s --env=live
运行测试,结果如下:
参数
触发时机:
默认作用:
# conftest.py
def pytest_addoption(parser, pluginmanager):
parser.addoption(
"--env",
# dest="env_value",
action="store",
default="test",
choices=["test", "live"],
help="通过自定义命令行参数-env设置当前运行的环境"
)
def pytest_configure(config):
# 获取命令行选项的值
my_option = config.getoption('env')
print(f"获取到的命令行选项值为:{my_option}")
# 添加自定义配置
config.addinivalue_line("markers", "demo: democase")
print("已添加自定义标记 'custom_marker'")
# 获取配置文件选项的值
my_ini_option = config.getini('markers')
print(f"获取到的配置文件选项值为:{my_ini_option}")
# test_demo.py
import pytest
cases = [
{"id": 1, "title": "demo 001", "username": "flora", "age": 17},
# {"id": 2, "title": "demo 002", "username": "lucy", "age": 18},
]
class TestDemo:
@pytest.mark.demo
@pytest.mark.parametrize("case", cases)
def test_demo_01(self, case):
assert case["username"] == "flora"
@pytest.mark.parametrize("case", cases)
def test_demo_02(self, case):
assert case["age"] == 18
通过命令pytest -s --env=live -m=demo
运行测试,结果如下:
参数
触发时机:
参数
触发时机:
参数:
触发时机:
参数
作用:
参数
触发时机:
默认作用: