pytest的内置插件盘点2:mark

本文系《pytest源码剖析》系列内容

正在连载,欢迎关注

图片

2. 内置插件 mark

插件路径:_pytest.mark

实现的 hook

hooktryfirsttrylastoptionalhookhookwrapper
pytest_addoptionFalseFalseFalseFalse
pytest_cmdline_mainFalseFalseTrueFalse
pytest_collection_modifyitemsFalseFalseFalseFalse
pytest_configureFalseFalseFalseFalse
pytest_unconfigureFalseFalseFalseFalse

调用的 hook

  • pytest_deselected

插件功能

  1. 创建命令行参数 -k,实现基于【关键字】的用例选择

  2. 创建命令行参数 -m, 实现基于【标记】的用例选择

  3. 创建配置项 markers,用于注册标记

  4. 创建命令行参数 -markers, 用于输出所有的标记

  5. 创建表达式解析:_pytest.mark.expression.Expression

  6. 创建装饰器 @pytest.mark: _pytest.mark.structures.MarkGenerator

标记的基本用法

如果仅仅是用于用例的筛选,三个步骤即可

  1. 在 pytest.ini 中注册自定义标记

    [pytest]markers =     login:  登录相关用例    db: 数据库相关用例
  2. 在用例函数添加自定义标记装饰器
  3. import pytest
    @pytest.mark.dbdef test_db_update():    print('use database')        def test_abc():    print('abc')
  4. 启动 pytest 时传递 -m 参数

标记的高级用法

如果是由开发者使用的话,可以通过自定义标记产生更酷炫的效果。

例如下面这些内置标记,就不是为了筛选用例,而是对用例进行特殊处理

  • skip:始终跳过执行

  • skipif:满足某个条件时跳过执行

  • xfail:预期执行失败

  • filterwarnings:过滤警告信息

  • usefixtures:使用 fixture

  • parametrize:参数化测试

这些内置标记,是由 pytest 内的其他的插件创建、并完成处理的,

第三方插件还可以创建更多的标记,产生更多的效果

后续介绍到这些插件时,再细说他们的实现方式

关键字用法

关键字表达式也可用来筛选用例,不过使用时不需要做注册之类的准备工作,

而是根据每个用例自有的 id(目录名 + 文件名 + 类名 + 用例名)进行筛选匹配

使用时直接在命令行中加参数 -k 即可,参数的值可以是:

  1. 用例 id 的子字符串,比如:包含 abc 的用例

    >pytest -v -k abc 
    tests.py::test_abc PASSEDtests.py::test_abcd PASSED
  2. 逻辑表达式,比如:包含 abc,但不包含 abcd 的用例
  3. >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
  1. -k 参数不区分大小写、判断是否包含

  2. -m 参数区分大小写、判断是否相等

  3. -k 参数和 -m 参数均支持逻辑表达式or 、andnot

简评

mark 插件提供了2种方式进行用例筛选:关键字 、 标记,

其中关键字非常方便,标记非常灵活。

如果是深入 pytest 内部之后,标记就不仅仅是筛选用例了,而是可以做出很多匪夷所思的效果,

这让 pytest 源码剖析这件事情吸引力又增加了不少

首发于公众号:测试开发研习社

原创不易,喜欢请星标+点赞,转载请注明出处

  • 28
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值