Python测试框架pytest(07)fixture - 参数化params、和parametrize结合、ids

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次。

Python测试框架pytest(07)fixture - 参数化params、和parametrize结合、ids

Python测试框架pytest(07)fixture - 参数化params、和parametrize结合、ids

 

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、运行结果:

Python测试框架pytest(07)fixture - 参数化params、和parametrize结合、ids

Python测试框架pytest(07)fixture - 参数化params、和parametrize结合、ids

 

(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、运行结果:

Python测试框架pytest(07)fixture - 参数化params、和parametrize结合、ids

Python测试框架pytest(07)fixture - 参数化params、和parametrize结合、ids

 

(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、运行结果:

Python测试框架pytest(07)fixture - 参数化params、和parametrize结合、ids

Python测试框架pytest(07)fixture - 参数化params、和parametrize结合、ids

 

(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、运行结果:

Python测试框架pytest(07)fixture - 参数化params、和parametrize结合、ids

Python测试框架pytest(07)fixture - 参数化params、和parametrize结合、ids

 

(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、运行结果:

Python测试框架pytest(07)fixture - 参数化params、和parametrize结合、ids

Python测试框架pytest(07)fixture - 参数化params、和parametrize结合、ids

 

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

Python测试框架pytest(07)fixture - 参数化params、和parametrize结合、ids

Python测试框架pytest(07)fixture - 参数化params、和parametrize结合、ids

 

Python测试框架pytest(07)fixture - 参数化params、和parametrize结合、ids

上一篇:WVP+ZLMediaKit+MediaServerUI实现摄像头GB28181推流播放录制


下一篇:pytest:conftest.py运行细节一则