webentwicklung-frage-antwort-db.com.de

Wie kann ich eine GUI Unit testen?

Die Berechnungen in meinem Code sind gut getestet, aber da es so viel GUI-Code gibt, ist meine Codeabdeckung insgesamt geringer, als ich es gerne hätte. Gibt es Richtlinien für den GUI-Code zum Testen von Einheiten? Macht es überhaupt Sinn?

Zum Beispiel gibt es Grafiken in meiner App. Ich konnte nicht herausfinden, wie das Testen der Diagramme automatisiert werden kann. Es braucht ein menschliches Auge, AFAIK, um zu prüfen, ob die Grafik korrekt ist.

(Ich benutze Java Swing)

148
Steve McLeod

Entwürfe wie MVP und MVC versuchen normalerweise, so viel Logik wie möglich aus der tatsächlichen GUI herauszuholen. Ein sehr beliebter Artikel dazu ist "The Humble Dialog Box" von Michael Feathers. Persönlich hatte ich gemischte Erfahrungen mit dem Versuch, Logik aus der Benutzeroberfläche zu entfernen - manchmal hat es sehr gut funktioniert, und manchmal war es mehr Mühe als es wert ist. Es liegt jedoch etwas außerhalb meines Fachgebiets.

67
Jon Skeet

Die Antwort ist natürlich, MVC zu verwenden und so viel Logik wie möglich aus der GUI zu entfernen.

Davon abgesehen hörte ich vor langer Zeit von einem Kollegen, dass SGI beim Portieren von OpenGL auf neue Hardware eine Reihe von Komponententests durchführte, die eine Reihe von Primativen auf den Bildschirm zeichneten und dann eine MD5-Summe des Frame-Puffers berechneten. Dieser Wert könnte dann mit bekannten guten Hash-Werten verglichen werden, um schnell festzustellen, ob die API pixelgenau ist.

36
dicroce

Sie können versuchen ISpec4J ist eine Open Source-Funktions- und/oder Komponententestbibliothek für Swing-basierte Java) -Anwendungen ...

10
CMS

Sie können versuchen, Gurke und Swinger zu verwenden, um Funktionstests in Klartext für Swing-GUI-Anwendungen zu schreiben. Swinger nutzt die Jemmy-Bibliothek von Netbeans unter der Haube, um die App zu steuern.

Mit Cucumber können Sie Tests wie diese schreiben:

 Scenario: Dialog manipulation
    Given the frame "SwingSet" is visible
    When I click the menu "File/About"
    Then I should see the dialog "About Swing!"
    When I click the button "OK"
    Then I should not see the dialog "About Swing!"

Schauen Sie sich das an Swinger Video Demo um es in Aktion zu sehen.

7
Dema

Testen ist eine Kunstform. Ich bin damit einverstanden, dass die Logik GUI so weit wie möglich entfernt werden sollte. Dort können wir uns dann auf unsere Unit-Tests konzentrieren. Beim Testen geht es wie bei allem anderen darum, das Risiko zu verringern. Sie müssen nicht immer alles testen, aber oft ist es das Beste, die verschiedenen Tests in verschiedenen Bereichen zu unterbrechen.

Die andere Frage ist, was Sie wirklich auf der UI-Ebene testen möchten. UI-Tests sind die teuersten Tests, da das Erstellen und Verwalten in der Regel länger dauert und die meisten Probleme auftreten. Wenn Sie die Logik testen, um zu wissen, dass die Koordinaten korrekt sind, bevor Sie versuchen, die Linie zu zeichnen, was testen Sie speziell? Wenn Sie einen Graphen testen möchten, wird eine rote Linie gezeichnet. Können Sie ihm vorgegebene Koordinaten geben und testen, ob bestimmte Pixel rot oder nicht rot sind? Wie oben empfohlen, funktionieren Bitmap-Vergleiche. Mein Hauptaugenmerk liegt jedoch darauf, die GUI nicht zu stark zu testen, sondern die Logik zu testen, mit deren Hilfe die Benutzeroberfläche erstellt werden kann, und sich dann darauf zu konzentrieren, welcher Teil der Benutzeroberfläche fehlerhaft ist oder verdächtig ist, und eine Handvoll Tests durchzuführen Dort.

6
Charles Smith

Hier sind einige Tipps:

Versuchen Sie, den größtmöglichen Code aus der GUI zu entfernen (Controller und Modellobjekt). Auf diese Weise können Sie sie auch ohne die GUI testen.

Für die Grafik sollten Sie den Wert testen, den Sie für den Code angeben, der die Grafik generiert.

6

Es gibt Selenium RC , das das Testen einer webbasierten Benutzeroberfläche automatisiert. Es werden Aktionen aufgezeichnet und wiedergegeben. Sie müssen immer noch die Interaktionen mit Ihrer Benutzeroberfläche durchgehen, daher hilft dies nicht bei der Berichterstattung, aber es kann für automatisierte Builds verwendet werden.

6
David Robbins

Aus Ihrer Frage geht hervor, dass Sie nach einer automatisierten Methode suchen, um Ihr GUI-Verhalten im Detail zu testen. Das Beispiel, das Sie angeben, ist das Testen, ob eine Kurve tatsächlich korrekt gezeichnet wurde.

Unit-Testing-Frameworks bieten eine Möglichkeit zum automatisierten Testen, aber ich denke, dass die Art von Tests, die Sie durchführen möchten, komplizierte Integrationstests sind, die das korrekte Verhalten einer Vielzahl von Klassen verifizieren, darunter die Klassen Ihres GUI-Toolkits/Ihrer GUI-Bibliothek sollte nicht testen wollen.

Ihre Optionen hängen stark davon ab, welche Plattformen/Toolkits/Frameworks Sie verwenden: Beispielsweise kann eine Anwendung, die Qt als GUI-Framework verwendet, Squish zur Automatisierung ihrer Tests verwenden. Sie überprüfen die Ergebnisse Ihrer Tests einmal und anschließend vergleichen automatisch ausgeführte Tests die Ergebnisse mit den überprüften Ergebnissen.

3
andreas buykx

Sie können JFCUnit verwenden, um Ihre GUI zu testen, aber Grafiken können schwieriger sein. Ich habe einige Male Schnappschüsse von meiner Benutzeroberfläche gemacht und diese automatisch mit einer früheren Version verglichen. Dies bietet zwar keinen tatsächlichen Test, warnt Sie jedoch, wenn ein automatischer Build nicht die erwartete Ausgabe liefert.

3
Steve Moyer

Window Licker für Swing & Ajax

2
robi-y

Es ist nicht Ihre Aufgabe, die GUI-Bibliothek zu testen. Sie können sich also der Verantwortung entziehen, zu überprüfen, was tatsächlich auf dem Bildschirm gezeichnet wird, und stattdessen die Eigenschaften der Widgets überprüfen, indem Sie der Bibliothek vertrauen, dass sie genau das wiedergibt, was gezeichnet wird.

0
ivan_pozdeev

Wenn Sie Swing verwenden, ist FEST-Swing nützlich, um Ihre GUI zu steuern und Behauptungen zu testen. Es macht es ziemlich einfach, Dinge wie "Wenn ich auf Knopf A klicke, sollte Dialog B angezeigt werden" oder "Wenn ich Option 2 aus dem Dropdown-Menü auswähle, sollten alle Kontrollkästchen deaktiviert werden" .

Das von Ihnen erwähnte Grafikszenario ist nicht so einfach zu testen. Es ist ziemlich einfach, Code für GUI-Komponenten zu erstellen und anzuzeigen (und sie möglicherweise mit FEST zu steuern). Sinnvolle Behauptungen aufzustellen ist jedoch der schwierige Teil (und Code-Coverage ohne sinnvolle Behauptungen ist eine Übung zur Selbsttäuschung). Wie testen Sie, ob das Diagramm nicht verkehrt herum oder zu klein gezeichnet wurde?

Ich denke, Sie müssen einfach akzeptieren, dass einige Aspekte der GUIs nicht effektiv durch automatisierte Komponententests getestet werden können und dass Sie sie auf andere Weise testen müssen.

0
Dan Dyer

Soweit ich weiß, ist dies ziemlich kompliziert und hängt wirklich von der Sprache ab - viele Sprachen haben ihre eigene Art, die GUI zu testen, aber wenn Sie die GUI wirklich testen müssen (im Gegensatz zur Modell/GUI-Interaktion), müssen Sie dies oft tun simulieren Sie einen tatsächlichen Benutzer, der auf Schaltflächen klickt. Das in Eclipse verwendete SWT-Framework enthält beispielsweise SWTBot , JFCUnit . Mozilla hat eine eigene Methode, dies in XUL zu simulieren (und nach dem, was ich gelesen habe) Auf ihren Blogs scheinen diese Tests ziemlich spröde zu sein.

Manchmal muss man einen Screenshot machen und auf pixelgenaue Wiedergabe testen (ich glaube, Mozilla prüft auf korrekt gerenderte Seiten) - dies erfordert ein längeres Setup, ist aber möglicherweise genau das, was man für die Grafiken benötigt. Auf diese Weise müssen Sie beim Aktualisieren Ihres Codes und bei einer Testpause das Bild manuell überprüfen, ob der Fehler tatsächlich aufgetreten ist, oder den Grafik-Rendering-Code verbessern, um hübschere Grafiken zu generieren und die Screenshots zu aktualisieren.

0
Kim Sullivan