web-dev-qa-db-ger.com

Bereinigung nach allen Junit-Tests

In meinem Projekt muss ich vor allen Tests einige Repository-Einstellungen vornehmen. Dies geschieht mit einigen kniffligen statischen Regeln. Ich habe jedoch keine Ahnung, wie ich nach all den Tests aufräumen soll. Ich möchte nicht eine magische statische Nummer behalten, die sich auf die Anzahl aller Testmethoden bezieht, die ich ständig beibehalten sollte. 

Die beliebteste Methode ist das Hinzufügen eines Listeners, der nach allen Tests aufgerufen wird. Gibt es schon eine Schnittstelle in JUnit4?


edit: das hat nichts mit @BeforeClass und @AfterClass zu tun, weil ich wissen muss, ob die mit @AfterClass annotierte Methode zum letzten Mal aufgerufen wird.

37

Ich verwende JUnit 4.9. Wird das helfen ?: 

import junit.framework.TestCase;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses({First.class,Second.class,Third.class})
public class RunTestSuite extends TestCase {
    @BeforeClass
    public static void doYourOneTimeSetup() {
        ...
    }

    @AfterClass
    public static void doYourOneTimeTeardown() {
        ...
    }    
}

Edit: Ich bin ziemlich positiv (sofern ich Sie nicht falsch verstanden habe), dass meine Lösung genau das ist, was Sie suchen. eine Abreißmethode, nachdem alle Tests ausgeführt wurden. Kein Listener erforderlich, JUnit verfügt über diese Funktion. Vielen Dank.

38
HellishHeat

Ich empfehle die Verwendung von org.junit.runner.notification.RunListener , Beispiel:

public class TestListener extends RunListener {
  @Override
  public void testRunStarted(Description description) throws Exception {
     // Called before any tests have been run.
  }
  @Override
  public void testRunFinished(Result result) throws Exception {
     // Called when all tests have finished
  }
}

Weitere Informationen finden Sie direkt in JUnit Java doc . Sie können dies auch mit Maven Surefire (Unit-Tests) oder fehlersicherem Plugin (Integrationstests) verwenden, indem Sie folgenden Code in die Plugin-Konfiguration einfügen:

<properties>
  <property>
    <name>listener</name>
    <value>com.innovatrics.afismq.it.TestListener</value>
  </property>
</properties>
39
Juraj Michalak

Bin gerade auf das gleiche Problem gestoßen.
Meine Lösung:

  • Für ein globales Setup: Verwenden Sie (Lazy) Singleton, um auf etwas Globales zuzugreifen, das vor den Tests eine Instantiierung erfordert. Der erste Test, der auf diesen Singleton zugreift, löst den globalen Einrichtungsprozess aus.
  • Für einen globalen Abriss: Benutze einen Java shutdown hook:
    Runtime.getRuntime().addShutdownHook(new Thread(() -> do_your_global_cleanup())));
10
Alexander

Sie müssen keine Suite verwenden, fügen Sie einfach @BeforeClass und @AfterClass als statisch hinzu

public class Tests {

    @BeforeClass
    public static void doYourOneTimeSetup()
    {
        ...
    }

    @AfterClass
    public static void doYourOneTimeTeardown() {
        ...
    }    

    @Test
    public void testYourTestcase()
    {
        ...
    }
}
0
serup

Sie können jederzeit Ihren benutzerdefinierten TestRunner schreiben. Bevor Sie dies tun, müssen Sie jedoch die Notwendigkeit für dasselbe beurteilen. Es ist besser, @BeforeClass und @AfterClass zu verwenden. Ein anderes Beispiel, auf das ich verweisen kann, ist die Art und Weise, in der der Ruhezustand Benutzern ermöglicht, Komponententests mit 'import.sql' durchzuführen.

0
questzen