在运行单元测试时关闭图形



我正在使用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

最新更新