type
status
date
slug
summary
tags
category
icon
password
Parametrize是pytest测试框架中的一个强大特性,它允许我们为测试函数提供多组参数和预期结果,从而轻松地创建多个测试用例。这种方法提高了代码的可读性和可维护性,提高了测试覆盖率和测试效率。然而,参数过多时可能会导致测试函数的复杂性增加,且参数之间的依赖关系可能需要额外处理。Parametrize非常适用于测试同一个函数或方法在不同参数下的行为、创建大量相似的测试用例以及进行参数化的并行测试。
Parametrize 简介
Parametrize 是什么?
Parametrize是pytest测试框架中的一个强大特性,它允许我们为测试函数提供多组参数和预期结果,从而可以轻松地创建多个测试用例。这种方法可以让我们轻松地为一个函数创建多个测试用例,而无需为每个用例都写一个单独的测试函数。
为什么要使用 Parametrize?
在编写测试用例时,我们经常会遇到需要测试同一个函数或方法在不同参数下的行为的情况。如果手动为每一种参数组合编写一个测试函数,那么工作量将会非常大,而且代码的可读性和可维护性也会大大降低。Parametrize的出现,解决了这个问题,它允许我们在一个测试函数中定义多组参数和预期结果,从而可以轻松地创建多个测试用例。
Parametrize 源码分析
参考: 参数化Fixture方法和测试函数。
Metafunc.parametrize(
argnames
,
argvalues
,
indirect = False
,
ids = None
,
scope = None
)
使用给定argnames的argvalues列表向基础测试函数添加新调用。在收集阶段执行参数化。如果你需要设置昂贵的资源,请参阅设置间接,以便在测试设置时进行。
参数:
- argnames以逗号分隔的字符串,表示一个或多个参数名称,或参数字符串的列表/元组。
- argvalues argvalues列表确定使用不同参数值调用测试的频率。如果只指定了一个argname,则argvalues是值列表。如果指定了N个argnames,则argvalues必须是N元组的列表,其中每个tuple-element为其各自的argname指定一个值。
- indirect argnames或boolean的列表。参数列表名称(argnames的子集)。如果为True,则列表包含argnames中的所有名称。对应于此列表中的argname的每个argvalue将作为request.param传递到其各自的argname fixture函数,以便它可以在测试的设置阶段而不是在收集时执行更昂贵的设置。
- ids 字符串ID列表或可调用的列表。如果字符串,则每个字符串对应于argvalues,以便它们是测试ID的一部分。如果将None作为特定测试的id给出,则将使用该参数的自动生成的id。如果是可调用的,它应该采用一个参数(单个argvalue)并返回一个字符串或返回None。如果为None,将使用该参数的自动生成的id。如果没有提供id,它们将自动从argvalues生成。
- scope 如果指定,则表示参数的范围。范围用于按参数实例对测试进行分组。它还将覆盖任何fixture函数定义的范围,允许使用测试上下文或配置设置动态范围。
Parametrize 实践
以下是一个简单的例子,展示了如何使用
pytest.mark.parametrize
来测试一个函数的多个用例:在这个例子中,我们首先定义了一个简单的
add
函数,然后使用 pytest.mark.parametrize
来为 test_add
测试函数提供了四组参数。
每组参数都包含了两个输入 a
和 b
,以及一个预期的输出 expected
。当运行这个测试时,pytest 会自动为每组参数创建一个测试用例,然后检查 add(a, b)
的返回值是否等于 expected
。这种方法可以让你轻松地为一个函数创建多个测试用例,而无需为每个用例都写一个单独的测试函数。
Parametrize 优缺点
优点:
- 提高代码的可读性和可维护性:通过使用parametrize,我们可以在一个测试函数中定义多组参数和预期结果,从而避免了为每一种参数组合都编写一个单独的测试函数。
- 提高测试覆盖率:parametrize使得我们可以轻松地为一个函数创建多个测试用例,从而提高了测试覆盖率。
- 提高测试效率:parametrize支持并行测试,可以大大提高测试效率。
缺点:
- 参数过多时,可能会导致测试函数的复杂性增加。
- 如果参数之间有依赖关系,可能需要额外的逻辑来处理。
Parametrize 使用场景
Parametrize非常适合用于以下场景:
- 需要测试同一个函数或方法在不同参数下的行为。
- 需要创建大量相似的测试用例。
- 需要进行参数化的并行测试。
总的来说,pytest的parametrize是一个非常强大的工具,它可以大大提高我们编写和维护测试用例的效率。
参考:
- 作者:eachenkuang
- 链接:https://kuangyichen.com/article/parametrize
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。