python如何重复执行用例方法_pytest文档28-重复执行用例(pytest-repeat)

本文介绍了如何使用pytest-repeat插件在Python测试中重复执行单个或多个测试用例,包括通过命令行选项`--count`指定执行次数,以及通过`@pytest.mark.repeat`装饰器标记重复执行的测试。同时,文章还提到了`--repeat-scope`参数以控制重复执行的范围,并展示了不同场景下的使用示例。
摘要由CSDN通过智能技术生成

前言

平常在做功能测试的时候,经常会遇到某个模块不稳定,偶然会出现一些bug,对于这种问题我们会针对此用例反复执行多次,最终复现出问题来。

自动化运行用例时候,也会出现偶然的bug,可以针对单个用例,或者针对某个模块的用例重复执行多次。

pytest-repeat

pytest-repeat是pytest的一个插件,用于重复执行单个用例,或多个测试用例,并指定重复次数,pytest-repeat支持的版本:

Python 2.7, 3.4+ 或 PyPy

py.test 2.8或更高

使用pip安装pytest-repeat

pip install pytest-repeat

使用--count命令行选项指定要运行测试用例和测试次数

py.test --count=10 test_file.py

重复执行--count

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

web_conf_py是项目工程名称

│ 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

代码参考:

# web_conf_py/conftest.py

import pytest

@pytest.fixture(scope="session")

def start():

print("\n打开首页")

return "yoyo"

# web_conf_py/baidu/conftest.py

import pytest

@pytest.fixture(scope="session")

def open_baidu():

print("打开百度页面_session")

# web_conf_py/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"])

# web_conf_py/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"])

cmd进入到工程目录后,不带--count参数只会执行一次

pytest baidu/test_1_baidu.py -s

E:\YOYO\web_conf_py>pytest baidu/test_1_baidu.py -s

============================= test session starts =============================

platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0

rootdir: E:\YOYO\web_conf_py, inifile:

plugins: xdist-1.23.2, repeat-0.7.0, metadata-1.7.0, html-1.19.0, forked-0.2

collected 2 items

baidu\test_1_baidu.py

打开首页

打开百度页面_session

测试用例test_01

.测试用例test_02

.

========================== 2 passed in 1.03 seconds ===========================

加上参数--count=5,用例会重复执行5次

pytest baidu/test_1_baidu.py -s --count=5

E:\YOYO\web_conf_py>pytest baidu/test_1_baidu.py -s --count=5

============================= test session starts =============================

platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0

rootdir: E:\YOYO\web_conf_py, inifile:

plugins: xdist-1.23.2, repeat-0.7.0, metadata-1.7.0, html-1.19.0, forked-0.2

collected 10 items

baidu\test_1_baidu.py

打开首页

打开百度页面_session

测试用例test_01

.测试用例test_01

.测试用例test_01

.测试用例test_01

.测试用例test_01

.测试用例test_02

.测试用例test_02

.测试用例test_02

.测试用例test_02

.测试用例test_02

.

========================== 10 passed in 5.06 seconds ==========================

从运行的用例结果看,是先重复5次test_01,再重复5次test_02,有时候我们希望执行的顺序是test_01,test_02按这样顺序重复五次,接下来就用到一个参数--repeat-scope

--repeat-scope

--repeat-scope类似于pytest fixture的scope参数,--repeat-scope也可以设置参数: session , module,class或者function(默认值)

function(默认)范围针对每个用例重复执行,再执行下一个用例

class 以class为用例集合单位,重复执行class里面的用例,再执行下一个

module 以模块为单位,重复执行模块里面的用例,再执行下一个

session 重复整个测试会话,即所有收集的测试执行一次,然后所有这些测试再次执行等等

使用--repeat-scope=session重复执行整个会话用例

pytest baidu/test_1_baidu.py -s --count=5 --repeat-scope=session

E:\YOYO\web_conf_py>pytest baidu/test_1_baidu.py -s --count=5 --repeat-scope=session

============================= test session starts =============================

platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0

rootdir: E:\YOYO\web_conf_py, inifile:

plugins: xdist-1.23.2, repeat-0.7.0, metadata-1.7.0, html-1.19.0, forked-0.2

collected 10 items

baidu\test_1_baidu.py

打开首页

打开百度页面_session

测试用例test_01

.测试用例test_02

.测试用例test_01

.测试用例test_02

.测试用例test_01

.测试用例test_02

.测试用例test_01

.测试用例test_02

.测试用例test_01

.测试用例test_02

.

========================== 10 passed in 5.07 seconds ==========================

@pytest.mark.repeat(count)

如果要在代码中标记要重复多次的测试,可以使用@pytest.mark.repeat(count)装饰器

# test_1_baidu.py

import pytest

import time

def test_01(start, open_baidu):

print("测试用例test_01")

time.sleep(0.5)

assert start == "yoyo"

@pytest.mark.repeat(5)

def test_02(start, open_baidu):

print("测试用例test_02")

time.sleep(0.5)

assert start == "yoyo"

if __name__ == "__main__":

pytest.main(["-s", "test_1_baidu.py"])

这样执行用例时候,就不用带上--count参数,只针对test_02重复执行5次

E:\YOYO\web_conf_py>pytest baidu/test_1_baidu.py -s

============================= test session starts =============================

platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0

rootdir: E:\YOYO\web_conf_py, inifile:

plugins: xdist-1.23.2, repeat-0.7.0, metadata-1.7.0, html-1.19.0, forked-0.2

collected 6 items

baidu\test_1_baidu.py

打开首页

打开百度页面_session

测试用例test_01

.测试用例test_02

.测试用例test_02

.测试用例test_02

.测试用例test_02

.测试用例test_02

.

========================== 6 passed in 3.05 seconds ===========================

重复测试直到失败

如果您正在尝试诊断间歇性故障,那么一遍又一遍地运行相同的测试直到失败是有用的。您可以将pytest的-x选项与pytest-repeat结合使用,以强制测试运行器在第一次失败时停止。例如:

py.test --count=1000 -x test_file.py

这将尝试运行test_file.py 1000次,但一旦发生故障就会停止

UnitTest样式测试

不幸的是,此插件不支持unittest框架的用例,pytest-repeat无法使用unittest.TestCase测试类。无论如何,这些测试将始终运行一次--count,并显示警告

更多资料参考【官方文档:https://pypi.org/project/pytest-repeat/】

---------------------------------pytest结合selenium自动化完整版-------------------------

作者:上海-悠悠 QQ交流群:874033608

也可以关注下我的个人公众号:yoyoketang

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值