Teil 3: Testen mit Faktor-IPS

JUnit-Adapter für Faktor-IPS Testfälle

Die Faktor-IPS Runtime enthält Adapter, um aus den Faktor-IPS Testfällen JUnit-Testfälle bzw. Testsuiten zu machen. So lassen sich die Faktor-IPS Testfälle auch mit Gradle oder Maven ausführen, da diese über eine entsprechende JUnit-Integration verfügen. Damit ist auch eine automatisierte Ausführung der Faktor-IPS Testfälle im Rahmen einer kontinuierlichen Integration problemlos möglich.

Mit folgendem Code können wir uns einen Adapter erstellen, der aus unseren Faktor-IPS-Testfällen eine JUnit 3/JUnit 4-Testsuite macht:

import org.faktorips.runtime.ClassloaderRuntimeRepository;
import org.faktorips.runtime.IRuntimeRepository;
import org.faktorips.runtime.test.IpsTestSuiteJUnitAdapter;

import junit.framework.Test;

public class HausratJUnit3Test extends IpsTestSuiteJUnitAdapter {

    public static Test suite() {
        IRuntimeRepository repositoryHausrat = ClassloaderRuntimeRepository.create(
                "org/faktorips/tutorial/produktdaten/internal/faktorips-repository-toc.xml");

        return createJUnitTest(repositoryHausrat.getIpsTest(""));
    }
}

Und mit folgendem Code erstellen wir einen Adapter, der unsere Faktor-IPS-Testfälle in JUnit 5 Dynamic Tests umwandelt:

import org.faktorips.runtime.ClassloaderRuntimeRepository;
import org.faktorips.runtime.IRuntimeRepository;
import org.faktorips.runtime.test.IpsTestSuiteJUnit5Adapter;

import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.TestFactory;

public class HausratJUnit5Test extends IpsTestSuiteJUnit5Adapter {

    @TestFactory
    public Stream<DynamicTest> getTests() {
        IRuntimeRepository repositoryHausrat = ClassloaderRuntimeRepository.create(
                "org/faktorips/tutorial/produktdaten/internal/faktorips-repository-toc.xml");

        return createTests(repositoryHausrat.getIpsTest(""));
    }
}

Wir erzeugen ein RuntimeRepository mit den Produktdaten, lassen uns durch den Aufruf der Methode getIpsTest("") eine Testsuite mit allen Testfällen aus dem Repository geben. Für JUnit 3 und JUnit 4 erzeugt die Methode createJUnitTest(…​) der Klasse IpsTestSuiteJUnitAdapter daraus eine JUnit-Testsuite. Für JUnit 5 gibt die Methode createTests(…​) der Klasse IpsTestSuiteJUnit5Adapter einen Stream von DynamicTests zurück . Führen wir die Testklassen mit dem jeweiligen JUnit-Testrunner aus, sehen wir, wie unsere Faktor-IPS-Testfälle von JUnit ausgeführt und interpretiert werden.

junit
Figure 1. Testadapter mit JUnit-GUI ausführen

Konfiguration des Maven Surefire Plugin für JUnit 5 Tests

In den Testreports des Maven Surefire Plugins werden die aus IPS-Testfällen erzeugten Dynamic Tests nicht mit ihren Anzeigenamen (den IPS-Testfall-Namen) aufgeführt sondern mit dem Namen der mit @TestFactory annotierten Methode. Für das obige Codebeispiel würde beispielsweise ein Testreport generiert werden, bei dem drei Tests mit dem Namen "getTests" aufgelistet sind. Dadurch ist es nicht möglich aus den Testreports herauszulesen, welche IPS-Testfälle fehlgeschlagen sind.

Dieses Problem kann gelöst werden, indem das Plugin in der pom.xml wie folgt konfiguriert wird. Dadurch werden die korrekten Anzeigenamen der Dynamic Tests in den Reports verwendet.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>3.0.0-M6</version>
    <configuration>
        <statelessTestsetReporter implementation="org.apache.maven.plugin.surefire.extensions.junit5.JUnit5Xml30StatelessReporter">
            <usePhrasedTestCaseMethodName>true</usePhrasedTestCaseMethodName>
        </statelessTestsetReporter>
        <argLine>-Dfile.encoding="UTF-8"</argLine>
    </configuration>
</plugin>