下面是关于“python的pytest框架之命令行参数详解(下)”的完整攻略。
标题
python的pytest框架之命令行参数详解(下)
概述
前面讲解了pytest框架中一些常用的命令行参数,本篇文章将继续讲解一些更为高级的参数,包括fixture的范围以及参数化运行测试用例。
fixture范围
fixture是pytest框架中常用的一种功能,可以用来实现测试前准备和测试后清理,以及避免代码的重复编写。fixture的作用域分为function、class、module和session。
- function:每个测试函数调用时运行fixture的代码。
- class:每个测试类调用一次fixture的代码,在类中的所有测试函数中可用。
- module:每个模块调用一次fixture的代码,在该模块中的所有测试函数中可用。
- session:每个会话调用一次fixture的代码,在该会话的所有模块和测试函数中可用。
pytest框架默认的fixture作用域是function。可以通过在fixture函数上加上@pytest.fixture(scope="scope范围")
,来修改fixture的作用域。
参数化测试用例
参数化测试用例是pytest框架中的高级功能,可以通过多个参数运行同一个测试用例,从而有效避免代码的重复。
可以通过@pytest.mark.parametrize("参数名称", 参数值列表)
来定义参数化测试用例。
例如,我们有如下的测试用例:
def add(x, y):
return x + y
def test_add():
assert add(1, 2) == 3
assert add(2, 3) == 5
这里我们可以将参数化测试用例定义为(使用装饰器):
import pytest
@pytest.mark.parametrize("x, y, result", [(1, 2, 3), (2, 3, 5)])
def test_add(x, y, result):
assert add(x, y) == result
这样我们就可以通过多组不同的参数运行同一个测试用例。
示例说明
示例一
假设我们有如下测试文件:
def multiply(x, y):
return x * y
def test_multiply():
assert multiply(2, 3) == 6
assert multiply(4, 5) == 20
我们希望将test_multiply
的fixture作用域改为class,可以修改代码如下:
import pytest
@pytest.fixture(scope="class")
def setup():
print("setUp")
yield
print("tearDown")
def multiply(x, y):
return x * y
class TestMultiply:
def test_multiply(self, setup):
assert multiply(2, 3) == 6
assert multiply(4, 5) == 20
这里我们给test_multiply
加上了一个参数setup
,并且在类名上标注了TestMultiply
,用于表示这个测试类依赖于setup
这个fixture。
示例二
我们可以使用参数化的方法,对multiply
函数进行测试。
import pytest
@pytest.mark.parametrize("x, y, result", [(2, 3, 6), (4, 5, 20)])
def test_multiply(x, y, result):
assert multiply(x, y) == result
这里我们将x
,y
,result
分别设置为不同的参数,用逗号分隔开,从而实现对test_multiply
函数的参数化测试。
结论
通过本篇文章,我们了解了pytest框架中的fixture作用域以及参数化测试用例的使用方法,可以帮助我们更好地编写高质量的测试代码。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python的pytest框架之命令行参数详解(下) - Python技术站