我正在使用unittest
库测试我的模块。这包括使用matplotlib
库绘制一些图表。目前的问题是每次绘制图形时测试都会暂停,并且只有在我关闭图形后它才会恢复。我怎么能避免这个?
答案 0 :(得分:9)
我将根据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
最后,网站上已有类似的问题:How to run nosetests without showing of my matplotlib's graph?
答案 1 :(得分:1)
如果在测试中完成此操作,请不要调用pyplot.show()
。此外,documentation建议对block=False
函数使用实验性show
关键字参数。
答案 2 :(得分:1)
出于完整性考虑,我遇到了类似的问题,但是要解决此问题,我不得不模拟对a:3:{s:1:"p";i:2;s:1:"m";i:10;s:1:"e";i:20;}
的调用。我意识到这并不是所要的,但这花了我一段时间才弄清楚这个线程,所以我想在这里发布。
例如,如果您的matplotlib.pyplot.figure
如下所示:
plot_graph.py
然后,至少在我的情况下(在没有X11转发的终端上运行单元测试,并且在尝试打开图时出错),我需要在import matplotlib.pyplot as plt
def func_plot():
fig = plt.figure()
plt.plot([1,2,3,4])
plt.ylabel('some numbers')
plt.show()
中执行以下操作:< / p>
test_plot_graph.py