Beuth Hochschule JUnit 3 und JUnit 4 WS15/16, S. 1
JUnit 3 und JUnit 4
XJunit ist eine Sammelbezeichnung für verschiedene Frameworks, mit denen man Testprogramme schreiben kann. JUnit ist eines dieser Frameworks. Mit JUnit kann man Java-Programme zum Testen von Java-Klassen schreiben. Für das Testen von .Net-Programmen, PHP-Programmen, C++-
Programmen, ... gibt es entsprechende XUnit Frameworks namens NUnit, PHPUnit, CppUnit, ... . Um eine Java-Klasse K zu testen, schreibt man eine JUnit Test-Klasse TK und lässt TK von einem sogenannten Runner-Programm ausführen. Es gibt verschiedene solche Runner-Programme. Textuelle Runner geben ihre Ergebnisse als Text-Zeilen aus. Grabo-Runner haben eine grafische
Benutzeroberfläche. Verbreitete Java Entwicklungs-Umgebungen wie Eclipse und NetBeans haben eigene, "fest eingebaute" JUnit-Runner (natürlich mit Grabo).
Von JUnit gibt es zur Zeit (Ende 2016) zwei wesentlich verschiedene Versionen: JUnit 3 und JUnit 4.
Beide Versionen haben Vor- und Nachteile. Der wichtigste Unterschied ist der folgende:
Für JUnit 3 gibt es (textuelle und Grabo-) Runner, die man auch unabhängig von einer "großen und komplizierten" Entwicklungsumgebung benutzen kann. Für JUnit 4 gibt es in den verbreiteten Entwicklungsumgebungen Grabo-Runner, aber unabhängig von Entwicklungsumgebungen muss man sich mit textuellen Runnern begnügen.
Es folgen hier
eine JUnit 3 Test-Klasse namens StringBuilderTestJU3 und eine JUnit 4 Test-Klasse namens StringBuilderTestJU4.
Beide Testklassen leisten das Gleiche: Sie führen ein paar kleine Tests mit der Klasse
StringBuilder durch. Unter Eclipse kann man jede der beiden Test-Klassen auf zwei verschiedene Weisen ausführen lassen:
mit Run As, JUnit Test, oder mit Run As, Java Application.
Damit man beim Ausführen der Test-Klassen auch ein paar Fehlermeldungen sieht (obwohl es sehr schwer, vielleicht sogar unmöglich ist, noch Fehler in der Klasse StringBuilder zu finden), wurden in die Testklassen absichtlich auch ein paar falsche Test-Befehle eingebaut, die eine Fehlermeldung bewirken, obwohl die Klasse StringBuilder (zumindest an der getesteten Stelle) keinen Fehler enthält.
S. 2, WS15/16 Die JUnit 3 Testklasse StringBuilderTestJU3 Beuth-Hochschule
Die JUnit 3 Testklasse StringBuilderTestJU3
1 /* --- 2 Datei StringBuilderTestJU3.java
3
4 Ein JUnit 3 Programm zum Testen der Klasse StringBuilder.
5 Kann (unter Eclipse) wahlweise mit 6 "Run As, Java Application" oder mit
7 "Run As, JUnit Test" ausgefuehrt werden.
8
9 In dieses Testprogramm wurden absichtlich fehlerhafte Testbefehle 10 eingebaut (gekennzeichnet mit "Geht schief!"), so dass Fehler gemeldet 11 werden, obwohl die Klasse StringBuilder diese Fehler nicht enthaelt.
12 --- */
13 import org.junit.runner.JUnitCore; // Wird in main benutzt 14
15 import junit.framework.TestCase;
16 import junit.framework.Test;
17 import junit.framework.TestSuite;
18 //--- 19 public class StringBuilderTestJU3 extends TestCase {
20
21 // Objektattribute fuer Test-Objekte, die in allen Testfaellen 22 // benutzt werden koennen (aber noch ohne Objekte):
23 StringBuilder sb00;
24 StringBuilder sb01;
25 StringBuilder sb02;
26
27 // Wird vor jedem Testfall ausgefuehrt:
28 protected void setUp() throws Exception { 29 super.setUp();
30
31 // Die Objektattribute sb00 bis sb02 auf "neue Testobjekte"
32 // zeigen lassen:
33 sb00 = new StringBuilder();
34 sb01 = new StringBuilder("ABC");
35 sb02 = new StringBuilder("Hallo Sonja! Wie geht's?");
36
37 printf("Before: [%s, %s, %s]%n", sb00, sb01, sb02);
38 } 39
40 // Wird nach jedem Testfall ausgefuehrt:
41 protected void tearDown() throws Exception { 42 super.tearDown();
43
44 printf("After: [%s, %s, %s]%n", sb00, sb01, sb02);
45 } 46
47 // Ein Testfall namens test_append_01:
48 public void test_append_01() { 49 sb00.append("DE");
50 sb01.append("DE");
51 sb02.append("DE");
52 assertEquals(true, "DE".equals(sb00.toString())); // Geht gut!
53 assertEquals(true, "ABCDE".equals(sb01.toString())); // Geht gut!
54 assertEquals(true, "ABCDE".equals(sb02.toString())); // Geht schief!
55 } 56
57 // Ein Testfall namens test_length_01:
58 public void test_length_01() {
59 assertEquals(0, sb00.length()); // Geht gut!
60 assertEquals(3, sb01.length()); // Geht gut!
61 assertEquals(3, sb02.length()); // Geht schief!
Beuth Hochschule Die JUnit 3 Testklasse StringBuilderTestJU3 WS15/16, S. 3
62 } 63
64 // Ein Testfall namens test_indexOf_01:
65 public void test_indexOf_01() {
66 StringBuilder sb03 = new StringBuilder("ABCDEFG");
67 assertEquals(0, sb03.indexOf("AB" )); // Geht gut!
68 assertEquals(1, sb03.indexOf("BCDE")); // Geht gut!
69 assertEquals(2, sb03.indexOf("CDE")); // Geht gut!
70 } 71
72 static public Test suite() { 73 // Ein TestSuite-Objekt ist im Wesentlichen eine Zusammenfassung 74 // von Namen von Testfaellen. Ein Testfall ist eine parameterlose 75 // Objektprozeudr (non-static void-method with no parameters).
76
77 // Alle mit "test" beginnenden Namen von Testfaellen kann man 78 // (pauschal) wie folgt in ein TestSuite-Objekt einfuegen:
79 TestSuite ts1 = new TestSuite(StringBuilderTestJU3.class);
80
81 return ts1;
82 } // suite
83 // --- 84 // Eine Methode mit einem kurzen Namen:
85 static void printf(String f, Object... or) {System.out.printf(f, or);}
86 // --- 87 static public void main(String[] sonja) {
88 // Ein sehr schlichter JUnit 3 Test-Runner.
89 // Gibt seine Meldungen zur Standardausgabe (Eclipse: Console) aus.
90 // junit.textui.TestRunner.run(suite());
91
92 // Ein sehr schlichter JUnit 4 Test-Runner, der 93 // auch JUnit 3 Klassen ausfuehren kann.
94 // Gibt seine Meldungen zur Standardausgabe (Eclipse: Console) aus.
95 JUnitCore.main("StringBuilderTestJU3");
96 }
97 // --- 98 }
Die JUnit 4 Testklasse StringbuilderTestJU4
99 /* --- 100 Datei StringBuilderTestJU4.java
101
102 Ein JUnit 4 Programm zum Testen der Klasse StringBuilder.
103 Kann (unter Eclipse) wahlweise mit 104 "Run As, Java Application" oder mit
105 "Run As, JUnit Test" ausgefuehrt werden.
106
107 In dieses Testprogramm wurden absichtlich fehlerhafte Testbefehle 108 eingebaut (gekennzeichnet mit "Geht schief!"), so dass Fehler gemeldet 109 werden, obwohl die Klasse StringBuilder diese Fehler nicht enthaelt.
110 --- */
111 import static org.junit.Assert.assertEquals;
112
113 import org.junit.Before;
114 import org.junit.After;
115 import org.junit.Test;
116 import org.junit.runner.JUnitCore;
117 // --- 118 public class StringBuilderTestJU4 {
119
120 // Objektattribute fuer Test-Objekte, die in allen Testfaellen
S. 4, WS15/16 Die JUnit 4 Testklasse StringbuilderTestJU4 Beuth-Hochschule
121 // benutzt werden koennen (aber noch ohne Objekte):
122 StringBuilder sb00;
123 StringBuilder sb01;
124 StringBuilder sb02;
125
126 @Before
127 // Wir vor jedem Testfall ausgefuehrt:
128 public void vor_jedem() {
129 // Die Objektattribute sb00 bis sb02 auf "neue Testobjekte"
130 // zeigen lassen:
131 sb00 = new StringBuilder();
132 sb01 = new StringBuilder("ABC");
133 sb02 = new StringBuilder("Hallo Sonja! Wie geht's?");
134
135 printf("Before: [%s, %s, %s]%n", sb00, sb01, sb02);
136 } 137
138 @After
139 // Wird nach jedem Testfall ausgefuehrt:
140 public void nach_jedem() {
141 printf("After: [%s, %s, %s]%n", sb00, sb01, sb02);
142 143 } 144
145 // Ein Testfall namens append_01:
146 @Test
147 public void append_01() { 148 sb00.append("DE");
149 sb01.append("DE");
150 sb02.append("DE");
151 assertEquals(true, "DE".equals(sb00.toString())); // Geht gut!
152 assertEquals(true, "ABCDE".equals(sb01.toString())); // Geht gut!
153 assertEquals(true, "ABCDE".equals(sb02.toString())); // Geht schief!
154 } 155
156 // Ein Testfall namens length_01:
157 @Test
158 public void length_01() {
159 assertEquals(0, sb00.length()); // Geht gut!
160 assertEquals(3, sb01.length()); // Geht gut!
161 assertEquals(3, sb02.length()); // Geht schief!
162 } 163
164 // Ein Testfall namens indexOf_01:
165 @Test
166 public void indexOf_01() {
167 StringBuilder sb03 = new StringBuilder("ABCDEFG");
168 assertEquals(0, sb03.indexOf("AB" )); // Geht gut!
169 assertEquals(1, sb03.indexOf("BCDE")); // Geht gut!
170 assertEquals(2, sb03.indexOf("CDE")); // Geht gut!
171 }
172 // --- 173 // Eine Methode mit einem kurzen Namen:
174 static void printf(String f, Object... or) {System.out.printf(f, or);}
175 // --- 176 static public void main(String[] sonja) {
177 // Ein sehr schlichter JUnit 4 Test-Runner.
178 // Gibt seine Meldungen zur Standardausgabe (Eclipse: Console) aus.
179 JUnitCore.main("StringBuilderTestJU4");
180 }
181 // --- 182 }
Beuth Hochschule Die JUnit 4 Testklasse StringbuilderTestJU4 WS15/16, S. 5
Die Ausgabe der beiden Programme:
Before: [, ABC, Hallo Sonja! Wie geht's?]
After: [, ABC, Hallo Sonja! Wie geht's?]
Before: [, ABC, Hallo Sonja! Wie geht's?]
After: [, ABC, Hallo Sonja! Wie geht's?]
Before: [, ABC, Hallo Sonja! Wie geht's?]
After: [DE, ABCDE, Hallo Sonja! Wie geht's?DE]
Anmerkung: Die einzelnen Testfälle werden nicht unbedingt in der Reihenfolge ausgeführt, in der sie in der Testklasse vereinbart wurden.