pytest的测试用例标记
Posted 永远不要矫情
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pytest的测试用例标记相关的知识,希望对你有一定的参考价值。
在pytest中,有时候我们并不需要对所有的用例全部执行。pytest提供了一种机制:有选择的挑选用例去执行,即标记测试函数。下面详细介绍几种方法给函数标记。
1.使用pytest.mark在函数上进行标记
1.1 标记格式
“@”表示这是一个装饰器,“pytest.mark”是pytest固定的写法,mark_name可以使用自定义标记和内置标记。
@pytest.mark.mark_name
1.2 内置标记
常用的内置标记如下:
例如:
import pytest
def test_01():
print('hello')
@pytest.mark.skip()
def test_add():
print('happy')
def test_02():
print('fun')
if __name__ == '__main__':
pytest.main(['-s', '-v','test_02.py'])
执行结果如下:
============================= test session starts =============================
collecting ... collected 3 items
test_02.py::test_01 PASSED [ 33%]hello
test_02.py::test_add SKIPPED (unconditional skip) [ 66%]
Skipped: unconditional skip
tes_t02.py::test_02 PASSED [100%]fun
======================== 2 passed, 1 skipped in 0.02s =========================
1.3 自定义标记
1.3.1 注册标签名
通过pytest.ini配置文件注册,格式如下:
[pytest] # 固定的section名
markers= # 固定的option名称
标签名1: 标签名的说明内容。
标签名2
标签名N
1.3.2 在测试用例/测试类中给用例打标记(只能使用已注册的标记名)
在测试用例的前面加上:@pytest.mark.已注册标签名。运行时,根据用例标签过滤(-m 标签名)。
例如:pytest -m smoke and demo 表示执行同时有smoke和demo两个标签的用例。-m参数支持python表达式,用or实现多选的效果,用not实现反选的效果
创建一个test_02.py,代码如下:
import pytest
def test_01():
print('hello')
@pytest.mark.do
def test_add():
print('happy')
def test_02():
print('fun')
再创建pytest.ini文件,不需要同目录,pytest.ini 配置文件不支持注释,内容如下:
[pytest]
markers =
do: do
undo: undo
在命令行执行如下:
D:\\pythonProject\\my_selenium_project\\testcases\\pytest>pytest -s -v -m do test_02.py
======================================================================== test session starts ========================================================================
platform win32 -- Python 3.7.6, pytest-6.2.4, py-1.10.0, pluggy-0.13.1 -- d:\\python3.7.6\\python.exe
cachedir: .pytest_cache
rootdir: D:\\pythonProject\\my_selenium_project\\testcases\\pytest, configfile: pytest.ini
collected 3 items / 2 deselected / 1 selected
tes_t02.py::test_add happy
PASSED
================================================================== 1 passed, 2 deselected in 0.02s ==================================================================
给test_02函数再加一个@pytest.mark.test标记,test标记在pytest.ini已注册。执行的时候加上pytest -s -v -m “do and test” test_02.py即可,记得必须是双引号。
创建类,在方法中使用也行:
例如:创建test_03.py
import pytest
class TestMark():
def test_01(self):
print('hello')
@pytest.mark.test
def test_add(self):
print('happy')
def test_02(self):
print('fun')
执行结果如下:
D:\\pythonProject\\my_selenium_project\\testcases\\pytest>pytest -s -v -m test test_03.py
======================================================================== test session starts ========================================================================
platform win32 -- Python 3.7.6, pytest-6.2.4, py-1.10.0, pluggy-0.13.1 -- d:\\python3.7.6\\python.exe
cachedir: .pytest_cache
rootdir: D:\\pythonProject\\my_selenium_project\\testcases, configfile: pytest.ini
collected 3 items / 2 deselected / 1 selected
test_03.py::TestMark::test_add happy
PASSED
================================================================== 1 passed, 2 deselected in 0.04s ============================
1.4 查找策略
在上面的例子中,我们运行时都指定了模块名,也可不指定,那么查找策略是怎样的呢?
默认情况下,pytest会递归查找当前目录下所有以test_开头或以_test结尾的Python脚本,并执行文件内的所有以test开始或结束的函数和方法。
我们也可根据标记同时执行两个文件。例如:在pytest目录下进行查找
D:\\pythonProject\\my_selenium_project\\testcases\\pytest>pytest -s -v -m "test and do"
======================================================================== test session starts ========================================================================
platform win32 -- Python 3.7.6, pytest-6.2.4, py-1.10.0, pluggy-0.13.1 -- d:\\python3.7.6\\python.exe
cachedir: .pytest_cache
rootdir: D:\\pythonProject\\my_selenium_project\\testcases\\pytest, configfile: pytest.ini
collected 7 items / 6 deselected / 1 selected
test_02.py::test_add happy
PASSED
================================================================== 1 passed, 6 deselected in 0.03s ==================================================================
2.显式指定函数名
显式指定函数名,通过::标记。
例如:在test_02.py中执行test01函数
D:\\pythonProject\\my_selenium_project\\testcases\\pytest>pytest -v -s test_02.py::test_01
======================================================================== test session starts ========================================================================
platform win32 -- Python 3.7.6, pytest-6.2.4, py-1.10.0, pluggy-0.13.1 -- d:\\python3.7.6\\python.exe
cachedir: .pytest_cache
rootdir: D:\\pythonProject\\my_selenium_project\\testcases\\pytest, configfile: pytest.ini
collected 1 item
test_02.py::test_01 hello
PASSED
========================================================================= 1 passed in 0.01s =========================================================================
例如:在test_03.py中执行test01方法,这个就需要写上classname,不然找不到报错。
D:\\pythonProject\\my_selenium_project\\testcases\\pytest>pytest -v -s test_03.py::test_01
======================================================================== test session starts ========================================================================
platform win32 -- Python 3.7.6, pytest-6.2.4, py-1.10.0, pluggy-0.13.1 -- d:\\python3.7.6\\python.exe
cachedir: .pytest_cache
rootdir: D:\\pythonProject\\my_selenium_project\\testcases\\pytest, configfile: pytest.ini
collected 0 items
======================================================================= no tests ran in 0.01s =======================================================================
ERROR: not found: D:\\pythonProject\\my_selenium_project\\testcases\\pytest\\test_03.py::test_01
(no name 'D:\\\\pythonProject\\\\my_selenium_project\\\\testcases\\\\pytest\\\\test_03.py::test_01' in any of [<Module test_03.py>])
写成pytest -v -s test_03.py::TestMark::test_01即可
D:\\pythonProject\\my_selenium_project\\testcases\\pytest>pytest -v -s test_03.py::TestMark::test_01
======================================================================== test session starts ========================================================================
platform win32 -- Python 3.7.6, pytest-6.2.4, py-1.10.0, pluggy-0.13.1 -- d:\\python3.7.6\\python.exe
cachedir: .pytest_cache
rootdir: D:\\pythonProject\\my_selenium_project\\testcases\\pytest, configfile: pytest.ini
collected 1 item
test_03.py::TestMark::test_01 hello
PASSED
========================================================================= 1 passed in 0.01s =========================================================================
也可只写到classname,那么运行整个类。
3.使用模糊匹配
使用-k选项标识。例如在test_03.py中,找含有add的方法
D:\\pythonProject\\my_selenium_project\\testcases\\pytest>pytest -k add test_03.py
======================================================================== test session starts ========================================================================
platform win32 -- Python 3.7.6, pytest-6.2.4, py-1.10.0, pluggy-0.13.1
rootdir: D:\\pythonProject\\my_selenium_project\\testcases\\pytest, configfile: pytest.ini
collected 3 items / 2 deselected / 1 selected
test_03.py . [100%]
================================================================== 1 passed, 2 deselected in 0.01s ==================================================================
以上是关于pytest的测试用例标记的主要内容,如果未能解决你的问题,请参考以下文章
pytest文档31-allure标记用例级别severity