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

29 篇文章 8 订阅
28 篇文章 13 订阅

目录

1、fixture参数化params

2、fixture和parametrize结合的参数化

3、fixture中的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次。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangmcn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值