创建绘图的 Pytest 测试函数

oli*_*679 10 python matplotlib pytest

我有几个创建绘图的函数,我在 Jupyter 笔记本中使用它们来可视化数据。

我想为这些创建基本测试,检查它们是否仍然运行,如果我进行更改,各种输入不会出错。但是,如果我使用 pytest 调用这些函数,创建绘图会导致程序挂起,直到我手动最小化绘图。

import pytest 
import matplotlib.pyplot as plt 

def plot_fn():
    plt.plot([1,2,3])
    plt.show()


def test_plot_fn():
   plot_fn()
Run Code Online (Sandbox Code Playgroud)

如何使用 Pytest 测试“plot_fn”等函数的运行而不出错?我尝试了以下方法,但它不起作用,我认为是因为 plt.show() 导致脚本挂起,因此无法到达 plt.close('all')。

def test_plot_fn():
   plot_fn()
   plt.close('all')
Run Code Online (Sandbox Code Playgroud)

我很高兴更改绘图函数的行为,例如返回 plt 对象?

aws*_*ice 5

我不确定如何matplotlib交互pytest,但似乎您需要使用fixtures才能实现此目的。您还需要在测试中创建某种assert语句,以指示测试优雅地拆除您的装置。像这样的事情应该会达到预期的结果。

import pytest 
import matplotlib.pyplot as plt 

@pytest.fixture(scope='function')
def plot_fn():
    def _plot(points):
        plt.plot(points)
        yield plt.show()
        plt.close('all')
    return _plot


def test_plot_fn(plot_fn):
    points = [1, 2, 3]
    plot_fn(points)
    assert True
Run Code Online (Sandbox Code Playgroud)

如果你想要简单的monkeypatch行为show,我会这样做,如下所示。

def test_plot_fn(monkeypatch):
    monkeypatch.setattr(plt, 'show', lambda: None)
    plot_fn()
Run Code Online (Sandbox Code Playgroud)


oli*_*679 4

这有效。

from unittest.mock import patch 
import pytest 
import matplotlib.pyplot as plt 

def plot_fn():
    plt.plot([1,2,3])
    plt.show()

@patch("matplotlib.pyplot.show")
def test_plot_fn(mock_show):
    plot_fn()
Run Code Online (Sandbox Code Playgroud)

基于这个答案(可能重复)运行单元测试时关闭图表