pytest插件帮助比较测试的数组输出
pytest-arraydiff的Python项目详细描述
关于
这是一个py.test插件,可以帮助 测试期间产生的数据数组的生成和比较,特别是 如果数组太大,无法方便地硬编码 在测试中(例如np.testing.assert_allclose(x, [1, 2, 3]))。
基本思想是可以编写一个生成numpy数组的测试(或者 其他相关对象,具体取决于格式)。然后你可以运行 以模式测试从数组生成引用文件,或者您可以运行 在comparison模式下的测试,它将测试结果与 参考值在一定范围内。
目前,参考文件支持的文件格式是:
- 纯文本格式(基于numpyloadtxtoutput)
- fits格式(需要astropy)。带着这个 格式,测试可以返回fits hdu对象的numpy数组。
有关如何编写测试来执行此操作的详细信息,请参见使用。 下面一节。
安装
此插件与Python2.7、3.5及更高版本兼容,并且 需要pytest和 numpy待安装。
要安装,您可以执行以下操作:
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>应该是fits或text。
此时支持的格式是text和fits,以及 欢迎其他格式的稿件。默认格式为 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
必须首先安装插件的原因是确保 插件作为测试套件的一部分正确加载。