目录
前言:
顺序执行:pytest-ordering
失败重试:pytest-rerunfailures
并行执行:pytest-xdist
pytest 是一个广泛使用的 Python 测试框架。它具有强大的测试运行器、测试驱动开发和测试结果可视化等功能。除此之外,pytest 还支持许多第三方插件,这些插件可以为测试带来更多的便利和功能。
本文只介绍pytest-ordering
、pytest-rerunfailures
、pytest-xdist
三种插件,报告方面的插件会另起篇幅进行介绍。
pip install pytest-ordering
默认情况下,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 运行
.
安装: 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 重试了三次。
有 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 ===================================
作为一位过来人也是希望大家少走一些弯路
在这里我给大家分享一些自动化测试前进之路的必须品,希望能对你带来帮助。
(软件测试相关资料,自动化测试相关资料,技术问题答疑等等)
相信能使你更好的进步!
点击下方小卡片