赞
踩
分享一个关于在pytest中,如何将测试用例文件中的变量传递到fixture函数。
conftest.py
文件的,这里有个生成api token
的fixture函数,就叫它gen_token()
吧。conftest.py
,用于存放适用于本模块下测试用例的fixture
函数,比如有个叫setup_before()
。test_case()
里,要传顶层的fixture函数,也就是这样test_case(gen_token)
。gen_token()
,是需要3个传参的。因为不同case可能涉及到的生成不同用户的token,所以我们把这个参数放在了case文件里。ok,大背景是这样的。
现在有小伙伴来需求了,她要在setup_before()
里去造数,通过请求另一个接口,这个请求也需要使用token。
那么,问题也就可以转化为:
这里把实际代码抽象一下,转化为简易代码,方便演示和理解:
- # 目录结构
-
- -- /demo_top
- -- /demo_sub
- __init__.py
- conftest.py
- test_case.py
- __init__.py
- conftest.py
以下分别是/demo_top/conftest.py
、/demo_top/demo_sub/conftest.py
、/demo_top/demo_sub/test_case.py
的内容。
- # content of /demo_top/conftest.py
- import pytest
-
-
- @pytest.fixture()
- def gen_token(request):
- params = request.param
- print("
- 根目录下gen_token()拿到的参数:", params)
- if params[0] + params[1] == 5:
- return "api_token"
- else:
- return None
这里,模拟生成token的fixture函数,当传过来的值相加等于5,就会返回"api_token"
,否则返回None
。
- # content of /demo_top/demo_sub/conftest.py
- import pytest
-
-
- @pytest.fixture()
- def setup_before(request, gen_token):
- print("执行子级setup_before,拿到的传参:", request.param)
- print("执行子级setup_before,拿到gen_token的返回值:", gen_token)
- if gen_token:
- yield "造数完成"
- print("测试用例test_case执行完毕,清理测试数据")
- else:
- pytest.skip("跳过")
这里模拟了给测试用例造数据的fixture函数,如果没拿到token的话,就跳过测试用例。
- # content of /demo_top/demo_sub/test_case.py
- import pytest
-
- test_param = [(1, 4)]
-
-
- @pytest.mark.parametrize("gen_token", test_param, indirect=True)
- @pytest.mark.parametrize("setup_before", test_param, indirect=True)
- def test_case1(gen_token, setup_before):
- print("
- 测试用例里拿到的gen_token返回值:", gen_token)
- print("测试用例里拿到的setup_before返回值:", setup_before)
- print("执行测试用例test_case1...")
-
-
- if __name__ == '__main__':
- pytest.main(['-s', 'test_case.py'])
这是测试用例文件了,里面有个测试函数test_case1
,因为它需要用到2个fixture函数返回的值,所以gen_token, setup_before
都请求。
参数传递
gen_token
和setup_before
,注意名称与fixture名称一致。"gen_token"
当成函数执行,并且后面的参数值test_param
,作为"gen_token"
的传参。request.param
来获取值。fixture调用fixture
fixture之间的相互调用,在之前的文章里已经有过详述了。既然这里setup_before
依赖gen_token
,之间传递调用即可setup_before(request, gen_token)
。
在各环节做了些print
打印出信息,帮助理解执行过程。
- test_case.py [100%]
-
- ============================== 1 passed in 0.08s ==============================
- 根目录下gen_token()拿到的参数: (1, 4)
- 执行子级setup_before,拿到的传参: (1, 4)
- 执行子级setup_before,拿到gen_token的返回值: api_token
- .
- 测试用例里拿到的gen_token返回值: api_token
- 执行测试用例test_case1...
- 测试用例test_case执行完毕,清理测试数据
-
- Process finished with exit code 0
再看下gen_token
不返回token的情况,改下传参test_param = [(2, 4)]
。
- test_case.py [100%]
-
- ============================= 1 skipped in 0.08s ==============================s
- 根目录下gen_token()拿到的参数: (2, 4)
- 执行子级setup_before,拿到的传参: (2, 4)
- 执行子级setup_before,拿到gen_token的返回值: None
-
- Skipped: 跳过
-
- Process finished with exit code 0
测试用例不执行。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。