Lorsque j'exécute un test TestNG normalement sur la console, cela ne me donne aucune information sur la méthode de test en cours d'exécution. Si tous les tests se déroulent correctement, c'est bien, mais
% mvn clean test
[INFO] Scanning for projects...
(Omission)
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running TestSuite
↑ Parfois, je suis bloqué avec cet affichage, et je suis perdu car je ne sais pas quel test est suspendu.
Donc, pour éviter de tels problèmes, je vais vous montrer comment sortir sur la console quel test est exécuté par TestNG. L'image de la sortie du journal après l'action est comme ceci:
[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)
Dans cet article, je présenterai les trois méthodes suivantes.
@ BeforeMethod
de la classe de testL'exemple de code utilisé dans cet article se trouve sur GitHub.
C'est une méthode simple et facile pour mettre le journal directement dans la méthode de test elle-même. C'est bien si vous avez un nombre limité de méthodes que vous souhaitez enregistrer, mais si vous en avez beaucoup, c'est un gros problème ...
public class CalcTest {
@Test(dataProvider = "testAdd")
public void testAdd(int x, int y, int expected) {
//Sortie des informations sur la méthode de test pour enregistrer
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)
@ BeforeMethod
de la classe de testDéfinissez une méthode avec l'annotation @ BeforeMethod
dans la classe de test et placez-y le journal.
C'est une méthode raisonnable qui est facile à démarrer et à comprendre car il suffit de jouer un peu avec la classe de test.
import org.testng.annotations.BeforeMethod;
public class CalcTest {
@BeforeMethod
public void beforeMethod(Method method, Object[] data) {
//Sortie des informations sur la méthode de test pour enregistrer
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)
La méthode consiste à ajouter un écouteur TestNG et à utiliser la méthode ʻonTestStart` de l'écouteur pour préparer le journal. Bien que la définition de l'écouteur prenne du temps, elle est efficace lorsqu'il existe de nombreuses méthodes de test cible, car le paramètre fonctionne globalement. Il est également utile si vous ne pouvez pas modifier l'ensemble de test (comme exécuter un TCK) car vous n'avez pas à vous soucier de la classe de test.
L'écouteur TestNG est préparé comme la classe suivante qui implémente l'interface ʻITestListener`.
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) {
//Sortie des informations sur la méthode de test pour enregistrer
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) { }
}
De plus, éditez testng.xml
ou spécifiez l'annotation @ Listeners
dans la classe de test pour enregistrer l'auditeur avec TestNG.
Pour enregistrer un écouteur avec testng.xml
, écrivez comme suit.
<suite>
<listeners>
<listener class-name="com.example.calc.test.util.CustomTestListener"/>
</listeners>
<!-- ... -->
</suite>
Pour spécifier l'annotation @ Listeners
dans la classe de test, écrivez comme suit.
import org.testng.annotations.Listeners;
@Listeners({ CustomTestListener.class })
public class CalcTest {
// ...
}
La sortie de journal attendue ressemble à ceci.
[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)
J'ai présenté comment visualiser le test en cours d'exécution par TestNG. Il existe de nombreuses façons de le faire, comme présenté dans cet article, alors essayez-le au cas par cas!
Recommended Posts