Pytest 中有一个很有用的功能,就是为测试用例(测试函数,以后我们都把测试函数直接成为测试用例)添加标记的功能.
一个测试用例可以添加多个标记,一个标记可以添加给多个用例,运行时可以通过-m
参数快速选择被标记的用例。
比如我们经常需要做冒烟测试或 BVT 测试,而在这类测试的时候往往并不会运行所有测试用例。
大家也都知道冒烟测试是用来验证主要流程、主要功能的正确性,为了突出快速的特性一般会针对性的选取一部分用例来执行。另外 BVT 测试,线上巡检等各种自动化测试场景中都需要根据情况选取不同的用例。但是如果仅仅通过文件夹、模块名等方式来区分显得捉襟见肘,而且可能会导致在命名要求上过于复杂。这时候我们就可以使用不同的 mark 来标记我们的测试用例。
mark 是 pytest 提供的一个装饰器,用法为:
import pytest
@pytest.mark.标记 # => 标记名称可以任意取
def test_case():
do_some_test
if __name__ == '__main__':
pytest.main(['-m 标记'])
标记的名称你可以任意取名,后面通过-m 标记
来获取对应标记的用例。
比如,我们可以命名为:somke 冒烟测试
, bvt BVT测试
等等,应用于不同的测试场景。
import pytest
def add(a, b):
return a + b
@pytest.mark.bvt # 这里添加了一个标记
def test_str():
"""测试字符串"""
a, b = '1', '2'
assert add(a, b) == '112'
@pytest.mark.bvt # => 这里添加了两个标记
@pytest.mark.smoke
def test_int():
"""测试整型"""
a, b = 1, 2
assert add(a, b) == 3
上面的代码中,我们将test_str
用例加了 bvt
标记,而test_int
添加了两个标记bvt
和smoke
。
如果你使用下面的命令进行尝试,记得带上
-v
参数,这样才能看到运行的用例名称。
通过命令运行:
pytest -m bvt # => 可以找到两个用例
pytest -m smoke # => 只能找到 test_str
如果你想同时指定多种标记的用例,你可以使用逻辑符号and
, or
, not
,比如:
pytest -m "bvt or smoke" # => 带两种标记的都能找到
pytest -m "bvt and smoke" # => 只能找到同时带两种标记的用例
pytest -m "bvt and not smoke" # => 还可以用not排除某种标记的
注意,一定要用双引号。
在之前的文章也提到过,虽然我们可以任意定义标记且能够生效,但是会有一个警告信息:

最简单的方法是在 pytest 的配置文件配置这些标记。在测试目录(pytest 查找起始目录)下新建一个pytest.ini,这是一个文本文件,并加入如下内容。
[pytest]
markers=smoke:冒烟测试用例
bvt: bvt 测试用例
online: 正式环境运行的用例
这样相当于告诉 pytest 哪些标记是我们定义的,就不会出现警告信息了。
感受一下,是不是有了标记之后在各种测试场景下选取对应的用例就变得非常的灵活了?
这也是为什么你看到用 pytest 框架写的用例那么多的装饰器了,🙂。
网友评论