1、fixture参数化params
params 是一个列表,用来存放我们要参数化的值。
执行每个值的列表,可以通过 request.param
1、创建test_fixture_4.py文件
脚本代码:
#!/usr/bin/env python # -*- coding: utf-8 -*- """ 微信公众号:AllTests软件测试 """ import pytest test_param = [(1,2), ("a","b"), (False,False), (int,int)] @pytest.fixture(params=test_param) def fixturefun(request): test = request.param return test def test_case(fixturefun): assert fixturefun[0] == fixturefun[1]
2、运行结果:
执行4次。
2、fixture和parametrize结合的参数化
1、创建test_fixture_5.py文件
脚本代码:
#!/usr/bin/env python # -*- coding: utf-8 -*- """ 微信公众号:AllTests软件测试 """ import pytest test_param = [(1,2), ("a","b"), (False,False), (int,int)] @pytest.fixture() def fixturefun(request): test = request.param return test @pytest.mark.parametrize("fixturefun", test_param, indirect=True) # indirect=True,声明fixturefun不是参数,而是一个函数。 def test_case(fixturefun): assert fixturefun[0] == fixturefun[1]
2、运行结果:
(1)传单个参数
1、创建test_fixture_8.py文件
脚本代码:
#!/usr/bin/env python # -*- coding: utf-8 -*- """ 微信公众号:AllTests软件测试 """ import pytest data = ["AllTests", "wangmcn"] ids = [f"test_name: {name}" for name in data] @pytest.fixture() def login(request): name = request.param print(f"账号:{name}") return name @pytest.mark.parametrize("login", data, ids=ids, indirect=True) def test_case(login): print(f"测试用例登录账号:{login}")
@pytest.mark.parametrize添加indirect=True参数是为了把login当成一个函数去执行,而不是一个参数,并且将data当做参数传入函数。
函数test_case(login),这里的login是获取fixture返回的值。
2、运行结果:
(2)多个参数(字典)
1、创建test_fixture_9.py文件
脚本代码:
#!/usr/bin/env python # -*- coding: utf-8 -*- """ 微信公众号:AllTests软件测试 """ import pytest data = [ {"name": "AllTests", "pwd": "123456"}, {"name": "wangmcn", "pwd": "admin"} ] @pytest.fixture() def login(request): param = request.param print(f"账号:{param['name']},密码:{param['pwd']}") return param @pytest.mark.parametrize("login", data, indirect=True) def test_case(login): print(f"测试用例登录账号:{login['name']},测试用例登录密码:{login['pwd']}")
2、运行结果:
(3)多个fixture(一个装饰器)
1、创建test_fixture_10.py文件
脚本代码:
#!/usr/bin/env python # -*- coding: utf-8 -*- """ 微信公众号:AllTests软件测试 """ import pytest data = [ ("AllTests", "123456"), ("wangmcn", "admin") ] @pytest.fixture(scope="module") def input_name(request): name = request.param print("账号:%s" % name) return name @pytest.fixture(scope="module") def input_pwd(request): pwd = request.param print("密码:%s" % pwd) return pwd @pytest.mark.parametrize("input_name, input_pwd", data, indirect=True) def test_case(input_name, input_pwd): print("测试用例登录账号密码:", input_name, input_pwd)
2、运行结果:
(4)多个fixture(叠加装饰器)
1、创建test_fixture_11.py文件
脚本代码:
#!/usr/bin/env python # -*- coding: utf-8 -*- """ 微信公众号:AllTests软件测试 """ import pytest name = ["AllTests", "wangmcn"] pwd = ["123456", "admin"] @pytest.fixture(scope="function") def input_name(request): param_name = request.param print("账号:%s" % param_name) return param_name @pytest.fixture(scope="function") def input_pwd(request): param_pwd = request.param print("密码:%s" % param_pwd) return param_pwd @pytest.mark.parametrize("input_name", name, indirect=True) @pytest.mark.parametrize("input_pwd", pwd, indirect=True) def test_case(input_name, input_pwd): print("测试用例登录账号密码:", input_name, input_pwd)
测试用例数:2*2=4条
2、运行结果:
3、fixture中的ids
ids 也是要结合着 params 一起使用的。当有多个 params 时,针对每一个 param,可以指定一个 id,然后这个 id 会变成测试用例名字的一部分。
1、创建test_fixture_6.py文件
脚本代码:
#!/usr/bin/env python # -*- coding: utf-8 -*- """ 微信公众号:AllTests软件测试 """ import pytest @pytest.fixture(params=["参数1", "参数2"], ids=["id-01", "id-02"]) def fixturefun(request): return request.param def test_case(fixturefun): print(fixturefun)
2、运行结果:
可以看到用例带了id:id-01、id-02