Ordre d’exécution des tests dans TestNG

Comment personnaliser l’ordre d’exécution des tests dans TestNG?

Par exemple:

public class Test1 { @Test public void test1() { System.out.println("test1"); } @Test public void test2() { System.out.println("test2"); } @Test public void test3() { System.out.println("test3"); } } 

Dans la suite ci-dessus, l’ordre d’exécution des tests est arbitraire. Pour une exécution, la sortie peut être:

 test1 test3 test2 

Comment puis-je exécuter les tests dans l’ordre dans lequel ils ont été écrits?

    Cela fonctionnera.

     @Test(priority=1) public void Test1() { } @Test(priority=2) public void Test2() { } @Test(priority=3) public void Test3() { } 

    priority encourage l’ordre d’exécution mais ne garantit pas que le niveau de priorité précédent est terminé. test3 pourrait démarrer avant la fin du test2 . Si une garantie est nécessaire, déclarez une dépendance.

    Contrairement aux solutions qui déclarent des dépendances, les tests qui utilisent la priority s’exécuteront même si un test échoue. Ce problème avec les dépendances peut être contourné avec @Test(...alwaysRun = true...) selon la documentation .

    Dans TestNG, vous utilisez AmendOnMethods et / ou dependOnGroups:

     @Test(groups = "a") public void f1() {} @Test(groups = "a") public void f2() {} @Test(dependsOnGroups = "a") public void g() {} 

    Dans ce cas, g () ne fonctionnera qu’après que f1 () et f2 () se soient terminés et ont réussi.

    Vous trouverez de nombreux exemples dans la documentation: http://testng.org/doc/documentation-main.html#test-groups

    Pour répondre à un scénario spécifique en question:

     @Test public void Test1() { } @Test (dependsOnMethods={"Test1"}) public void Test2() { } @Test (dependsOnMethods={"Test2"}) public void Test3() { } 

    Si vous ne souhaitez pas utiliser l’ @Test(priority = ) dans TestNG, vous pouvez utiliser la bibliothèque javaassist et IMethodInterceptor de TestNG pour hiérarchiser les tests en fonction de l’ordre dans lequel les méthodes de test sont définies dans la classe de test. Ceci est basé sur la solution fournie ici .

    Ajoutez cet écouteur à votre classe de test:

     package cs.jacob.listeners; import java.util.Arrays; import java.util.Comparator; import java.util.List; import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; import javassist.NotFoundException; import org.testng.IMethodInstance; import org.testng.IMethodInterceptor; import org.testng.ITestContext; public class PriorityInterceptor implements IMethodInterceptor { public List intercept(List methods, ITestContext context) { Comparator comparator = new Comparator() { private int getLineNo(IMethodInstance mi) { int result = 0; Ssortingng methodName = mi.getMethod().getConstructorOrMethod().getMethod().getName(); Ssortingng className = mi.getMethod().getConstructorOrMethod().getDeclaringClass().getCanonicalName(); ClassPool pool = ClassPool.getDefault(); try { CtClass cc = pool.get(className); CtMethod ctMethod = cc.getDeclaredMethod(methodName); result = ctMethod.getMethodInfo().getLineNumber(0); } catch (NotFoundException e) { e.printStackTrace(); } return result; } public int compare(IMethodInstance m1, IMethodInstance m2) { return getLineNo(m1) - getLineNo(m2); } }; IMethodInstance[] array = methods.toArray(new IMethodInstance[methods.size()]); Arrays.sort(array, comparator); return Arrays.asList(array); } } 

    Cela détecte les numéros de ligne des méthodes et les sortinge par ordre croissant de leur numéro de ligne, c’est-à-dire l’ordre dans lequel elles sont définies dans la classe.

    Si je comprends bien votre question en ce sens que vous souhaitez exécuter des tests dans un ordre spécifié, TestNG IMethodInterceptor peut être utilisé. Consultez http://beust.com/weblog2/archives/000479.html pour savoir comment les exploiter.

    Si vous souhaitez exécuter une préinitialisation, consultez http://testng.org/javadoc/org/testng/IHookable.html IHookable et le lien associé http://groups.google.com/group/testng-users/browse_thread/ thread / 42596505990e8484 / 3923db2f127a9a9c? lnk = gst & q = IHookable # 3923db2f127a9a9c

     @Test(dependsOnMethods="someBloodyMethod") 

    Utilisez ceci:

     public class TestNG { @BeforeTest public void setUp() { /*--Initialize broowsers--*/ } @Test(priority=0) public void Login() { } @Test(priority=2) public void Logout() { } @AfterTest public void tearDown() { //--Close driver--// } } 

    Généralement, TestNG fournit un nombre d’annotations, nous pouvons utiliser @BeforeSuite, @BeforeTest, @BeforeClass pour initialiser les navigateurs / la configuration.

    Nous pouvons atsortingbuer une priorité si vous avez écrit un nombre de cas de test dans votre script et que vous voulez l’exécuter selon la priorité assignée, puis utilisez: @Test(priority=0) partir de 0,1,2,3 ….

    En attendant, nous pouvons regrouper plusieurs cas de test et les exécuter en les regroupant. pour cela nous allons utiliser @Test(Groups='Regression')

    À la fin, comme pour fermer les navigateurs, nous pouvons utiliser les @AfterTest, @AfterSuite, @AfterClass .

    En spécifiant les méthodes de test à exécuter dans testNg.xml, nous pouvons exécuter les cas de test dans l’ordre souhaité

                

    En utilisant le paramètre principal pour @Test, nous pouvons contrôler l’ordre d’exécution des tests.

    Retrait de Piggy de la réponse de user1927494, Si vous souhaitez exécuter un seul test avant tous les autres, vous pouvez le faire:

     @Test() public void testOrderDoesntMatter_1() { } @Test(priority=-1) public void testToRunFirst() { } @Test() public void testOrderDoesntMatter_2() { } 

    L’ordre des méthodes dans le fichier de classe est imprévisible, vous devez donc utiliser des dépendances ou inclure explicitement vos méthodes dans XML.

    Par défaut, TestNG exécutera vos tests dans l’ordre dans lequel ils se trouvent dans le fichier XML. Si vous souhaitez que les classes et les méthodes répertoriées dans ce fichier soient exécutées dans un ordre imprévisible, définissez l’atsortingbut preserve-order sur false.

    J’ai rencontré le même problème, la raison possible est due à l’exécution parallèle de testng et la solution consiste à append l’option Priority ou simplement à mettre à jour preserve-order = “true” dans votre fichier testng.xml.

      

    Il existe des moyens d’exécuter des tests dans un ordre donné. Cependant, les tests doivent normalement être répétables et indépendants pour garantir qu’ils testent uniquement la fonctionnalité souhaitée et ne dépendent pas des effets secondaires du code en dehors de ce qui est testé.

    Donc, pour répondre à votre question, vous devrez fournir plus d’informations, comme POURQUOI il est important d’exécuter des tests dans un ordre spécifique.

    Dans le cas où vous utiliseriez des éléments supplémentaires, à l’instar de dependsOnMethods , vous souhaiterez peut-être définir l’intégralité du stream @Test dans votre fichier testng.xml. AFAIK, l’ordre défini dans votre fichier XML de suite (testng.xml) remplacera toutes les autres stratégies de classement.

    use: preserve-order = “true” enabled = “true” qui exécutera les cas de test de la manière dont vous avez écrit.

                            

    Une réponse avec une explication importante:

    Il y a deux parameters de ” TestNG ” qui sont supposés déterminer l’ordre d’exécution des tests:

     @Test(dependsOnGroups= "someGroup") 

    Et:

     @Test(dependsOnMethods= "someMethod") 

    Dans les deux cas, ces fonctions dépendent de la méthode ou du groupe,

    Mais les différences:

    Dans ce cas:

     @Test(dependsOnGroups= "someGroup") 

    La méthode dépendra de l’ensemble du groupe, et il n’est donc pas nécessaire que cette méthode soit exécutée immédiatement après l’exécution de la fonction dépendante, mais elle peut se produire plus tard dans l’exécution et même après l’exécution d’autres tests.

    Il est important de noter que dans le cas où il y a plus d’une utilisation dans le même ensemble de tests dans ce paramètre, c’est une recette sûre pour les problèmes, car les méthodes dépendantes de l’ensemble des tests s’exécutent en premier et seulement méthodes qui en dépendent.

    Cependant, dans ce cas:

     @Test(dependsOnMethods= "someMethod") 

    Même si ce paramètre est utilisé plusieurs fois dans le même ensemble de tests, la méthode dépendante sera toujours exécutée après l’exécution immédiate de la méthode dépendante.

    J’espère que c’est clair et aide.

    Des tests comme des tests unitaires? Pourquoi? Les tests DOIVENT être indépendants, sinon …. vous ne pouvez pas exécuter un test individuellement. S’ils sont indépendants, pourquoi même interférer? De plus, qu’est-ce qu’un “ordre” si vous les exécutez dans plusieurs threads sur plusieurs cœurs?