跳转到主要内容

pytest插件,用于帮助比较测试中数组输出

项目描述

10.5281/zenodo.5811772 CI Status PyPI Status

关于

这是一个py.test插件,用于方便地生成和比较测试期间产生的数据数组,特别是在数组太大而无法方便地在测试中硬编码它们的情况下(例如:np.testing.assert_allclose(x, [1, 2, 3]))。

基本思想是您可以编写一个生成Numpy数组(或根据格式生成其他相关对象,例如pandas DataFrame)的测试。然后,您可以在生成模式中运行测试以从数组生成参考文件,或者可以在比较模式中运行测试,该模式将测试结果与参考值在一定的容差范围内进行比较。

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

  • 基于纯文本的格式(基于Numpy loadtxt输出)

  • FITS格式(需要astropy)。使用此格式,测试可以返回一个FITS HDU对象对应的Numpy数组。

  • 使用pandas HDFStore的pandas HDF5格式

有关如何编写此类测试的更多信息,请参阅下面的使用部分。

安装

此插件与Python 2.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')
def test_array():
    ...

也可以使用在运行py.test时使用的--arraydiff-default-format=<format>标志来指定默认文件格式,其中<format>应为fitstext

目前支持的格式是textfits,欢迎为其他格式做出贡献。默认格式是text

其他参数是浮点值的相对和绝对容差(默认分别为1e-7和0)

@pytest.mark.array_compare(rtol=20, atol=0.1)
def test_array():
    ...

您还可以使用 write_kwargs 为编写器传递关键字参数。对于 text 格式,这些参数传递给 savetxt,而对于 fits 格式,则传递给 Astropy 的 fits.writeto 函数。

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

其他选项包括参考目录的名称(默认为 reference)以及参考文件的名称(默认为测试文件名,具有格式相关的扩展名)。

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

上述装饰器中的参考目录将被解释为相对于测试文件。请注意,基线目录也可以是 URL(应以 http://https:// 开头并结束于斜杠)。

最后,您还可以在运行测试时通过以带有以下内容的 py.test 运行来全局设置自定义基线目录:

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

此目录将被解释为相对于运行测试的位置。此外,如果同时使用此选项和 array_compare 装饰器中的 reference_dir 选项,装饰器中的选项具有优先级。

测试失败示例

如果测试产生的数组正确,则测试将通过,但如果它们不正确,则测试将失败并显示类似以下的消息:

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

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

项目详情


下载文件

下载适合您平台的文件。如果您不确定要选择哪个,请了解有关 安装包 的更多信息。

源分布

pytest-arraydiff-0.6.1.tar.gz (16.9 kB 查看哈希值)

上传时间

构建分布

pytest_arraydiff-0.6.1-py3-none-any.whl (10.0 kB 查看哈希值)

上传时间 Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面