Python中pytest()的高级用法和技巧。
pytest 是一个 Python 的单元测试框架,它提供了一个简单易用的接口来编写和运行测试用例。除了基本的测试用例编写和运行功能外,pytest 还提供了许多高级用法和技巧,可以帮助我们更好地编写和管理测试用例。
下面是一些 pytest 的高级用法和技巧,以及相关的使用示例:
1. 参数化测试
参数化测试是 pytest 中一个非常强大的特性,它允许我们为同一个测试用例传递不同的输入参数,从而避免编写重复的测试用例代码。参数化测试可以通过使用 @pytest.mark.parametrize 装饰器来实现。
示例代码:
import pytest
@pytest.mark.parametrize("input,expected", [
(1, 2),
(3, 6),
(5, 10),
])
def test_double(input, expected):
assert input * 2 == expected
2. 自定义标记
pytest 允许我们为测试用例自定义标记,并且可以根据标记来选择或排除特定的测试用例。这在我们需要对测试用例做分类、分组或者只运行特定的测试用例时非常有用。
示例代码:
import pytest
@pytest.mark.slow
def test_slow():
...
@pytest.mark.fast
def test_fast():
...
@pytest.mark.slow
def test_another_slow():
...
可以使用 -m 参数来选择或排除特定的测试用例:
pytest -m slow # 只运行标记为 slow 的测试用例 pytest -m "not slow" # 运行非 slow 的测试用例
3. 自定义失败信息
在 pytest 中,我们可以使用 assert 语句来进行断言。当一个断言失败时,pytest 会默认打印一些基本的失败信息,但有时候我们可能希望打印更多的上下文信息来帮助定位问题。
示例代码:
def test_something():
value = calculate_value()
assert value == expected_value, f"Expected {expected_value}, but got {value}"
在上面的例子中,当断言失败时,pytest 会打印类似于 "Expected ..." 的自定义失败信息。
4. 夹具(Fixtures)
夹具是 pytest 中一个非常有用的概念,它允许我们在测试用例前后进行一些初始化和清理操作。使用夹具可以帮助我们减少测试用例代码的重复,并提高测试用例的可维护性。
示例代码:
import pytest
@pytest.fixture
def setup_data():
data = initialize_data()
yield data
cleanup_data(data)
def test_something(setup_data):
assert len(setup_data) == 10
在上面的例子中,setup_data 是一个夹具,它在每个测试用例执行之前被调用,并且可以在测试用例中使用。在夹具的最后使用 yield 关键字返回一个值,它可以在测试用例中使用。当测试用例执行完毕后,夹具函数会继续执行,并进行一些清理操作。
5. 参数化夹具
类似于参数化测试,我们也可以对夹具进行参数化。这样可以在不同的测试用例中使用不同的夹具数据。
示例代码:
import pytest
@pytest.fixture(params=[1, 2, 3])
def setup_data(request):
data = initialize_data(request.param)
yield data
cleanup_data(data)
def test_something(setup_data):
assert len(setup_data) == setup_data[0]
在上面的例子中,setup_data 夹具被参数化为 3 组数据,分别是 1、2、3。每个测试用例会使用不同的夹具数据。注意,参数化夹具使用 request.param 来访问参数值。
这只是 pytest 的一些高级用法和技巧的一个简单介绍,pytest 还有许多其他的功能,如测试用例的自动发现,异常处理,文件和目录的测试,测试报告等等。深入学习 pytest 可以参考官方文档。
