Software-Engineering Software-Management 12.3 Unit-Tests mit JUnit - Wissen, was der Sourcecode macht! Lösung Prof. Dr. Rolf Dornberger Software-Engineering: 12.3 Unit-Tests mit JUnit 30.04.2006 1
12.3 Unit-Tests mit JUnit Aufgabe 1: Unit-Tests mit JUnit in Eclipse Aufgabe 2: Euro-Klasse 30.04.2006 2
Aufgabe 1: Unit-Tests mit JUnit in Eclipse 1. JUnit Oberfläche in Eclipse 2. Tests erstellen und laufen lassen 3. Testauswertung 4. Test-Suites erstellen und laufen lassen 30.04.2006 3
Lösung 1: Unit-Tests mit JUnit in Eclipse: 1. JUnit Oberfläche in Eclipse JUnit vorhanden? 30.04.2006 4
Lösung 1: Unit-Tests mit JUnit in Eclipse: 1. JUnit Oberfläche in Eclipse JUnit Tab in Eclipse Test fehlgeschlagen Test erfolgreich 30.04.2006 5
Lösung 1: Unit-Tests mit JUnit in Eclipse: 2. Tests erstellen und laufen lassen Einen neuen Test erstellen Menu: File New JUnit Test Case Test in welchem Projekt? Klassenname Automatisch Konstruktor erstellen 30.04.2006 6
Lösung 1: Unit-Tests mit JUnit in Eclipse: 2. Tests erstellen und laufen lassen Quellcode des Unit-Tests: TestLargest.java import junit.framework.testcase; public class TestLargest2 extends TestCase { public TestLargest2(String name) { super(name); public void testsimple(){ assertequals(9, Largest.largest(new int[] {8,9,7)); 30.04.2006 7
Lösung 1: Unit-Tests mit JUnit in Eclipse: 2. Tests erstellen und laufen lassen Quellcode des Unit-Tests: Largest.java public class Largest { // Methode liesst int Array ein und gibt den grössten // int Wert des Arrays zurück. public static int largest(int[] list){ int index, max = Integer.MIN_VALUE; for (index = 0; index < list.length; index++){ if (list[index] > max){ max = list[index]; return max; 30.04.2006 8
Lösung 1: Unit-Tests mit JUnit in Eclipse: 2. Tests erstellen und laufen lassen Nachdem der Quellcode geschrieben wurde, geht es ans testen. Testklasse markieren. Menu: Run Run As 1 JUnit Test Test erfolgreich 30.04.2006 9
Lösung 1: Unit-Tests mit JUnit in Eclipse: 3. Testauswertung Da scheint was Schiefgelaufen zu sein. Test fehlgeschlagen Ausgeführte Testmethode Fehlerbeschreibung 30.04.2006 10
Lösung 1: Unit-Tests mit JUnit in Eclipse: 3. Testauswertung Quellcodeänderung der Klasse: Largest.java public class Largest { Anstelle von max = Integer.MAX_VALUE max = 0 public static int largest(int[] list){ int index, max = 0; for (index = 0; index < list.length-1;index++){ if (list[index] > max){ max = list[index]; return max; 30.04.2006 11
Lösung 1: Unit-Tests mit JUnit in Eclipse: 3. Testauswertung Test erfolgreich Test erfolgreich Ausgeführte Testmethode 30.04.2006 12
Lösung 1: Unit-Tests mit JUnit in Eclipse: 4. Test-Suites erstellen und laufen lassen Einen neuen Test erstellen: Menu: File New Other Java JUnit JUnit Test Suite Test in welchem Projekt? Test Suite Name Auswahl der Klassen Der Suite GUI Auswahl für JUnit. In Eclipse nicht nötig. 30.04.2006 13
Aufgabe 2: Euro-Klasse 1. Schreiben Sie die Euro-Klasse zu folgendem TestCase. 2. Überlegen Sie sich weitere Testfälle für die Euro Klasse. Gehen Sie nach dem Right- BICEP Konzept vor. (Euro-Beträge soll auf Cents genau angezeigt werden.) 3. Schreiben Sie einen Testfall, der prüft ob der Betrag richtig gerundet wird. (Verwenden Sie ein Delta von 0.001.) Schreiben Sie Euro.java so um, dass bei der Instanzierung durch new Euro(1.995) der oben geschriebene Test erfolgreich ist. (Tipp: Für die Rundung muss mit Cents gerechnet werden.) import junit.framework.testcase; public class EuroTest extends TestCase { public static void main(string[] args) { junit.swingui.testrunner.run(eurotest.class); public EuroTest(String name) { super(name); public void testamount(){ Euro two = new Euro(2.00); asserttrue(2.00 == two.getamount()); 30.04.2006 14
Lösung 2: Euro-Klasse 1. Die Euro-Klasse EuroTest: public class Euro { private double amount; public Euro(double amount) { this.amount = amount; public double getamount(){ return this.amount; 30.04.2006 15
Lösung 2: Euro-Klasse 2. Mögliche weitere Testfälle: Was passiert, falls mit new Euro(1.995) ein neues Objekt instanziert wird? Welches Ergebnis erwartet man? Was passiert, falls mit new Euro(null) ein neues Objekt instanziert wird? Was passiert, falls mit new Euro(0) ein neues Objekt instanziert wird? Was passiert, falls mit new Euro(1485033959335854832.00) ein neues Objekt instanziert wird? Was passiert, falls mit new Euro( zehn ) ein neues Objekt instanziert wird?... 30.04.2006 16
Lösung 2: Euro-Klasse 3. Zusätzlicher Testfall in EuroTest.java public void testrounding(){ Euro roundedtwo = new Euro(1.995); assertequals(2.00, roundedtwo.getamount(), 0.001); Umgeschriebene Euro-Klasse public class Euro { private long cents; public Euro(double euro) { cents = Math.round(euro * 100); public double getamount(){ return cents/100.0; 30.04.2006 17