开发人员测试提示¶
Matplotlib的测试基础设施依赖于 pytest. 测试正在进行中 lib/matplotlib/tests
和对pytest测试基础结构的自定义 matplotlib.testing
.
要求¶
安装Matplotlib的最新版本,如中所述 检索和安装最新版本的代码 .
运行测试需要以下软件:
- pytest (>=3.6)
- Ghostscript (>=9.0,用于呈现PDF文件)
- Inkscape (渲染SVG文件)
可以选择安装:
- pytest-cov (>=2.3.1)收集覆盖信息
- pytest-flake8 使用测试编码标准 flake8
- pytest-timeout 限制运行时,以防测试卡住
- pytest-xdist 并行运行测试
运行测试¶
运行测试很简单。确保已安装并运行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_comparison
和 check_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(或更早版本)。