测试返回无的函数的创建图

时间:2019-03-13 14:30:22

标签: python unit-testing matplotlib pytest

我想为一个函数编写一个单元测试(使用pytest),该函数创建一个matplotlib图,但返回None。

让我们说函数--allow-file-access-from-files看起来像这样:

show_plot

调用函数import matplotlib.pyplot as plt def show_plot(): # create plot plt.plot([1, 2, 3], [4, 5, 3]) # return None return None 时,您会看到创建的图,但不返回图对象。

如何编写单元测试,以测试我的函数show_plot()正在绘制正确的图?或至少检查我的功能确实在绘制某些东西?

编辑:我无法更改或调整功能show_plot

我需要这样的东西:

show_plot()

例如,我发现heredef test_show_plot(): # run show_plot show_plot() # Need help here! # ... # define plot_created # ... # logical value of plot_created, which indicates if a plot was # indeed created assert plot_created 的一种有趣的方法,我希望有一些类似于捕获图的东西。

2 个答案:

答案 0 :(得分:1)

您想测试您是否以期望的方式使用该库。

首先,您对plt有依赖性。因此,让我们稍微重写一下函数。

import matplotlib.pyplot as plt

def show_plot(plt=plt):    
    plt.plot([1, 2, 3], [4, 5, 3])

这允许您注入存根,以便对其进行测试。

from unittest import mock
def test_show_plot():
    mock_plt = mock.MagicMock()
    show_plot(mock_plt)
    mock_plt.plot.assert_called_once_with([1, 2, 3], [4, 5, 3])

但是您怎么知道这实际上会创建情节?好吧,使用外壳程序上的真实库尝试相同的调用,并亲自查看它是否有效。

如果您无法更改原始功能,请参见mock.patch

# plot.py
import matplotlib.pyplot as plt

def show_plot():    
    plt.plot([1, 2, 3], [4, 5, 3])


# test.py
from unittest import mock

@mock.patch('path.to.your.module.plt')
def test_show_plot(mock_plt):
    show_plot()
    mock_plt.plot.assert_called_once_with([1, 2, 3], [4, 5, 3])

答案 1 :(得分:0)

问题实际上是您要测试的内容。

  • 如果您要测试该功能是否正常运行,只需调用该功能就可以了

    def test_show_plot():
        show_plot()
    
  • 如果要测试生成的图形是否可绘制,并且绘制的图形不会产生任何错误,

    def test_show_plot():
        show_plot()
        plt.gcf().canvas.draw()
    
  • 如果要测试直线是否具有与其关联的正确数据,可以从当前轴获取直线,

    import numpy as np
    import matplotlib.pyplot as plt
    from numpy.testing import assert_array_almost_equal
    
    def show_plot():
        plt.plot([1, 2, 3], [4, 5, 3])
        return None
    
    def test_show_plot():
        show_plot()
        line = plt.gca().get_lines()[0]
        assert_array_almost_equal(line.get_data(), [[1, 2, 3], [4, 5, 3]])
    
    test_show_plot()
    
  • 最后,有一个适用于image comparison tests的完整框架,尽管这需要通过pytest运行,并且在外部运行时可能会有一些警告。

    li>