pytest 参数化中的indirect的作用

戏子无情 提交于 2019-12-30 22:40:47

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!