我想为一个函数编写一个单元测试(使用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()
例如,我发现here是def 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
的一种有趣的方法,我希望有一些类似于捕获图的东西。
答案 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
运行,并且在外部运行时可能会有一些警告。