Python测试框架pytest(07)
fixture
参数化params、和parametrize结合、ids
目录
- 1、fixture参数化params
- 2、fixture和parametrize结合的参数化
- 3、fixture中的ids
1、fixture参数化params
params 是一个列表,用来存放我们要参数化的值。
执行每个值的列表,可以通过 request.param
1、创建test_fixture_4.py文件
脚本代码:
代码语言:javascript复制#!/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文件
脚本代码:
代码语言:javascript复制#!/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文件
脚本代码:
代码语言:javascript复制#!/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文件
脚本代码:
代码语言:javascript复制#!/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文件
脚本代码:
代码语言:javascript复制#!/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文件
脚本代码:
代码语言:javascript复制#!/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文件
脚本代码:
代码语言:javascript复制#!/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