/ / TestNG test parallèle / méthode utilisant dataprovoder - java, sélénium, sélénium-webdriver, testng

TestNG test parallèle / méthode utilisant dataprovoder - java, sélénium, sélénium-webdriver, testng

J'ai une méthode de test juste comme ceci:

@Test(dataProvider="takeMyProvider")
public void myTest(String param1, String param2){

System.out.println(param1 + " " + param2);

}

Mon fournisseur de données renvoie 10 éléments. Ma méthode sera exécutée 10 fois dans un thread. Comment est-il possible de mettre cela en parallèle? Par exemple

  • Je veux avoir 5 méthodes en parallèle. Le pilote Web doit ouvrir 5 navigateurs simultanément. Après ces 5 tests en parallèle, les 5 autres tests doivent être exécutés

ou

  • le pilote Web doit ouvrir 10 navigateurs et faire les 10 éléments en parallèle

Est-ce que quelqu'un a une idée?

Réponses:

1 pour la réponse № 1

Vous pouvez définir le parallélisme via un fichier suite dans TestNG. L'exemple suivant exécute des méthodes en parallèle avec 10 threads:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="MySuiteNameHere" parallel="methods" thread-count="10">

<test name="Selenium Tests">
<classes>
<class name="foo.bar.FooTest"/>
</classes>
</test>
</suite>

Vous devez également noter que votre fournisseur de données peut être thread-safe afin de ne pas forcer la méthode à s'exécuter de manière séquentielle.

// data providers force single threaded by default
@DataProvider(name = "takeMyProvider", parallel = true)

Soyez prudent, cependant. TestNG ne crée pas de nouvelles instances de l'objet de classe lorsqu'il est exécuté avec des méthodes parallèles. Cela signifie que si vous enregistrez des valeurs sur l'objet de classe de test, vous pouvez vous heurter à des problèmes de thread.

Notez également que si vous définissez le nombre de threads sur 5, il n'attend pas que les 5 premiers soient tous terminés, puis démarrez les 5 suivants. Il met essentiellement toutes les méthodes de test dans une file d'attente, puis démarre. x les discussions. Chaque thread interroge ensuite simplement l'élément suivant de la file d'attente lorsqu'il est disponible.


0 pour la réponse № 2

TestNG "s @Test l'annotation a déjà ce que vous voulez ... Dans une certaine mesure:

// Execute 10 times with a pool of 5 threads
@Test(invocationCount = 10, threadPoolSize = 5)

Ce que cela ne fera pas, c’est d’adapter exactement votre premier scénario, c’est-à-dire exécuter les 5 premiers, attendez qu’ils finissent, exécutez les 5 autres.


0 pour la réponse № 3

beaucoup thx pour vos commentaires et astuces utiles. Mes tests ont été exécutés - peut-être - parallèlement, mais dans un seul navigateur.

Permet de sauter en détail:

Mon fournisseur de données retourne un objet [] []

@Dataprovider(name = "takeMyProvider", parallel = true)
public object[][] myProvider(){
return new object[][]{{"1", "name1"}, {"2", "name2"} {"3", "name3"}}
}

Cette méthode de test est exécutée trois fois

@Test(dataProvider="takeMyProvider")
public void myTest(String param1, String param2){

System.out.println(param1 + " " + param2);

}

mais juste dans un exemple de navigateur. Ce n'est pas ce que je veux.

Je veux que testNG démarre 3 instances de chrome et effectue les 3 tests en parallèle.

Btw, je fais les tests sur une grille de sélénium. Peut-être avec 100 nœuds. Ce serait parfait lorsque 100 nœuds effectuent ce test en parallèle. Ou même 1.000, dépend du fournisseur de données.

Est-ce que quelqu'un a une idée?

Meilleures salutations