Тестовая функция Pytest, которая создает графики - PullRequest
1 голос
/ 08 февраля 2020

У меня есть несколько функций для создания графиков, которые я использую в записных книжках Jupyter для визуализации данных.

Я хочу создать базовые c тесты для них, проверяя, что они по-прежнему работают без ошибок на различных входах, если Я делаю изменения. Однако, если я вызываю эти функции с помощью pytest, создание графиков приводит к зависанию программы до тех пор, пока я вручную не сверну график.

import pytest 
import matplotlib.pyplot as plt 

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


def test_plot_fn():
   plot_fn()

Как я могу проверить, что такие функции, как plot_fn, работают без ошибок с помощью Pytest? Я попробовал следующее, но это не работает, я думаю, потому что plt.show () приводит к зависанию скрипта, и поэтому не достигает plt.close ('all').

def test_plot_fn():
   plot_fn()
   plt.close('all')

I ' я рад изменить поведение моей функции построения графиков, например, чтобы вернуть объект plt?

Ответы [ 3 ]

0 голосов
/ 08 февраля 2020

Я не уверен, как 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

Если вы хотите просто monkeypatch поведение show, я бы сделал это, как показано ниже.

def test_plot_fn(monkeypatch):
    monkeypatch.setattr(plt, 'show', lambda: None)
    plot_fn()
0 голосов
/ 08 февраля 2020

Это работает.

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()

На основании этого ответа (возможный дубликат) Отключение графиков при проведении юнит-тестов

0 голосов
/ 08 февраля 2020

Я могу подумать о двух вариантах:

  1. использовать plt.show (block = False) и по-прежнему закрывать фигуру после завершения теста.

  2. в тесте вместо plt.show сохраните график в файл plt.savefig. Таким образом, вы также можете сравнить созданный файл с контрольной ссылкой, а также проверить, что вы строите то же самое. Конечно, для этой опции вы должны сообщить своей функции, что она находится в тестовом режиме, с помощью необязательного параметра env variable et c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...