bessere tests mit junit 4.x - java forum...
TRANSCRIPT
![Page 1: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/1.jpg)
Bessere Tests mit JUnit 4.xMarc Philipp1. Juli 2010
![Page 2: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/2.jpg)
Über JUnit
Kent Beck:A programmer-oriented testingframework for Java.
David Saff:JUnit is the intersection of allpossible useful Java testframeworks, not their union.
Nicht nur für Unit Tests!
1. Juli 2010 2
![Page 3: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/3.jpg)
Warum ein Vortrag über JUnit?
I Jeder kennt JUnit.I Wirklich?I Jeder meint, JUnit zu kennen.I Ich meinte es auch.I Seit Version 4.0 hat sich einiges getan!
1. Juli 2010 3
![Page 4: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/4.jpg)
Neue Features seit Version 4.0
JUnit 4.8.2
Matchers
Theories
Rules
Categories
1. Juli 2010 4
![Page 5: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/5.jpg)
Matchers
René Magritte, Untitled 5
![Page 6: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/6.jpg)
Neue Assertion: assertThat(...)
I Neue Assert-Methoden:
<T> void assertThat(T actual, Matcher<T> matcher)<T> void assertThat(String reason, T actual, Matcher<T> matcher)
I Parameter:reason Zusätzliche Beschreibung für den Fehlerfall (optional)actual Tatsächlicher Wert
matcher Hamcrest-Matcher überprüft tatsächlichen Wert
1. Juli 2010 6
![Page 7: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/7.jpg)
Bessere Lesbarkeit
import static org.hamcrest.CoreMatchers.is;
public class BetterReadability {
@Test public void withoutMatchers() {assertEquals(2, 1 + 1);
}
@Test public void withMatchers() {assertThat(1 + 1, is(2));
}}
I Reihenfolge stimmtI Häufig besser lesbar als herkömmliche Assertions
1. Juli 2010 7
![Page 8: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/8.jpg)
Matcher kombinieren
Matcher lassen sich einfach kombinieren:
assertThat(1 + 1, is(not(3)));assertThat(1 + 1, both(greaterThan(1)).and(lessThan(3)));
1. Juli 2010 8
![Page 9: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/9.jpg)
Aussagekräftige Fehlermeldungen
Herkömmliche Zusicherung ohne Beschreibung
assertFalse(asList(1, 2, 3).contains(2));
Ergebnis:
AssertionError: at de.andrena.junit...
Neue Zusicherung mit Matcher
assertThat(asList(1, 2, 3), not(hasItem(2)));
Ergebnis:
AssertionError:Expected: not a collection containing <2>
got: <[1, 2, 3]>
1. Juli 2010 9
![Page 10: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/10.jpg)
Vordefinierte Matcher
I Vielzahl vordefinierter Matcher:Core is, not, allOf, anyOf, nullValue, . . .
Strings containsString, startsWith, endsWith, . . .Collections hasItem, hasItems, isIn, empty, hasSize, . . .
I Bei JUnit ist nur ein kleiner Teil mit dabei:I org.hamcrest.CoreMatchersI org.junit.matchers.JUnitMatchers
I Hamcrest bietet weitere Matcher (hamcrest-all.jar).I Darüber hinaus lassen sich eigene Matcher definieren.
1. Juli 2010 10
![Page 11: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/11.jpg)
Ein eigener MatcherImplementierung
public class IsEmptyCollection extends TypeSafeMatcher<Collection<?>> {
@Override protected boolean matchesSafely(Collection<?> collection) {return collection.isEmpty();
}
@Override public void describeTo(Description description) {description.appendText("empty");
}
@Factory public static Matcher<Collection<?>> empty() {return new IsEmptyCollection();
}}
1. Juli 2010 11
![Page 12: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/12.jpg)
Ein eigener MatcherBenutzung
public class CollectionMatchersTest {
@Test public void isEmpty() {TreeSet<String> set = new TreeSet<String>();assertThat(set, new IsEmptyCollection()); // direkter AufrufassertThat(set, IsEmptyCollection.empty()); // über @Factory-MethodeassertThat(set, empty()); // mit statischem ImportassertThat(set, is(empty())); // syntactic sugar
}}
1. Juli 2010 12
![Page 13: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/13.jpg)
Viele Matcher – Viele Klassen
ProblemI Vielzahl von Klassen mit zu importierenden statischen MethodenI Manuelle Konfiguration der IDE notwendigI . . . bei allen Entwicklern
LösungGenerierung einer eigenen Matcher-Bibliothek
1. Juli 2010 13
![Page 14: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/14.jpg)
Generierung einer Matcher-Bibliothek1. Konfiguration in XML
<matchers><factory class="org.hamcrest.core.Is"/><factory class="de.andrena.junit.hamcrest.IsEmptyCollection"/>
</matchers>
2. Aufruf von org.hamcrest.generator.config.XmlConfigurator
3. Alle mit @Factory annotierten Methoden werden in einergenerierten Klasse zusammengefasst:public class Matchers {
public static <T> Matcher<? super T> is(T param1) {return org.hamcrest.core.Is.is(param1);
}/* ... */public static Matcher<Collection<?>> empty() {
return de.andrena.junit.hamcrest.IsEmptyCollection.empty();}
}
1. Juli 2010 14
![Page 15: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/15.jpg)
Fazit: Matchers
I Assertions lassen sich oft eleganter formulierenI Manchmal sind die alten Assertion-Methoden klarer
ProblemJavas Typsystem macht einem oft einen Strich durch die Rechnung
I Boxing notwendig bei primitiven Typen
assertThat(1 + 1, is(2))
I Mangelnde Typinferenz
assertThat(new TreeSet<String>(), Matchers.<String>empty());
1. Juli 2010 15
![Page 16: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/16.jpg)
Theories
Wassily Kandinsky, Composition VIII 16
![Page 17: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/17.jpg)
Parametrisierte Tests
I Seit JUnit 4.0 gibt es den Parameterized Test Runner.I Ermöglicht Parametrisierung von Testklassen über KonstruktorI Argumente werden in einer statischen Methode angegeben:
I @Parameters-AnnotationI Rückgabetyp: List<Object[]>
I Für jedes Paar von Testmethode und Argument wird eine Instanzder Testklasse angelegt und die Testmethode ausgeführt.
I Nützlich, wenn Berechnung mit vielen Eingabeparametern getestetwerden soll.
1. Juli 2010 17
![Page 18: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/18.jpg)
Parametrisierte TestsBeispiel: Fibonacci-Zahlen
@RunWith(Parameterized.class)public class FibonacciParameterizedTest {
@Parameters public static List<Object[]> data() {return Arrays.asList(new Object[][] { { 0, 0 }, { 1, 1 }, { 2, 1 },
{ 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 } });}
private final int input, expected;
public FibonacciParameterizedTest(int input, int expected) {this.input = input;this.expected = expected;
}
@Test public void test() {assertEquals(expected, Fibonacci.compute(input));
}}
1. Juli 2010 18
![Page 19: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/19.jpg)
Theories
I Neu seit Version 4.4I Parametrisierte Testmethode mit Vorbedingungen (Assumptions)
I assumeThat()I assumeTrue()I assumeNotNull()
I @Theory statt @TestI Input für Testmethoden über @DataPoint(s)-Annotation
1. Juli 2010 19
![Page 20: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/20.jpg)
TheoriesBeispiel: Fibonacci-Zahlen
import static de.andrena.junit.fibonacci.Fibonacci.compute;
@RunWith(Theories.class)public class FibonacciTheories {
@DataPoints public static int[] VALUES = { 0, 1, 2, 3, 4, 5, 6 };
@Theory public void seeds(int n) { // F (0) = 0, F (1) = 1assumeTrue(n <= 1);assertEquals(n, compute(n));
}
@Theory public void recurrence(int n) { // F (n) = F (n − 1) + F (n − 2) für n > 1assumeTrue(n > 1);assertEquals(compute(n - 1) + compute(n - 2), compute(n));
}}
1. Juli 2010 20
![Page 21: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/21.jpg)
TheoriesBeispiel: Verschiedene @DataPoints
@RunWith(Theories.class)public class DifferentDataPoints {
@DataPoint public static String A = "a";@DataPoint public static String B = "b";@DataPoints public static int[] NUMBERS = { 1, 2, 3 };
@Theory public void theory1(String string, int number) {/* ("a", 1), ("a", 2), ("a", 3), ("b", 1), ("b", 2), ("b", 3) */
}@Theory public void theory2(String string) {
/* ("a"), ("b") */}@Theory public void theory3(int number) {
/* (1), (2), (3) */}
}
1. Juli 2010 21
![Page 22: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/22.jpg)
Parameterized Tests vs. Theories
I Definition von @DataPoints ist flexiblerI Konstanten oder MethodenI Beliebig vieleI Verschiedene Typen
I Parametrisierung der TestmethodenI Kein Boilerplate-Code (Konstruktor + Instanzvariablen)I Verschiedene Parametertypen möglich
I Theories können alles, was Parameterized auch kann, aber mehr!
1. Juli 2010 22
![Page 23: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/23.jpg)
Herkömmliche Tests vs. Theories
I Herkömmliche Tests benutzen Beispiele:I Überprüfung des Verhaltens unter ausgewählten EingabenI Beispiele sind (hoffentlich) charakteristisch
I Eine Theory verallgemeinert eine Menge von Tests:I Vorbedingung wird explizit angegebenI Sollte für alle Eingaben gelten, die Vorbedingungen erfüllen
I Eingabewerte können explizit angegeben werden oder automatischerzeugt werden
1. Juli 2010 23
![Page 24: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/24.jpg)
Rules
René Magritte, Golconda 24
![Page 25: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/25.jpg)
Was ist eine Rule?
Erweiterungsmechanismus für Ablauf der Testmethoden
Beispiele:
I Ausführung eigenen Codes vor bzw. nach jeder TestmethodeI Behandlung fehlgeschlagener TestsI Überprüfung zusätzlicher Kriterien nach einem TestsI . . .
1. Juli 2010 25
![Page 26: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/26.jpg)
Beispiel: TemporaryFolderOhne Benutzung einer Rule
public class TemporaryFolderWithoutRule {private File folder;
@Before public void createTemporaryFolder() throws Exception {folder = File.createTempFile("myFolder", "");folder.delete();folder.mkdir();
}
@Test public void test() throws Exception {File file = new File(folder, "test.txt");file.createNewFile();assertTrue(file.exists());
}
@After public void deleteTemporaryFolder() {recursivelyDelete(folder); // passt nicht mehr auf die Folie...
}
1. Juli 2010 26
![Page 27: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/27.jpg)
Beispiel: TemporaryFolderUnter Verwendung einer Rule
public class TemporaryFolderWithRule {
@Rule public TemporaryFolder folder = new TemporaryFolder();
@Test public void test() throws Exception {File file = folder.newFile("test.txt");assertTrue(file.exists());
}
}
1. Juli 2010 27
![Page 28: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/28.jpg)
Was ist eine Rule?
Erweiterungsmechanismus für Ablauf der Testmethoden
Beispiele:
I Ausführung eigenen Codes vor bzw. nach jeder TestmethodeI Behandlung fehlgeschlagener TestsI Überprüfung zusätzlicher Kriterien nach einem TestsI . . .
1. Juli 2010 28
![Page 29: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/29.jpg)
Beispiel: ExpectedExceptionOhne Benutzung einer Rule
public class ExpectedExceptionWithoutRule {
int[] threeNumbers = { 1, 2, 3 };
@Test(expected = ArrayIndexOutOfBoundsException.class)public void exception() {
threeNumbers[3] = 4;}
@Test public void exceptionWithMessage() {try {
threeNumbers[3] = 4;fail("ArrayIndexOutOfBoundsException expected");
} catch (ArrayIndexOutOfBoundsException expected) {assertEquals("3", expected.getMessage());
}}
}
1. Juli 2010 29
![Page 30: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/30.jpg)
Beispiel: ExpectedExceptionUnter Verwendung einer Rule
public class ExpectedExceptionWithRule {
int[] threeNumbers = { 1, 2, 3 };
@Rule public ExpectedException thrown = ExpectedException.none();
@Test public void exception() {thrown.expect(ArrayIndexOutOfBoundsException.class);threeNumbers[3] = 4;
}
@Test public void exceptionWithMessage() {thrown.expect(ArrayIndexOutOfBoundsException.class);thrown.expectMessage("3");threeNumbers[3] = 4;
}}
1. Juli 2010 30
![Page 31: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/31.jpg)
Weitere vordefinierte Rules
ErrorCollectorSammelt fehlgeschlagene Assertions innerhalb einer Testmethode undgibt am Ende eine Liste der Fehlschläge aus.
TestNameMerkt sich Namen der aktuell ausgeführten Testmethode und stellt ihnauf Anfrage zur Verfügung.
TimeoutWendet gleichen Timeout auf alle Testmethoden einer Klasse an.
1. Juli 2010 31
![Page 32: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/32.jpg)
Schreib deine eigenen Regeln!
1. Juli 2010 32
![Page 33: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/33.jpg)
Eine eigene RegelImplementierung
public class SystemProperty extends ExternalResource {private final String key, value;private String oldValue;public SystemProperty(String key, String value) {
this.key = key;this.value = value;
}@Override protected void before() {
oldValue = System.getProperty(key);System.setProperty(key, value);
}@Override protected void after() {
if (oldValue == null) {System.getProperties().remove(key);
} else {System.setProperty(key, oldValue);
}}
}
1. Juli 2010 33
![Page 34: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/34.jpg)
Eine eigene RegelBenutzung
public class SomeTestUsingSystemProperty {
private static final String VALUE = "someValue";private static final String KEY = "someKey";
@Rule public SystemProperty systemProperty = new SystemProperty(KEY, VALUE);
@Test public void test() {assertThat(System.getProperty(KEY), is(VALUE));
}}
1. Juli 2010 34
![Page 35: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/35.jpg)
Vorteile von Regeln
WiederverwendbarkeitErmöglichen häufig benötigten Code auszulagern.
KombinierbarkeitBeliebig viele Regeln in einem Test verwendbar
Delegation statt VererbungHelfen Testklassenhierarchien zu vermeiden!
ErweiterbarkeitEigene Regeln schreiben ist einfach.
1. Juli 2010 35
![Page 36: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/36.jpg)
Categories
Piet Mondrian, Composition with Gray and Light Brown 36
![Page 37: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/37.jpg)
Tests in Kategorien einteilen
I Kategorie ist Klasse oder Interface:
public interface Slow {}
I Einzelner Test:
@Category(Slow.class)@Testpublic void test() {}
I Alle Tests einer Klasse:
@Category(Slow.class)public class B {
@Testpublic void c() {}
}
1. Juli 2010 37
![Page 38: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/38.jpg)
Tests in bestimmten Kategorien ausführen
I Herkömmliche Test-Suite:
@RunWith(Suite.class)@SuiteClasses( { A.class, B.class })public class AllTests {}
I Alle Tests in der Kategorie Slow:
@RunWith(Categories.class)@IncludeCategory(Slow.class)public class AllSlowTests extends AllTests {}
I Alle anderen Tests:
@RunWith(Categories.class)@ExcludeCategory(Slow.class)public class AllFastTests extends AllTests {}
1. Juli 2010 38
![Page 39: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/39.jpg)
Ausblick
Quint Buchholz, Mann auf einer Leiter 39
![Page 40: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/40.jpg)
Was jetzt?
I Aktualisierung auf neue Version ist einfachI Alte Tests funktionieren weiterhinI Neue Tests profitieren von neuen FeaturesI Alte Tests können nach und nach vereinfacht werdenI Ausprobieren!
1. Juli 2010 40
![Page 41: Bessere Tests mit JUnit 4.x - Java Forum Stuttgartalt.java-forum-stuttgart.de/jfs/2010/folien/E3.pdf · Bessere Tests mit JUnit 4.x - Author: Marc Philipp Created Date: 6/23/2010](https://reader034.vdocuments.site/reader034/viewer/2022042913/5f4c1bcd19339b4ff106969a/html5/thumbnails/41.jpg)
Ausprobieren!
http://www.junit.org/
Vielen Dank!
Mail [email protected] marcphilipp
Blog http://marcphilipp.tumblr.com/
1. Juli 2010 41