Pytest如何重复执行N次脚本

【原文链接】Pytest如何重复执行N次脚本

在有些场景下,希望将自动化脚本重复执行多次,比如想看看自动化脚本的稳定性,还比如想利用功能测试用例直接进行压力测试,即对某一些脚本反复执行从而对应用产生压力等,Pytest框架中可以通过第三方插件pytest-repeat来实现这样的需求。

首先需要执行如下命令安装pytest-repeat插件

pip install pytest-repeat

种使用方式在脚本中直接使用 @pytest.mark.repeat(N) 标记,比如编写脚本如下,即在test_01上使用 @pytest.mark.repeat(3) 标记。

import pytest

@pytest.mark.repeat(3)
def test_01():
    print("in test01...")
    assert 1==1

def test_02():
    print("in test02...")
    assert 1==1

执行结果如下,通过打印也可以看出,这里test_01执行了3次。

(demo--ip5ZZo0) D:\demo>pytest
=================== test session starts ===================
platform win32 -- Python 3.7.9, pytest-7.1.3, pluggy-1.0.0
rootdir: D:\demo
plugins: repeat-0.9.1
collected 4 items

test_demo.py ....                                    [100%]

==================== 4 passed in 0.03s ====================

(demo--ip5ZZo0) D:\demo>

在实际应用中,这种用法不是很多,因为在通常情况下,脚本是不需要执行多次的,因此通过在执行脚本的命令行中指定重复执行往往是用的最多的。比如这里将测试脚本修改为如下:

def test_01():
    print("in test01...")
    assert 1==1

def test_02():
    print("in test02...")
    assert 1==1

通过在命令行中使用 –count=N 来执行脚本重复执行的次数,比如如下,此时将test_01和test_02均执行了3次。

(demo--ip5ZZo0) D:\demo>pytest -s --count=3
=================== test session starts ===================
platform win32 -- Python 3.7.9, pytest-7.1.3, pluggy-1.0.0
rootdir: D:\demo
plugins: repeat-0.9.1
collected 6 items

test_demo.py in test01...
.in test01...
.in test01...
.in test02...
.in test02...
.in test02...
.

==================== 6 passed in 0.03s ====================

(demo--ip5ZZo0) D:\demo>

从执行结果中可以看出,执行的过程是将test_01连续执行了3次,然后又将test_02执行了3次,那么这就有一个问题,能不能将test_01和test_02执行完一次,再反复执行test_01和test_02呢,答案是肯定的,这就需要另外一个参数 –repeat-scope 出场了。–repeat-scope参数支持可选的参数有 function、class、module、session,在前面没有指定 –repeat-scope的情况下即默认情况下跟 -repeat-scope=function是一致的,如下即为 –repeat-scope=function的执行结果:

(demo--ip5ZZo0) D:\demo>pytest -s --count=3 --repeat-scope=function
=================== test session starts ===================
platform win32 -- Python 3.7.9, pytest-7.1.3, pluggy-1.0.0
rootdir: D:\demo
plugins: repeat-0.9.1
collected 6 items

test_demo.py in test01...
.in test01...
.in test01...
.in test02...
.in test02...
.in test02...
.

==================== 6 passed in 0.03s ====================

(demo--ip5ZZo0) D:\demo>

通过指定 –repeat-scope=module 即可做到test_01和test_02作为一个整体循环执行多次,执行结果如下:

(demo--ip5ZZo0) D:\demo>pytest -s --count=3 --repeat-scope=module
=================== test session starts ===================
platform win32 -- Python 3.7.9, pytest-7.1.3, pluggy-1.0.0
rootdir: D:\demo
plugins: repeat-0.9.1
collected 6 items

test_demo.py in test01...
.in test02...
.in test01...
.in test02...
.in test01...
.in test02...
.

==================== 6 passed in 0.02s ====================

(demo--ip5ZZo0) D:\demo>

下面将测试脚本使用测试类组织,如下:

class TestDemo1():
    def test_01(self):
        print("in test01...")
        assert 1==1

    def test_02(self):
        print("in test02...")
        assert 1==1
        
class TestDemo2():
    def test_03(self):
        print("in test03...")
        assert 1==1

    def test_04(self):
        print("in test04...")
        assert 1==1

接下来通过指定 --repeat-scope=class 来指定把测试类作为重复执行的整体,执行结果如下:

(demo--ip5ZZo0) D:\demo>pytest -s --count=3 --repeat-scope=class
=================== test session starts ===================
platform win32 -- Python 3.7.9, pytest-7.1.3, pluggy-1.0.0
rootdir: D:\demo
plugins: repeat-0.9.1
collected 12 items

test_demo.py in test01...
.in test02...
.in test01...
.in test02...
.in test01...
.in test02...
.in test03...
.in test04...
.in test03...
.in test04...
.in test03...
.in test04...
.

=================== 12 passed in 0.16s ====================

(demo--ip5ZZo0) D:\demo>

下面可以看下当 –repeat-scope=session 的时候的执行结果,首先编写测试文件test_demo.py和test_demo2.py两个文件,其中test_demo.py文件中的测试代码如下:

class TestDemo1():
    def test_01(self):
        print("in test01...")
        assert 1==1

    def test_02(self):
        print("in test02...")
        assert 1==1

test_demo2.py文件中的测试代码如下:

class TestDemo2():
    def test_03(self):
        print("in test03...")
        assert 1==1

    def test_04(self):
        print("in test04...")
        assert 1==1

通过指定 –repeat-scope=session 的执行结果如下,即将所有脚本作为一个整体进行重复执行了3次。

(demo--ip5ZZo0) D:\demo>pytest -s --count=3 --repeat-scope=session
=================== test session starts ===================
platform win32 -- Python 3.7.9, pytest-7.1.3, pluggy-1.0.0
rootdir: D:\demo
plugins: repeat-0.9.1
collected 12 items

test_demo.py in test01...
.in test02...
.
test_demo2.py in test03...
.in test04...
.
test_demo.py in test01...
.in test02...
.
test_demo2.py in test03...
.in test04...
.
test_demo.py in test01...
.in test02...
.
test_demo2.py in test03...
.in test04...
.

=================== 12 passed in 2.38s ====================

(demo--ip5ZZo0) D:\demo>

你可能感兴趣的:(Pytest,pytest,自动化测试,python)