文章目录
- 前言
- 测试用例默认显示
- 传递一个参数
- 传递多个参数
- 利用Fixture修改测试函数名称
- 传递一个参数
- 传递多个参数
- 验证ids和params长度不一致
- 修改Fixture函数名称
前言
在
pytest
中,@pytest.fixture
装饰器用于定义可以在多个测试函数中重用的设置和清理代码。
name
参数允许为fixture
函数指定一个更易读、更有描述性的名称,这样在其他测试函数或fixture
中引用它时就可以使用这个别名,而不是函数名本身。ids
参数则是与@pytest.fixture
装饰器一起使用的,用于给参数化测试中的每一组数据提供一个描述性的名称。这样,当运行测试时,每个测试实例在输出中会有一个更易于理解的名称,而不是默认生成的基于参数值的名称。
这样做的好处:
- 可读性高:通过为 fixture 和参数化数据提供描述性的名称,测试代码和输出报告的可读性大大提高,使得开发和维护测试变得更加容易。
- 明确意图:使用别名可以让其他开发者更容易理解测试的意图和目的,特别是当测试逻辑变得复杂时。
- 组织性高:别名有助于组织和管理测试代码,特别是在大型项目中有许多测试函数和 fixture 时。
- 调试方便:当测试失败时,描述性的名称可以帮助开发者更快地定位问题所在,而不需要逐个检查每个测试实例的参数值。
测试用例默认显示
传递一个参数
示例代码
import pytest
@pytest.fixture(params=[111, 222, 333])
def data(request): # 必须是request这个参数名
return request.param # 依次取列表中的每个值返回
class TestClassCase05:
def test_case(self, data):
print(f"\n---test_case:data={data}")
assert isinstance(data, int), "数据非int类型"
执行效果
传递多个参数
示例代码
import pytest
@pytest.fixture(params=[111, 222, 333])
def data1(request): # 必须是request这个参数名
return request.param # 依次取列表中的每个值返回
@pytest.fixture(params=["aaa", "bbb", "ccc"])
def data2(request): # 必须是request这个参数名
return request.param # 依次取列表中的每个值返回
class TestClassCase05:
def test_case(self, data1, data2):
print(f"\n---test_case:data1={data1}, data2={data2}")
assert isinstance(data1, int), "数据1非int类型"
assert isinstance(data2, str), "数据2非str类型"
通过
Test
类执行效果
通过命令行执行效果
利用Fixture修改测试函数名称
传递一个参数
示例代码
import pytest
# 这里需要注意:ids的长度需要与params传递的参数长度一致
@pytest.fixture(params=[111, 222, 333], ids=["item1", "item2", "item3"])
def data(request): # 必须是request这个参数名
return request.param # 依次取列表中的每个值返回
class TestClassCase05:
def test_case(self, data):
print(f"\n---test_case:data={data}")
assert isinstance(data, int), "数据非int类型"
执行效果
传递多个参数
示例代码
# -*- coding: utf-8 -*-
"""
@WorkNo : CS4224
@Author : yangkai
@Email : yangkai1@dev.bosc
@Project : PythonWorkspace
@Module : test_case_05.py
@DateTime: 2024/4/3 08:30
"""
import pytest
# 这里需要注意:ids的长度需要与params传递的参数长度一致
@pytest.fixture(params=[18, 19, 20], ids=["age=18", "age=19", "age=20"])
def age(request): # 必须是request这个参数名
return request.param # 依次取列表中的每个值返回
@pytest.fixture(params=["张三", "李四", "王五"], ids=["name=zhangsan", "name=lisi", "name=wangwu"])
def name(request): # 必须是request这个参数名
return request.param # 依次取列表中的每个值返回
class TestClassCase05:
def test_case(self, age, name):
print(f"\n---test_case:age={age}, name={name}")
assert age >= 18, "年龄不可低于18岁"
assert name is not None, "姓名不可为None"
通过
Test
类执行效果
通过命令行执行效果
验证ids和params长度不一致
示例代码
import pytest
# 这里需要注意:ids的长度需要与params传递的参数长度一致
@pytest.fixture(params=[111, 222, 333], ids=["item1", "item2"])
def data(request): # 必须是request这个参数名
return request.param # 依次取列表中的每个值返回
class TestClassCase05:
def test_case(self, data):
print(f"\n---test_case:data={data}")
assert isinstance(data, int), "数据非int类型"
验证结果
修改Fixture函数名称
利用
name
参数给被@pytest.fixture
修饰的函数取别名
import pytest
# 这里需要注意:ids的长度需要与params传递的参数长度一致
@pytest.fixture(params=["张三", "李四", "王五"],
ids=["name=zhangsan", "name=lisi", "name=wangwu"],
name="names")
def data(request): # 必须是request这个参数名
return request.param # 依次取列表中的每个值返回
class TestClassCase05:
def test_case(self, data):
print(f"\n---test_case:data={data}")
assert data is not None, "姓名不可为None"
执行效果
这时,我们将依赖的fixture函数名称修改成
names
别名结果:程序运行正常,但是没有得到实际的数据,
data
被识别为可调用函数
结论,当给
fixture
设置别名时,引用时需要使用别名