JUnit Supplementary Classes

fastjack

Top Contributor
Ich habe zwei Codestücke gesehen. Beim ersten habe eine Testklasse und eine Testobjektfactory:

Java:
class PersonTest {
    private Person person = PersonTestFactory.create();
    private Person personWithNoCity = PersonTestFactory.withNoCity();
    @Test
    public void shouldHaveExpectedName() {
        assertEquals("bundy", this.person.getName());
    }
    @Test
    public void shouldHaveNoCity() {
        assertEquals("", this.person.getCity());
    }
    ...
}

class PersonTestFactory {
    static Person create() {
        Person person = new Person();
        person.setName("bundy");
        person.setFirstName("al");
        person.setCity("Entenhausen");
        return person;
    }
    static Person withNoCity() {
        Person person = create();
        person.setCity("");
        return person;
    }
}

Bei diesem Code werden feste Testobjekte durch TestFactories erzeugt. Die Testobjekte können wiederverwendet werden und haben dann immer den gleichen Namen, Vornamen usw. Ich habe wenig Änderungsaufwand, wenn zur Person noch ein Feld dazu kommt bzw. ändert, da die Objekterzeugung an einer zentralen Stelle ist.

Das zweite Codestück wäre z.B.:
Java:
class PersonTest {
    @Test
    public void shouldHaveExpectedName() {
        Person person = new Person();
        person.setName("bundy");
        assertEquals("bundy", person.getName());
    }
    @Test
    public void shouldHaveNoCity() {
        Person person = new Person();
        person.setName("bundy");
        person.setCity("");
        assertEquals("", person.getCity());
    }
    ...
}
Testobjekte werden in den Tests erzeugt, können immer anders aussehen. Hier kann schnell die übersicht flöten gehen, Personen können in anderen Test komplett anders aussehen usw.

Ich bin geteilter Meinung. Was haltet ihr davon? Wo seht Ihr Vorteile und Nachteile?
 
Zuletzt bearbeitet:

DerEisteeTrinker

Bekanntes Mitglied
Sowas kannst du nur bedingt pauschalisieren. Im Grunde sind wir Programmierer ja ein faules Volk. Sprich wir vereinfachen wo es nur geht. Grundsätzlich ist es eine Sache, die ich auch persönlich für Tests einsetze und sehr zu schätzen gelernt habe. Nur muss man von Fall zu Fall abschätzen, ob sich der Aufwand für die Factory lohnt, wenn du eh nur 2 oder 3 mal die Factory benutzen musst im Test.
 
M

maki

Gast
Bei diesem Code werden feste Testobjekte durch TestFactories erzeugt.
Da ist schon mal sehr gut, wie du selebr sagst musst du nur an zentralen Stellen ändern, wichtig wenn man viele Tests hat, wie zB. bei TDD oder hoher Testabdeckung. Allerdings sehe ich da ein paar Problem beim Test selber:
Java:
    @Test
    public void shouldHaveExpectedName() {
        assertEquals("bundy", this.person.getName());
    }
"bundy" ist ja wohl sehr magisch und dadurch veschleiernd, den test vesteht man so nicht, aber "bundy" ist auch noch redundant.

Es gibt grundsätzlich 2 Arten von Testobjekten (mal von mocks/Stubs/Fakes agesheen):
Solche, bei denen man die Werte kennt, und solche bei denen man die Werte nicht kennt (Anonym).

Da lohnen sich grundsätzlich 2 Arten von Test Objekt Factories: Solche, denen man Werte mitgibt, und solche, die anonyme Testdaten nutzen.
Leider mischt dein 1. Test beide Arten, es wird zwar etwas anonymes erzeugt, aber dann auf einen bestimmten Wert geprüft.
Geprüft wird übrigens da nur die Factory, sonst nix ;)

Übrigens, CustomAsserts sind eine gute Sache, einmal um redundanz zu vermeiden, dann noch um Klarheit zu schaffen, falls du öfters auf den namen prüfst, wäre ein [c]assertPersonNameEquals(String expected, Person actual)[/c] nicht verkehrt.

Lesetipp: XUnit Test Patterns : Refactoring Test Code
 

fastjack

Top Contributor
Geprüft wird übrigens da nur die Factory

Darum war ich geteilter Meinung. Wenn dort bei den Settern etwas schief läuft, wird es vielleicht schwer die richtige Stelle zu finden... Wie kann man das anders machen? Was meinst Du mit anonymen Testdaten?
 
M

maki

Gast
Die factories Testen ist sicherlich keine schlechte Idee, dachte zuerst es sollte etwas echtes getestet werden ;)

Was meinst Du mit anonymen Testdaten?
Damit meine ich testdaten die für den test irrelevant sind und daher "anonym" sein können, sie mit in den Test aufzunehmen bringt keine zus. Abddeckung oder sonstige Vorteile, da wird nur der eigentliche Test komplizierter und dadurch mehr verschleiert als nötig.

Stell dir vor du möchtest die City Logik testen(wenn es denn eine gäbe), da ist der Name der Person doch egal, oder? ;)
Wenn du beim erzeugen der Person immer den Namen mitangibst, könntest du auch "blablubb" angeben und es wäre egal, der Leser des Tests allerdings wundert sich.
Nimmst du eine Variable/Konstante die nur heisst [c]anonymousName[/c], [c]randomName[/c], oder gleich FactoryMethoden wie [c]createPersonWithCityAndRadomName[/c] (übertrieben) weiss der Leser eher worauf er achten muss.
Es gibt auch Frameworks die einem zufällige TEstdaten erzeugen: Generate Test Data with DataFactory | Javalobby
Sind natürlich nur dann geeignet wenn die Daten auch nicht abgeprüft werden, also anonym sind.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Zrebna Wieso sind eigentlich JUnit-Tests in src/test/java platziert - nur Konvention? Allgemeine Java-Themen 7
harrytut Java Input/Output Tests Junit Allgemeine Java-Themen 3
B Junit Test Allgemeine Java-Themen 8
J Junit surefire: enrich test information Allgemeine Java-Themen 0
J Junit start surefire for manual testing Allgemeine Java-Themen 1
P No JUnit tests found Allgemeine Java-Themen 5
F Junit Test + Cucumber - JSON auslesen und in einem weiteren Schritt nutzen Allgemeine Java-Themen 0
J JUnit - Auslassen von Code Allgemeine Java-Themen 25
S Zugriff auf jUnit Test Suite Runner-Instanzen innerhalb von Test Classes Allgemeine Java-Themen 7
S Eclipse Probleme beim Implementieren / Ausführen von jUnit 5-Test Suites Allgemeine Java-Themen 14
S Parametrisierte jUnit 5-Tests mit eigenen Datentypen/Klassen-Objekten als Test-Parameter Allgemeine Java-Themen 0
K Input/Output JUnit: Log Inhalte, falsche Assertion Allgemeine Java-Themen 2
H OOP Testen einer Exception mit JUnit Allgemeine Java-Themen 8
AssELAss Junit-Tests für SQL-Veribindung sowie SQL-Queries? Allgemeine Java-Themen 3
O Maven - JUnit - H2 Allgemeine Java-Themen 1
M Selenium JUnit Tests (Auswahl von Testmethoden auswerten) Allgemeine Java-Themen 5
C JUNIT - ANT - build.xml Allgemeine Java-Themen 0
Airwolf89 JUnit: Vorschläge/ Best Practice Allgemeine Java-Themen 7
M JUnit Serverseitig? Wie geht sowas? Allgemeine Java-Themen 2
E JUnit wie Testergebnisse pro Test ("Test Report") erhalten? Allgemeine Java-Themen 1
B JUnit Zufalls Operation testen Allgemeine Java-Themen 1
P JUnit Allgemeine Java-Themen 2
B jUnit 4: Wie protokolliert man Testergebnisse? Allgemeine Java-Themen 1
H JUnit Fehler beim Compilieren - erledigt Allgemeine Java-Themen 0
M JUnit Test Suites Allgemeine Java-Themen 2
L JUnit - automatisiertes vs. manuelles Testen? Allgemeine Java-Themen 6
B Hilfe bei JUnit Test Allgemeine Java-Themen 1
M JUnit & Multithreading - sehr seltener Fehler Allgemeine Java-Themen 3
A JUnit/Hashcode Problem Allgemeine Java-Themen 5
X Problem mit URLClassLoader und JUnit Allgemeine Java-Themen 3
N JUnit Allgemeine Java-Themen 13
M Junit Tests durchführen Allgemeine Java-Themen 18
M JVM Probleme JUnit Allgemeine Java-Themen 2
G NUnit Features in JUnit Allgemeine Java-Themen 2
darekkay (JUnit) Testdaten generieren - Framework? Allgemeine Java-Themen 2
A JUnit problem Allgemeine Java-Themen 9
T Organisation von Junit Testfällen? Allgemeine Java-Themen 2
M JUnit Tests vs. DBUnit Tests Allgemeine Java-Themen 3
P Klassen Junit test funktioniert nicht... Allgemeine Java-Themen 11
S Die Zeile die JUnit gerade ausführt lesen Allgemeine Java-Themen 15
aze JUnit: Testen ob bestimmte Exception nicht auftritt Allgemeine Java-Themen 18
U Fehler: Hauptklasse org.junit.runner.JUnitCore konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 2
G JUnit Test Methoden in anderen Thread verlagern Allgemeine Java-Themen 4
J JUnit-Tests Zeichensatzproblem ? Allgemeine Java-Themen 2
J JUnit, TestCase vs "einfacher" Test Allgemeine Java-Themen 3
S [JUnit] Name von TestCase bekommen Allgemeine Java-Themen 4
1 JUnit Test Suit Allgemeine Java-Themen 2
T Junit-Tests in Java Klasse ausführen Allgemeine Java-Themen 26
J JUnit - werfen von Exceptions testen Allgemeine Java-Themen 17
M JUnit TestSuite erstellen Allgemeine Java-Themen 2
B JUnit und mehrere Instanzen der selben Applikation Allgemeine Java-Themen 4
G Testcases mit Junit auf private-Methode Allgemeine Java-Themen 7
G Input/Output System.in "umbiegen" für junit-Test Allgemeine Java-Themen 4
C JUnit und das Zulassen von RuntimeExceptions Allgemeine Java-Themen 5
ruutaiokwu junit mit annotations geht nicht? Allgemeine Java-Themen 5
T JUnit-Log auslesen Allgemeine Java-Themen 13
C JUnit Tests Allgemeine Java-Themen 4
O Junit Reports / Logs als XML ohne Maven/Ant Allgemeine Java-Themen 7
M Junit und Mocks Allgemeine Java-Themen 5
fastjack jUnit und Test von equals, hashCode, toString Allgemeine Java-Themen 11
D junit - frage zu fixtures/test suites Allgemeine Java-Themen 11
A Seltsames Verhalten von JUnit-Tests im Zusammenspiel mit Ant Allgemeine Java-Themen 6
S JUnit: Erzeugen einer IOException Allgemeine Java-Themen 9
G JUnit Tests Allgemeine Java-Themen 7
G JUnit Test Allgemeine Java-Themen 5
S JUnit - was mocken, was nicht? Allgemeine Java-Themen 3
S JUnit TesSuite und @Repeat Allgemeine Java-Themen 2
S JUnit Tests für GUI / Oberflächen Allgemeine Java-Themen 2
M Junit und Mocks bei JDBC Daos Allgemeine Java-Themen 8
M JUnit Problem mit AssertionFailedError Allgemeine Java-Themen 2
B Testfälle mit JUnit Allgemeine Java-Themen 4
S JUnit Allgemeine Java-Themen 15
N ClassNotFound Exception bei JUnit Test? Allgemeine Java-Themen 2
G ANT Tutorial . Schritte bzgl. Junit Bibliothek Allgemeine Java-Themen 4
A JUnit Reports zu groß für XSLT Allgemeine Java-Themen 4
M JUnit und dynamische Tests Allgemeine Java-Themen 11
P JUnit unter Eclipse: Problem mit Exception Allgemeine Java-Themen 8
GilbertGrape Warum schlägt JUnit-Test fehl? Allgemeine Java-Themen 19
K Bekomme JUnit TEst nicht zum laufen :( Allgemeine Java-Themen 9
K Junit: Frage zum Ablauf Allgemeine Java-Themen 3
K JUnit: Tests über ant aufrufen Allgemeine Java-Themen 2
S JUnit und EasyMock Allgemeine Java-Themen 7
B Wie alt ist JUnit? Allgemeine Java-Themen 2
A Junit Exceptions testen Allgemeine Java-Themen 3
P Testen mit JUnit Allgemeine Java-Themen 8
7 JUnit: Testproblem. Allgemeine Java-Themen 23
G Ant + JUnit Allgemeine Java-Themen 2
F JUnit unter Ant Allgemeine Java-Themen 3
S Integer zu int konvertieren - JUnit Allgemeine Java-Themen 12
G testen mit JUnit? Allgemeine Java-Themen 3
K JUnit 4 User Interaktion Allgemeine Java-Themen 7
M Ant + Junit + Testclass in Jar Allgemeine Java-Themen 3
G Junit 4 - TestSuite Allgemeine Java-Themen 6
B JUnit Allgemeine Java-Themen 2
T CheckStyle, JUnit und FindBugs aus Java-Programm starten Allgemeine Java-Themen 2
S JUnit will ins Netz! Allgemeine Java-Themen 2
B JUnit - Gleichen Test x-mal durchlaufen Allgemeine Java-Themen 2
F Hilfe: Adjazenzmatrix mittels JUnit testen. Allgemeine Java-Themen 2
H JUnit Allgemeine Java-Themen 5
N Problem mit Ant und JUnit Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben