2017-03-24 7 views
6

Ich teste mal meine Modul mit der unittest Bibliothek. Dies beinhaltet das Zeichnen einiger Graphen mit der Bibliothek matplotlib. Das Problem ist, dass der Test jedes Mal angehalten wird, wenn ein Diagramm gezeichnet wird, und erst nach dem Schließen des Diagramms wieder aufgenommen wird. Wie kann ich das vermeiden?Graphen beim Laufen Unittests

+0

ich meine Antwort mit einem Beispiel aktualisiert –

Antwort

6

werde ich meine Antwort nach dem einfachen Beispiel-Code aus dem matplotlib Tutorial Modell: http://matplotlib.org/users/pyplot_tutorial.html

Nehmen wir an, wir das folgende Modul haben, plot_graph.py getestet werden:

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

Die Anrufe zu show sein können wie folgt gepatcht:

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 

wie Sie sehen können, sollten Sie die AnrufePatch. Sie können mehr über Patching und spöttisch in der Dokumentation finden: https://docs.python.org/3/library/unittest.mock.html.

Normalerweise ist der Abschnitt über, wo ist Patch wirklich nützlich: https://docs.python.org/3/library/unittest.mock.html#where-to-patch

Schließlich ähnliche Frage bereits auf der Website gibt es: How to run nosetests without showing of my matplotlib's graph?

1

Sie pyplot.show() nicht nennen, wenn dies in den Tests erfolgt. Auch die documentation schlägt ein experimentelles block=False Stichwort Argument für die show Funktion.

+0

'pyplot.show()' ist in einen meiner Module, die nicht in den Tests genannt. 'block = False' funktioniert nicht für mich. Ich denke, es ist veraltet. – bluprince13

+0

Vielleicht ruft pyplot.close („alle“) aus Ihren Tests den Trick tun könnte. – Lukisn

0

Statt Hacking, können Sie versuchen, einzelne Verantwortung Prinzip von SOLID zu verwenden und schreib testbaren Code, damit du nicht in diese Art von Problemen gerätst. Nur eine Idee ...