pytest插件帮助比较测试的数组输出

pytest-arraydiff的Python项目详细描述


Travis Build StatusAppVeyor Build statusCoverage

关于

这是一个py.test插件,可以帮助 测试期间产生的数据数组的生成和比较,特别是 如果数组太大,无法方便地硬编码 在测试中(例如np.testing.assert_allclose(x, [1, 2, 3]))。

基本思想是可以编写一个生成numpy数组的测试(或者 其他相关对象,具体取决于格式)。然后你可以运行 以模式测试从数组生成引用文件,或者您可以运行 在comparison模式下的测试,它将测试结果与 参考值在一定范围内。

目前,参考文件支持的文件格式是:

  • 纯文本格式(基于numpyloadtxtoutput)
  • fits格式(需要astropy)。带着这个 格式,测试可以返回fits hdu对象的numpy数组。

有关如何编写测试来执行此操作的详细信息,请参见使用。 下面一节。

安装

此插件与Python2.7、3.5及更高版本兼容,并且 需要pytestnumpy待安装。

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

pip install pytest-arraydiff

您可以通过执行以下操作来检查该插件是否已在pytest中注册:

py.test --version

将显示插件列表:

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

使用

要使用,只需将函数标记为要比较的位置 使用@pytest.mark.array_compare的数组,并确保 函数返回一个普通的numpy数组:

python
import pytest
import numpy as np

@pytest.mark.array_compare
def test_succeeds():
    return np.arange(3 * 5 * 4).reshape((3, 5, 4))

要生成引用数据文件,请使用 --arraydiff-generate-path选项和目录名 生成的文件应放在何处:

py.test --arraydiff-generate-path=reference

如果目录不存在,它将被创建。目录将 被解释为相对于运行py.test的位置。 确保手动检查引用数组以确保它们是 对的。

一旦对生成的数据文件满意,就应该移动它们 相对于测试文件名为reference的子目录 名称是可配置的,请参见下文)。您还可以生成基线 数组直接在正确的目录中。

然后,您只需使用以下命令即可运行测试:

py.test --arraydiff

如果数组相同,则测试将通过。如果你忽略了 --arraydiff选项,测试将运行,但只检查 代码运行时不检查输出数组。

选项

@pytest.mark.array_compare标记接受一个参数来指定 用于参考文件的格式:

@pytest.mark.array_compare(file_format='text')deftest_array():...

默认文件格式也可以使用 ^运行py.test时的{tt9}$标志, 而<format>应该是fitstext

此时支持的格式是textfits,以及 欢迎其他格式的稿件。默认格式为 text

另一个参数是浮点值的相对公差 (默认为1e-7):

@pytest.mark.array_compare(rtol=20)deftest_array():...

您还可以使用 write_kwargs。对于text格式,这些参数传递给 savetxt而对于fits格式,它们被传递到astropy的 fits.writeto函数。

@pytest.mark.array_compare(file_format='fits',write_kwargs={'output_verify':'silentfix'})deftest_array():...

其他选项包括引用目录的名称(其中 默认为reference)和引用文件的文件名 (默认为测试的名称,其格式依赖于 分机)。

@pytest.mark.array_compare(reference_dir='baseline_arrays',filename='other_name.fits')deftest_array():...

上面decorator中的引用目录将被解释为 相对于测试文件。请注意,基线目录可以 也是一个url(应该以http://https://开头 以斜线结尾)。

最后,当 使用以下命令运行py.test来运行测试:

py.test --arraydiff --arraydiff-reference-path=baseline_arrays

此目录将被解释为相对于测试的位置 正在运行。另外,如果这两个操作和reference_dir 使用了array_comparedecorator中的选项,其中 装饰者优先。

测试失败示例

如果测试产生的数组是正确的,那么测试将 通过,但如果不通过,则测试将失败,消息类似于 以下内容:

E               AssertionError:
E
E               a: /var/folders/zy/t1l3sx310d3d6p0kyxqzlrnr0000gr/T/tmpbvjkzt_q/test_to_mask_rect-mode_subpixels-subpixels_18.txt
E               b: /var/folders/zy/t1l3sx310d3d6p0kyxqzlrnr0000gr/T/tmpbvjkzt_q/reference-test_to_mask_rect-mode_subpixels-subpixels_18.txt
E
E               Not equal to tolerance rtol=1e-07, atol=0
E
E               (mismatch 47.22222222222222%)
E                x: array([[ 0.      ,  0.      ,  0.      ,  0.      ,  0.404012,  0.55    ,
E                        0.023765,  0.      ,  0.      ],
E                      [ 0.      ,  0.      ,  0.      ,  0.112037,  1.028704,  1.1     ,...
E                y: array([[ 0.      ,  0.      ,  0.      ,  0.      ,  0.367284,  0.5     ,
E                        0.021605,  0.      ,  0.      ],
E                      [ 0.      ,  0.      ,  0.      ,  0.101852,  0.935185,  1.      ,...

异常中包含的文件路径可用于 检查。

运行pytest arraydiff的测试

如果要进行一些更改并要运行测试,请首先 安装最新版本的插件,然后执行以下操作:

cd tests
py.test --arraydiff

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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
从源WSO2标识服务器生成时发生java错误   java如何在icefaces项目中启用url   java将堆栈中的每个元素打印到文本文件中的新行   java如何将导航抽屉的所有片段放在全屏上?   java EHCache如何实现其事务?   Selenide中的java捕获shouldHave/shouldBe方法   从CSV文件读取java   java如何在ListView行中显示长文本视图高度?   java Tapestry内部重定向到静态页面   TFS使用Java和Eclipse构建   多线程Java线程是否可以在已经持有锁的情况下获得锁?   JavaSwing:使用文档侦听器处理返回键   java在Moshi中保存对象关系