本文系《pytest源码剖析》系列内容
正在连载,欢迎关注
2. 内置插件 mark
插件路径:_pytest.mark
实现的 hook
hook | tryfirst | trylast | optionalhook | hookwrapper |
---|---|---|---|---|
pytest_addoption | False | False | False | False |
pytest_cmdline_main | False | False | True | False |
pytest_collection_modifyitems | False | False | False | False |
pytest_configure | False | False | False | False |
pytest_unconfigure | False | False | False | False |
调用的 hook
-
pytest_deselected
插件功能
-
创建命令行参数
-k
,实现基于【关键字】的用例选择 -
创建命令行参数
-m
, 实现基于【标记】的用例选择 -
创建配置项
markers
,用于注册标记 -
创建命令行参数
-markers
, 用于输出所有的标记 -
创建表达式解析:
_pytest.mark.expression.Expression
-
创建装饰器
@pytest.mark
:_pytest.mark.structures.MarkGenerator
标记的基本用法
如果仅仅是用于用例的筛选,三个步骤即可
-
在 pytest.ini 中注册自定义标记
[pytest]
markers =
login: 登录相关用例
db: 数据库相关用例
- 在用例函数添加自定义标记装饰器
-
import pytest
@pytest.mark.db
def test_db_update():
print('use database')
def test_abc():
print('abc')
-
启动 pytest 时传递
-m
参数
标记的高级用法
如果是由开发者使用的话,可以通过自定义标记产生更酷炫的效果。
例如下面这些内置标记,就不是为了筛选用例,而是对用例进行特殊处理
-
skip:始终跳过执行
-
skipif:满足某个条件时跳过执行
-
xfail:预期执行失败
-
filterwarnings:过滤警告信息
-
usefixtures:使用 fixture
-
parametrize:参数化测试
这些内置标记,是由 pytest 内的其他的插件创建、并完成处理的,
第三方插件还可以创建更多的标记,产生更多的效果
后续介绍到这些插件时,再细说他们的实现方式
关键字用法
关键字表达式也可用来筛选用例,不过使用时不需要做注册之类的准备工作,
而是根据每个用例自有的 id(目录名 + 文件名 + 类名 + 用例名)进行筛选匹配
使用时直接在命令行中加参数 -k
即可,参数的值可以是:
-
用例 id 的子字符串,比如:包含 abc 的用例
>pytest -v -k abc
tests.py::test_abc PASSED
tests.py::test_abcd PASSED
- 逻辑表达式,比如:包含 abc,但不包含 abcd 的用例
-
>pytest -v -k "abc and not abcd"
tests.py::test_abc PASSED
代码片段
@dataclasses.dataclass
class KeywordMatcher:
def __call__(self, subname: str) -> bool:
subname = subname.lower()
names = (name.lower() for name in self._names)
for name in names:
if subname in name:
return True
return False
@dataclasses.dataclass
class MarkMatcher:
def __call__(self, name: str) -> bool:
return name in self.own_mark_names
-
-k
参数不区分大小写、判断是否包含 -
-m
参数区分大小写、判断是否相等 -
-k
参数和-m
参数均支持逻辑表达式:or
、and
、not
简评
mark 插件提供了2种方式进行用例筛选:关键字 、 标记,
其中关键字非常方便,标记非常灵活。
如果是深入 pytest 内部之后,标记就不仅仅是筛选用例了,而是可以做出很多匪夷所思的效果,
这让 pytest 源码剖析这件事情吸引力又增加了不少
首发于公众号:测试开发研习社
原创不易,喜欢请星标+点赞,转载请注明出处