pytest 是一个功能强大且易于使用的 Python 测试框架,广泛应用于单元测试、集成测试和功能测试中。它不仅支持标准的测试用例编写,还提供了丰富的插件和扩展功能,使得测试变得更加灵活和高效。本文将深入探讨 pytest 的基本用法、高级特性以及实用技巧,帮助你充分利用 pytest 来提升代码质量和开发效率。
安装 pytest
首先,我们需要安装 pytest。可以通过 pip 进行安装:
编写简单的测试用例
pytest 的测试用例以 test_
开头的函数定义,并使用断言来验证期望的结果。例如:
# test_example.py
def add(x, y):
return x + y
def test_add():
assert add(1, 2) == 3
assert add(5, 5) == 10
复制代码
在命令行中运行测试:
参数化测试
使用 @pytest.mark.parametrize
装饰器可以方便地进行参数化测试,避免重复编写多个相似的测试用例。
import pytest
def multiply(x, y):
return x * y
@pytest.mark.parametrize('x, y, expected', [
(2, 3, 6),
(5, 5, 25),
(-3, 2, -6),
])
def test_multiply(x, y, expected):
assert multiply(x, y) == expected
复制代码
跳过测试和条件测试
使用 @pytest.mark.skip
或 @pytest.mark.skipif
装饰器可以跳过测试或在特定条件下跳过测试。
import pytest
@pytest.mark.skip(reason="example of skipping")
def test_skip():
assert False
@pytest.mark.skipif(sys.version_info < (3, 7), reason="requires Python 3.7 or higher")
def test_skipif():
assert True
复制代码
检测和标记测试
pytest 支持通过 @pytest.mark
进行自定义标记,并可以使用 -m
参数运行特定标记的测试。
import pytest
@pytest.mark.smoke
def test_login():
assert True
@pytest.mark.regression
def test_cart():
assert True
复制代码
运行特定标记的测试:
夹具(Fixtures)
夹具是 pytest 中强大且灵活的功能,用于为测试提供初始化和清理代码。可以使用 @pytest.fixture
装饰器定义夹具。
import pytest
@pytest.fixture
def setup_data():
data = {"username": "alice", "password": "123456"}
return data
def test_login(setup_data):
assert setup_data["username"] == "alice"
复制代码
模块级别夹具和参数化夹具
可以使用 autouse=True
参数创建模块级别的夹具,并通过参数化来动态生成夹具数据。
import pytest
@pytest.fixture(scope="module", autouse=True)
def setup_module():
print("\n=== Setting up module ===")
yield
print("\n=== Tearing down module ===")
@pytest.fixture(params=["chrome", "firefox", "safari"])
def browser(request):
return request.param
def test_browser(browser):
assert browser in ["chrome", "firefox", "safari"]
复制代码
测试覆盖率
可以使用 pytest-cov 插件来测量代码的测试覆盖率,并生成详细的报告。
运行测试并生成覆盖率报告:
pytest --cov=your_module --cov-report=html
复制代码
扩展 pytest 功能
pytest 支持丰富的插件系统,可以通过安装额外的插件来扩展 pytest 的功能,例如参数化、测试报告、数据库清理等。
pip install pytest-html # 安装 HTML 报告插件
复制代码
生成 HTML 测试报告:
pytest --html=report.html
复制代码
通过本文的介绍,你已经了解了 pytest 的基本用法、高级特性以及一些实用技巧。pytest 不仅简化了测试的编写和管理,还提供了丰富的功能和扩展,使得测试变得更加灵活和高效。在实际应用中,合理地利用 pytest 可以帮助你提高代码质量、减少错误和提升开发效率。
评论