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.
Der in diesem Artikel verwendete Beispielcode ist auf GitHub zu finden.
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)
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)
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)
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!
Recommended Posts