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基础使用教程

pytest文档31-allure标记用例级别severity

14-pytest-标记失败xfail使用

pytest接口自动化测试框架 | 通过标记表达式执行用例

pytest自动化测试框架详解+mark标记+fixture夹具

pytest自动化测试框架详解+mark标记+fixture夹具