python自动测试n_Pytest自动化测试 - 必知必会的一些插件

本文介绍了Pytest的一些热门插件,如pytest-html用于生成详细测试报告,pytest-cov用于代码覆盖率分析,pytest-xdist加速测试执行,pytest-rerunfailures处理间歇性故障,以及pytest-randomly实现测试随机化。通过这些插件,可以提升测试效率和质量。
摘要由CSDN通过智能技术生成

e282a94df50c720b49b775320d302fdf.png

Pytest拥有丰富的插件架构,超过800个以上的外部插件和活跃的社区,在PyPI项目中以“ pytest- *”为标识。

本篇将列举github标星超过两百的一些插件进行实战演示。

1、

一次完整的测试,测试报告是必不可少的,但是pytest自身的测试结果过于简单,而pytest-html正好可以给你提供一份清晰报告。

安装:

pip install -U pytest-html

用例:

#test_sample.py

importpytest#import time

#被测功能

defadd(x, y):#time.sleep(1)

return x +y#测试类

classTestLearning:

data=[

[3, 4, 7],

[-3, 4, 1],

[3, -4, -1],

[-3, -4, 7],

]

@pytest.mark.parametrize("data", data)deftest_add(self, data):assert add(data[0], data[1]) == data[2]

运行:

E:\workspace-py\Pytest>pytest test_sample.py --html=report/index.html========================================================================== test session starts ==========================================================================platform win32-- Python 3.7.3, pytest-6.0.2, py-1.9.0, pluggy-0.13.0rootdir: E:\workspace-py\Pytest

plugins: allure-pytest-2.8.18, cov-2.10.1, html-3.0.0, rerunfailures-9.1.1, xdist-2.1.0collected4items

test_sample.py ...F [100%]=============================================================================== FAILURES ================================================================================_____________________________________________________________________ TestLearning.test_add[data3] ______________________________________________________________________

self= , data = [-3, -4, 7]

@pytest.mark.parametrize("data", data)

def test_add(self, data):> assert add(data[0], data[1]) == data[2]

E assert-7 == 7

E + where -7 = add(-3, -4)

test_sample.py:20: AssertionError------------------------------------------------- generated html file: file://E:\workspace-py\Pytest\report\index.html --------------------------------------------------

======================================================================== short test summary info ========================================================================FAILED test_sample.py::TestLearning::test_add[data3]- assert -7 == 7

====================================================================== 1 failed, 3 passed in 0.14s ======================================================================

运行完,会生产一个html文件 和 css样式文件夹assets,用浏览器打开html即可查看清晰的测试结果。

e5007da4790820d160c879fcff716c4b.png

e4ae2d35c1f83e0621460cc5ee7c9b98.png

后面我将会更新更加清晰美观的测试报告插件:

2、

在做单元测试时,代码覆盖率常常被拿来作为衡量测试好坏的指标,甚至,用代码覆盖率来考核测试任务完成情况。

安装:

pip install -U pytest-cov

运行:

E:\workspace-py\Pytest>pytest --cov=.========================================================================== test session starts ==========================================================================platform win32-- Python 3.7.3, pytest-6.0.2, py-1.9.0, pluggy-0.13.0rootdir: E:\workspace-py\Pytest

plugins: allure-pytest-2.8.18, cov-2.10.1, html-3.0.0, rerunfailures-9.1.1, xdist-2.1.0collected4items

test_sample.py .... [100%]----------- coverage: platform win32, python 3.7.3-final-0 -----------Name Stmts Miss Cover------------------------------------conftest.py5 3 40%test_sample.py7 0 100%

------------------------------------TOTAL12 3 75%

=========================================================================== 4 passed in 0.06s ===========================================================================

3、

通过将测试发送到多个CPU来加速运行,可以使用-n NUMCPUS指定具体CPU数量,或者使用-n auto自动识别CPU数量并全部使用。

安装:

pip install -U pytest-xdist

用例:

#test_sample.py

importpytestimporttime#被测功能

defadd(x, y):

time.sleep(3)return x +y#测试类

classTestAdd:deftest_first(self):assert add(3, 4) == 7

deftest_second(self):assert add(-3, 4) == 1

deftest_three(self):assert add(3, -4) == -1

deftest_four(self):assert add(-3, -4) == 7

运行:

E:\workspace-py\Pytest>pytest test_sample.py========================================================================== test session starts ==========================================================================platform win32-- Python 3.7.3, pytest-6.0.2, py-1.9.0, pluggy-0.13.0rootdir: E:\workspace-py\Pytest

plugins: allure-pytest-2.8.18, cov-2.10.1, html-3.0.0, rerunfailures-9.1.1, xdist-2.1.0collected4items

test_sample.py .... [100%]========================================================================== 4 passed in 12.05s ===========================================================================E:\workspace-py\Pytest>pytest test_sample.py-n auto========================================================================== test session starts ==========================================================================platform win32-- Python 3.7.3, pytest-6.0.2, py-1.9.0, pluggy-0.13.0rootdir: E:\workspace-py\Pytest

plugins: allure-pytest-2.8.18, assume-2.3.3, cov-2.10.1, forked-1.3.0, html-3.0.0, rerunfailures-9.1.1, xdist-2.1.0gw0 [4] / gw1 [4] / gw2 [4] / gw3 [4]

.... [100%]=========================================================================== 4 passed in 5.35s ===========================================================================E:\workspace-py\Pytest>pytest test_sample.py -n 2

========================================================================== test session starts ==========================================================================platform win32-- Python 3.7.3, pytest-6.0.2, py-1.9.0, pluggy-0.13.0rootdir: E:\workspace-py\Pytest

plugins: allure-pytest-2.8.18, assume-2.3.3, cov-2.10.1, forked-1.3.0, html-3.0.0, rerunfailures-9.1.1, xdist-2.1.0gw0 [4] / gw1 [4]

.... [100%]=========================================================================== 4 passed in 7.65s ===========================================================================

上述分别进行了未开多并发、开启4个cpu、开启2个cpu,从运行耗时结果来看,很明显多并发可以大大缩减你的测试用例运行耗时。

我们在测试时可能会出现一些间接性故障,比如接口测试遇到网络波动,web测试遇到个别插件刷新不及时等,这时重新运行则可以帮忙我们消除这些故障。

安装:

pip install -U pytest-rerunfailures

运行:

E:\workspace-py\Pytest>pytest test_sample.py --reruns 3

========================================================================== test session starts ==========================================================================platform win32-- Python 3.7.3, pytest-6.0.2, py-1.9.0, pluggy-0.13.0rootdir: E:\workspace-py\Pytest

plugins: allure-pytest-2.8.18, cov-2.10.1, html-3.0.0, rerunfailures-9.1.1, xdist-2.1.0collected4items

test_sample.py ...R [100%]R

[100%]R [100%]F [100%]=============================================================================== FAILURES ================================================================================___________________________________________________________________________ TestAdd.test_four ___________________________________________________________________________

self= def test_four(self):> assert add(-3, -4) == 7E assert-7 == 7E+ where -7 = add(-3, -4)

test_sample.py:22: AssertionError======================================================================== short test summary info ========================================================================FAILED test_sample.py::TestAdd::test_four- assert -7 == 7

================================================================= 1 failed, 3 passed, 3 rerun in 0.20s ==================================================================

如果你想设定重试间隔,可以使用--rerun-delay 参数指定延迟时长(单位秒);

如果你想重新运行指定错误,可以使用 --only-rerun 参数指定正则表达式匹配,并且可以使用多次来匹配多个。

pytest --reruns 5 --reruns-delay 1 --only-rerun AssertionError --only-rerun ValueError

如果你只想标记单个测试失败时自动重新运行,可以添加pytest.mark.flaky() 并指定重试次数以及延迟间隔。

@pytest.mark.flaky(reruns=5, reruns_delay=2)deftest_example():importrandomassert random.choice([True, False])

测试中的随机性非常越大越容易发现测试本身中隐藏的缺陷,并为你的系统提供更多的覆盖范围。

安装:

pip install -U pytest-randomly

运行:

E:\workspace-py\Pytest>pytest test_sample.py========================================================================== test session starts ==========================================================================platform win32-- Python 3.7.3, pytest-6.0.2, py-1.9.0, pluggy-0.13.0Using--randomly-seed=3687888105rootdir: E:\workspace-py\Pytest

plugins: allure-pytest-2.8.18, cov-2.10.1, html-3.0.0, randomly-3.5.0, rerunfailures-9.1.1, xdist-2.1.0collected4items

test_sample.py F... [100%]=============================================================================== FAILURES ================================================================================___________________________________________________________________________ TestAdd.test_four ___________________________________________________________________________

self= def test_four(self):> assert add(-3, -4) == 7E assert -7 == 7

E + where -7 = add(-3, -4)

test_sample.py:22: AssertionError======================================================================== short test summary info ========================================================================FAILED test_sample.py::TestAdd::test_four- assert -7 == 7

====================================================================== 1 failed, 3 passed in 0.13s ======================================================================E:\workspace-py\Pytest>pytest test_sample.py========================================================================== test session starts ==========================================================================platform win32-- Python 3.7.3, pytest-6.0.2, py-1.9.0, pluggy-0.13.0Using--randomly-seed=3064422675rootdir: E:\workspace-py\Pytest

plugins: allure-pytest-2.8.18, assume-2.3.3, cov-2.10.1, forked-1.3.0, html-3.0.0, randomly-3.5.0, rerunfailures-9.1.1, xdist-2.1.0collected4items

test_sample.py ...F [100%]=============================================================================== FAILURES ================================================================================___________________________________________________________________________ TestAdd.test_four ___________________________________________________________________________

self= def test_four(self):> assert add(-3, -4) == 7E assert -7 == 7

E + where -7 = add(-3, -4)

test_sample.py:22: AssertionError======================================================================== short test summary info ========================================================================FAILED test_sample.py::TestAdd::test_four- assert -7 == 7

====================================================================== 1 failed, 3 passed in 0.12s ======================================================================

这功能默认情况下处于启用状态,但可以通过标志禁用(假如你并不需要这个模块,建议就不要安装)。

pytest -p no:randomly

如果你想指定随机顺序,可以通过--randomly-send 参数来指定,也可以使用 last 值来指定沿用上次的运行顺序。

pytest --randomly-seed=4321

pytest --randomly-seed=last

6、其他活跃的插件

还有一些其他功能性比较活跃的、一些专门为个别框架所定制的、以及为了兼容其他测试框架,这里暂不做演示,我就简单的做个列举:

pytest-django:用于测试Django应用程序(Python Web框架)。

pytest-flask:用于测试Flask应用程序(Python Web框架)。

pytest-splinter:兼容Splinter Web自动化测试工具。

pytest-selenium:兼容Selenium Web自动化测试工具。

pytest-testinfra:测试由Salt,Ansible,Puppet, Chef等管理工具配置的服务器的实际状态。

pytest-mock:提供一个mock固件,创建虚拟的对象来实现测试中个别依赖点。

pytest-factoryboy:结合factoryboy工具用于生成各式各样的数据。

PyQt5和PySide2应用程序编写测试。

pytest-asyncio:用于使用pytest测试异步代码。

pytest-bdd:实现了Gherkin语言的子集,以实现自动化项目需求测试并促进行为驱动的开发。

pytest-watch:为pytest提供一套快捷CLI工具。

pytest-testmon:可以自动选择并重新执行仅受最近更改影响的测试。

pytest-assume:用于每个测试允许多次失败。

pytest-sugar:可立即显示失败和错误并显示进度条。

pytest-dev/pytest-repeat:可以重复(可指定次数)执行单个或多个测试。

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值