pytest 参数化中的indirect的作用

之前的解释有点太模糊,重新说明下。

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的时候,只是当做变量来引用了。

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值