当前位置:   article > 正文

pytest系列教程——11、用例重复执行、顺序执行、分布式执行_pytest.main重复运行

pytest.main重复运行

重复执行

当我们想要复现某个偶现的问题时候,重复执行测试脚本当然是最好的选择。不用写个循环去执行,pytest提供了pytest-repeat插件去做这件事。

安装

pip install pytest-repeat

使用
  • 直接在运行脚本本使用
import pytest
from random import randint


def test01():
    assert randint(1,10) % 2 == 0

if __name__ == '__main__':
    pytest.main(['重复执行.py', '-s','--count=5'])

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

运行结果:

collected 5 items

重复执行.py ..F..

================================== FAILURES ===================================
_________________________________ test01[3-5] _________________________________

def test01():
>       assert randint(1,10) % 2 == 0
E       assert (7 % 2) == 0
E        +  where 7 = randint(1, 10)

重复执行.py:6: AssertionError
=========================== short test summary info ===========================
FAILED 重复执行.py::test01[3-5] - assert (7 % 2) == 0
========================= 1 failed, 4 passed in 0.19s =========================

***Repl Closed***
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 在命令行中使用,效果一样:

pytest 重 复执行.py -s --count 5

  • 使用装饰器执行:
import pytest
from random import randint


@pytest.mark.repeat(5)
def test01():
    assert randint(1,10) % 2 == 0

if __name__ == '__main__':
    pytest.main(['重复执行.py', '-s'])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

效果同上:

重复执行.py FF...

================================== FAILURES ===================================
_________________________________ test01[1-5] _________________________________

    @pytest.mark.repeat(5)
    def test01():
>       assert randint(1,10) % 2 == 0
E       assert (5 % 2) == 0
E        +  where 5 = randint(1, 10)

重复执行.py:7: AssertionError
_________________________________ test01[2-5] _________________________________

    @pytest.mark.repeat(5)
    def test01():
>       assert randint(1,10) % 2 == 0
E       assert (9 % 2) == 0
E        +  where 9 = randint(1, 10)

重复执行.py:7: AssertionError
=========================== short test summary info ===========================
FAILED 重复执行.py::test01[1-5] - assert (5 % 2) == 0
FAILED 重复执行.py::test01[2-5] - assert (9 % 2) == 0
========================= 2 failed, 3 passed in 0.19s =========================

***Repl Closed***
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

顺序执行

有如下代码,希望它的执行顺序是按照我所设定的场景执行登录->增加用户->退出,但是实际运行结果是按照代码顺序进行的,例如:

import pytest
from time import sleep


def testLogin():
    print("登录")


def testLogout():
    print("退出")


def testAddUser():
    print("增加用户")


if __name__ == '__main__':
    pytest.main(['非顺序执行.py', '-s'])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

结果:

collected 3 items

非顺序执行.py 登录
.退出
.增加用户
.

============================== 3 passed in 3.12s ==============================

***Repl Closed***
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

这个时候我们就可以使用pytest-ordering插件实现指定顺序运行。

安装

pip install pytest-ordering

使用
import pytest
from time import sleep


@pytest.mark.run(order=1)
def testLogin():
    sleep(1)
    print("登录")


@pytest.mark.run(order=3)
def testLogout():
    sleep(1)
    print("退出")


@pytest.mark.run(order=2)
def testAddUser():
    sleep(1)
    print("增加用户")


if __name__ == '__main__':
    pytest.main(['顺序执行.py', '-s'])

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

运行结果:

collected 3 items

顺序执行.py 登录
.增加用户
.退出
.

============================== 3 passed in 3.12s ==============================

***Repl Closed***
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

分布式运行

当我有100条脚本的时候,每条执行大概1秒,如果顺序执行完的话,至少100秒。为了缩短测试时间,我们引入了并发执行的插件pytest-xdist

安装

pip install pytest-xdist

使用

先对比下我们最开始的例子,我这里写6条case,每条执行一秒。总共耗时可以看下:

import pytest
from time import sleep


def test01():
    sleep(1)
    print("test01")


def test02():
    sleep(1)
    print("test02")


def test03():
    sleep(1)
    print("test03")


def test04():
    sleep(1)
    print("test04")


def test05():
    sleep(1)
    print("test05")


def test06():
    sleep(1)
    print("test06")


if __name__ == '__main__':
    pytest.main(['非分布式执行.py', '-s'])

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

运行结果:

collected 6 items

非分布式执行.py test01
.test02
.test03
.test04
.test05
.test06
.

============================== 6 passed in 6.10s ==============================

***Repl Closed***
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

可见,运行时间6.10s
当我们引入分布式的执行参数,运行参数增加 -n numbernumber是几,则就代表几个并行数量

import pytest
from time import sleep


def test01():
    sleep(1)
    print("test01")


def test02():
    sleep(1)
    print("test02")


def test03():
    sleep(1)
    print("test03")


def test04():
    sleep(1)
    print("test04")


def test05():
    sleep(1)
    print("test05")


def test06():
    sleep(1)
    print("test06")


if __name__ == '__main__':
    pytest.main(['分布式执行.py', '-s',  '-n=3'])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

优化后结果,缩减为3.17s:

gw0 I / gw1 I / gw2 I
gw0 [6] / gw1 [6] / gw2 [6]

......
============================== 6 passed in 3.17s ==============================

***Repl Closed***
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
原理
  • xdist的分布式类似于一主多从的结构,master机负责下发命令,控制slave机;slave机根据master机的命令执行特定测试任务
  • 在xdist中,主是master,从是workers
  • xdist会产生一个或多个workers,workers都通过master来控制
  • 每个worker负责执行完整的测试用例集,然后按照master的要求运行测试,而master机不执行测试任务
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/649495
推荐阅读
相关标签
  

闽ICP备14008679号