[JAVA] Visualisieren Sie die in TestNG ausgeführte Testmethode im Listener

TestNG Es gibt ein bestimmtes "Wo ist das?"

Wenn ich einen TestNG-Test normal auf der Konsole ausführe, erhalte ich keine Informationen darüber, welche Testmethode ausgeführt wird. Wenn alle Tests reibungslos verlaufen, ist das in Ordnung, aber

% mvn clean test
[INFO] Scanning for projects...
(Unterlassung)
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running TestSuite

↑ Gelegentlich bleibe ich bei diesem Display hängen und bin ratlos, weil ich nicht weiß, welcher Test hängt.

Um solche Probleme zu vermeiden, zeige ich Ihnen, wie Sie auf der Konsole ausgeben, welcher Test von TestNG ausgeführt wird. Das Bild der Protokollausgabe nach der Aktion sieht folgendermaßen aus:

[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running TestSuite
[CustomTestListener] [INFO] Running: com.example.calc.test.CalcTest#testAdd(0, 0, 0)
[CustomTestListener] [INFO] Running: com.example.calc.test.CalcTest#testAdd(0, 1, 1)

In diesem Artikel werde ich die folgenden drei Methoden vorstellen.

Beispielcode

Der in diesem Artikel verwendete Beispielcode ist auf GitHub zu finden.

Methode 1: Fügen Sie das Protokoll direkt in die Testmethode ein

Es ist eine einfache Methode, das Protokoll direkt in die Testmethode selbst einzufügen. Es ist schön, wenn Sie eine begrenzte Anzahl von Methoden haben, die Sie protokollieren möchten, aber wenn Sie viele davon haben, ist es eine große Sache ...

public class CalcTest {
    @Test(dataProvider = "testAdd")
    public void testAdd(int x, int y, int expected) {
        //Geben Sie die zu protokollierenden Testmethodeninformationen aus
        LOGGER.info(String.format(
        "Running: com.example.calc.test.CalcTest#testAdd(%d, %d, %d)", x, y, expected));

        Calc calc = new Calc();
        assertEquals(calc.add(x, y), expected);
    }
    // ...
}
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running TestSuite
[CalcTest] [INFO] Running: com.example.calc.test.CalcTest#testAdd(0, 0, 0)
[CalcTest] [INFO] Running: com.example.calc.test.CalcTest#testAdd(0, 1, 1)

Methode 2: Fügen Sie das Protokoll in die Methode @ @ BeforeMethod der Testklasse ein

Definieren Sie eine Methode mit der Annotation @ BeforeMethod in der Testklasse und fügen Sie das Protokoll ein. Es ist eine vernünftige Methode, die leicht zu beginnen und leicht zu verstehen ist, da Sie nur ein wenig mit der Testklasse spielen müssen.

import org.testng.annotations.BeforeMethod;

public class CalcTest {
    @BeforeMethod
    public void beforeMethod(Method method, Object[] data) {
        //Geben Sie die zu protokollierenden Testmethodeninformationen aus
        LOGGER.info(String.format(
            "Running: %s#%s(%s)",
            method.getDeclaringClass().getCanonicalName(),
            method.getName(),
            Arrays.stream(data).map(x -> x.toString()).collect(Collectors.joining(", "))));
    }
    // ...
}
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running TestSuite
[CalcTest] [INFO] Running: com.example.calc.test.CalcTest#testAdd(0, 0, 0)
[CalcTest] [INFO] Running: com.example.calc.test.CalcTest#testAdd(0, 1, 1)

Methode 3: Fügen Sie einen Listener hinzu und füllen Sie die Methode "onTestStart" mit Protokollen

Die Methode besteht darin, einen TestNG-Listener hinzuzufügen und das Protokoll "onTestStart" des Listeners zu verwenden, um das Protokoll vorzubereiten. Obwohl das Festlegen des Listeners einige Zeit in Anspruch nimmt, ist es effektiv, wenn es viele Zieltestmethoden gibt, da die Einstellung global funktioniert. Dies ist auch nützlich, wenn Sie den Testsatz nicht ändern können (z. B. ein TCK ausführen), da Sie sich nicht mit der Testklasse herumschlagen müssen.

Der TestNG-Listener wird als folgende Klasse vorbereitet, die die ITestListener-Schnittstelle implementiert.

import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestResult;

public class CustomTestListener implements ITestListener {
    private static final Logger LOGGER = Logger.getLogger(CustomTestListener.class);

    public void onTestStart(ITestResult result) {
        //Geben Sie die zu protokollierenden Testmethodeninformationen aus
        LOGGER.info(String.format(
            "Running: %s#%s(%s)",
            result.getMethod().getTestClass().getName(),
            result.getMethod().getMethodName(),
            Arrays.stream(result.getParameters()).map(x -> x.toString()).collect(Collectors.joining(", "))));
    }

    public void onTestSuccess(ITestResult result) { }
    public void onTestFailure(ITestResult result) { }
    public void onTestSkipped(ITestResult result) { }
    public void onTestFailedButWithinSuccessPercentage(ITestResult result) { }
    public void onStart(ITestContext context) { }
    public void onFinish(ITestContext context) { }
}

Bearbeiten Sie außerdem testng.xml oder geben Sie die Annotation @ Listeners in der Testklasse an, um den Listener bei TestNG zu registrieren. Um einen Listener bei testng.xml zu registrieren, schreiben Sie wie folgt.

<suite>
    <listeners>
        <listener class-name="com.example.calc.test.util.CustomTestListener"/>
    </listeners>
   <!-- ... -->
</suite>

Schreiben Sie wie folgt, um die Annotation "@ Listeners" in der Testklasse anzugeben.

import org.testng.annotations.Listeners;

@Listeners({ CustomTestListener.class })
public class CalcTest {
    // ...
}

Die erwartete Protokollausgabe sieht folgendermaßen aus.

[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running TestSuite
[CustomTestListener] [INFO] Running: com.example.calc.test.CalcTest#testAdd(0, 0, 0)
[CustomTestListener] [INFO] Running: com.example.calc.test.CalcTest#testAdd(0, 1, 1)

Zusammenfassung

Ich habe vorgestellt, wie der von TestNG ausgeführte Test visualisiert wird. Es gibt viele Möglichkeiten, dies zu tun, wie in diesem Artikel vorgestellt. Probieren Sie es also von Fall zu Fall aus!

Verweise

Recommended Posts

Visualisieren Sie die in TestNG ausgeführte Testmethode im Listener
Testen Sie private Methoden in JUnit
Testen Sie private Methoden in JUnit
[Java] Testen Sie private Methoden mit JUnit
Steuern Sie die Testreihenfolge in Junit4 mit einem Aufzählungstyp
Testen Sie den Controller mit Mock MVC im Spring Boot
Mischen Sie Testfälle mit JUnit 5 und Standardmethoden
Setup mit anfänglichen Testdaten, die in den Db2 / DB-Container eingefügt wurden
Führen Sie Maven unter Java 8 aus, während Sie unter Java 6 kompilieren und unter Java 11 testen