第三方插件简介
正如pytest开箱即用的强大功能一样,当我们将插件添加到组合中时,它将变得更加出色。pytest的代码库被设计成允许定制和扩展,并且有一些钩子可以通过插件进行修改和改进。
你可能会惊讶地发现你已经写过一些插件了。任何时候你把固定装置和/或钩子函数放到项目的conftest.py文件中,你就创建了一个本地插件。把这些conftest.py文件转换成可安装的插件,只是一点额外的工作,你可以在项目之间、与其他人、或与世界分享。
参考资料
- 本文涉及的python测试开发库 谢谢点赞!
- 本文相关海量书籍下载
寻找插件
你可以在几个地方找到第三方的pytest插件。
- https://docs.pytest.org/en/latest/reference/plugin_list.html
pytest的主要文档网站包括按字母顺序排列的插件列表,这些插件来自pypi.org。
- https://pypi.org
Python Package Index (PyPI) 是一个获得大量 Python 包的好地方,但它也是寻找 pytest 插件的好地方。当寻找pytest插件时,搜索pytest、pytest-或-pytest应该很有效,因为大多数pytest插件要么以pytest-开头,要么以-pytest结尾。你也可以通过分类器 "Framework::Pytest "进行过滤,这将包括那些包含pytest插件但不以pytest-或-pytest命名的包,如Hypothesis和Faker。
- https://github.com/pytest-dev
GitHub上的pytest-dev组是保存pytest源代码的地方。在这里也可以找到许多流行的pytest插件。对于插件来说,pytest-dev组的目的是作为流行的pytest插件的中心位置,并分担一些维护责任。更多信息请参考docs.pytest.org网站上的 "向pytest-dev提交插件"。
- https://docs.pytest.org/en/latest/how-to/plugins.html
pytest文档主站有一个关于安装和使用pytest插件的页面,并列出了一些常见的插件。
常见插件
pytest,默认情况下,以一种可预测的流程运行我们的测试。给定一个测试文件的目录,pytest将按字母顺序运行每个文件。在每个文件中,每个测试都是按照它在文件中出现的顺序运行。
有时候,改变这个顺序是很好的。下面的插件在某种程度上改变了正常的测试运行流程。
pytest-order-允许我们用标记来指定顺序。
pytest-randomly-随机化顺序,首先按文件,然后按类,然后按测试。
pytest-repeat-使我们可以很容易地重复单个测试或多个测试的特定次数。
pytest-rerunfailures-重新运行失败的测试。对不稳定的测试有帮助
pytest-xdist-并行运行测试,可以使用一台机器上的多个CPU,或者多个远程机器。
正常的pytest输出主要显示通过测试的圆点,以及其他输出的字符。如果你输入-v,你会看到测试名称的列表和结果。然而,有一些插件可以改变输出。
pytest-instafail-添加一个-instafail标志,在测试失败后立即报告回溯和失败的输出。通常情况下,pytest会在所有测试完成后报告失败测试的回溯和输出。
pytest-sugar-显示绿色复选标记,而不是通过测试的点,并有一个漂亮的进度条。它也会像 pytest-instafail 一样即时显示失败的情况。
pytest-html-允许生成html报告。报告可以用额外的数据和图片来扩展,如失败案例的截图。
pytest被广泛用于测试Web项目,所以有一长串的插件来帮助Web测试也就不足为奇了。
pytest-selenium-提供固定装置,允许轻松配置基于浏览器的测试。Selenium是浏览器测试的一个流行工具。
pytest-splinter-建立在Selenium之上,作为一个更高层次的接口,这使得Splinter可以更容易地从pytest中使用。
pytest-django和pytest-flask-帮助使用pytest更容易测试Django和Flask应用程序。Django和Flask是Python中最流行的两个Web框架。
我们在Combining Markers with Fixtures中使用Faker来生成卡片摘要和所有者数据。在不同的领域有很多情况下,生成假数据是有帮助的。毫不奇怪,有几个插件可以满足这个需求。
Faker-为你生成假数据。提供与pytest一起使用的faker夹具。
model-bakery-生成带有假数据的Django模型对象。
pytest-factoryboy-包括Factory Boy的固定装置,一个数据库模型数据生成器。
pytest-mimesis-生成类似于Faker的假数据,但Mimesis的速度要快得多。
扩展pytest功能的插件:所有的插件都扩展了pytest的功能,但我已经没有好的分类名称了。这是一个由各种很酷的插件组成的抓包。
pytest-cov-测试时运行覆盖率
pytest-benchmark-对测试中的代码进行基准计时。
pytest-timeout-不要让测试运行太长时间
pytest-asyncio-测试异步函数
pytest-bdd-用pytest编写行为驱动开发(BDD)风格的测试
pytest-freezegun-冻结时间,这样任何读取时间的代码在测试中都会得到相同的值。你也可以设置一个特定的日期或时间。
pytest-mock-围绕unittest.mock修补API的一个薄的包装。
虽然许多人可能会发现本节中列出的插件很有帮助,但有两个插件在帮助加快测试速度和寻找测试之间的意外依赖方面几乎得到了普遍认可:PYTEST-XDIST和PYTEST-Randomly。接下来让我们仔细看看这两个插件。
使用Parallel并行运行测试
pytest-xdist插件可以指定多个处理器并并行运行许多测试。你甚至可以把测试推到其他机器上,使用不止一台计算机。
例如,让我们看一下下面这个简单的测试。
ch14/test_parallel.py
import time
def test_something():
time.sleep(1)
运行它大约需要一秒钟。如果我们使用 pytest-repeat 在 --count=10 的情况下运行 10 次,应该需要 10 秒左右。
现在我们可以通过在四个CPU上用-n=4并行运行这些测试来加速事情。
$ pytest --count=10 -n=4 test_parallel.py
============================= test session starts =============================
platform win32 -- Python 3.9.13, pytest-7.1.2, pluggy-1.0.0
rootdir: D:\code\pytest_quick\ch14, configfile: pytest.ini
plugins: allure-pytest-2.12.0, Faker-4.18.0, tep-0.8.2, anyio-3.5.0, cov-4.0.0, repeat-0.9.1, xdist-3.1.0
gw0 I / gw1 I / gw2 I / gw3 I
gw0 [10] / gw1 [10] / gw2 [10] / gw3 [10]
.......... [100%]
============================= 10 passed in 4.30s ==============================
在-n=auto上运行是一个更好的做法,以获得最好的加速。老实说,我不知道这怎么会有这么好的效果,但即使我有六个核心,-n=auto也比-n=6快。
pytest-xdist插件还有一个不错的功能:--looponfail标志。--looponfail标志使你可以在一个子进程中重复运行测试。每次运行后,pytest等待,直到项目中的一个文件发生变化,然后重新运行之前失败的测试。这样反复进行,直到所有测试都通过,然后再进行一次完整的运行。这个功能对于调试大量的测试失败是非常酷的。
随机测试顺序
pytest-randomly插件在随机化测试顺序方面非常出色。它还能随机化其他随机工具的种子值,如Faker和Factory Boy。让我们在几个简单的测试文件上试试吧。
ch14/random/test_a.py
def test_one():
pass
def test_two():
pass
ch14/random/test_b.py
def test_three():
pass
def test_four():
pass
如果我们正常运行这些,我们会得到第一到第四个测试。
$ cd path/to/code/ch14/random
$ pytest -v
============================= test session starts =============================
platform win32 -- Python 3.9.13, pytest-7.1.2, pluggy-1.0.0 -- D:\ProgramData\Anaconda3\python.exe
cachedir: .pytest_cache
rootdir: D:\code\pytest_quick\ch14, configfile: pytest.ini
plugins: allure-pytest-2.12.0, Faker-4.18.0, tep-0.8.2, anyio-3.5.0, cov-4.0.0, repeat-0.9.1, xdist-3.1.0
collecting ... collected 4 items
test_a.py::test_one PASSED [ 25%]
test_a.py::test_two PASSED [ 50%]
test_b.py::test_three PASSED [ 75%]
test_b.py::test_four PASSED [100%]
============================== 4 passed in 0.09s ==============================
安装 pytest-randomly, 在使用pytest -v执行就已经是随机顺序。
确保你的测试以随机顺序运行良好,这似乎是一件奇怪的事情。然而,没有正确隔离的测试已经造成了许多深夜的调试过程。定期随机化你的测试可以帮助你避免这些问题。