Ich arbeite an einem Python (2.7) -Programm, das viele verschiedene Matplotlib-Zahlen produziert (die Daten sind nicht zufällig). Ich bin bereit, einen Test (mit Unittest) durchzuführen, um sicher zu sein, dass die generierten Zahlen korrekt sind. Zum Beispiel speichere ich die erwartete Zahl (Daten oder Bild) irgendwo, ich führe meine Funktion aus und vergleiche das Ergebnis mit der Referenz. Gibt es eine Möglichkeit, dies zu tun?Wie kann ich Komponententests für Code schreiben, der matplotlib verwendet?
Antwort
In meinem experience bringen Bildvergleichstests mehr Ärger als sie wert sind. Dies ist insbesondere dann der Fall, wenn Sie eine kontinuierliche Integration über mehrere Systeme hinweg (wie TravisCI) durchführen möchten, die leicht unterschiedliche Schriftarten oder verfügbare Zeichnungs-Backends haben können. Es kann sehr viel Arbeit sein, die Tests auch dann bestehen zu lassen, wenn die Funktionen einwandfrei funktionieren. Darüber hinaus erfordert das Testen dieser Methode das Speichern von Bildern in Ihrem Git-Repository, was schnell zu einem Aufblähen des Repository führen kann, wenn Sie den Code häufig ändern.
Ein besserer Ansatz ist meiner Meinung nach zu (1) gehe davon aus, dass Matplotlib die Figur tatsächlich korrekt zeichnen wird, und (2) numerische Tests mit den von den Plotfunktionen zurückgegebenen Daten durchführt. (. Sie können auch immer, diese Daten innerhalb des Axes
Objekt finden, wenn Sie wissen, wo sie suchen müssen)
Zum Beispiel, sagen Sie eine einfache Funktion wie folgt testen wollen:
import numpy as np
import matplotlib.pyplot as plt
def plot_square(x, y):
y_squared = np.square(y)
return plt.plot(x, y_squared)
Ihr Unit-Test könnte dann aussehen wie
def test_plot_square1():
x, y = [0, 1, 2], [0, 1, 2]
line, = plot_square(x, y)
x_plot, y_plot = line.get_xydata().T
np.testing.assert_array_equal(y_plot, np.square(y))
oder äquivalent
def test_plot_square2():
f, ax = plt.subplots()
x, y = [0, 1, 2], [0, 1, 2]
plot_square(x, y)
x_plot, y_plot = ax.lines[0].get_xydata().T
np.testing.assert_array_equal(y_plot, np.square(y))
Matplotlib hat eine testing infrastructure. Zum Beispiel:
import numpy as np
import matplotlib
from matplotlib.testing.decorators import image_comparison
import matplotlib.pyplot as plt
@image_comparison(baseline_images=['spines_axes_positions'])
def test_spines_axes_positions():
# SF bug 2852168
fig = plt.figure()
x = np.linspace(0,2*np.pi,100)
y = 2*np.sin(x)
ax = fig.add_subplot(1,1,1)
ax.set_title('centered spines')
ax.plot(x,y)
ax.spines['right'].set_position(('axes',0.1))
ax.yaxis.set_ticks_position('right')
ax.spines['top'].set_position(('axes',0.25))
ax.xaxis.set_ticks_position('top')
ax.spines['left'].set_color('none')
ax.spines['bottom'].set_color('none')
Vom docs:
Das erste Mal in diesem Test durchgeführt wird, wird es keine Basisbild zu vergleichen gegen, so schlägt der Test fehl. Kopieren Sie die Ausgangsbilder (in in diesem Fall result_images/test_category/stures_axes_positions. *) In das korrekte Unterverzeichnis des Ausgangsverzeichnisbaums im Quellverzeichnis (in diesem Fall lib/matplotlib/tests/baseline_images/test_category). Wenn die Tests erneut ausgeführt werden, sollten sie jetzt bestanden werden.
ich Ihren Weg versucht haben, und ich habe eine E Fehler. In matplotlib.testing.decorators gibt es einen "import matplotlib.tests", der einen ImportError erzeugt: Kein Modul namens tests. Ich habe einige Nachforschungen gemacht und in der Tat gibt es kein Testmodul in meinen Matplolib-Dateien und die Dokumentation sagt leise darüber. Weiß jemand, wie man es löst? –
- 1. Schreiben von Komponententests für C-Code
- 2. Wie kann ich Komponententests für private clojure-Funktionen schreiben?
- 3. Wie kann ich feststellen, wann ich meine eigene Schnittstelle und Wrapper für Komponententests schreiben muss?
- 4. Komponententests für Code, der auf ActiveDirectory zugreift
- 5. Wie kann ich HttpContext für Komponententests fälschen?
- 6. Wie kann ich diesen JavaScript-Code in Komponententests verwenden?
- 7. Wie schreibe ich Komponententests für serverseitige Meteor-Code?
- 8. Wie kann ich Komponententests in Perl durchführen?
- 9. Best Practices für das Schreiben paralleler Komponententests
- 10. Wie kann ich große mehrstufige Komponententests vermeiden?
- 11. Wie kann ich Java-Code testen, der JAR verwendet?
- 12. Wie reformiere ich Komponententests?
- 13. Wie organisiert man Code in Xamarin Forms ViewModel für Komponententests?
- 14. Wie viele Komponententests sollte ich pro Funktion/Methode schreiben?
- 15. Wie kann ich eine Prozedur für ... schreiben?
- 16. Schreiben aussagekräftiger Komponententests für Code mit Gleitkomma-Ungenauigkeiten (z. B. Kollisionserkennung)
- 17. Wie kann ich eine eingebettete Datendatei für datengetriebene Komponententests referenzieren?
- 18. Welche dynamische Sprache kann ich für .NET-Komponententests verwenden?
- 19. Wie kann ich einen Komponententest für eine Controller-Klasse schreiben, die Winforms für Ansichten verwendet?
- 20. Wie schreibe ich Komponententests mit commons-fileupload?
- 21. Wird MockMvc von Spring für Komponententests oder Integrationstests verwendet?
- 22. Wie kann ich eine Umgebung simulieren, in der BitConverter.IsLittleEndian für meine Komponententests das Gegenteil ist?
- 23. In welcher .NET-Sprache schreiben Sie Komponententests?
- 24. PHP Patterns - wie kann ich diesen Code schreiben?
- 25. Komponententests für automatisch generierten Code: automatisch oder manuell?
- 26. Wie kann ich Komponententests mit Sammlungen in C# erstellen?
- 27. Wie kann ich Addon/Plugin-freundlichen Code schreiben?
- 28. Sollten Komponententests geschrieben werden, bevor der Code geschrieben wird?
- 29. Wie kann ich Diktat-Software verwenden, um Code zu schreiben?
- 30. Kann ich automatisch Komponententests für Tests aus Roxygen2-Beispielen generieren?
Mit Ihrer Lösung müssen Sie das Ergebnis der Handlung zurückgeben. Gibt es eine Möglichkeit, dasselbe zu tun, ohne es zurückgeben zu müssen? Indem man die Feige "fängt"? Meine Plot-Funktionen "kehren" für jetzt leer, wenn es der einzige Weg ist, den ich ändern kann, aber das möchte ich nicht. –
Sehen Sie sich das zweite Beispiel an. Es zeigt, wie Sie das Achsenobjekt inspizieren können, um alle Daten zu finden, mit denen das Diagramm gezeichnet wird. – mwaskom
@mwaskom Irgendwelche Erfahrungen mit Tests gegen eine mpl.collection, die du explizit hinzugefügt hast? z.B. 'ax.add_collection (PatchCollection (...))'? –