Organisation von Junit Testfällen?

T

Testdrifen

Gast
Hi,

ich bin neuerdings dabei Unit-Tests zu schreiben und bin noch etwas unsicher wie so eine unit-test klasse aussehen sollte.
Ich hab in der regel mehrere komponenten die ich im vorfeld zusammenbauen muss, damit eine Komponente funktioniert.
Wenn ich jetzt mehrere Dinge in einer Testklasse testen lassen will, muss ich ggf. die Dinge die ich in der setUp methode eingerichtet habe umändern. Mittelfristig führt das zu einem heiden Chaos und keiner blickt mehr durch, welche der dutzenden hilfsmethoden jetzt für welchen testfall zuständig ist.
Dinge wie Mockito haben das schon stark entschärft, aber das generelle Problem bzw. mein Eindruck dass das sehr chaotisch ist bleibt.
Wie macht ihr das? Jedes Feature einer Klasse ist eine eigene Testfallklasse, wenn die setUp Bedinungen nicht gleich sind? Oder wie organisiert ihr eure Testfälle?
 
B

...ButAlive

Gast
Ich hab in der regel mehrere komponenten die ich im vorfeld zusammenbauen muss, damit eine Komponente funktioniert.

Damit hast du keine Unittests mehr, sondern Integrationstests.

Wenn ich jetzt mehrere Dinge in einer Testklasse testen lassen will, muss ich ggf. die Dinge die ich in der setUp methode eingerichtet habe umändern. Mittelfristig führt das zu einem heiden Chaos und keiner blickt mehr durch, welche der dutzenden hilfsmethoden jetzt für welchen testfall zuständig ist.
Dinge wie Mockito haben das schon stark entschärft, aber das generelle Problem bzw. mein Eindruck dass das sehr chaotisch ist bleibt.

Meiner Meinung nach, ist der Aufwand den man betreiben muss, um Tests zu schreiben, ein gutes Maß für Code Qualität. Je geringer der Aufwand ist, desto besser ist der Code.

Das was du beschreibst klingt für mich so: Du hast eine Klasse A dieses hängt von Klasse B ab, Klasse B hängt wiederum von Klasse C ab. Je nach dem welchen Zustand jetzt Klasse C hat, mach Klasse B irgendetwas, davon hängt nun das Verhalten von Klasse A ab. Dadurch hat A eine Abhängigkeit auf C. Bei dir wird das wahrscheinlich noch ein paar Ebenen weiter gehen.

Wenn jetzt B ein Interface wäre, könntest du dir den ganzen Rattenschwanz den B als Klasse mitbringt sparen, und für deinen Test eine Mock-Implementierung vom Interface B schreiben, diese könntest du dann so schreiben dass du ganz einfach alle Pfade der Klasse A abdecken kannst. Zum Beispiel so:

Java:
public class A{
    private B b;
    
    public A(B b){
         this.b = b;
    }

   public int foo(){
       if(b.bar())
          return 1;
       else
           return 0;
   }
}

Java:
public interface B{  
   boolean bar();
}

Java:
public class RealB implements B{
   
   public boolean bar(){
          //Irgendetwas total kompliziertes, das noch von anderen Sachen abhängt, und am Ende entweder true oder false zurück gibt 
   }
}

Java:
public class BTestImpl implements B{
   private boolean bar;

   public BTestImpl(boolean bar){
      this.bar = bar;
   }

   public boolean bar(){
       return bar;
   }
}

Java:
public class ATest{
  
   @Test
   public void testFoo(){
       B b = new BTestImpl(true);
       A a = new A(b);
       assertEquals(1, a.foo());

       b = new BTestImpl(false);
       a = new A(b);
       assertEquals(0,a.foo());
   }
}

Unittest heißt, dass man genau eine Unit testet. Mit einer Unit ist in der Regel eine Komponente gemeint. Die "Kunst" ist eine Komponente so zu isolieren, dass man diese einzeln testen kann. Wenn man so weit ist, dann stellt sich deine Frage gar nicht. Daher schreibt man übrigens auch besseren Code, wenn man Test-Driven arbeitet, da man sich die Gedanken, wie man den Code aufteilt, schon vorher macht.

Wenn das Kind schon in den Brunnen gefallen ist, muss man solche Tests schreiben, wie du sie beschreibst. Diese Tests sind aber ein super Mittel um deinen Code zu refactoren. Damit kannst du sicherstellen, dass dein Code nach dem Refactoring noch genau so funktioniert wie davor. Wenn du damit fertig bist, sind sowohl die Tests als auch der Code, besser.
 
J

jGendre

Gast
Hi,

danke für die Antwort. Ich stehe noch sehr am Anfang von dem was ich machen will, deswegen ist es noch nicht zu spät :)

Hier mal eine Test für eine Filterklasse die Sätze rausfiltern soll in denen gewissen Wörter auftauchen. Die Klasse kann ich nicht testen ohne Sätze bestehend aus token bereitzustellen. Benutzt hab ich dafür hier Mockito - ist das jetzt noch ein unit-test oder schon ein integrationstest? Anders gefragt, wenn ich das filtern als unit-test testen wollte, wie müsste das grob aussehen?

Java:
import java.util.LinkedList;
import java.util.List;

import org.junit.Before;
import org.junit.Test;

import static org.junit.Assert.*;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

public class TestFIBQFilter {

    List<FilterRule> rules;
    private LinkedList<Sentence> sentences;

    @Test
    public void getFilteredSentences() {
        Filter filter = new Filter(rules.toArray(new FilterRule[0]));
        List<Sentence> filtered = filter.applyFilters(sentences);
        assertEquals(1, filtered.size());
        assertEquals(6, filtered.get(0).getTokens().size());
    }

    @Before
    public void setUp() {
        initSentence();
        initFilterRules();
    }

    private void initSentence() {
        List<Token> tokens = initTokens();
        Sentence sentence = mock(Sentence.class);
        when(sentence.getTokens()).thenReturn(tokens);
        sentences = new LinkedList<Sentence>();
        sentences.add(sentence);
    }

    private List<Token> initTokens() {
        Token token1 = mock(Token.class);
        when(token1.getForm()).thenReturn("How");
        Token token2 = mock(Token.class);
        when(token2.getForm()).thenReturn("are");
        Token token3 = mock(Token.class);
        when(token3.getForm()).thenReturn("you");
        Token token4 = mock(Token.class);
        when(token4.getForm()).thenReturn("feeling");
        Token token5 = mock(Token.class);
        when(token5.getForm()).thenReturn("today");
        Token token6 = mock(Token.class);
        when(token6.getForm()).thenReturn("?");
        List<Token> tokens = new LinkedList<Token>();
        tokens.add(token1);
        tokens.add(token2);
        tokens.add(token3);
        tokens.add(token4);
        tokens.add(token5);
        tokens.add(token6);
        return tokens;
    }

    private void initFilterRules() {
        FilterRule rule = mock(FilterRule.class);
        rules = new LinkedList<FilterRule>();
        rules.add(rule);
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Organisation von Threads Allgemeine Java-Themen 4
padde479 Organisation von Quellcode Allgemeine Java-Themen 6
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
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
fastjack JUnit Supplementary Classes 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

Ähnliche Java Themen

Neue Themen


Oben