Testen von Software Systemen Übung 02 SS 2009 Version: 1.0 09.06.2009 Komponententest Kunde: Dr. Reinhold Plösch Dr. Johannes Sametinger Kundenreferenz: 259.019 Team 19 Mitarbeiter: Christian Märzinger Thomas Pichler
Inhaltsverzeichnis 1. Einsatz Test-Stub... 3 2. Diskussion Code-Coverage Allgemein... 3 2.1. Projekt... 3 2.2. Model... 4 2.2.1. MineSweeperModel... 4 2.3. MineFieldModel... 8 2.3.1. getadjancies... 8 2.4. Util... 9 2.5. View... 9 3. Diskussion Code-Coverage Testfälle... 9 3.1.1. MineSweeperModelTest... 10 3.1.2. StopWatchTest... 11 Abbildungsverzeichnis Abbildung 1: Projekt... 3 Abbildung 2: Model... 4 Abbildung 3: MineSweeperModel... 4 Abbildung 4: flagsquare... 5 Abbildung 5: gameover... 6 Abbildung 6: revealadjacent... 6 Abbildung 7: revealall... 7 Abbildung 8: MineFieldModel... 8 Abbildung 9: getadjancies... 8 Abbildung 10: Util... 9 Abbildung 11: View... 9 Abbildung 12: jsweeper.test... 9 Abbildung 13: MineSweeperModel.java... 10 Abbildung 14: testrevealsquare... 11 Abbildung 15: StopWatchTest.java... 11 Abbildung 16: testresetwatch... 12 Märzinger, Pichler Seite 2 / 12
1. Einsatz Test-Stub Wir haben uns dazu entschieden bei den Tests keine Test-Stubs zu verwenden. Dies hat einmal den Grund, dass dazu ein umfangreicher Eingriff in den bestehenden Code notwendig gewesen wäre. Um dennoch die volle Funktionalität der Klasse MineSweeperModel.java testen zu können, haben wir uns über eine zusätzliche Getter-Methode Zugriff auf das MineField beschafft. /** * Implemented for the test with JUnit4 * Through that it is possible to test the class MineSweeperModel * @return minefield / public FieldModel getminefield() { return minefield; } 2. Diskussion Code-Coverage Allgemein 2.1. Projekt Überblick über die Abdeckung des gesamten Projekts. Abbildung 1: Projekt Auffallend dabei ist, dass bei dem Package Controller keine Abdeckung vorherrscht. Dies beruht aber darauf, dass der Controller nur die Aufgabe besitzt ein Spiel zu starten. Da wir aber über JUnit nur in den Packages Model und Util testen, wird die Klasse Controller.java nie angesprochen. Märzinger, Pichler Seite 3 / 12
2.2. Model Abbildung 2: Model Hier wird im gesamten Package eine Abdeckung von 94,6% erreicht. Die beiden Klassen FieldModel.java und Model.java stellen dabei ein Interface dar. Und werden auch bei der Abdeckung nicht berücksichtigt. Als nächstes wird die Klasse MineSweeperModel.java genauer betrachtet. 2.2.1. MineSweeperModel Abbildung 3: MineSweeperModel In dieser Klasse erreichen wir eine Abdeckung von 94,0 %. Dabei sind vier Methoden enthalten, die keine Abdeckung von 100,0 % erreichen. Diese müssen genauer betrachtet werden. Märzinger, Pichler Seite 4 / 12
2.2.1.1. flagsquare Abbildung 4: flagsquare Hier sieht man das die Methode von isrevealed(row,col) nicht bei der Abdeckung mit einbezogen wird. Betrachtet man dies genauer, so stellt man fest, dass hierbei eine Methode des Interface FieldModel verwendet wird. Hier dürfte Clover ein Problem mit der Markierung bzw. dem Feststellen der Benützung des Interfaces haben, da durch Debuggen der Testfälle festgestellt wurde, dass die Methode jedoch tatsächlich korrekt aufgerufen wird im Zuge der Ausführung der Testfälle. Märzinger, Pichler Seite 5 / 12
2.2.1.2. gameover Abbildung 5: gameover Auch hier wird wieder eine Methode von Clover nicht als durchlaufen erkannt. Obwohl dies der Fall sein muss, da sonst der Rumpf der If-Verzweigung nicht ausgeführt worden wäre und wiederrum mittels Debuggen der Testfälle der Aufruf verifiziert wurde. Demnach ist auch hier eine Abdeckung von 100,0 % gegeben. 2.2.1.3. revealadjacent Abbildung 6: revealadjacent In dieser Methode erfolgt das Aufdecken aller umliegenden Felder, falls nach dem Spielprinzip darin keine Minen versteckt sind. Wie auch bereits bei flagsquare() wird hier wieder auf eine Methode des Interface zugegriffen. Und das viermal, da das Aufdecken über eine Rekursion gelöst ist. Damit werden alle Felder links, rechts, oben und unten aufgedeckt. Auch hier ist dadurch eine Abdeckung von 100,0 % gegeben. Märzinger, Pichler Seite 6 / 12
2.2.1.4. revealall Abbildung 7: revealall Auch hier ist wieder eine Interface Methode betroffen. Welche von Clover nicht erkannt wird. Aber durch den Verlauf des Code ist eindeutig sichtbar, das die Methode betreten werden muss, da ansonsten der If-Zweig nicht betreten worden wäre. Auch dieser Fall wurde mittels Debuggen verifiziert. Märzinger, Pichler Seite 7 / 12
2.3. MineFieldModel Abbildung 8: MineFieldModel Bei dieser Klasse erreichen wir eine Abdeckung von 95,5 %. Auffallend dabei ist, dass alle Methoden bis auf eine Methode eine Abdeckung von 100 % erreichen. Daher ist die Methode getadjacencies genauer zu betrachten. 2.3.1. getadjancies Abbildung 9: getadjancies Da dies eine öffentliche Methode darstellt, wurde nach geforscht von wo aus sie im normalen Spielverlauf aus aufgerufen wird. Da dies aber nicht Teil einer der Märzinger, Pichler Seite 8 / 12
zu testenden Klasse war, ist kein Testfall vorhanden, mit dem die Methode getestet worden wäre und auch sonst scheint die Methode vom restlichen jsweeper-source-code nie aufgerufen zu werden. 2.4. Util Abbildung 10: Util Hier erreichen wir bei dem Testlauf eine Abdeckung von 100,0 % und daher ist hier keine Verbesserung notwendig. 2.5. View Abbildung 11: View 3. Diskussion Code-Coverage Testfälle Abbildung 12: jsweeper.test Bei den Testfällen erreichen wir eine Abdeckung von 98,1 %. Die Klasse AllTest.java erreicht erhält hierbei 0 % da es sich um die Test-Suite handelt. Interessanter hierbei ist die Abdeckung der geforderten Methoden laut Angabe. Märzinger, Pichler Seite 9 / 12
3.1.1. MineSweeperModelTest Abbildung 13: MineSweeperModel.java Bei den Testfällen wird eine Abdeckung von 99,4 % erreicht. Die Methoden setup and teardown sind von JUnit-Test und werden von Clover nicht berücksichtigt. Es bleiben daher noch die Methoden testrevealsquare. Märzinger, Pichler Seite 10 / 12
3.1.1.1. testrevealsquare Abbildung 14: testrevealsquare Auch hierbei hat Clover wieder das Problem, mit dem Interface und dadurch kommt die Abweichung zu den 100,0 % zu Stande. 3.1.2. StopWatchTest Abbildung 15: StopWatchTest.java Hier wird eine Abdeckung von 98,9 % erreicht. Die Methode testresetwatch bedarf dabei einer genaueren Betrachtung. Märzinger, Pichler Seite 11 / 12
3.1.2.1. testresetwatch Abbildung 16: testresetwatch In dieser Methode muss ein Fehler gefunden werden. Durch das Auftreten des Fehlers wird nach assertequals abgebrochen und die letzte Anweisung wird nicht ausgeführt. Märzinger, Pichler Seite 12 / 12