该篇将循序渐进地详细拆解 pytest.mark 装饰器:
目录
一、概念
在软件测试中,经常需要对大量的测试用例进行分类、筛选和管理。为了提高测试的组织性和可维护性,pytest 提供了一种称为“标记”(Marker)的功能。标记是一种元数据,允许我们为测试函数、类或模块添加额外的描述性信息。这些信息可以帮助我们:
- 分类测试:根据测试的目的、重要性、阶段(如单元测试、集成测试、冒烟测试等)对测试进行分组。
- 筛选测试:在运行测试时,通过标记快速选择特定类型的测试进行执行,避免运行全部测试。
- 控制测试行为:标记可以指示 pytest 对特定测试采取特定的操作,如跳过、预期失败等。
- 集成第三方工具:标记可与某些 pytest 插件或外部工具配合,提供更丰富的测试报告、自动化处理等。
二、标记的基本结构与使用
标记是通过 pytest.mark 装饰器来应用的。装饰器是一种 Python 语法,用于修改或增强函数、类等对象的行为。在 pytest 中,使用 pytest.mark.<marker_name> 形式的装饰器为测试项添加标记。实例如下:
import pytest
# 使用 @pytest.mark.smoke 标记一个冒烟测试
@pytest.mark.smoke
def test_login():
...
# 使用 @pytest.mark.integration 标记一个集成测试
@pytest.mark.integration
class TestPaymentSystem:
...
pytest 内置了一些常见的标记名称,这些标记可以直接在测试代码中使用,以下是一些常见的内置标记名称及其用途:
标记名称 | 含义与用途 | 分类 |
---|---|---|
smoke |
冒烟测试,快速验证核心功能是否正常 | 测试类型或阶段 |
regression |
回归测试,检查已有功能在代码变更后是否正常,防止引入新的 bug | |
unit |
单元测试,针对代码最小可测试单元进行隔离测试 | |
integration |
集成测试,验证不同模块或组件间的交互是否正确 | |
system |
系统测试,测试整个系统作为一个整体的功能和行为 | |
e2e / end-to-end |
端到端测试,模拟用户操作验证完整业务流程的正确性 | |
slow |
耗时较长的测试,可以用于筛选并单独运行这类测试,或者在持续集成(CI)环境中跳过它们以加快测试周转时间。 | 执行条件 |
fast |
快速测试,用于快速验证关键功能或优先运行 | |
flaky |
易变或不可靠的测试,可能间歇性失败,标记为 flaky 的测试在失败时可以被报告为预期失败(xfail),不影响整体测试结果。 | |
network |
需要网络连接的测试 | 资源要求或限制 |
database |
依赖数据库的测试 | |
live_server |
需要与实际运行服务器交互的测试 | |
no_cover |
不计入代码覆盖率统计的测试 | |
window |