书籍来源:房荔枝 梁丽丽《pytest框架与自动化测试应用》
一边学习一边整理老师的课程内容及实验笔记,并与大家分享,侵权即删,谢谢支持!
附上汇总贴:pytest框架进阶自学系列 | 汇总_热爱编程的通信人的博客-CSDN博客
pytest实现参数化有3种方式:
- pytest.fixture()使用fixture传params参数实现参数化;
- @pytest.mark.parametrize允许在测试函数或类中定义多组参数;
- pytest_generate_tests允许定义自定义参数化方案或扩展。
分别在3.8节和4.2节介绍了前面两种方式。本节简单介绍自定义参数化方案。
pytest_generate_tests在测试用例参数化收集前调用此钩子函数,根据测试配置或定义测试函数的类或模块中指定的参数值生成测试用例,可以使用此钩子实现自定义参数化方案或扩展。
有时可能要实现自己的参数化方案或实现某种动态性来确定fixture的参数或范围,因此,可以使用pytest_generate_tests在收集测试函数时调用的钩子。通过传入的metafunc对象,可以检查请求的测试上下文,最重要的一点是,可以调用metafunc.parametrize()引起参数化。
我们先看一看源码中是怎么使用这种方法的。
源码如下:
首先,它检查了parametrize的拼写错误,如果不小心将parametrize写成了["parameterize","parametrise","parameterise"]中的一个,pytest会返回一个异常,并提示正确的单词,然后循环遍历所有的parametrize的标记,并调用metafunc.parametrize方法。
例如,假设我们要运行一个测试,并接收通过新的pytest命令行选项设置的字符串输入。我们首先需要编写一个接收stringinput函数参数的简单测试。
我们检查给定的stringinput是否只由字母组成,但是我们并没有为其打上parametrize标记,所以stringinput被认为是一个fixture。
代码如下:
def test_valid_string(stringinput):
assert stringinput.isalpha()
现在,我们期望把stringinput当成一个普通的参数,并且从命令行赋值。
首先,我们定义一个命令行选项。
代码如下:
def pytest_addoption(parser):
parser.addoption(
"--stringinput",
action="append",
default=[],
help="list of stringinputs to pass to test functions",
)
然后,我们通过pytest_generate_tests方法,将stringinput的行为由fixture改成parametrize。
代码如下:
def pytest_addoption(parser):
parser.addoption(
"--stringinput",
action="append",
default=[],
help="list of stringinputs to pass to test functions",
)
def pytest_generate_tests(metafunc):
if "stringinput" in metafunc.fixturenames:
metafunc.parametrize("stringinput", metafunc.config.getoption("stringinput"))
最后,我们可以通过--stringinput命令行选项为stringinput参数赋值。
代码如下:
PS D:\SynologyDrive\CodeLearning\WIN\pytest-book\src\chapter-4> pytest -q --stringinput='hello' --stringinput='world' .\test_strings.py
.. [100%]
2 passed in 0.03s
PS D:\SynologyDrive\CodeLearning\WIN\pytest-book\src\chapter-4>
如果我们不加--stringinput选项,相当于parametrize的argnames中的参数没有接收到任何的实参,那么测试用例的结果将会被置为SKIPPED。
PS D:\SynologyDrive\CodeLearning\WIN\pytest-book\src\chapter-4> pytest -q .\test_strings.py
s [100%]
1 skipped in 0.00s
PS D:\SynologyDrive\CodeLearning\WIN\pytest-book\src\chapter-4>
不管是metafunc.parametrize方法还是@pytest.mark.parametrize标记,它们的参数(argnames)不能是重复的,否则会产生一个错误:ValueError:duplicate 'stringinput'。