我正在使用unittest
库测试我的模块。这包括使用 matplotlib
库绘制一些图形。目前的问题是每次绘制图形时测试都会暂停,并且只有在我关闭图形后才会恢复。我怎样才能避免这种情况?
我将根据 matplotlib 教程中的简单示例代码对我的答案进行建模: http://matplotlib.org/users/pyplot_tutorial.html
假设我们有以下模块,plot_graph.py
要测试:
import matplotlib.pyplot as plt
def func_plot():
plt.plot([1,2,3,4])
plt.ylabel('some numbers')
plt.show()
if __name__ == "__main__":
func_plot()
可以按如下方式修补对show
的调用:
from plot_graph import func_plot
from unittest.mock import patch
@patch("plot_graph.plt.show")
def test_plot(mock_show):
assert func_plot() == None
如您所见,您应该修补对pyplot.show()
的调用。您可以在文档中找到有关修补和模拟的更多信息:https://docs.python.org/3/library/unittest.mock.html。
通常,关于在哪里打补丁的部分非常有用:https://docs.python.org/3/library/unittest.mock.html#where-to-patch
最后,网站上已经有类似的问题:如何在不显示我的 matplotlib 图表的情况下运行鼻子测试?
如果在测试中这样做,请不要调用pyplot.show()
。此外,文档还建议对show
函数使用实验性block=False
关键字参数。
为了完整起见,我遇到了类似的问题,但为了解决它,我不得不模拟对matplotlib.pyplot.figure
的调用。我意识到这并不完全是被问到的,但是在遇到这个线程后,我花了一段时间才弄清楚,所以我想在这里发布它。
例如,如果您的plot_graph.py
如下所示:
import matplotlib.pyplot as plt
def func_plot():
fig = plt.figure()
plt.plot([1,2,3,4])
plt.ylabel('some numbers')
plt.show()
然后,至少在我的情况下(在没有 X11 转发的终端上运行单元测试,并且在尝试打开绘图时出错(,我需要test_plot_graph.py
以下内容来运行我的测试:
from plot_graph import func_plot
from unittest.mock import patch
# unittest boilerplate...
@patch('matplotlib.pyplot.figure')
def test_func_plot(self, mock_fig):
# whatever tests I want...
mock_fig.assert_called() # some assertion on the mock object