以下是关于“pytest使用@pytest.mark.parametrize() 实现参数化的示例代码”的完整攻略。
1. 简介
pytest.mark.parametrize()
是 pytest
中用来实现参数化测试的方法,可以用来避免重复测试相似用例的冗余代码。
2. 语法
pytest.mark.parametrize()
函数的语法如下:
@pytest.mark.parametrize(argnames, argvalues)
其中:
argnames
:字符串,表示参数名,可以为单个参数或多个参数;argvalues
:值的序列,表示参数的可能取值组合,可以为列表、元组、集合等。
3. 示例说明
示例一
假设我们需要测试一个简单函数add()
,实现两个数字相加的功能,我们需要对一些测试用例进行测量。可以通过pytest.mark.parametrize()
函数实现:
def add(a, b):
return a + b
@pytest.mark.parametrize("a, b, expected", [
(2, 3, 5),
(1, 4, 5),
(0, 0, 0)
])
def test_add(a, b, expected):
assert add(a, b) == expected
在这个示例中,test_add
函数采用了 @pytest.mark.parametrize
参数化装饰器,"a, b, expected"
表示三个参数名,对应之后元组序列中的三个元素。元组序列中的三个元素分别表示被测试函数 add()
的 a
、b
参数以及期望输出的 expected
。
示例二
现在,我将使用 pytest
测试 math
模块的一些常见的函数。该模块包含了许多有用的函数,例如 ceil()
, floor()
, factors()
, gcd()
, sqrt()
, exp()
, log()
, log10()
, log1p()
, 并且我们想对这些函数进行一些测试,就可以采用以下方式:
import math
import pytest
@pytest.mark.parametrize(
"num, result",
[(2, math.sqrt(2)),
(3, math.sqrt(3)),
(4, 2),
(5, 2.236),
]
)
def test_sqrt(num, result):
"""
对math.sqrt()函数进行测试
"""
assert math.sqrt(num) == pytest.approx(result, 0.01)
@pytest.mark.parametrize(
"num, result",
[(2, math.log(2)),
(3, math.log(3)),
(4, math.log(4)),
(5, math.log(5)),
]
)
def test_log(num, result):
"""
对math.log()函数进行测试
"""
assert math.log(num) == pytest.approx(result, 0.01)
@pytest.mark.parametrize(
"num, result",
[(2, math.exp(2)),
(3, math.exp(3)),
(4, math.exp(4)),
(5, math.exp(5)),
]
)
def test_exp(num, result):
"""
对math.exp()函数进行测试
"""
assert math.exp(num) == pytest.approx(result, 0.01)
在这个示例中,我们使用了 import
导入了 math
模块,并使用了三个 @pytest.mark.parametrize
装饰器来测试三个常见的 math
模块函数 math.sqrt()
, math.log()
和 math.exp()
。每个参数化装饰器都提供了参数名和值组成的元组序列。pytest.approx()
函数用于将期望值与实际值进行比较,并控制比较精度的精度。
这些示例代码中展示了如何使用 pytest.mark.parametrize()
函数实现参数化的测试,可以从中看到这种测试方法如何从繁琐的用例中解放出来,让代码更加简洁和可读性更高。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:pytest使用@pytest.mark.parametrize()实现参数化的示例代码 - Python技术站