it-swarm.com.de

Wie können vorhandene JUnit-Tests in einer anderen Testklasse wiederverwendet werden?

wie kann ich JUnit-Tests in einer anderen Testklasse wiederverwenden?

Zum Beispiel:

public TestClass1 {
    @Test
    public void testSomething(){...}
}

public TestClass2 {
    @Test
    public void testSomethingAndSomethingElse() {
        // Somehow execute testSomething()
        // and then test something else
    }
}
22
tk2000

Wie üblich können Sie:

  1. Erweitert TestClass2 von TestClass1
  2. Zugriff auf TestClass1 von TestClass2 über Delegierung:

Beispiel 1:

// Instantiate TestClass1 inside test method
public TestClass2 {
    public void testSomethingAndSomethingElse1() {
         new TestClass1().testSomething();
    }
}

Beispiel 2

// Instantiate TestClass1 as a member of TestClass2
public TestClass2 {
    private TestClass1 one = new TestClass1();
    public void testSomethingAndSomethingElse1() {
         one.testSomething();
    }
}
7
AlexR

Vermeiden Sie das Szenario im Allgemeinen. Es neigt dazu, Tests viel spröder zu machen. Wenn TestClass1 fehlschlägt, schlägt TestClass2 implizit fehl, was zumindest aus folgenden Gründen nicht wünschenswert ist:

  • Code wird mehrmals getestet, wodurch die Ausführungszeit verschwendet wird.
  • Tests sollten sich nicht aufeinander verlassen, sie sollten so entkoppelt wie möglich sein
  • Wenn dies zu einem Muster wird, wird es schwieriger zu erkennen, welcher Codeabschnitt beschädigt ist, indem untersucht wird, welche Tests fehlschlagen

Das gelegentliche Teilen von Testcode-Abschnitten ist besonders für Integrationstests hilfreich. So können Sie dies tun, ohne von den Tests selbst abhängig zu sein: 

public abstract BaseTests {

    protected void somethingHelper() {
        // Test something
    }
}

public TestClass1 extends BaseTests {
    @Test
    public void testSomething(){
        somethingHelper();
    }
}

public TestClass2 extends BaseTests {
    @Test
    public void testSomethingAndSomethingElse() {
        somethingHelper();
        // and then test something else
    }
}

Alternativ können Sie eine Hilfsklasse verwenden und die Vererbung ganz vermeiden. Asserts und dergleichen können in der somethingHelper()-Methode enthalten sein.

Rufen Sie eine Methode nicht direkt aus TestClass1 in TestClass2 auf. Die Testfälle werden auf diese Weise weniger lesbar und können zu Spaghetti Frittata führen.

32
seanhodges

Logischerweise gibt es keinen Grund, eine Testmethode von einer anderen aufzurufen. Jedes Tool, das einen Test ausführt, würde genauso einfach alle Tests im Paket ausführen. Aber wenn Sie es brauchen, würden Sie es wie jede andere Methode in einer anderen Klasse nennen.

Was Sie am ehesten tun möchten, ist ein gemeinsames Setup für beide Testmethoden. Sie könnten that-Code in eine Utility-Methode in eine allgemeine Klasse einfügen und den allgemeinen Code in beiden Tests aufrufen.

1
Rajesh J Advani

Dies ist üblich, um einen Test mit einer anderen Konfiguration auszuführen. Machen Sie sich keine Sorgen und machen Sie weiter.

Erstellen Sie im ersten Schritt Ihren eigenen Test, ohne die Konfiguration zu berücksichtigen:

public abstract BaseTests {
    @Test
    protected void somethingHelper() {
        // Test something
    }
}

Erweitern Sie dann die Testklasse und fügen Sie eine Konfiguration hinzu:

public TestClass1 extends BaseTests {
    @Before
    public void setup(){
         // TODO: config
    }
}

Es ist keine spezielle Konfiguration erforderlich, aber bei einem konfigurierbaren System ist es üblich (die Hauptfunktionalität des Systems muss für jede Konfiguration gültig sein).

Im anderen Testfall:

public TestClass2 extends BaseTests {
    @Before
    public void setup(){
         // TODO: other config
    }
}

Zum Beispiel kann es einen Ver- und Entschlüsselungsprozess geben, bei dem die Reihenfolge der Verschlüsselung> Entschlüsselung identifiziert werden muss. Andererseits ist ein anderer Algorithmus zu verwenden, während der Testprozess einzigartig ist.

0
مصطفی