之前的解释有点太模糊,重新说明下。
params=[{'user':'admin','pwd':''}]
@pytest.fixture(scope='module')
def login(request):
user = request.param['user']
psw = request.param['pwd']
print ('login account is {0},pwd is {1}'.format(user,psw))
if psw:
return True
else:
return False
1、@pytest.mark.parametrize('login',params)
2、@pytest.mark.parametrize('login',params,indirect=True)
当引用1的时候,login就理解成一个变量,执行后的结果就是login=[{'user':'admin','pwd':''}],
当使用2的时候,login变为一个可执行的函数,再将params当参数传入login函数中去执行,当其他变量被赋值为login的时候
@pytest.mark.parametrize('login',params,indirect=True)
class Test_xx():
def test_01(self,login):
'case1 login '
result = login
这个时候,result的值就是login函数执行后返回的True。
以上用法比较常见,需要掌握。
=====================================================
总结:当indirect为True的时候,参数为固件函数名称的,执行的时候会当做函数来执行。
当indirect为false的时候,参数为固件函数名称的,执行的时候会当做一个参数来执行。
参考下面的例子
# coding:utf-8
"""
author:zhouxuan
2019/12/27 17:01
PyCharm
"""
import pytest
@pytest.fixture(params=[1,2,3])
def fixture_param(request):
request.param
print("\033[31;1m我是fixture_param,这是第%s次打印\033[0m"%request.param)
return request.param
@pytest.mark.parametrize("fixture_param",["a","b",'c'],indirect=True)
@pytest.mark.parametrize("a,b",[(1,6),(2,3)])
def test_fixture_param_and_parametrize(a,b,fixture_param):
print("我是测试函数test_fixture_param_and_parametrize,参数a是%s,b是%s"%(a,b))
# print("我fixture_param现在是:%s"%fixture_param)
if __name__ == '__main__':
pytest.main(["-s",'test_fixture_params.py'])
if __name__ == '__main__':
pytest.main(["-s",'debug1.py'])
输出
============================= test session starts =============================
platform win32 -- Python 3.6.8, pytest-5.0.0, py-1.5.4, pluggy-0.13.1
rootdir: D:\django_project\p3_tongtool, inifile: pytest.ini
plugins: allure-pytest-2.8.6, html-2.0.1, metadata-1.8.0, rerunfailures-8.0
collected 6 items
debug1.py 我是fixture_param,这是第a次打印
我是测试函数test_fixture_param_and_parametrize,参数a是1,b是6
.我是fixture_param,这是第b次打印
我是测试函数test_fixture_param_and_parametrize,参数a是1,b是6
.我是fixture_param,这是第c次打印
我是测试函数test_fixture_param_and_parametrize,参数a是1,b是6
.我是fixture_param,这是第a次打印
我是测试函数test_fixture_param_and_parametrize,参数a是2,b是3
.我是fixture_param,这是第b次打印
我是测试函数test_fixture_param_and_parametrize,参数a是2,b是3
.我是fixture_param,这是第c次打印
我是测试函数test_fixture_param_and_parametrize,参数a是2,b是3
.
========================== 6 passed in 0.03 seconds ===========================
去掉indirect=True 默认为false
@pytest.mark.parametrize("fixture_param",["a","b",'c'],indirect=False)
@pytest.mark.parametrize("a,b",[(1,6),(2,3)])
def test_fixture_param_and_parametrize(a,b,fixture_param):
print("我是测试函数test_fixture_param_and_parametrize,参数a是%s,b是%s"%(a,b))
# print("我fixture_param现在是:%s"%fixture_param)
debug1.py 我是测试函数test_fixture_param_and_parametrize,参数a是1,b是6
.我是测试函数test_fixture_param_and_parametrize,参数a是1,b是6
.我是测试函数test_fixture_param_and_parametrize,参数a是1,b是6
.我是测试函数test_fixture_param_and_parametrize,参数a是2,b是3
.我是测试函数test_fixture_param_and_parametrize,参数a是2,b是3
.我是测试函数test_fixture_param_and_parametrize,参数a是2,b是3
.
========================== 6 passed in 0.03 seconds ===========================
结果中没有了固件函数fixture_param的作用了,进一步修改代码
@pytest.mark.parametrize("fixture_param",["a","b",'cc'],indirect=False)
@pytest.mark.parametrize("a,b",[(1,6),(2,3)])
def test_fixture_param_and_parametrize(a,b,fixture_param):
print("我是测试函数test_fixture_param_and_parametrize,参数a是%s,b是%s ,%s"%(a,b,fixture_param))
# print("我fixture_param现在是:%s"%fixture_param)
输出结果为,这里就是把fixture_param当做参数了,继续做确认修改
debug1.py 我是测试函数test_fixture_param_and_parametrize,参数a是1,b是6 ,a
.我是测试函数test_fixture_param_and_parametrize,参数a是1,b是6 ,b
.我是测试函数test_fixture_param_and_parametrize,参数a是1,b是6 ,cc
.我是测试函数test_fixture_param_and_parametrize,参数a是2,b是3 ,a
.我是测试函数test_fixture_param_and_parametrize,参数a是2,b是3 ,b
.我是测试函数test_fixture_param_and_parametrize,参数a是2,b是3 ,cc
这里就是把fixture_param当做参数了,继续做确认修改
# coding:utf-8
"""
author:zhouxuan
2019/12/27 17:01
PyCharm
"""
import pytest
@pytest.fixture(params=[1,2,3])
def fixture_param(request):
request.param
print("\033[31;1m我是fixture_param,这是第%s次打印\033[0m"%request.param)
return request.param*2
@pytest.mark.parametrize("fixture_param",["a","b",'cc'],indirect=True)
@pytest.mark.parametrize("a,b",[(1,6),(2,3)])
def test_fixture_param_and_parametrize(a,b,fixture_param):
print("我是测试函数test_fixture_param_and_parametrize,参数a是%s,b是%s ,%s"%(a,b,fixture_param))
# print("我fixture_param现在是:%s"%fixture_param)
if __name__ == '__main__':
pytest.main(["-s",'test_fixture_params.py'])
if __name__ == '__main__':
pytest.main(["-s",'debug1.py'])
============================= test session starts =============================
platform win32 -- Python 3.6.8, pytest-5.0.0, py-1.5.4, pluggy-0.13.1
rootdir: D:\django_project\p3_tongtool, inifile: pytest.ini
plugins: allure-pytest-2.8.6, html-2.0.1, metadata-1.8.0, rerunfailures-8.0
collected 6 items
debug1.py 我是fixture_param,这是第a次打印
我是测试函数test_fixture_param_and_parametrize,参数a是1,b是6 ,aa
.我是fixture_param,这是第b次打印
我是测试函数test_fixture_param_and_parametrize,参数a是1,b是6 ,bb
.我是fixture_param,这是第cc次打印
我是测试函数test_fixture_param_and_parametrize,参数a是1,b是6 ,cccc
.我是fixture_param,这是第a次打印
我是测试函数test_fixture_param_and_parametrize,参数a是2,b是3 ,aa
.我是fixture_param,这是第b次打印
我是测试函数test_fixture_param_and_parametrize,参数a是2,b是3 ,bb
.我是fixture_param,这是第cc次打印
我是测试函数test_fixture_param_and_parametrize,参数a是2,b是3 ,cccc
.
========================== 6 passed in 0.03 seconds ===========================
可以看出是将“fixture_param” 当做函数执行了,返回的值(return request.param*2) 传递到了
test_fixture_param_and_parametrize中的fixture_param了。
最后将indirect修改为false,再看输出
debug1.py 我是测试函数test_fixture_param_and_parametrize,参数a是1,b是6 ,a
.我是测试函数test_fixture_param_and_parametrize,参数a是1,b是6 ,b
.我是测试函数test_fixture_param_and_parametrize,参数a是1,b是6 ,cc
.我是测试函数test_fixture_param_and_parametrize,参数a是2,b是3 ,a
.我是测试函数test_fixture_param_and_parametrize,参数a是2,b是3 ,b
.我是测试函数test_fixture_param_and_parametrize,参数a是2,b是3 ,cc
.
========================== 6 passed in 0.03 seconds ===========================
这样就能得出结论了,indirect为true的时候,将变量当做函数执行,当为false的时候,只是当做变量来引用了。