9.pytest第三方插件

公众号关注:测试充电宝,一起交流

pytest第三方插件

本文只介绍pytest-orderingpytest-rerunfailurespytest-xdist三种插件,报告方面的插件会另起篇幅进行介绍。

顺序执行:pytest-ordering

  • 安装:pip install pytest-ordering
  • 使用方式:在方法上加入下面装饰器
    1. 标记于被测试函数,@pytest.mark.run(order=x)
    2. 根据order传入的参数来解决运行顺序
    3. order值全为正数或全为负数时,运行顺序:值越小,优先级越高
    4. 正数和负数同时存在:正数优先级高

默认情况下,pytest是根据测试方法名由小到大执行的,可以通过第三方插件包改变其运行顺序。

# test_abc.py
#默认执行方式
#示例:
    import pytest
    class Test:
        def test_a(self):
            print("------->test_a")
            assert 1
        def test_b(self):
            print("------->test_b")
            assert 0
    if __name__ == '__main__':
        pytest.main(["-s","test_abc.py"])
#执行结果:
    test_abc.py 
    ------->test_a # 默认第一个运行
    .
    ------->test_b # 默认第二个运行
    F

改变顺序后

#示例:
    import pytest
    class Test:
        @pytest.mark.run(order=2)
        def test_a(self):
            print("------->test_a")
            assert 1

        @pytest.mark.run(order=1)
        def test_b(self):
            print("------->test_b")
            assert 0
    if __name__ == '__main__':
             pytest.main(["-s","test_abc.py"])
#执行结果:
    test_abc.py
    ------->test_b # order=1 优先运行
    F
    ------->test_a # order=2 晚于 order=1 运行
    .

失败重试:pytest-rerunfailures

  • 安装: pip install pytest-rerunfailures

  • 使用方式:pytest --reruns 重试次数 --reruns-delay 次数之间的延时设置(单位:秒)

    比如:pytest --reruns 2 --reruns-delay 5  表示:运行失败的用例可以重新运行2次,第一次和第二次的间隔时间为5秒钟

import pytest


def test_demo_01():
    b = 1 + 2
    assert 3 == b


def test_demo_02():
    b = 1 + 2
    assert 2 == b


if __name__ == '__main__':
    pytest.main(['--reruns', '3', '--reruns-delay', '5'])

结果:

D:\Envs\pytest\Scripts\python.exe D:/study/auto-pytest/test_rerun.py
============================= test session starts =============================
platform win32 -- Python 3.7.1, pytest-6.0.2, py-1.9.0, pluggy-0.13.1
rootdir: D:\study\auto-pytest
plugins: rerunfailures-9.1.1
collected 2 items

test_rerun.py .R                                                         [100%]R [100%]R [100%]F [100%]

================================== FAILURES ===================================
________________________________ test_demo_02 _________________________________

    def test_demo_02():
        b = 1 + 2
>       assert 2 == b
E       assert 2 == 3

test_rerun.py:11: AssertionError
=========================== short test summary info ===========================
FAILED test_rerun.py::test_demo_02 - assert 2 == 3
==================== 1 failed, 1 passed, 3 rerun in 15.13s ====================

从结果看,test_rerun.py重试了三次。

并行执行:pytest-xdist

  • 前言

有1000条用例,假设每个用例执行需要1分钟。如果一个测试人员执行需要1000分钟才能执行完,当项目非常紧急的时候,我们会用测试人力成本换取时间成本,这个时候多找个小伙伴把任务分成2部分,于是时间缩减一半。如果是十个人一起执行,1000个用例理论上只需100分钟就能完成,时间缩短到了1/10。这是一种并行测试,分布式场景。

同样道理,当我们测试用例非常多的时候,一条条执行,很显然会比较慢,那么如何让测试用例并行执行呢,这就是我们接下来要讲的pytest分布式执行插件pytest-xdist

  • 安装:pip install pytest-xdist

  • 使用方法:pytest -n 3代表三个并行

运行以下代码,项目结构如下

auto_pytest是项目工程名称
│  conftest.py
│  __init__.py
│              
├─baidu
│  │  conftest.py
│  │  test_1_baidu.py
│  │  test_2.py
│  │  __init__.py 
│          
├─blog
│  │  conftest.py
│  │  test_2_blog.py
│  │  __init__.py 

代码如下:

# auto_pytest/conftest.py
import pytest

@pytest.fixture(scope="session")
def start():
    print("\n打开首页")
    return "yoyo"

# auto_pytest/baidu/conftest.py
import pytest

@pytest.fixture(scope="session")
def open_baidu():
    print("打开百度页面_session")
    
#########################################################

# auto_pytest/baidu/test_1_baidu.py
import pytest
import time

def test_01(start, open_baidu):
    print("测试用例test_01")
    time.sleep(1)
    assert start == "yoyo"

def test_02(start, open_baidu):
    print("测试用例test_02")
    time.sleep(1)
    assert start == "yoyo"

if __name__ == "__main__":
    pytest.main(["-s", "test_1_baidu.py"])
    
    
#########################################################

# auto_pytest/baidu/test_2.py
import pytest
import time

def test_06(start, open_baidu):
    print("测试用例test_01")
    time.sleep(1)
    assert start == "yoyo"
def test_07(start, open_baidu):
    print("测试用例test_02")
    time.sleep(1)
    assert start == "yoyo"

if __name__ == "__main__":
    pytest.main(["-s", "test_2.py"])
    
#########################################################

# auto_pytest/blog/conftest.py
import pytest

@pytest.fixture(scope="function")
def open_blog():
    print("打开blog页面_function")

#########################################################
    
# auto_pytest/blog/test_2_blog.py
import pytest
import time
def test_03(start, open_blog):
    print("测试用例test_03")
    time.sleep(1)
    assert start == "yoyo"

def test_04(start, open_blog):
    print("测试用例test_04")
    time.sleep(1)
    assert start == "yoyo"

def test_05(start, open_blog):
    '''跨模块调用baidu模块下的conftest'''
    print("测试用例test_05,跨模块调用baidu")
    time.sleep(1)
    assert start == "yoyo"

if __name__ == "__main__":
    pytest.main(["-s", "test_2_blog.py"])

正常运行需要消耗时间:7.09 seconds

(pytest) D:\study\auto-pytest>pytest
=================================== test session starts ===================================
platform win32 -- Python 3.7.1, pytest-6.0.2, py-1.9.0, pluggy-0.13.1
rootdir: D:\study\auto-pytest
plugins: rerunfailures-9.1.1
collected 7 items
baidu\test_1_baidu.py ..                        [ 28%]
baidu\test_2.py ..                              [ 57%]
blog\test_2_blog.py ...                         [100%]
=================================== 7 passed in 7.09s ===================================

设置并行运行数量为3,消耗时间:3.78 seconds,大大的缩短了用例时间

(pytest) D:\study\auto-pytest>pytest -n 3
=================================== test session starts ===================================
platform win32 -- Python 3.7.1, pytest-6.0.2, py-1.9.0, pluggy-0.13.1
rootdir: D:\study\auto-pytest
plugins: forked-1.3.0, rerunfailures-9.1.1, xdist-2.2.0
gw0 [7] / gw1 [7] / gw2 [7]
.......                                         [100%]
=================================== 7 passed in 3.78s ===================================

你可能感兴趣的:(9.pytest第三方插件)