运行单元测试时关闭图表

时间:2017-03-24 09:50:55

标签: python unit-testing

我正在使用unittest库测试我的模块。这包括使用matplotlib库绘制一些图表。目前的问题是每次绘制图形时测试都会暂停,并且只有在我关闭图形后它才会恢复。我怎么能避免这个?

3 个答案:

答案 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