Führen Sie Tests in JUnit 4 bedingt aus oder ignorieren Sie sie

1. Übersicht

Stellen wir uns vor, wir haben einen Test für Code, der vom Betriebssystem abhängt und nur ausgeführt werden sollte, wenn unser Testcomputer unter Linux ausgeführt wird. Wenn es auf einem anderen Betriebssystem ausgeführt wird, soll der Test nicht fehlschlagen, sondern zur Laufzeit ignoriert werden.

Ein erster Ansatz könnte mit ein paar sein , wenn Anweisungen für diesen Zustand mit zu überprüfen , System - Eigenschaften - Klasse. Das funktioniert natürlich, aber JUnit hat eine sauberere und elegantere Methode.

In diesem kurzen Tutorial werden wir uns ansehen, wie wir Tests in JUnit 4 mithilfe der Assume- Klasse bedingt ausführen oder ignorieren können .

2. Die Klasse annehmen

Diese Klasse bietet eine Reihe von Methoden zur Unterstützung der bedingten Testausführung unter bestimmten Bedingungen . Unser Test wird nur ausgeführt, wenn alle diese Bedingungen erfüllt sind. Wenn nicht, überspringt JUnit einfach seine Ausführung und markiert es als im Testbericht bestanden . Letzteres ist der Hauptunterschied zur Assert- Klasse, bei der eine fehlerhafte Bedingung dazu führt, dass der Test als fehlgeschlagen endet .

Es ist wichtig zu beachten, dass das Verhalten , das wir für die Assume- Klasse beschrieben haben, ausschließlich für den Standard-JUnit-Runner gilt . Bei benutzerdefinierten Läufern können die Dinge anders sein.

Schließlich können wir auf die gleiche Weise wie bei Assert die Assume- Methoden entweder in den mit @Before oder @BeforeClass annotierten Methoden oder in der @ Test- Methode selbst aufrufen .

Lassen Sie uns nun die nützlichsten Methoden der Assume- Klasse anhand einiger Beispiele durchgehen . Nehmen wir für alle folgenden Beispiele an, dass getOsName () Linux zurückgibt .

2.1. Mit acceptThat

Die Methode acceptThat () überprüft, ob der Status - in diesem Fall getOsName () - die Bedingungen des übergebenen Matchers erfüllt:

@Test public void whenAssumeThatAndOSIsLinux_thenRunTest() { assumeThat(getOsName(), is("Linux")); assertEquals("run", "RUN".toLowerCase()); }

In diesem Beispiel haben wir überprüft, ob getOsName () gleich Linux ist . Wenn getOsName () Linux zurückgibt , wird der Test ausgeführt . Beachten Sie, dass wir hier die Hamcrest-Matcher-Methode (T) als Matcher verwenden.

2.2. Verwenden von acceptTrue

In ähnlicher Weise können wir die Methode acceptTrue () verwenden, um einen booleschen Ausdruck anzugeben, der als wahr ausgewertet werden muss , damit der Test ausgeführt werden kann. Wenn es als falsch ausgewertet wird, wird der Test ignoriert:

private boolean isExpectedOS(String osName) { return "Linux".equals(osName); } @Test public void whenAssumeTrueAndOSIsLinux_thenRunTest() { assumeTrue(isExpectedOS(getOsName())); assertEquals("run", "RUN".toLowerCase()); } 

In diesem Fall isExpectedOs () gibt wahr . Daher sind die Bedingungen für die Ausführung des Tests erfüllt, und der Test wird ausgeführt .

2.3. Mit acceptFalse

Schließlich können wir die entgegengesetzte Methode acceptFalse () verwenden, um einen booleschen Ausdruck anzugeben, der als falsch ausgewertet werden muss , damit der Test ausgeführt werden kann. Wenn es als wahr ausgewertet wird, wird der Test ignoriert:

@Test public void whenAssumeFalseAndOSIsLinux_thenIgnore() { assumeFalse(isExpectedOS(getOsName())); assertEquals("run", "RUN".toLowerCase()); }

In diesem Fall wurden die Bedingungen für die Ausführung des Tests nicht erfüllt , da isExpectedOs () ebenfalls true zurückgibt , und der Test wird ignoriert .

2.4. Verwenden von acceptNotNull

Wenn wir einen Test ignorieren möchten, wenn ein Ausdruck null ist, können wir die Methode acceptNotNull () verwenden:

@Test public void whenAssumeNotNullAndNotNullOSVersion_thenRun() { assumeNotNull(getOsName()); assertEquals("run", "RUN".toLowerCase()); }

Da getOsName () einen Wert ungleich Null zurückgibt , ist die Bedingung für die Ausführung des Tests erfüllt und der Test wird ausgeführt.

2.5. Verwenden von acceptNoException

Schließlich möchten wir möglicherweise einen Test ignorieren, wenn eine Ausnahme ausgelöst wird. Zu diesem Zweck können wir acceptNoException () verwenden:

@Test public void whenAssumeNoExceptionAndExceptionThrown_thenIgnore() { assertEquals("everything ok", "EVERYTHING OK".toLowerCase()); String t=null; try { t.charAt(0); } catch(NullPointerException npe){ assumeNoException(npe); } assertEquals("run", "RUN".toLowerCase()); }

In diesem Beispiel, wie t ist null, eine Nullpointer wird Ausnahme ausgelöst, also die Bedingungen für die Ausführung des Test nicht erfüllt wurde, und der Test wird ignoriert .

3. Wo sollen wir den takeXXX- Anruf platzieren?

Es ist wichtig zu beachten, dass das Verhalten der AnnahmenXXX- Methoden davon abhängt, wo wir sie in unseren Tests einsetzen .

Lassen Sie uns unser Annahme- Beispiel leicht ändern, damit der Aufruf von assertEquals () an erster Stelle steht. Lassen Sie auch die assertEquals () fehlschlagen:

@Test public void whenAssumeFalseAndOSIsLinux_thenIgnore() { assertEquals("run", "RUN"); assumeFalse(isExpectedOS(getOsName())); } 

Wenn wir dieses Beispiel ausführen, haben wir:

org.junit.ComparisonFailure: Expected :run Actual :RUN

In diesem Fall wird unser Test nicht ignoriert, da er fehlgeschlagen ist, bevor wir den Aufruf von acceptThat () erreicht haben . Das gleiche passiert mit allen Methoden von acceptXXX . Wir müssen also sicherstellen, dass wir sie innerhalb unserer Testmethode an der richtigen Stelle platzieren .

4. Fazit

In diesem kurzen Tutorial haben wir gesehen, wie wir mithilfe der Assume- Klasse in JUnit 4 unter bestimmten Bedingungen entscheiden können, ob ein Test ausgeführt werden soll oder nicht. Wenn wir JUnit 5 verwenden, ist dieser auch in Version 5.4 oder höher verfügbar .

Wie immer finden Sie den Quellcode der Beispiele, die wir durchlaufen haben, auf GitHub.