web-dev-qa-db-fra.com

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, le résultat peut être:

test1
test3
test2

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

66
Badri

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 a été atteint. test3 peut commencer avant que test2 soit terminé. Si une garantie est nécessaire, déclarez une dépendance.

Contrairement aux solutions qui déclarent des dépendances, les tests qui utilisent priority seront exécutés même si un test échoue. Ce problème de dépendance peut être résolu avec @Test(...alwaysRun = true...) selon documentation .

75
user1927494

Dans TestNG, vous utilisez dependOnMethods 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 s'exécutera qu'une fois que f1 () et f2 () auront été terminés et ont abouti.

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

55
Cedric Beust

Pour traiter le scénario spécifique en question:

@Test
public void Test1() {

}

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

}

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

}
21
user2759895

Si vous ne souhaitez pas utiliser l'option @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 here

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<IMethodInstance> intercept(List<IMethodInstance> methods, ITestContext context) {

    Comparator<IMethodInstance> comparator = new Comparator<IMethodInstance>() {
        private int getLineNo(IMethodInstance mi) {
        int result = 0;

        String methodName = mi.getMethod().getConstructorOrMethod().getMethod().getName();
        String 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 permet de connaître les numéros de ligne des méthodes et de les trier par ordre croissant de leur numéro de ligne, c’est-à-dire leur ordre de définition dans la classe.

6
jacobcs

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--//

        }

}

En général, TestNG fournit un nombre d'annotations. Nous pouvons utiliser @BeforeSuite, @BeforeTest, @BeforeClass pour initialiser les navigateurs/la configuration.

Nous pouvons attribuer une priorité si vous avez écrit un nombre de scénarios de test dans votre script et souhaitez exécuter la commande selon la priorité attribuée, puis utilisez: @Test(priority=0) à partir de 0,1,2,3 ....

En attendant, nous pouvons regrouper le nombre de cas de test et l'exécuter par regroupement. pour cela, nous utiliserons @Test(Groups='Regression')

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

5
Bharat Mane

Si je comprends bien votre question en ce que vous souhaitez exécuter des tests dans un ordre spécifié, vous pouvez utiliser TestNG IMethodInterceptor. Jetez un coup d’œil à http://beust.com/weblog2/archives/000479.html sur la façon de les exploiter.

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

4
Kartik
@Test(dependsOnMethods="someBloodyMethod")
4
user2137872

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

<suite>
<test name="Selenium1">
 		<classes>
			<class name="com.test.SeleniumTest" >
			    <methods><include name="methodB"></include>
			        <include name="methodA"></include>
			    </methods>    
			 </class>
		</classes>
 
	</test>
</suite>

2
seetha

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

<test name="Firefox Test" preserve-order="true">
1
Kiran

En utilisant le paramètre de priorité pour @Test, nous pouvons contrôler l'ordre d'exécution du test.

1
Madan

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'attribut preserve-order sur false.

1
san1deep2set3hi

Piggy reculant de la réponse de user1927494, Si vous voulez exécuter un 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() {
}
1
Big Gunz

Si vous utilisez des éléments supplémentaires tels que dependsOnMethods, vous pouvez définir le flux @Test complet dans votre fichier testng.xml. Autant que je sache, l'ordre défini dans le fichier XML de votre suite (testng.xml) remplacera toutes les autres stratégies de classement.

0
Akshay Maldhure

Il y a moyen d'exécuter des tests dans un ordre donné. Normalement cependant, les tests doivent être répétables et indépendants pour garantir qu'il teste uniquement la fonctionnalité souhaitée et ne dépend pas des effets secondaires du code en dehors de ce qui est testé.

Ainsi, pour répondre à votre question, vous devrez fournir davantage d'informations telles que POURQUOI il est important d'exécuter des tests dans un ordre spécifique.

0
Kelly S. French

use: preserve-order = "true" enabled = "true" qui exécuterait des scénarios de test de la manière que vous avez écrite.

<suite name="Sanity" verbose="1" parallel="" thread-count="">   
<test name="Automation" preserve-order="true"  enabled="true">
        <listeners>
            <listener class-name="com.yourtest.testNgListner.RetryListener" />
        </listeners>
        <parameter name="BrowserName" value="chrome" />
        <classes>
            <class name="com.yourtest.Suites.InitilizeClass" />
            <class name="com.yourtest.Suites.SurveyTestCases" />
            <methods>
                <include name="valid_Login" />
                <include name="verifyManageSurveyPage" />
                <include name="verifySurveyDesignerPage" />
                <include name="cloneAndDeleteSurvey" />
                <include name="createAndDelete_Responses" />
                <include name="previewSurvey" />
                <include name="verifySurveyLink" />
                <include name="verifySurveyResponses" />
                <include name="verifySurveyReports" />
            </methods>
        </classes>
    </test>
</suite>
0
Ankit Gupta

Une réponse avec une explication importante:

Il existe deux paramètres 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épendront 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. Par conséquent, cette méthode ne sera pas nécessairement exécutée immédiatement après l'exécution de la fonction dépendante, mais elle peut survenir plus tard au cours de l'exécution et même après l'exécution d'autres tests.

Il est important de noter que si ce paramètre contient plusieurs utilisations dans le même ensemble de tests, il s'agit d'une recette sans danger pour les problèmes, car les méthodes dépendantes de l'ensemble de tests s'exécutent en premier et seulement ensuite. 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 son exécution immédiate.

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

0
Gavriel Cohen