Pytest 插件 (Plugins):扩展你的测试武器库 (Pytest 系列之六)

在前几篇文章中,我们已经深入了解了 Pytest的核心特性,包括简洁的语法、强大的 Fixture、灵活的参数化以及可定制的钩子函数。今天,我们将探索 Pytest生态系统中另一个至关重要的组成部分——插件 (Plugins)Pytest拥有一个庞大且活跃的插件生态系统,这些插件能够极大地扩展 Pytest的功能,帮助我们更高效地进行自动化测试,并生成更丰富的测试报告。

回顾:定制与扩展你的测试能力

正如我们在第五篇中学习到的,钩子函数允许我们在 Pytest的执行流程中插入自定义逻辑,从而定制框架的行为。而插件则是在此基础上更进一步,它们通常会封装一组相关的钩子函数和 Fixture,提供更高级、更便捷的功能,无需我们从零开始编写复杂的代码。

Pytest插件生态:丰富的扩展选择

Pytest社区贡献了大量的优秀插件,涵盖了自动化测试的各个方面。无论是生成美观的测试报告、进行测试覆盖率分析、并行执行测试用例,还是提供 Mocking 功能,你几乎都能找到相应的 Pytest 插件来满足你的需求。

常用的Pytest插件介绍和使用

以下是一些常用的 Pytest插件及其基本使用方法:

  • pytest-html:生成漂亮的 HTML 测试报告

    • 功能: pytest-html 插件可以生成易于阅读和分享的 HTML 格式的测试报告,其中包含了测试用例的执行状态、持续时间、日志信息等。

    • 安装:

      pip install pytest-html
      
    • 使用命令行选项指定报告文件的路径:运行结束后,你将在指定的路径下找到生成的文件。

      pytest --html=report.html
      
    • 可以通过预览HTML文件,查看报告;但是这个报告页面不好看;后面我们会介绍专门的第三方报告,Allure

  • pytest-cov:测试覆盖率报告

    • pytest-cov 插件可以生成测试覆盖率报告,帮助你了解你的测试代码覆盖了多少被测代码。

首先编写代码如下,里面包含一些基本的数学运算,文件名为math_operations.py

def add(a,b):
    return a+b

def subtract(a,b):
    return a-b

def multiply(a,b):
    return a*b

def divide(a,b):
    if b == 0:
        raise ZeroDivisionError
    return a/b

现在编写对应的测试代码,文件名为test_math_operations.py

from math_operations import add, subtract, multiply


def test_add():
    assert add(1, 2) == 3
    assert add(-1, 1) == 0


def test_subtract():
    assert subtract(2, 1) == 1
    assert subtract(2, 3) == -1


def test_multiply():
    assert multiply(2, 3) == 6
    assert multiply(0, 5) == 0

  • 安装:
pip install pytest-cov
  • 使用:

运行 Pytest测试时,添加命令行选项指定要分析覆盖率的源代码目录:

pytest --cov=math_operations

输出内容如下,可以看到再输出的报告中;显示了覆盖率只有70%,这意味着我们的测试覆盖了其中的3个方法,但有1个方法没有被测试到。

================================================ tests coverage ================================================= 
________________________________ coverage: platform win32, python 3.13.2-final-0 ________________________________ 

Name                 Stmts   Miss  Cover
----------------------------------------
math_operations.py      10      3    70%
----------------------------------------
TOTAL                   10      3    70%
=============================================== 3 passed in 0.05s =============================================== 

你可以结合--cov-report选项来生成不同格式的报告,常用的报告格式包括

  • term:在终端中显示覆盖率报告
  • html:生成HTML格式的覆盖率报告,可以在浏览器中查看
  • xml:生成XML格式的报告,适合CI工具

例如 HTML 报告:

pytest --cov=math_operations --cov-report=html

执行命令后,可以看到生成了一个htmlcov文件夹,预览里面的Index.html就可以看到报告了

  • 排除不必要的文件

    有的时候我们不想把某些文件纳入到覆盖率检查里面,这个时候可以通过 .coveragerc 配置文件或者命令行参数来排除这些文件。以下是一个简单的 .coveragerc 文件示例:

[coverage:run]
omit =
    */tests/*
    */venv/*

这个意思就是,会排除所有testsvenv文件夹的文件

  • pytest-xdist:并行执行测试用例

    • 功能: pytest-xdist 插件允许你并行执行测试用例,从而显著缩短测试执行时间,尤其是在测试用例数量较多的项目中。

    • 安装:

      pip install pytest-xdist
      
    • 运行Pytest测试时,添加命令行选项指定要使用的 worker 数量:

      pytest -n 2  # 使用 2 个 worker 并行执行测试
      pytest -n auto # 自动检测 CPU 核心数并使用
      
  • pytest-ordering:控制测试用例的执行顺序 (不推荐过度使用)

    • 功能: pytest-ordering 插件允许你通过 @pytest.mark.run 标记来控制测试用例的执行顺序。注意:过度依赖测试用例的执行顺序通常不是好的实践,测试用例应该尽可能独立。

    • 安装:

      pip install pytest-ordering
      
    • 使用:

      在测试函数或类上使用标记指定执行顺序,n为整数,数值越小越先执行。

      import pytest
      
      @pytest.mark.run(order=2)
      def test_add():
          assert add(1, 2) == 3
          assert add(-1, 1) == 0
      
      
      @pytest.mark.run(order=4)
      def test_subtract():
          assert subtract(2, 1) == 1
          assert subtract(2, 3) == -1
      
      
      @pytest.mark.run(order=1)
      def test_multiply():
          assert multiply(2, 3) == 6
          assert multiply(0, 5) == 0
      
      
      @pytest.mark.run(order=3)
      def test_divide():
          assert divide(6, 3) == 2
          try:
              divide(6, 0)
          except ZeroDivisionError:
              pass
          
          
      输出内容如下;可以看到会按照order的从小到大的顺序执行
      07_Plugins_test.py::test_multiply PASSED
      07_Plugins_test.py::test_add PASSED
      07_Plugins_test.py::test_divide PASSED
      07_Plugins_test.py::test_subtract PASSED
      
      
      
  • pytest-rerunfailures:失败用例自动重试

    • 功能: pytest-rerunfailures 插件可以在测试用例失败时自动重新运行它们,这对于处理一些间歇性失败的测试场景非常有用。

    • 安装:

      pip install pytest-rerunfailures
      
    • 运行 Pytest 测试时,添加--reruns命令行选项指定重试次数:接受一个正整数,表示失败重跑的次数;是一个必填参数

      pytest --reruns 2
      
    • 还可以添加--reruns-delay参数,接受一个正整数,表示重跑之间的延迟秒数;是一个可选参数

      pytest --reruns 2 --reruns-delay 5
      
  • pytest-sugar:改进测试输出的显示

    • 功能: pytest-sugar 插件可以使 Pytest 的终端输出更加美观和易于阅读,例如显示更详细的进度条和失败信息。

    • 安装:

      pip install pytest-sugar
      
    • 使用: 安装后,pytest-sugar 会自动生效,无需额外的命令行选项。

安装和配置 Pytest 插件

安装 Pytest插件通常只需要使用 pip install <plugin_name> 命令。安装完成后,Pytest会自动发现并加载这些插件。

某些插件可能需要额外的配置,可以通过以下方式进行配置:

  • 命令行选项: 大部分插件会提供自己的命令行选项,例如 --html--cov-n 等。
  • pytest.ini 文件: 一些插件允许在 pytest.ini 文件中进行更细致的配置。你可以查阅插件的官方文档了解具体的配置方法。
开发自定义 Pytest 插件(入门)

如果你需要更高级的功能,或者想将你的测试扩展逻辑分享给其他人,你可以开发自己的 Pytest插件。一个简单的 Pytest 插件通常包含一个或多个实现了 Pytest钩子函数的 Python 模块。

要开发一个自定义插件:

  • 创建一个 Python 文件: 你的插件代码可以放在一个单独的 .py 文件中。

  • 实现 Pytest钩子函数: 在你的文件中定义以 pytest_ 开头的函数,实现你需要的钩子逻辑。

  • Pytest能够找到你的插件:

    • 如果你的插件是项目特定的,可以将包含钩子函数的文件命名为 conftest.py 并放在你的测试目录或其父目录中。Pytest会自动加载 conftest.py 文件中的钩子函数。

    • 如果你的插件是可复用的,你可以将其打包并发布到 PyPI上,其他用户可以通过 pip install安装。

总结

Pytest的插件生态系统为我们提供了丰富的工具,能够极大地扩展 Pytest 的功能,简化我们的测试工作流程,并生成更有价值的测试报告。通过灵活地选择和配置合适的插件,我们可以打造出更强大、更高效的自动化测试解决方案。在接下来的文章中,我们将学习如何在 Pytest中集成 Selenium,进行 Web 应用程序的自动化测试。请继续关注!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值