2009-10-18 6 views
12

Ich habe eine Java-Anwendung, die JOGL verwendet, um einen großen Teil der GUI bereitzustellen.Automatisiertes Testen für OpenGL-Anwendung

Gibt es ein Tool, mit dem Sie wissen, von oder verwendet haben, die das Testen von OpenGL-Anwendungen automatisieren können (oder mehr specificly diejenigen mit JOGL)

einfach zu aktualisieren: Das Tool kann entweder auf Linux oder Windows laufen.

+0

Verzeihen Sie die noob Frage, aber was unterscheidet OpenGL-Anwendungstests von anderen App-Tests? – Bahbar

+1

Was ich wirklich meinte, ist, die OpenGL-Ansicht selbst zu testen. Klicken, Ziehen, Drehen, Zoomen usw. Es gibt Werkzeuge, mit denen Sie Ihre GUI-Interaktion mit einer Swing-App aufzeichnen und wiedergeben können. Sie können dies für alle Ihre Kerninteraktionen tun und es als Regressionstest wiederholen. Ich hätte gerne eine ähnliche Lösung für OpenGL, aber ich weiß nicht, welche existiert. – hhafez

Antwort

10

Ich habe Komponententests für C++ geschrieben (Qt unter Linux) & OpenGL vor. Ich kenne keinen Grund, warum es nicht auch für Java funktionieren sollte.

Die Dinge, die für mich gearbeitet sind:

  • Zusammenfassung Ihrer OpenGL-Kontext-Provider so dass der Rest des Codes davon unabhängig ist. In meinem Fall verwendete die Haupt-App Qt's QGLWidget, aber die Unittests verwendeten eine Pbuffer-basierte, die ich ohne jegliche Fensterinfrastruktur erstellen konnte (mit Ausnahme eines designierten X11 DISPLAY). Später fügte ich ein "Offscreen-Mesa" (reine Software-OpenGL-Implementierung) hinzu, so dass sie sogar auf einer kopflosen Build-Maschine ohne GPU arbeiten konnten.

  • Halten Sie Ihren OpenGL-Code unabhängig von Ihrem GUI-Code. In meinem Fall wusste die OpenGL-Rendering-Engine nichts über Qt-Klassen (z. B. Mausereignisse). Definieren Sie Ihre eigene testbare API, die nicht an bestimmte GUI-Konzepte gebunden ist, und schreiben Sie Tests dafür. In den Unittests lies den Inhalt aus dem Framebuffer mit glReadPixels zurück und triff entweder sie mit einigen Behauptungen darüber, welche Pixel bestimmte Werte haben sollten, oder gehe die Regressionsteststrecke hinunter und vergleiche die Framebuffererfassung mit einem gespeicherten Bild Sie wissen, dass es gut ist (entweder durch manuelle Verifizierung oder weil es aus einem anderen Referenzmodell hergestellt wurde).

  • Erlauben Sie ein bisschen Unschärfe in jedem Bild-Regressionstest; Die meisten OpenGL-Implementierungen erzeugen leicht unterschiedliche Ausgaben.

  • (Ich habe das nicht getan, aber ...) Idealerweise möchten Sie die GUI-Ebene testen können, indem Sie die erwartete Folge von Aufrufen an Ihre Rendering-Engine als Reaktion auf GUI-Aktivitäten ausführen. Wenn dies der Fall ist und Sie aufgrund der obigen Tests von Ihrer Renderebene überzeugt sind, dann müssen Sie das Rendern nicht wirklich durchführen. Erstellen Sie also ein geeignetes Mock-Objekt Ihres Rendering-Layers für den GUI-Test (ich würde mir vorstellen, dass Tests wie "Maus ziehen von hier nach dort zu einem Aufruf des Rendering-Layers führt, um eine bestimmte Transformationsmatrix festzulegen ...")).

+1

+1 für alle guten Ratschläge. Für den Framebuffer-Vergleich haben wir eine kleine App geschrieben, die einen unscharfen Unterschied in den Bildern macht, der die Wahrnehmungsdeltas betrachtet, und nicht absolute Pixelwerte. –

+0

Das Problem ist, dass die GUI ein benutzerdefiniertes Framework ist, das mit JOGL erstellt wurde. Deshalb kann Nummer 2 nicht funktionieren. Zum Beispiel erstellen wir grafische Elemente auf dem Bildschirm, mit denen der Benutzer mit allen JOGL interagieren kann. Ich brauche eine Möglichkeit, die Benutzerinteraktion zu automatisieren. – hhafez

+2

Die Verwendung einer bestimmten Bibliothek zur Implementierung der GUI sollte nicht von Bedeutung sein. Erstellen Sie eine GraphicsContext-Klasse, die den OpenGL-Canvas/Frame abstrahiert, und eine GUI-Klasse, die alle von Ihnen benötigten GUI-Funktionen abstrahiert. Anschließend kann die Implementierung der GUI-Klasse für die Implementierung des Anzeigekontexts gerendert werden. Ihre App muss sich jedoch nicht darum kümmern, wie sie zusammenarbeiten. –

2

Ich habe nachgedacht, ein Bild-Diff-Tool wie PDiff mit OpenGL-Code zu testen, durch Aufnahme von Schnappschüssen, sie auf der Festplatte speichern und mit früherem Regressions Ausgang zu vergleichen. Auf diese Weise tauchen wirklich schlechte Sachen (fehlende Texturen) auf, aber menschlich unbemerkbare Dinge (wie die oben erwähnten kleinen Unterschiede zwischen der Implementierung) gehen gut durch. Um die Benutzerinteraktion zu automatisieren, sollten die GUI-Klassen ausreichend offen sein, damit Sie Ereignisse senden oder auf eine Schaltfläche klicken können. oder Sie müssen OS-Ereignisse manuell in Ihre Apps einspeisen. Dies ist möglich, aber viel mühsamer. Möglicherweise ist es einfacher, die GUI-Ebene zu öffnen, wenn es Open Source ist.

+0

SSIM ("Structural Similarity Index") - http://en.wikipedia.org/wiki/Structural_similarity - ist ein weiterer Bildkomparator, der auf Wahrnehmungsaspekten basiert. – timday

3

Sie können Ihre JOGL-basierte Anwendung testen, indem Sie Sikuli verwenden, der die Benutzeroberflächenautomatisierung über Bilderkennungstechnologie auf Bildschirmaufnahmen ausführt.

Ich verwende derzeit Sikuli, um eine Java App funktional zu testen, die hauptsächlich auf der NASA Worldwind Java SDK basiert (die auf JOGL basiert). Mit der Sikuli Java API kann meine Testsuite Icons innerhalb des OpenGL Canvas erkennen, auf sie klicken und sie auch ziehen. Sikuli kann auch Text aus der Zeichenfläche mittels OCR erkennen und extrahieren, aber die Leistung scheint ein kleiner Treffer zu sein (je nach Sprache, Schriftart, Größe und Hintergrundfarben hinter dem Text).

Ich habe eine Menge automatisierter UI-Tests mit anderen Tools durchgeführt, die das Fenster-Toolkit untersuchen (z. B. Swing, SWT, natives Windows) und festgestellt haben, dass Sikuli viel langsamer läuft als diese, aber das ist angesichts der Menge verständlich der Bildverarbeitung muss es hinter den Kulissen tun. Beachten Sie auch, dass Sikuli derzeit benötigt, dass Ihre Anwendung in einem Fenster ausgeführt wird (nicht im Vollbildmodus).

Sikuli läuft sowohl unter Windows als auch unter Linux. Ich würde dir empfehlen, es auszuprobieren. Ich konnte kein anderes Werkzeug finden, das in der Lage wäre, diese Ebene des Funktionstests einer OpenGL-basierten Anwendung zu testen.