Marathon Beispiel: Überdeckungstests in Marathon mit EMMA

Einleitung:

Das Ziel des Beispiels ist es, Überdeckungstests zusammen mit den Marathon GUI Tests zu kombinieren und zu automatisieren. Ein Problem bei diesem Vorhaben ist, dass Marathon die zu testenden Klassen eigenständig lädt und dem Benutzer lediglich einige wenige Optionen zur Verfügung stellt, über die man in diesen Prozess eingreifen kann. Aus diesem Grund wird ein passendes Überdeckungs-Framework benötigt, dessen Schnittstellen und Arbeitsweise dazu taugt, das Problem, mit akzeptablem Aufwand, zufriedenstellend zu lösen. In diesem Beispiel kommt dafür das EMMA Framework zum Einsatz. Emma kann Java Klassen auf zwei Arten für Überdeckungstests aufbereiten, "on the fly" und "offline", wobei Ersteres die zu testenden Klassen beim Laden instrumentalisiert und Zweites die original Klassen oder Kopien von ihnen permanent erweitert. Die über den offline Modus modifizierten Klassen besitzen permanent die Fähigkeit, Überdeckungen zu messen und generieren nach dem Beenden ihrer Ausführung eine Datei, aus der sich Berichte erzeugen lassen. Dieser Ansatz funktioniert ebenfalls, wenn Marathon die Klassen benutzt. Somit muss nur das Marathon-Projekt die modifizierten Klassen, statt der originalen Klassen, bekommen und das automatische Instrumentalisieren der Klassen und Durchführen der Tests mit Hilfe von ANT veranlassen.

Projekt einrichten:

Ein Java Projekt mit einer Swing GUI, bestehend aus einem JFrame und einer Angepassten JTable, die andere JComponents in ihren Zellen beinhalten und darstellen kann:

Source Code und Buildfile

Projektstruktur:
Projektstruktur

Die Test-GUI:
Projektstruktur

Die GUI soll ein simples Memo-Brett darstellen. Zu erledigende Aufgaben können über Dropdown-Menüs eine Dringlichkeitsstufe zugewiesen bekommen, einen Text darstellen und als erledigt markiert werden. Beim Klick auf die "x" Buttons, wird das Memo aus der Tabelle entfernt.

Klassenübersicht:

marathontest.Main.java
Startet das Programm, erzeugt die Swing GUI Elemente und Testdaten.

marathontest.Table.CustomTable.java
Erbt von JTable und nutzt Cell-Editoren und Cell-Renderer, um JComponents in Tabellenzellen richtig darzustellen. Eine normale JTable würde JComponents sonst als Strings darstellen.

marathontest.Table.DropdownEditor.java
Der passende Editor zu einer JComboBox in einer JTable. Macht die Auswahl von Werten in einem Dropdown-Menü in der CustomTable möglich.

marathontest.Table.JComponentCellEditor.java
Standard Editoren für verschiedene JComponents in der CustomTable.

marathontest.Table.JComponentCellRenderer.java
Ermöglicht CustomTable JComponents in den Tabellenzellen richtig darzustellen.

marathontest.Table.memotable.MemoEntity.java
Eine Datenhaltungsklasse, die ein Memo repräsentiert.

marathontest.Table.memotable.MemoTable.java
Erbt von CustomTable und ist das Haupt-GUI-Element des Beispiels.

marathontest.Table.memotable.MemoTableModel.java
Das Datenmodell der MemoTable.

marathontest.Table.memotable.TableButtonEditor.java
Angepasster Editor für die MemoTable JButtons. Wenn er durch Klick auf den Button aufgerufen wird, wird das entsprechende Memo aus der Tabelle entfernt.

Vorbereitung:

Apache ANT wird als installiert und eingerichtet vorausgesetzt.
Bei der ANT build.xml Datei müssen die Pfade "emma.dir" und "marathon-home" so angepasst werden, dass sie auf jeweils die Ordner verweisen, in denen die Emma Bibliotheken und die Marathon-ITE liegen.

XML anpassen

Jetzt wird der Kommandozeilen-Befehl "ANT emma compile" in dem Projektordner ausgeführt, um das Projekt zu compilieren und für die Überdeckungsmessung zu instrumentalisieren. Das Orignal-Programm wird in den Ordner "out" compiliert, während die instrumentalisierte Kopie in "outinstr" abgelegt wird.
Als nächstes kommt die Erstellung eines Marathon Projektes, welches im Unterverzeichnis "marathon" im Projektordner gespeichert wird und als Klassenpfad den "outinstr" Ordner bekommt.
Zuletzt fehlen die eigentliche Marathon Tests, die über die Marathon-ITE erstellt und zum Marathon Projekt hinzugefügt werden müssen.

Projektordner mit angelegtem Marathon Projekt:
Projektordner

Beipispiel Marathon Testskript:

Marathon (JRuby) Testkript: tc1.rb


Beachtenswert ist der Befehl "set_no_fail_on_exit(true)" bevor das Programmfenster mit "window_closed" geschlossen wird. Der "no fail on exit" Befehl wurde eingeführt, um eventuelle Probleme, die von Marathon beim Beenden des Testprogramms verursacht werden, zu ignorieren. Dies ist bei der Zusammenarbeit mit EMMA sehr sinnvoll, um Probleme mit der automatischen Durchführung der Tests zu vermeiden. Außerdem wird im normalen Aufzeichnungs-Modus der Klick auf den "x" Button, zum Löschen des Tabelleneintrages, von Marathon nicht richtig aufgezeichnet und muss per Hand angepasst oder im neuen "raw" Modus aufgezeichnet werden. Marathon zeichnet einen "click" Befehl auf, der dann den Editor für die Zelle in der der Button ist nicht auslöst. Wird der Befehl in einen "select" Befehl mit der entsprechenden Reihe und Spalte abgewandelt, funktioniert das Skript reibungslos.
Nach der Bedienung der JComboBox in der Tabellenzelle, sollte irgendwo an eine andere Stelle in der Tabelle geklickt werden oder ein "click" Befehl eingefügt werden, da der Test sonst an der Stelle hängen bleibt.
Das Interessante ist, dass die manuelle Bedienung der GUI diese Probleme nicht aufweist.

Durchführung:

Nachdem das Projekt, das Marathon Projekt und die Marathon Tests angelegt sind, kann das Projekt mit einem einzigen ANT Kommandozeilen-Befehl gestartet werden. Der Befehl "ANT emma marathon-tests" compiliert das Projekt, macht eine instrumentalisierte Kopie, startet Marathon und veranlasst das Durchführen aller Tests im Marathon Projektordner. Als letztes verschiebt ANT die, nach dem Durchführen der Tests im Projektordner erzeugte, Datei mit Überdeckungswerten, zu den Emma Metadaten, in den Unterordner "coverage" und erzeugt daraus die Überdeckung-Reports.

Uterordner "coverage" - enthält Metadaten, Coverage-Daten und erzeugte Reports:
coverage Unterordner mit Reports

Der Report im .html-Format:
coverage Report 1

Wenn die Source-Dateien im ANT Task mit verlinkt sind, enthalten die Reports auch farbliche Visualisierungen der Überdeckungen:
coverage Report 2



Zurück zur Werkzeugübersicht
Zurück zur CSI-Hauptseite