2008-10-18 5 views
133

Die Berechnungen in meinem Code sind gut getestet, aber weil es so viel GUI-Code gibt, ist meine allgemeine Codeabdeckung niedriger als ich es möchte. Gibt es Richtlinien zum Unit-Testing-GUI-Code? Macht es überhaupt Sinn?Wie kann ich Einheit GUI testen?

Zum Beispiel gibt es Diagramme in meiner App. Ich konnte nicht herausfinden, wie man das Testen der Graphen automatisiert. Es braucht ein menschliches Auge, AFAIK, um zu überprüfen, ob der Graph korrekt ist. aus der aktuellen GUI wie möglich

(Ich bin mit Java Swing)

+0

Es ist ein großer Artikel über verschiedene GUI-Architekturen von Martin Fowler (http: //www.martinfowler.com/eaaDev/uiArchs.html). Es beschreibt GUI-Architektur Kompromisse in Bezug auf Komponententests. –

+0

Heute würde diese Frage besser gefragt auf http://programmers.stackexchange.com (und ist wahrscheinlich Wegthema auf Stack-Überlauf, auf dem Gelände zu breit ist), aber alte Fragen können nicht migriert werden. Die Frage ob es hier nebenbei zugeht, bleibt das Problem ein interessantes und schwieriges. –

+0

Es wäre toll, ein Beispiel mit einem GUI-Code und JUnit zu haben. –

Antwort

61

Designs wie MVP und MVC Regel zu abstrahieren, so viel Logik versuchen. Ein sehr beliebter Artikel dazu ist "The Humble Dialog Box" von Michael Feathers. Persönlich hatte ich gemischte Erfahrungen damit, Logik aus der Benutzeroberfläche herauszuholen - manchmal hat es sehr gut funktioniert, und manchmal war es mehr Ärger als es wert war. Es ist jedoch etwas außerhalb meines Fachgebiets. Hier

+0

??? „Manchmal ist es sehr gut funktioniert, und zu anderen Zeiten ist es mehr Mühe gewesen, als es wert“ Sehr komisch, weil die meist neue Sprache ist in der Regel ... MVC orientiert werden, die Logik aus dem gui ist (Modell-Visuellen) ... –

+11

Noch , Präsentationslogik wird in der GUI sein. Manchmal, das kann alles andere als trivial – Andrea

+14

Spiegel sein: [The Humble Dialogfeld] (http://web.archive.org/web/20110721175855/http://www.objectmentor.com/resources/articles/TheHumbleDialogBox.pdf) – c24w

4

ist ein paar Tipps:

Versuchen Sie, die meisten Code entfernen Sie von der GUI können (müssen Controller und Modellobjekt) auf diese Weise können Sie sie testen, ohne die GUI werden können.

Für die Grafik sollten Sie den Wert testen, den Sie an den Code liefern, der die Grafik generiert.

2

Sie können JFCUnit verwenden, um Ihre GUI zu testen, aber Grafiken können schwieriger sein. Ich habe bei einigen Gelegenheiten Schnappschüsse meiner GUI gemacht und automatisch mit einer früheren Version verglichen. Dies stellt zwar keinen eigentlichen Test bereit, macht Sie jedoch darauf aufmerksam, wenn ein automatischer Build die erwartete Ausgabe nicht erzeugt.

9

Sie können UISpec4J versuchen ist eine Open-Source-funktionelle und/oder Unit-Test-Bibliothek für Swing-basierte Java-Anwendungen ...

+2

ich habe mit UISpec4J für einen Monat gestartet oder so, um Anforderungsvalidierungstests auf Java Swing-GUI durchzuführen. Ich habe es bisher sehr gemocht. – Bassam

+0

https://github.com/UISpec4J/UISpec4J besagt, dass Ihr Link die offizielle Website ist, aber für mich sieht das nicht so offiziell aus. Alles, was ich sehe, ist ein Blog über Vlogging – lucidbrot

4

Es Selenium RC ist, die eine Web-basierte Benutzeroberfläche testen werden automatisieren. Es zeichnet Aktionen auf und spielt sie erneut ab. Sie müssen weiterhin die Interaktionen mit Ihrer Benutzeroberfläche durchgehen, damit dies nicht für die Berichterstattung hilfreich ist, aber für automatisierte Builds verwendet werden kann.

0

Von dem, was ich weiß, ist dies ziemlich kompliziert, und hängt wirklich von der Sprache ab - zahlreiche Sprachen haben ihre eigene Art, GUI zu testen, aber wenn Sie wirklich die GUI testen müssen (im Gegensatz zu Modell/GUI-Interaktion), Sie müssen oft einen tatsächlichen Benutzer simulieren, indem Sie auf Schaltflächen klicken. Zum Beispiel hat das in Eclipse verwendete SWT-Framework SWTBot, JFCUnit bereits erwähnt, Mozilla hat seine eigene Art, dies in XUL zu simulieren (und von dem, was ich auf ihren Blogs gelesen habe, scheinen diese Tests ziemlich brüchig zu sein).

Manchmal muss man einen Screenshot machen und auf pixelgenaues Rendering testen (ich glaube, dass Mozilla dies auf korrekt gerenderte Seiten prüft) - das erfordert eine längere Einrichtung, aber vielleicht ist es das, was man für die Graphen braucht. Wenn Sie Ihren Code aktualisieren und ein Test bricht, müssen Sie das Bild manuell überprüfen, wenn der Fehler real war, oder Sie haben den grafischen Rendering-Code verbessert, um schönere Grafiken zu erstellen, und müssen die Screenshots aktualisieren.

29

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

Davon abgesehen, hörte ich von einem Kollegen vor langer Zeit, dass, wenn SGI wurde OpenGL auf neue Hardware zu portieren, sie eine Reihe von Unit-Tests hatten, die einen Satz von primatives auf den Bildschirm zeichnen würde dann eine MD5-Summe berechnen der Rahmenpuffer. Dieser Wert könnte dann mit bekannten guten Hash-Werten verglichen werden, um schnell festzustellen, ob die API pro Pixel genau ist.

+3

Ich mag diesen Ansatz. Umständlich einzurichten und zu warten, aber es würde mir die Regressionstests ermöglichen, die ich brauche. –

+0

Versucht dies. Scheiterte kläglich. Siehe http://stackoverflow.com/questions/528224/how-to-use-linux-fonts-in-windows-qt – danatel

+5

danatel Sie haben den Punkt verpasst. OpenGL ist eine pixelgenaue Grafik-Rendering-API. GUI-Anwendungsframeworks wie Qt werden in hohem Maße von dem System-Chrom abhängen, so dass das Hashing des Framebuffers kein guter Ansatz ist. –

0

Wenn Sie Schaukel verwenden, FEST-Swing ist nützlich für Ihre GUI Lenk- und Testen Behauptungen. Es macht es ziemlich einfach, Dinge wie zu testen "wenn ich Knopf A, Dialogfeld B sollte angezeigt werden" oder "wenn ich Option 2 aus der Dropdown-Liste wählen, sollten alle Kontrollkästchen deaktiviert werden".

Die Grafik Szenario, das Sie erwähnen, ist nicht so einfach zu testen. Es ist ziemlich einfach, Code-Coverage für GUI-Komponenten zu erhalten, indem man sie erstellt und anzeigt (und sie vielleicht mit FEST antreibt). Sinnvolle Behauptungen zu machen ist jedoch der schwierige Teil (und Code-Coverage ohne aussagekräftige Behauptungen ist eine Übung in der Selbsttäuschung). Wie testen Sie, dass die Grafik nicht umgedreht oder zu klein gezeichnet wurde?

Ich denke, dass man muss nur akzeptieren, dass einige Aspekte des GUIs nicht effektiv durch automatisierte Unit-Tests getestet werden, und dass Sie haben sie auf andere Weise zu testen.

2

Was ich aus Ihrer Frage zu sammeln, ist, dass Sie eine automatisierte Möglichkeit, dich auf Ihr GUI-Verhalten im Detail zu testen, das Beispiel geben Sie testen, ob eine Kurve tatsächlich korrekt gezeichnet wird.

Unit Testing Frameworks bieten eine Möglichkeit, automatisierte Tests durchzuführen, aber ich denke, die Art von Tests, die Sie durchführen möchten, sind komplizierte Integrationstests, die das korrekte Verhalten einer Vielzahl von Klassen überprüfen, darunter die Klassen Ihres GUI Toolkits/Bibliothek, die Sie nicht testen sollten.

Ihre Optionen hängen sehr 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 einmal die Ergebnisse Ihrer Tests, und nachfolgende automatisch ausgeführte Tests vergleichen die Ergebnisse mit den verifizierten Ergebnissen.

5

Sie können versuchen, Cucumber und Swinger zum Schreiben von funktionalen Akzeptanztests in einfachem Englisch für Swing GUI-Anwendungen zu verwenden. Swinger verwendet Netbeans 'Jemmy-Bibliothek unter der Haube, um die App zu steuern.

Gurke können Sie Tests wie folgt 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!" 

Werfen Sie einen Blick auf diese Swinger video demo es in Aktion zu sehen.

+11

ohgod, cobol zum testen ... –

+1

Nicht so sicher. – Dema

4

Testing ist eine Kunstform. Ich stimme zu, die Logik sollte GUI so weit wie möglich entfernt werden. Wir können uns dann darauf konzentrieren, unsere Unit-Tests durchzuführen. Wie bei allen anderen Tests geht es auch darum, Risiken zu reduzieren. Sie müssen nicht immer alles testen, aber oft ist das Beste, die verschiedenen Tests für verschiedene Bereiche zu brechen.

Die andere Frage ist, was sind Sie wirklich auf der UI-Ebene zu testen versuchen. Das UI-Testen ist das teuerste Testen, da es normalerweise länger dauert, um es zu erstellen, zu warten und es am sprödesten ist. 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 ein Diagramm testen möchten, wird eine rote Linie gezeichnet. Kannst du ihm vorgegebene Koordinaten geben und testen, ob bestimmte Pixel rot oder nicht rot sind? Wie oben vorgeschlagen, würden Bitmap-Vergleiche zwar funktionieren, aber mein Hauptaugenmerk würde nicht auf einem Übertest der GUI liegen, sondern eher auf der Logik der UI-Erstellung und darauf, welcher Teil der UI bricht oder verdächtig ist und eine Handvoll Tests fokussiert Dort.