提示
request是pytest的内置fixture函数;为请求对象提供对请求测试上下文的访问权,并且在fixture函数被间接参数化的情况下具有可选的"param"属性。
参考:
:pytest之内置fixture函数之request详解(request.params && request.config && request.module )
request.param:用于获取测试的请求参数
①【注意】fixture函数的 params 请求参数数量(请求参数的数据类型为列表/元组,请求参数数量为列表/元组元素个数)决定fixture函数执行的次数。
②【注意】此时fixture函数的装饰器 @pytest.fixture(params=test_data) 参数不能忘记传值。
创建一个文件,直接运行test_register函数
import pytest
# 测试数据
test_data = ["user1", "user2"]
@pytest.fixture(params=test_data)
def register_users(request):
# 获取当前的测试数据
user = request.param
print("setup前置函数拿着这个账号去注册:%s"%user)
result = "success"
return user, result
def test_register(register_users):
user, result = register_users
print("在测试用例里面里面获取到当前测试数据:%s"%user)
print(result)
assert result == "success"
在测试方法中可以调用request内置fixture函数来获得pytest配置对象中指定的自定义参数值,但是在conftest.py
文件中,文件名不能变化
# conftest.py
def pytest_addoption(parser):
parser.addoption("--cmdopt",
action="store",
default=100,
type=int,
help="将命令行参数'--cmdopt'添加到pytest配置对象中")
def test_request(request):
print('\n在测试方法中通过request.config.getoption()方法调用测试参数:', request.config.getoption('cmdopt'))
import pytest
@pytest.fixture()
def login(request):
print("\n=======================request start=================================")
print('测试方法的参数化数据:{}'.format(request.param))
print('测试方法所处模块的信息:{}'.format(request.module))
print('测试方法信息:{}'.format(request.function))
print('测试方法所在的类的信息:{}'.format(request.cls))
print('测试方法所在路径信息:{}'.format(request.fspath))
print('测试方法调用的多个fixture函数(比如fixture函数之间的嵌套调用(包括pytest内嵌的fixture函数))信息:{}'.format(request.fixturenames))
print('测试方法调用的单个fixture函数(自己在程序中定义在测试方法中调用的fixture函数)信息:{}'.format(request.fixturename))
print('测试方法级别信息:{}'.format(request.scope))
print("\n=======================request end=================================")
import pytest
user = [('张三', '123456'), ('李四', 'abcdefg')]
class TestA:
@pytest.mark.parametrize(argnames='login', argvalues=user, indirect=True)
def test_one_param(self, login):
assert True
参考文章1
pytest内置fixture之pytestconfig
参考文章2
pytest内置fixture函数之pytestconfig详解(参照pytest内置fixture函数之request)
可以通过pytestconfig.getini()方法来获取配置文件中的配置参数
pytest.ini文件内容
xfail_strict = True
addopts = -v --count=2 --reruns=2 --html=report.html --self-contained-html
log_cli = False
norecursedirs = venv report util log
python_files = test*.py
python_classes = Test*
python_functions = test_*
import pytest
def test_get_ini(pytestconfig):
log_cli = pytestconfig.getini("log_cli")
print("获取到的log_cli = {}".format(log_cli))
xfail_strict = pytestconfig.getini("xfail_strict")
print("获取到的xfail_strict = {}".format(xfail_strict))
addopts = pytestconfig.getini("addopts")
print("获取到的addopts = {}".format(addopts))
if __name__ == '__main__':
pytest.main(['-s', 'testconfig.py'])
安装一些addopts参数需要的插件
https://blog.csdn.net/u010454117/article/details/119428252
pip install pytest-repeat
pip install pytest-rerunfailures
pip install pytest-html
参考:
pytest配置文件 – pytest.ini
conftest.py
本地的插件库,主要用于存放fixture,其中的hook函数和fixture将作用于该文件所在的目录以及所有子目录
addopts
pytest执行时的默认命令行参数,可选参数见pytest用法。配置后执行时直接pytest即可,相当于后面默认加了命令行参数。如果pytest.ini配置的addopts和命令行的参数不一致,那么最终是以命令行的为准,如 pytest -q -rp 那么会以q简单模式输出而不是v模式,结果只显示passed的,不会显示pEf
xfail_strict
xfail的strict参数,默认是False,如果为true,被装饰用例即使无报错,测试结果也是failed,不是xpassed。如果pytest.ini配置的xfail_strict和测试用例xfail装饰器自己的参数不一致,那么最终是以测试用例自己的为准,如测试用例指明strict=False,那么对于该用例配置文件的True就会失效
参考:
pytest运行多条用例命令
if __name__ == '__main__':
pytest.main(["demo.py","-s", '--workers=1', '--tests-per-worker=4'])