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第三方库


热门话题
netbeans根据命名约定返回布尔类的getter的Java名称   java如何在MessageFormat中使用单引号   java如何在整数数组中只对奇数排序,而将偶数保留在其原始位置?   自定义ArrayAdapter中未定义java构造函数   java joda时间格式化程序解析yyyyymmdd(额外一小时)   java Spring引导控制器测试始终返回404   java如何提取类文件以获取该类文件中的类?   JTable java列不会显示   java Selenium Web驱动程序输出错误的Web表行数   当应用程序在mac上打开时,java SWT选项卡项会从页面上消失   java如何将html文件映射到过滤器   swing Java计算一段时间内两点之间的转换   javawebsphere和javax。xml。ws。spi。提供者:提供者组织。阿帕奇。axis2。jaxws。spi。提供者不是子类型   For循环在Java中没有按预期继续?   java如何配置gson以排除0个整数值   java读取一个由tab分隔的文件,并将单词放入ArrayList中   java我需要做什么才能让LiveConnect重新工作?   sqlservermerge2xml&使用java提取这些数据并将其存储在db表中   java如何在模型中添加新对象时通知网格