pytest-mpl, pytest插件,用于Matplotlib图像的faciliate图像比较

分享于 

9分钟阅读

GitHub

  繁體 雙語
A plugin to faciliate image comparison for Matplotlib figures in pytest
  • 源代码名称:pytest-mpl
  • 源代码网址:http://www.github.com/matplotlib/pytest-mpl
  • pytest-mpl源代码文档
  • pytest-mpl源代码下载
  • Git URL:
    git://www.github.com/matplotlib/pytest-mpl.git
    Git Clone代码到本地:
    git clone http://www.github.com/matplotlib/pytest-mpl
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/matplotlib/pytest-mpl
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    

    Travis Build StatusAppVeyor Build statusCoveralls coverage

    这是一个插件,用于为 Matplotlib中的图片进行图像比较,例如。

    Matplotlib包括许多测试工具和装饰器,但是它们是面向 nose的测试框架。 pytest可以轻松地比较由测试生成的图形,以便在使用 pytest时引用图像。

    对于每个要测试的图像,从生成的图像中减去参考图像,并对残余值进行比较。 如果剩余的值太大,则测试将失败( 这是使用 matplotlib.testing 中的helper 函数实现的)。

    有关如何编写测试的更多信息,请参见下面的

    安装

    这个插件与 python。2.7和 3.3兼容,需要安装 pytestMatplotlib和nose和 nose。

    要安装,你可以执行以下操作:

    pip install pytest-mpl

    你可以通过执行以下操作检查插件是否已经注册到 pytest:

    py.test --version

    它将显示一个插件列表:

    This is pytest version 2.7.1, imported from.. .
    setuptools registered plugins:
     pytest-mpl-0.1 at.. .

    使用

    要使用,只需标记要使用 @pytest.mark.mpl_image_compare 比较图像的函数,并确保函数返回一个Matplotlib图形( 或者任何具有 savefig 方法的图形对象):

    import pytestimport matplotlib.pyplot as plt@pytest.mark.mpl_image_comparedeftest_succeeds():
     fig = plt.figure()
     ax = fig.add_subplot(1,1,1)
     ax.plot([1,2,3])
     return fig

    要生成基线图像,请使用 --mpl-generate-path 选项与生成图像的目录的NAME 运行测试:

    py.test --mpl-generate-path=baseline

    如果该目录不存在,则将创建该目录。 目录将被解释为相对于运行 py.test的位置。 一旦你对生成的图像感到满意,应该将它们移动到相对于测试文件( 这里 NAME 是可以配置的,请参见下面的)的baseline 目录。 你还可以直接在右目录中生成基线图像。

    然后,你可以简单地运行以下测试:

    py.test --mpl

    如果图像是相同的,测试将通过。 如果省略 --mpl 选项,测试将运行,但只检查代码是否运行而不检查输出图像。

    命令行选项

    公差

    可以使用 tolerance 参数在 mpl_image_compare decorator中指定图像比较( 默认值为 2 )的RMS公差:

    @pytest.mark.mpl_image_compare(tolerance=20)deftest_image():
     ...

    Savefig选项

    你可以通过在 mpl_image_compare decorator中使用 savefig_kwargs 将关键字参数传递给 savefig:

    @pytest.mark.mpl_image_compare(savefig_kwargs={'dpi':300})deftest_image():
     ...

    基线图像

    可以使用 mpl_image_compare decorator中的baseline_dirfilename 参数自定义基线目录( 默认为 baseline ) 和 plot ( 它默认为带有 .png 后缀的测试的NAME )的文件名:

    @pytest.mark.mpl_image_compare(baseline_dir='baseline_images',
     filename='other_name.png')deftest_image():
     ...

    上面的装饰器中的基线目录将被解释为相对于测试文件。 请注意,基线目录也可以是 URL ( 它应该以 http:// 或者 https:// 开头,并以斜杠结尾)。 如果要指定镜像,请将 baseline_dir 设置为逗号分隔的URL ( URL中的真正逗号应该编码为 %2C ) 列表。

    最后,你还可以在运行测试时全局设置一个自定义基线目录,方法是使用以下命令运行 py.test:

    py.test --mpl --mpl-baseline-path=baseline_images

    这里目录将被解释为相对于运行测试的位置。 这里外,如果使用了 baseline_dir 选项和 mpl_image_compare 修改器中的选项,则优先使用该选项。

    基样式

    默认情况下,测试将使用 Matplotlib'经典'样式( 忽略任何局部定义的RC参数) 运行。 可以使用 style 参数覆盖这里参数:

    @pytest.mark.mpl_image_compare(style='fivethirtyeight')deftest_image():
     ...

    删除文本

    如果正在运行对比较文本标签的测试,则可以将 remove_text 参数用于修改器:

    @pytest.mark.mpl_image_compare(remove_text=True)deftest_image():
     ...

    这将使测试不敏感于 比如 库中的更改。

    测试失败示例

    如果测试生成的图像是正确的,则测试将传递,但如果不是,测试将失败,如下所示:

    E Exception: Error: Image files did not match.
    E RMS Value: 142.2287807767823
    E Expected:
    E/var/folders/zy/t1l3sx310d3d6p0kyxqzlrnr0000gr/T/tmp4h4oxr7y/baseline-coords_overlay_auto_coord_meta.png
    E Actual:
    E/var/folders/zy/t1l3sx310d3d6p0kyxqzlrnr0000gr/T/tmp4h4oxr7y/coords_overlay_auto_coord_meta.png
    E Difference:
    E/var/folders/zy/t1l3sx310d3d6p0kyxqzlrnr0000gr/T/tmp4h4oxr7y/coords_overlay_auto_coord_meta-failed-diff.png
    E Tolerance:
    E 10

    然后,可以检查异常中包含的图像路径:

    预期实际差异
    expectedactualdiff

    在这种情况下,差异很明显,而在某些情况下可以能需要使用差异图像或者闪烁。

    默认公差为 2,这是非常严格的。 在某些情况下,你可以能需要放松这个问题,以考虑不同系统中字体的差异。

    默认情况下,预期的文件和差异文件被写入具有不确定路径的临时目录。 如果你想将它们写入特定目录,可以使用:

    py.test --mpl --mpl-results-path=results

    然后 results 目录将每个测试包含一个子目录,每个子目录将包含上面提到的三个文件。 如果使用 持续集成 服务,那么可以使用选项上传工件,将这些结果上传到你可以查看它们的地方。 有关更多信息,请参见:

    正在运行 pytest-mpl测试

    如果你正在贡献一些更改并想运行测试,首先安装插件的最新版本,然后执行以下操作:

    cd tests
    py.test --mpl

    首先要安装插件的原因是确保插件作为测试套件的一部分正确加载。


    COM  plugin  图像  MAT  FIG  Matplotlib