当前位置: 首页 > news >正文

pytest实战技巧之参数化应用

pytest是Python中最流行的测试框架之一。它提供了丰富的功能,可以帮助我们编写高效、可靠的测试用例。其中一个重要的功能就是参数化,它可以让我们用不同的数据组合来运行同一个测试用例,从而 提高测试覆盖率和效率。本文将介绍pytest参数化的基本用法和一些高级技巧,帮助读者更好地使用这个功能。

01 基本用法

pytest参数化的基本用法非常简单,只需要在测试函数上添加一个装饰器@pytest.mark.parametrize, 然后指定参数名称和参数值列表即可。例如,我们有一个测试函数test_add,用来测试两个数相加的结果是否正确:

def test_add(): assert add(2, 3) == 5 assert add(-1, 1) == 0

现在我们想用多组数据来运行这个测试函数,可以这样做:

import pytest a, b, expected (2, 3, 5), (-1, 1, 0), (0, 0, 0), (100, -100, 0), ]) def test_add(a, b, expected): assert add(a, b) == expected

这里我们定义了一个参数化装饰器,指定了三个参数名称a、b和expected,以及一个参数值列表,其中每个元素都是一个包含三个值的元组,分别代表两个数和它们的和。这样,pytest就会根据这个参数值列表,自动运行测试函数四次,每次用一个元组中的数据来替换a、b和expected参数,然后执行断言操作,最后输出测试结果。

02 参数化的多种方式

除了上面的方式,pytest还支持多种参数化的方式,可以根据实际情况选择最合适的一种。

参数值列表

我们已经看到了最简单的参数化方式,就是将多组参数值放在一个列表中,然后传给装饰器。这种方式适用于参数比较少、每个参数值都比较独立的情况。如果参数值之间有一定的关联性,或者参数比较多,就不太适合使用这种方式了。

参数名称列表

有时我们希望将参数值列表和参数名称列表分开定义,这样可以更清晰地表达参数之间的关系。例如, 我们有一个函数用来测试字符串是否包含某个子串,可以这样写:

@pytest.mark.parametrize("s, sub, expected", [ ("hello world", "hello", True), ("hello world", "world", True), ("hello world", "python", False), ]) def test_contains(s, sub, expected): assert (sub in s) == expected

这里我们将参数名称s、sub和expected分别和参数值列表中的元组对应起来,这样就可以更直观地理解 每个参数的含义。

注意,参数名称列表也可以是一个字符串,多个参数名称之间用逗号隔开,例如:“a, b, expected”。

参数化装饰器嵌套

有时我们需要对多个参数进行组合,这时可以使用参数化装饰器的嵌套。例如,我们有一个函数用来测试两个字符串连接后的结果是否正确,可以这样写:

@pytest.mark.parametrize("s1", ["hello", "world"]) @pytest.mark.parametrize("s2", ["python", "pytest"]) def test_concat(s1, s2): assert concat(s1, s2) == s1 + s2

这里我们先用一个参数化装饰器指定s1参数的取值范围,然后在这个装饰器内部再嵌套一个参数化装饰器,指定s2参数的取值范围。这样,pytest就会自动运行测试函数四次,每次用一个s1和一个s2的组合 来测试函数的正确性。

参数化函数

有时我们需要动态生成参数值列表,这时可以使用参数化函数。例如,我们有一个函数用来测试一个整数是否为质数,可以这样写:

def is_prime(n): if n < 2: return False for i in range(2, int(n ** 0.5) + 1): if n % i == 0: return False return True @pytest.mark.parametrize("n", range(10)) def test_is_prime(n): assert is_prime(n) == (n in [2, 3, 5, 7])

这里我们使用了Python内置的range函数来生成一个整数序列,然后将这个序列作为参数值列表传给了参数化装饰器。这样,pytest就会自动运行测试函数十次,每次用一个整数来测试函数的正确性。

从文件读取参数

有时我们需要从外部文件中读取参数值列表,这时可以使用pytest的fixture机制。例如,我们有一个CSV文件,包含了多组数据,每组数据都是一个整数和一个字符串,用逗号隔开。我们希望用这些数据 来测试一个函数,可以这样写:

import csv import pytest @pytest.fixture(scope="module") def data(): with open("test_data.csv") as f: reader = csv.reader(f) return list(reader) @pytest.mark.parametrize("n, s", data()) assert func(n, s) == ...

这里我们定义了一个fixture函数data,用来读取CSV文件中的数据,并返回一个列表,每个元素都是一 个包含两个值的元组。然后在测试函数的参数化装饰器中,使用data()来获取这个列表,并将其中的元 组分别赋值给n和s两个参数。这样,pytest就会自动运行测试函数多次,每次用一个元组中的数据来测 试函数的正确性。

03 参数化的高级技巧

除了上面介绍的基本用法和多种方式,pytest参数化还有一些高级技巧,可以帮助我们更灵活地使用这个功能。

动态生成参数名称

有时我们需要动态生成参数名称,例如根据参数值来生成一个唯一的标识符。这时可以使用pytest的ids 参数,它可以指定每个参数值对应的参数名称。例如,我们有一个函数用来测试两个字符串连接后的长度是否正确,可以这样写:

@pytest.mark.parametrize("s1, s2, expected", [ ("hello", "world", 10), ("pytest", "is awesome", 15), ], ids=["case1", "case2"]) def test_len(s1, s2, expected): assert len(concat(s1, s2)) == expected

这里我们使用了ids参数,将每个参数值对应的参数名称指定为了一个字符串,分别 是"case1"和"case2"。这样,pytest就会在测试结果中显示这些参数名称,方便我们查看和分析测试结果。

参数化的组合

例如,我们有一个函数用来测试两个整数相乘的结果是否正确,可以这样写:

@pytest.mark.parametrize("a", [1, 2, 3]) @pytest.mark.parametrize("b", [4, 5, 6]) def test_mul(a, b): assert mul(a, b) == a * b @pytest.mark.parametrize("a, b", product([1, 2, 3], [4, 5, 6])) def test_mul2(a, b):

这里我们先用两个参数化装饰器分别指定a和b的取值范围,然后在测试函数中用a和b的乘积来进行断 言。这样,pytest就会自动运行测试函数九次,每次用一个a和一个b的组合来测试函数的正确性。另 外,我们还可以使用product函数来完成同样的功能,它可以将多个参数值列表进行组合,并返回所有可能的参数组合。

动态生成参数化装饰器

有时我们需要根据某些条件动态生成参数化装饰器,例如根据某个配置文件中的参数来决定测试函数的参数取值范围。这时可以使用pytest的fixture机制,动态生成参数化装饰器。

例如,我们有一个配置文件,包含了两个参数s和n,分别表示一个字符串和一个整数,我们希望用这些参数来测试一个函数,可 以这样写:

import yaml import pytest @pytest.fixture(scope="module") def config(): with open("test_config.yaml") as f: return yaml.safe_load(f) @pytest.fixture(scope="module") def params(config): return [(s, n) for s in config["strings"] for n in config["numbers"]] def test_func(params): for s, n in params: assert funcs, n...

这里我们定义了两个fixture函数,config和params。

config用来读取配置文件中的参数

params用来根据这些参数动态生成参数值列表

然后在测试函数中,使用params来获取参数值列表,并将其中的元 组分别赋值给s和n两个参数。这样,pytest就会自动运行测试函数多次,每次用一个元组中的数据来测试函数的正确性。

04 总结

本文介绍了pytest参数化的基本用法和多种方式,帮助读者更好地使用这个功能。同时,还介绍了一些高级技巧,如动态生成参数名称、参数化的组合和动态生成参数化装饰器,帮助读者更灵活地使用参数 化。通过学习本文,读者可以更好地理解pytest参数化的原理和用法,从而编写更高效、可靠的测试用例。

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取

http://www.jsqmd.com/news/317535/

相关文章:

  • 2026年靠谱的称重式搅拌机厂家推荐,看看哪个口碑好
  • 降本增效!B2B企业海外营销如何布局?推荐几家值得关注的海外短视频推广公司与社交媒体获客平台
  • 2026 出国英语雅思学习机构哪家好?雅思培训机构权威口碑榜单推荐
  • 该错误表明Spring容器中出现了同名Bean的冲突,apiLogService在ApiServiceConfiguration.class和ApiLogService.class中被重复定义
  • Spring Boot 应用启动失败,报错信息显示 MessageNoticeUtil 类中的 nisbosMessageCenterService 字段需要注入一个类型为 NisbosMessage
  • 2026年靠谱的液压升降平台品牌推荐,Marco优势尽显
  • 内联函数 inline:提升程序运行效率的小技巧
  • 湖北省靠谱中医师承报考学校排名,湖北中医药大学中医师承周末班上榜
  • 湖北中医师承报考哪个学校老师好,为你盘点靠谱推荐
  • 冷轧钢带哪家好,诚信供应商分析
  • 2026年冷水机选购攻略,推荐一下可靠的30HP风冷冷水机
  • 深聊谷城口碑不错的包装盒品牌企业,如何选择?
  • 2026年市场上高效的除雪设备批量生产商哪家产品好,爬山虎履带运输车/高速除雪设备,除雪设备诚信供应商哪家产品好
  • 【乐山师范学院支持 | SPIE (ISSN: 0277-786X)出版 | 往届已见刊并完成EI、Scopus检索 | EI 检索】第三届遥感技术与测量测绘国际学术会议(RSTSM 2026)
  • 《TAML》好文推荐 | 来自清华大学张宇飞团队最新研究成果 基于文本生成翼型:FoilCLIP,一种语言驱动的气动设计新框架
  • 一款带空间音效的蓝牙耳机如何定义沉浸听感与音质体验?
  • 论文解读-《Community-Invariant Graph Contrastive Learning》 - zhang
  • 主流关系型数据库系统缺陷实证研究——OceanBase 校企联合研究
  • 【重磅】热门的深圳小红书广告代理排名
  • 2026无锡市英语雅思培训机构推荐,权威英语雅思课程学校排行榜
  • k8s-配置管理
  • 计算机毕业设计springboot高校实验室安全巡检系统 基于SpringBoot的高校实验室智能安防与巡查管理平台 SpringBoot框架下的高校实验室安全风险监控与巡检信息系统
  • H595单个和级联扩展开发-实战开发教程
  • 计算机毕业设计springboot高校实训教学评估管理系统 基于SpringBoot的高校实践教学质量监控与评价体系平台 SpringBoot框架下的高校实验实训过程管理与成效评估系统
  • 从SEO到GEO,理解AI搜索时代的底层逻辑革命
  • 一文看懂振镜扫描、焊接与熔覆,技术差异全解析!
  • 实战蓝图:从诊断到闭环的GEO五步法操作体系
  • 计算机毕业设计之jsp学习助力平台的设计与实现
  • mise 安装及使用指南
  • 2025春熙路成都火锅终极PK,谁是你的心头好?社区火锅/老火锅/特色美食/美食/火锅,成都火锅回头客多的找哪家