# JUnit Tests für GUI / Oberflächen



## Stephan.Woebbeking (20. Jul 2009)

Hi,

nach vielfältigen Irrungen und Wirrungen, endlosen Debug Sitzungen und dementsprechend hochwertigem Code-Ergebnis bin ich seit einiger Zeit unter die JUnit Nutzer gegangen. Stück für Stück baut man die Nutzung aus und jetzt bin ich kürzlich an den Punkt gekommen, wo ich mir wünsche, dass ich die GUI ebenfalls intensiver testen möchte. De facto geht es dabei wohl bereits über den Klassischen Klassen / Unit Test hinaus, evt. lässt sich aber ja JUnit trotzdem dafür ganz gut nutzen?
Mir geht es im Prinzip um eine Art Fernsteuerung für die GUI. D.h. ich würde gern aus meinen TestCases heraus die Methoden aufrufen, die sonst von den Buttons, Menüs etc. gerufen werden. Das als solches ist ja auch ganz einfach und läuft dann in Windeseile ab.
Aber: Wenn der Tester nochmal mit einem Blick kontrollieren soll, wie das Ergebnis aussieht, dann wird es - bisher - schwierig. Mein Gedanke ist, ich mache was ich auch immer, lasse dann die Applikation stehen, bis sie regulär geschlossen wird und setze dann meinen Test fort. Genau hier hänge ich derzeit.

Ich hab's so probiert:


```
pilot.switchPage( Constants.PAGE_LIVE );
( (PageLive) pilot.getPage() ).updateModel( model );
try {
	while ( pilot.isRunning() ) {
		logger.debug( "running 1" );
		SwingUtilities.invokeAndWait( new Runnable() {
			public synchronized void run() {
				logger.debug( "running 2" );
				try {
					wait( 500 );
				} catch ( InterruptedException e ) {}
			}
		});
	}
	logger.info( "Tschau!" );
```

Die ersten beiden Zeilen sind der eigentliche Testfall. pilot.isRunning() geht auf false, sobald der Nutzer das Fenster schließt - in der "Vollversion" (also kein Test) geht das problemlos. Bei diesem Code bekomme ich abwechselnd die Meldungen "running 1" und "running 2", also wie erwartet. Aber "Tschau!" bekomme ich nie! Obwohl "running 1" / "running 2" irgendwann aufhört, das irritiert mich etwas.

Hab ich was übersehen? Ein System.Exit() ist dabei - soweit ich das korrekt überprüft hab - nicht beteiligt. Jemand eine Idee, bzw. sowas vielleicht schon mal mit einem anderen Konstrukt gemacht? Es geht mir wie gesagt darum, den Testfall offen zu halten, bis das Fenster geschlossen wird und dann ganz normal weiter zu machen. Mit konstant getimten Testfällen klappt das auch wunderbar, aber hier...?

Danke schon mal im Voraus!

Stephan


----------



## Stephan.Woebbeking (20. Jul 2009)

der Lösung... Es ist ja oft so, nachdem man im Forum geschrieben hat, probiert man noch etwas rum und schon macht jede Zeile Code ganz etwas anderes als vorher.  Ok, nicht ganz so, aber wenn ich


```
this.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
```

rausnehme, endet der Testfall zumindest planmäßig.

Falls jemand noch 'ne Idee dazu hat, immer her damit!


----------



## sliwalker (20. Jul 2009)

Hi,

es gibt professionelle Tools die man zum GUI-Testen verwenden kann. Wir verwenden QF-Test von Quality First.
Quality First Software GmbH & QF-Test - Das Java GUI Testtool

Dort kann man Testfälle hinterlägen, die man vorher einmal "aufnehmen" muss. Das ganze lässt sich durch einen Phyton-Ableger, genannt Jython, auch per Skriptsprache steuern.

Sehr gutes Tool, nur wehe Du entscheidest Dich einem Panel noch ein Überpanel zu geben. Dann kann es die Komponentenhierachie nicht mehr korrekt auflösen und scheitert.

Es ist sehr viel Aufwand, den man da rein stecken muss. Wir haben zwei Leute damit beschäftigt. Änderungen bei Maskenänderungen verursachen zwar (wenn man es kann) nur wenig Aufwand, aber die Pflege des Ganzen ist schon aufwändig.

Keine Ahnung ob es eine Testversion gibt.


----------

