开发人员测试提示

Matplotlib的测试基础设施依赖于 pytest. 测试正在进行中 lib/matplotlib/tests 和对pytest测试基础结构的自定义 matplotlib.testing .

要求

安装Matplotlib的最新版本,如中所述 检索和安装最新版本的代码 .

运行测试需要以下软件:

可以选择安装:

运行测试

运行测试很简单。确保已安装并运行pytest::

pytest

在存储库的根目录中。

pytest可以通过许多 command-line parameters . 一些特别有用的方法是:

-v or --verbose 更冗长
-n NUM 在num进程上并行运行测试(需要 pytest-xdist)
--timeout=SECONDS 为每个测试过程的结果设置超时(需要 pytest-timeout)
--capture=no or -s 不捕获stdout
--flake8 使用检查编码标准 flake8 (需要 pytest-flake8)

要从命令行运行单个测试,可以提供一个文件路径,后面可选地跟有两个冒号分隔的函数,例如(不需要安装测试,但Matplotlib应为)::

pytest lib/matplotlib/tests/test_simplification.py::test_clipping

或者,如果安装了测试,则是指向模块的以点分隔的路径,可以选择后跟由两个冒号分隔的函数,例如:

pytest --pyargs matplotlib.tests.test_simplification::test_clipping

如果要运行完整的测试套件,但要节省墙时间,请尝试并行运行测试::

pytest --verbose -n 5

另一种不查看命令行参数并在python中工作的实现是从matplotlibrary函数运行测试。 matplotlib.test() ::

import matplotlib
matplotlib.test()

写一个简单的测试

Matplotlib的许多元素可以使用标准测试进行测试。例如,这里有一个来自 matplotlib.tests.test_basic ::

def test_simple():
    """
    very simple example test
    """
    assert 1 + 1 == 2

pytest通过搜索名称以开头的文件来确定哪些函数是测试函数 "test_" 然后在这些文件中查找以 "test" 或以开头的类 "Test" .

有些测试有内部副作用,需要在执行后进行清理(例如创建图形或修改图形) rcParams ). 测试夹具 mpl_test_settings() 将自动清理这些;无需再做任何事情。

测试中的随机数据

随机数据是为示例生成数据的一种非常方便的方法,但是随机性对于测试来说是有问题的(因为测试必须是确定性的!)。为了解决这个问题,在每次测试中都会有种子。供numpy使用:

import numpy as np
np.random.seed(19680801)

以及python的随机数生成器:

import random
random.seed(19680801)

种子是约翰·亨特的生日。

编写图像比较测试

编写基于图像的测试只比简单的测试稍微困难一些。主要考虑的是必须在 image_comparison 装饰者。例如,此测试生成单个图像并自动测试它:

from matplotlib.testing.decorators import image_comparison
import matplotlib.pyplot as plt

@image_comparison(baseline_images=['line_dashes'], remove_text=True,
                  extensions=['png'])
def test_line_dashes():
    fig, ax = plt.subplots()
    ax.plot(range(10), linestyle=(0, (3, 3)), lw=5)

第一次运行此测试时,将没有要比较的基线图像,因此测试将失败。复制输出图像(在本例中 result_images/test_lines/test_line_dashes.png )到的正确子目录 baseline_images 源目录中的树(在本例中 lib/matplotlib/tests/baseline_images/test_lines )将此新文件置于源代码修订控制之下(使用 git add )当重新运行测试时,它们现在应该通过了。

基线图像在Matplotlib存储库中占用大量空间。图像比较测试的另一种方法是使用 check_figures_equal decorator,它应该用来装饰一个函数,取两个 Figure 使用两种不同的方法(测试方法和基线方法)在图形上绘制相同的图像。装饰师将安排设置图形,然后收集绘制的结果并进行比较。

参见以下文件: image_comparisoncheck_figures_equal 以获取有关其使用的其他信息。

已知的失败测试

如果您正在编写测试,可以使用 pytest.mark.xfail() 装饰者。这允许将测试添加到测试套件中,并在buildbots上运行,而不会导致过度警报。例如,尽管以下测试将失败,但它是预期的失败:

import pytest

@pytest.mark.xfail
def test_simple_fail():
    '''very simple example test that should fail'''
    assert 1 + 1 == 3

注意,第一个参数 xfail() decorator是一个失败条件,它可以是一个值,如true、false,也可以是一个动态计算的表达式。如果提供了条件,则还必须提供原因 reason='message' 关键字参数。

在matplotlib.tests中创建新模块

我们试图按照测试的主要模块对测试进行分类。例如,与 mathtext.py 模块在 test_mathtext.py .

使用Travis CI

Travis CI 是“云中”的托管CI系统。

Travis配置为接收对GitHub Repos的新提交通知(通过GitHub“服务挂钩”),并在看到这些新提交时运行构建或测试。它查找一个名为 .travis.yml 在存储库的根目录中查看如何测试项目。

Travis CI已为启用 main Matplotlib GitHub repository --例如,请参见 its Travis page .

如果要为您的个人Matplotlib Github回购启用Travis CI,只需在Travis CI UI或Github UI(管理服务挂钩)中启用Travis CI。有关详细信息,请参阅 the Travis CI Getting Started page . 这通常是不必要的,因为针对主Matplotlib存储库提交的任何拉请求都将被测试。

配置完成后,您可以在https://travis-ci.org/your_github_user_name/matplotlib上看到Travis CI结果--如下所示 an example .

使用托克斯

Tox 是一个针对多个Python环境运行测试的工具,包括Python的多个版本(例如,3.6、3.7),甚至完全不同的Python实现(例如CPython、PyPy、Jython等),只要所有这些版本都在系统的$PATH上可用(考虑使用系统包管理器,例如apt get、yum,或自制软件,安装它们)。

Tox使得在提交请求之前很容易确定您的工作副本是否引入了任何回归。以下是如何使用它:

$ pip install tox
$ tox

您还可以对环境的一个子集运行tox:

$ tox -e py36,py37

TOX对每件事情都进行连续处理,因此测试几种环境可能需要很长时间。为了加快速度,您可以尝试使用一个新的并行版本的tox,名为 detox . 尝试一下:

$ pip install -U -i http://pypi.testrun.org detox
$ detox

使用名为 tox.ini . 如果要将新环境添加到测试中(例如, py33 )或者,如果您想要调整依赖项或者测试的运行方式。有关 tox.ini 文件,见 Tox Configuration Specification .

构建Matplotlib的旧版本

当运行 git bisect 要查看哪个提交引入了某个bug,您可能(很少)需要构建Matplotlib的非常旧的版本。需要考虑以下限制因素:

  • Matplotlib 1.3(或更早版本)需要numpy 1.8(或更早版本)。