Verwendung von JUnit 5 mit Gradle

Verwenden von JUnit 5 mit Gradle

1. Überblick

In diesem Tutorial werden wir Tests auf der neuen JUnit 5-Plattform mit dem Gradle-Build-Tool ausführen.

Wir konfigurieren ein Projekt, das sowohl die alte als auch die neue Version unterstützt.

Lesen SieA Guide to JUnit 5, um weitere Informationen zur neuen Version zu erhalten. Oder dieIntroduction to Gradle für detaillierte Informationen zum Build-Tool.

2. Gradle-Setup

Zunächst überprüfen wir, ob Version 4.6 oder höher des Build-Tools installiert ist, da dies die früheste Version ist, die mit JUnit 5 funktioniert.

Der einfachste Weg ist, einfach den Befehlgradle -v auszuführen:

$> gradle -v
------------------------------------------------------------
Gradle 4.10.2
------------------------------------------------------------

Bei Bedarf können wir die Schritte voninstallationausführen, um die richtige Version zu erhalten.

Sobald wir alles installiert haben, müssen wir Gradle mithilfe derbuild.gradle-Datei konfigurieren.

Wir können damit beginnen, die Unit-Test-Plattform für das Build-Tool bereitzustellen:

test {
    useJUnitPlatform()
}

Nachdem wir die Plattform angegeben haben, müssen wir die JUnit-Abhängigkeiten angeben. Hier sehen wir einen bemerkenswerten Unterschied zwischen JUnit 5 und früheren Versionen.

In früheren Versionen war nur eine Abhängigkeit erforderlich. In JUnit 5, though, the API is separated from the runtime, meaning two dependencies.

Die API wird mitjunit-jupiter-api manifestiert. Die Laufzeit beträgtjunit-jupiter-engine für JUnit 5 undjunit-vintage-engine für JUnit 3 oder 4.

Wir liefern diese beiden intestImplementation andtimeRuntimeOnly:

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.3.1'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.3.1'
}

3. Tests erstellen

Schreiben wir unseren ersten Test. Es sieht genauso aus wie in früheren Versionen:

@Test
public void testAdd() {
    assertEquals(42, Integer.sum(19, 23));
}

Nunwe can run the test by executing the gradle clean test command.

Um zu überprüfen, ob wir JUnit 5 verwenden, können wir uns die Importe ansehen. The imports for @Test and assertEquals should have a package starting with org.junit.jupiter.api:

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

Im letzten Beispiel haben wir einen Test mit „alter“ Funktionalität erstellt, der seit Jahren funktioniert. Wir werden jetzt ein weiteres Beispiel erstellen, das einige der neuen Funktionen in JUnit 5 verwendet:

@Test
public void testDivide() {
    assertThrows(ArithmeticException.class, () -> {
        Integer.divideUnsigned(42, 0);
    });
}

assertThrows ist eine neue Zusicherung in JUnit5, die den alten Stil von@Test(expected=ArithmeticException.class). ersetzt

4. Konfigurieren von JUnit 5-Tests mit Gradle

Als nächstes werden wir eine tiefere Integration zwischen Gradle und JUnit5 untersuchen.

Nehmen wir an, wir haben zwei Arten von Tests in unserer Suite: Langzeit- und Kurzzeittests. Wir könnten die JUnit 5@Tag annotation verwenden:

public class CalculatorJUnit5Test {
    @Tag("slow")
    @Test
    public void testAddMaxInteger() {
        assertEquals(2147483646, Integer.sum(2147183646, 300000));
    }

    @Tag("fast")
    @Test
    public void testDivide() {
        assertThrows(ArithmeticException.class, () -> {
            Integer.divideUnsigned(42, 0);
        });
    }
}

Then, we tell the build tool which ones to execute. In unserem Fall führen wir einfach die kurzen (schnellen) Tests aus:

test {
    useJUnitPlatform {
        includeTags 'fast'
        excludeTags 'slow'
    }
}

5. Aktivieren der Unterstützung für alte Versionen

Now, it’s still possible to create JUnit 3 and 4 tests with the new Jupiter engine. Darüber hinaus können wir sie mit der neuen Version im selben Projekt mischen, beispielsweise in einem Migrationsszenario.

Zunächst fügen wir der vorhandenen Build-Konfiguration einige Abhängigkeiten hinzu:

testCompileOnly 'junit:junit:4.12'
testRuntimeOnly 'org.junit.vintage:junit-vintage-engine:5.3.1'

Beachten Sie, dass unser Projekt jetzt sowohljunit-jupiter-engine as als auchjunit-vintage-engine. hat

Jetzt erstellen wir eine neue Klasse und kopieren die zuvor erstelltetestDivide-Methode. Dann addieren wir die Importe für@Test undassertEquals. Diesmal stellen wir jedoch sicher, dass die alten Pakete der Version 4 verwendet werden, beginnend mitorg.junit:

import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class CalculatorJUnit4Test {
    @Test
    public void testAdd() {
        assertEquals(42, Integer.sum(19, 23));
    }
}

6. Fazit

In diesem Tutorial haben wir Gradle in JUnit 5 integriert. Darüber hinaus haben wir Unterstützung für die Versionen 3 und 4 hinzugefügt.

Wir haben gesehen, dass das Build-Tool die alte und die neue Version hervorragend unterstützt. Daher können wir die neuen Funktionen in einem vorhandenen Projekt verwenden, ohne alle vorhandenen Tests ändern zu müssen.

Das vollständige Codebeispiel ist inGitHub project verfügbar. Fühlen Sie sich frei, es als Ausgangspunkt für Ihr eigenes Projekt zu verwenden.