Testng: Les méthodes de test héritées n'obtiennent pas le comportement de groupe attendu

Créé le 1 mars 2012  ·  8Commentaires  ·  Source: cbeust/testng

Considérez les classes de test suivantes :

<strong i="6">@Test</strong>
public abstract class ParentTest {
    public void parentTestMethod() {
    }
}

@Test(groups = "myGroup")
public class ChildTest extends ParentTest {
    public void childTestMethod() {
    }
}

Lors de l'exécution de ce test (ChildTest), je m'attendrais à ce que les deux méthodes de test (childTestMethod et parentTestMethod) appartiennent au groupe 'myGroup'. Apparemment, ce n'est pas le comportement réel (testé avec la version 6.4).

J'ai mis en place un code pour enquêter sur ce problème:

TestNGMethodFinder testNGMethodFinder = new TestNGMethodFinder(new RunInfo(), new JDK15AnnotationFinder(new DefaultAnnotationTransformer()));
ITestNGMethod[] testMethods = testNGMethodFinder.getTestMethods(ChildTest.class, new XmlTest());
for (ITestNGMethod testMethod : testMethods) {
    String[] groups = testMethod.getGroups();
    System.out.println(testMethod + " groups:" + Arrays.toString(groups));
}

Résultat de l'exécution de ce code :

ChildTest.childTestMethod()[pri:0, instance:null] groups:[myGroup]
ParentTest.parentTestMethod()[pri:0, instance:null] groups:[]

J'ai examiné le code source de TestNG et il semble que ce comportement provienne de la méthode org.testng.internal.BaseTestMethod#initGroups(Class>). Pour être exact, je pense que la déclaration suivante est la cause de ce comportement plutôt étrange :

ITestOrConfiguration classAnnotation = (ITestOrConfiguration) getAnnotationFinder().findAnnotation(getMethod().getDeclaringClass(), annotationClass);

Afin de résoudre ce problème, cette déclaration peut être modifiée pour :

ITestOrConfiguration classAnnotation = (ITestOrConfiguration) getAnnotationFinder().findAnnotation(getInstance().getClass(), annotationClass);

mais je ne sais pas si ce serait la bonne façon de résoudre le problème. Ni d'éventuelles implications...

groups inheritance

Tous les 8 commentaires

Je vois le problème, et votre suggestion ne fonctionne pas tout à fait, malheureusement. C'est un peu délicat à résoudre car les annotations sont résolues dans la phase d'initialisation, ce qui signifie que lorsque l'annotation @Test du parent est analysée, elle ne sait évidemment rien du fait que l'annotation enfant y ajoutera plus de groupes...

Cédric, merci pour votre retour rapide sur ce problème. Vous dites "c'est un peu délicat à résoudre", cela veut-il dire que vous ne pensez pas que ce problème aura une chance d'être résolu dans un futur proche ? Pouvez-vous penser à des solutions de contournement possibles ?

Ce que je voulais dire, c'est que lorsque la résolution de groupe est effectuée, aucune classe de test n'a encore été instanciée, donc quand je regarde parentTestMethod(), je n'ai pas d'instance de ChildTest qui me permettrait de mettre cette méthode dans ce groupe.

La résolution de groupe est purement statique, tandis que l'exemple ci-dessus ne peut être résolu que dynamiquement.

Est-ce que ça a du sens?

J'ai aussi vu ce comportement. Lorsque j'exécute mes tests sans filtre de groupes, tout passe, mais lors de l'exécution avec des groupes, les choses échouent. Dans certains cas, cela est dû au fait que ma classe de test hérite d'une autre classe de test, mais dans d'autres cas, j'ai des classes de test POJO et il semble que mes méthodes @BeforeMethod et @AfterMethod ne soient pas invoquées correctement.

BTW, ma solution consiste à utiliser des groupes exclus qui, bien sûr, ne fonctionneront pas dans toutes les situations. @cbeust , y a-t-il eu des travaux sur une solution appropriée pour cela?

Plus d'un an plus tard et cela ne fonctionne toujours pas.
@cbeust À mon humble avis, cela n'a aucun sens : puisque la classe parent est abstraite, sa résolution de groupe doit être basée sur une instance concrète d'une classe de test.

FWIW, je viens de tomber sur ça aussi.

J'ai créé un sélecteur de méthode personnalisé, qui utilise les groupes de la sous-classe Test annoation

/* *****************************************************************************
 * Copyright 2017 VMware, Inc.  All rights reserved. VMware Confidential
 * ****************************************************************************/
package com.vmware.cloud.systemtests.util;

import java.util.Arrays;
import java.util.List;

import org.apache.commons.lang3.ArrayUtils;
import org.testng.IMethodSelector;
import org.testng.IMethodSelectorContext;
import org.testng.ITestNGMethod;
import org.testng.annotations.Test;
import org.testng.xml.XmlTest;

/**
 * Selector that uses groups in subclass <strong i="6">@Test</strong> annotations to determine if methods should be included
 */
public class SubclassAwareXmlMethodsSelector implements IMethodSelector {
    <strong i="7">@Override</strong>
    public boolean includeMethod(IMethodSelectorContext context, ITestNGMethod method, boolean isTestMethod) {
        XmlTest xmlTest = method.getXmlTest();
        if (xmlTest == null) {
            return method.isAlwaysRun();
        }
        Class realTestClass = isTestMethod ? method.getTestClass().getRealClass() : method.getRealClass();
        Test testClassAnnotation = (Test) realTestClass.getAnnotation(Test.class);
        String[] classAnnotationGroups = testClassAnnotation != null ? testClassAnnotation.groups() : new String[0];
        List<String> groups = Arrays.asList(ArrayUtils.addAll(classAnnotationGroups, method.getGroups()));

        context.setStopped(true);
        if (groups.size() == 0 && xmlTest.getIncludedGroups().isEmpty()) {
            return true;
        } else if (groups.size() > 0 && xmlTest.getExcludedGroups().stream().anyMatch(groups::contains)) {
            return false;
        } else if (groups.size() > 0 && xmlTest.getIncludedGroups().stream().anyMatch(groups::contains)) {
            return true;
        } else {
            return method.isAlwaysRun();
        }
    }

    <strong i="8">@Override</strong>
    public void setTestMethods(List<ITestNGMethod> list) {
    }
}
Cette page vous a été utile?
0 / 5 - 0 notes