Testen mit JGoTesting

Testen mit JGoTesting

1. Überblick

JGoTesting ist einJUnit-compatible testing framework inspired by Go’s testing package.

In diesem Artikel werden die wichtigsten Funktionen des JGoTesting-Frameworks erläutert und Beispiele implementiert, um seine Funktionen zu demonstrieren.

2. Maven-Abhängigkeit

Fügen wir zunächst die Abhängigkeit vonjgotestingzu unserenpom.xmlhinzu:


    org.jgotesting
    jgotesting
    0.12

Die neueste Version dieses Artefakts befindet sich inhere.

3. Einführung

Mit JGoTesting können wir Tests schreiben, die mit JUnit kompatibel sind. For every assertion method JGoTesting provides, there is one in JUnit with the same signature, daher ist die Implementierung dieser Bibliothek sehr einfach.

unlike JUnit, when an assertion fails, JGoTesting doesn’t stop the execution of the test. Stattdessen wird der Fehler alsevent aufgezeichnet und uns nur angezeigt, wenn alle Zusicherungen ausgeführt wurden.

4. JGoTesting in Aktion

In diesem Abschnitt sehen Sie Beispiele für die Einrichtung von JGoTesting und für die Erkundung seiner Möglichkeiten.

4.1. Anfangen

Um unsere Tests zu schreiben, importieren wir zunächst die Assertionsmethoden von JGoTesting:

import static org.jgotesting.Assert.*; // same methods as JUnit
import static org.jgotesting.Check.*; // aliases starting with "check"
import static org.jgotesting.Testing.*;

Die Bibliothek benötigt eine obligatorischeJGoTestRule-Instanz, die mit der Annotation@Rulegekennzeichnet ist. Dies bedeutet, dass alle Tests in der Klasse von JGoTesting verwaltet werden.

Erstellen wir eine Klasse, die eine solche Regel deklariert:

public class JGoTestingUnitTest {

    @Rule
    public final JGoTestRule test = new JGoTestRule();

    //...
}

4.2. Tests schreiben

JGoTesting bietet zwei Assertionsmethoden zum Schreiben unserer Tests. Die Namen der Methoden im ersten Satz beginnen mitassert und sind mit JUnit kompatibel, die anderen beginnen mitcheck.

Beide Methodensätze verhalten sich gleich, und die Bibliothek stellt eine Eins-zu-Eins-Entsprechung zwischen ihnen bereit.

Hier ist ein Beispiel, um mit beiden Versionen zu testen, ob eine Zahl einer anderen entspricht:

@Test
public void whenComparingIntegers_thenEqual() {
    int anInt = 10;

    assertEquals(anInt, 10);
    checkEquals(anInt, 10);
}

Der Rest der API ist selbsterklärend, daher werden wir nicht weiter auf Details eingehen. Bei allen folgenden Beispielen konzentrieren wir uns nur auf diecheck-Version der Methoden.

4.3. Fehlerereignisse und Meldungen

Wenn eine Prüfung fehlschlägt, zeichnet JGoTesting den Fehler auf, damit der Testfall weiter ausgeführt werden kann. After the test ends, the failures are reported.

Hier ist ein Beispiel, um zu zeigen, wie dies aussieht:

@Test
public void whenComparingStrings_thenMultipleFailingAssertions() {
    String aString = "The test string";
    String anotherString = "The test String";

    checkEquals("Strings are not equal!", aString, equalTo(anotherString));
    checkTrue("String is longer than one character", aString.length() == 1);
    checkTrue("A failing message", aString.length() == 2);
}

Nach dem Ausführen des Tests erhalten wir die folgende Ausgabe:

org.junit.ComparisonFailure: Strings are not equal!
  expected:<[the test s]tring> but was:<[The Test S]tring>
// ...
java.lang.AssertionError: String is longer than one character
// ...
java.lang.AssertionError: Strings are not the same
  expected the same: was not:

Neben der Übergabe der Fehlermeldungen in jeder Methode können wir sie auch so protokollieren, dass sie nur angezeigt werden, wenn ein Test mindestens einen Fehler aufweist.

Schreiben wir eine Testmethode, die dies in die Praxis umsetzt:

@Test
public void whenComparingNumbers_thenLoggedMessage() {
    log("There was something wrong when comparing numbers");

    int anInt = 10;
    int anotherInt = 10;

    checkEquals(anInt, 10);
    checkTrue("First number should be bigger", 10 > anotherInt);
    checkSame(anInt, anotherInt);
}

Nach der Testausführung erhalten wir folgende Ausgabe:

org.jgotesting.events.LogMessage: There was something wrong
  when comparing numbers
// ...
java.lang.AssertionError: First number should be bigger

Beachten Sie, dass zusätzlich zulogf(), das Nachrichten als MethodeString.format() formatieren kann,_ we can also use the _logIf() undlogUnless() Methoden zum Protokollieren von Nachrichten basierend auf einem bedingten Ausdruck.

4.4. Tests unterbrechen

JGoTesting bietet verschiedene Möglichkeiten, um Testfälle zu beenden, wenn sie eine bestimmte Voraussetzung nicht erfüllen.

Hier ist ein Beispiel für eintest that ends prematurely, da eine erforderliche Datei nicht vorhanden ist:

@Test
public void givenFile_whenDoesnotExists_thenTerminated() throws Exception {
    File aFile = new File("a_dummy_file.txt");

    terminateIf(aFile.exists(), is(false));

    // this doesn't get executed
    checkEquals(aFile.getName(), "a_dummy_file.txt");
}

Beachten Sie, dass wir auch die Methodenterminate() undterminateUnless() verwenden können, um die Testausführung zu unterbrechen.

4.5. Verkettung

Die KlasseJGoTestRule hat auchfluent API that we can use to chain checks together.

Schauen wir uns ein Beispiel an, das unsere Instanz vonJGoTestRule verwendet, um mehrere Prüfungen fürString Objekte miteinander zu verketten:

@Test
public void whenComparingStrings_thenMultipleAssertions() {
    String aString = "This is a string";
    String anotherString = "This Is a String";

    test.check(aString, equalToIgnoringCase(anotherString))
      .check(aString.length() == 16)
      .check(aString.startsWith("This"));
}

4.6. Benutzerdefinierte Schecks

Zusätzlich zuboolean Ausdrücken undMatcher Instanzen,JGoTestRule‘s methods can accept a custom Checker object to do the checking. Dies ist eine Single Abstract Method-Schnittstelle, die mithilfe eines Lambda-Ausdrucks implementiert werden kann.

Hier ist ein Beispiel, das mithilfe der oben genannten Schnittstelle überprüft, ob einString mit einem bestimmten regulären Ausdruck übereinstimmt:

@Test
public void givenChecker_whenComparingStrings_thenEqual() throws Exception {
    Checker aChecker = s -> s.matches("\\d+");

    String aString = "1235";

    test.check(aString, aChecker);
}

5. Fazit

In diesem kurzen Tutorial haben wir die Funktionen untersucht, die uns JGoTesting zum Schreiben von Tests bietet.

Wir haben die JUnit-kompatiblenassert-Methoden sowie derencheck-Komponenten vorgestellt. Wir haben auch gesehen, wie die Bibliothek Fehlerereignisse aufzeichnet und meldet, und wir haben ein benutzerdefiniertesChecker mit einem Lambda-Ausdruck geschrieben.

Wie immer finden Sie den vollständigen Quellcode für diesen Artikel inover on Github.