Fournisseur de données & TestNG XML: paramétrage dans Selenium (exemple)

Table des matières:

Anonim

Lorsque nous créons un logiciel, nous souhaitons toujours qu'il fonctionne différemment avec un ensemble de données différent. Lorsqu'il s'agit de tester le même logiciel, nous ne pouvons pas être injuste de le tester avec un seul ensemble de données. Ici encore, nous devons vérifier que notre système prend en charge tous les ensembles de combinaisons qui sont censés prendre en charge. Pour cela, nous devons paramétrer nos scipts de test. Voici le paramétrage dans l'image.

Paramétrage dans Selenium

Le paramétrage dans Selenium est un processus permettant de paramétrer les scripts de test afin de transmettre plusieurs données à l'application lors de l'exécution. Il s'agit d'une stratégie d'exécution qui exécute automatiquement des cas de test plusieurs fois en utilisant différentes valeurs. Le concept obtenu en paramétrant les scripts de test est appelé Test piloté par les données .

Dans ce didacticiel, vous apprendrez-

  • Type de paramétrage dans TestNG-
  • Annotation des paramètres avec Testng.xml
  • Dépannage
  • Paramètres utilisant Dataprovider
  • Appeler DataProvider à partir d'une classe différente
  • Types de paramètres dans Dataprovider

Type de paramétrage dans TestNG-

Pour rendre le paramétrage plus clair, nous allons passer en revue les options de paramétrage dans l'un des frameworks les plus populaires pour Selenium Webdriver - TestNG .

Il y a deux façons de réaliser le paramétrage dans TestNG

  1. Avec l'aide de l' annotation des paramètres et du fichier XML TestNG .

  2. Avec l'aide de l' annotation DataProvider .

Les paramètres de Testng.xml peuvent être de niveau suite ou test

Le paramètre de DataProvider peut prendre Method et ITestContext comme paramètre.

Étudions-les en détail -

Annotation des paramètres dans TestNG

Paramètres L'annotation dans TestNG est une méthode utilisée pour transmettre des valeurs aux méthodes de test sous forme d'arguments à l'aide du fichier .xml. Les utilisateurs peuvent être tenus de transmettre les valeurs aux méthodes de test pendant l'exécution. La méthode d'annotation @Parameters peut être utilisée dans n'importe quelle méthode ayant l'annotation @Test, @Before, @After ou @Factory.

Annotation des paramètres avec Testng.xml

Sélectionnez le paramétrage à l'aide d'annotations lorsque vous souhaitez gérer la complexité et que le nombre de combinaisons d'entrées est moindre.

Voyons comment cela fonctionne

Scénario de test

Étape 1) Lancez le navigateur et accédez à Google.com

Étape 2) Entrez un mot-clé de recherche

Étape 3) Vérifiez que la valeur entrée est la même que celle fournie par nos données de test

Étape 4) Répétez 2 et 3 jusqu'à ce que toutes les valeurs soient saisies

Auteur du test SearchKey
Guru99 Inde
Krishna Etats-Unis
Bhupesh Chine

Voici un exemple de comment le faire SANS paramètres

paramètres du package;import org.testng.annotations.Test;import org.testng.AssertJUnit;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.firefox.FirefoxDriver;classe publique NoParameterWithTestNGXML {String driverPath = "C: \\ geckodriver.exe";Pilote WebDriver;@Testpublic void testNoParameter () lance InterruptedException {String author = "guru99";String searchKey = "Inde";System.setProperty ("webdriver.gecko.driver", driverPath);pilote = nouveau FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");WebElement searchText = driver.findElement (Par.nom ("q"));// Recherche de texte dans la zone de texte googlesearchText.sendKeys (searchKey);System.out.println ("Bienvenue ->" + auteur + "Votre clé de recherche est ->" + searchKey);System.out.println ("Thread va dormir maintenant");Thread.sleep (3000);System.out.println ("Value in Google Search Box =" + searchText.getAttribute ("value") + "::: Valeur donnée par input =" + searchKey);// vérification de la valeur dans le champ de recherche GoogleAssertJUnit.assertTrue (searchText.getAttribute ("valeur"). EqualsIgnoreCase (searchKey));}}

Une étude, l'exemple ci-dessus. Imaginez à quel point le code deviendra complexe lorsque nous faisons cela pour 3 combinaisons d'entrées

Maintenant, paramétrons cela en utilisant TestNG

Pour ce faire, vous devrez

  • Créez un fichier XML qui stockera les paramètres
  • Dans le test, ajoutez l'annotation @Paramètres

Voici le code complet

Niveau de test TestNG.xml




Fichier ParameterWithTestNGXML.java

paramètres du package;import org.testng.AssertJUnit;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.firefox.FirefoxDriver;import org.testng.annotations.Optional;import org.testng.annotations.Parameters;import org.testng.annotations.Test;Classe publique ParameterWithTestNGXML {String driverPath = "C: \\ geckodriver.exe";Pilote WebDriver;@Test@Parameters ({"author", "searchKey"})public void testParameterWithXML (@Optional ("Abc") String author, String searchKey) lance InterruptedException {System.setProperty ("webdriver.gecko.driver", driverPath);pilote = nouveau FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");WebElement searchText = driver.findElement (Par.nom ("q"));// Recherche de texte dans la zone de texte googlesearchText.sendKeys (searchKey);System.out.println ("Bienvenue ->" + auteur + "Votre clé de recherche est ->" + searchKey);System.out.println ("Thread va dormir maintenant");Thread.sleep (3000);System.out.println ("Value in Google Search Box =" + searchText.getAttribute ("value") + "::: Valeur donnée par input =" + searchKey);// vérification de la valeur dans le champ de recherche GoogleAssertJUnit.assertTrue (searchText.getAttribute ("valeur"). EqualsIgnoreCase (searchKey));}}

Instructions pour exécuter le script, sélectionner le fichier XML et exécuter en tant que Test NG Suite

Cliquez avec le bouton droit sur le fichier .xml -> Exécuter en tant que -> Testng Suite (Remarque: Suite)

Désormais, les paramètres peuvent être définis à 2 niveaux

  1. Niveau suite - Les paramètres à l'intérieur de la balise du fichier XML TestNG seront un paramètre de niveau suite.
  2. Niveau de test - Les paramètres à l'intérieur de la balise du fichier XML de test seront un paramètre de niveau de test.

Voici le même test avec des paramètres de niveau suite

REMARQUE: Si le nom du paramètre est le même au niveau de la suite et au niveau du test, le paramètre de niveau de test aura la préférence sur le niveau de la suite. Donc, dans ce cas, toutes les classes à l'intérieur de ce niveau de test partageront le paramètre surchargé, et les autres classes qui sont en dehors du niveau de test partageront le paramètre de niveau suite.

Dépannage

Problème n ° 1 La valeur du paramètre dans testng.xml ne peut pas être convertie en paramètre de la méthode de test correspondante, elle générera une erreur.

Prenons l'exemple suivant

Ici, l'attribut 'author' est égal à 'Guru99' qui est une chaîne et dans la méthode de test correspondante, il attend une valeur entière, nous obtiendrons donc une exception ici.

Problème n ° 2 Vos @Paramètres n'ont pas de valeur correspondante dans testing.xml.

Vous pouvez résoudre cette situation en ajoutant l' annotation @optional dans le paramètre correspondant dans la méthode de test.

Problème n ° 3: vous souhaitez tester plusieurs valeurs du même paramètre à l'aide de Testng.xml

La réponse simple est que cela ne peut pas être fait! Vous pouvez avoir plusieurs paramètres différents, mais chaque paramètre ne peut avoir qu'une seule valeur. Cela permet d'éviter le codage en dur des valeurs dans le script. Cela rend le code réutilisable. Considérez-le comme des fichiers de configuration pour votre script. Si vous souhaitez utiliser plusieurs valeurs pour un paramètre, utilisez DataProviders

Fournisseur de données dans TestNG

Le fournisseur de données dans TestNG est une méthode utilisée lorsqu'un utilisateur doit passer des paramètres complexes. Des paramètres complexes doivent être créés à partir de Java, tels que des objets complexes, des objets provenant de fichiers de propriétés ou d'une base de données peuvent être transmis par la méthode du fournisseur de données. La méthode est annotée par @DataProvider et elle renvoie un tableau d'objets.

Paramètres utilisant Dataprovider

L'annotation @Parameters est facile, mais pour tester avec plusieurs ensembles de données, nous devons utiliser le fournisseur de données.

Pour remplir des milliers de formulaires Web à l'aide de notre cadre de test, nous avons besoin d'une méthodologie différente qui peut nous donner un très grand ensemble de données en un seul flux d'exécution.

Ce concept basé sur les données est réalisé par l' annotation @DataProvider dans TestNG.

Il n'a qu'un seul attribut «nom» . Si vous ne spécifiez pas l'attribut de nom, le nom du fournisseur de données sera le même que le nom de la méthode correspondante.

Le fournisseur de données renvoie un objet JAVA bidimensionnel à la méthode de test et la méthode de test invoquera M fois dans un tableau d'objets de type M * N. Par exemple, si le DataProvider renvoie un tableau de 2 * 3 objets, le cas de test correspondant sera appelé 2 fois avec 3 paramètres à chaque fois.

Exemple complet

paramètres du package;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.firefox.FirefoxDriver;import org.testng.Assert;import org.testng.annotations.BeforeTest;import org.testng.annotations.DataProvider;import org.testng.annotations.Test;Classe publique ParameterByDataprovider {Pilote WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTestpublic void setup () {// Créer un objet pilote firefoxSystem.setProperty ("webdriver.gecko.driver", driverPath);pilote = nouveau FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}/ ** Cas de test pour vérifier le champ de recherche Google* @param auteur* @param searchKey* @throws InterruptedException* /@Test (dataProvider = "SearchProvider")public void testMethod (String author, String searchKey) lance InterruptedException {{WebElement searchText = driver.findElement (Par.nom ("q"));// valeur de recherche dans la boîte de recherche googlesearchText.sendKeys (searchKey);System.out.println ("Bienvenue ->" + auteur + "Votre clé de recherche est ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("valeur");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Vérifier si la valeur dans le champ de recherche Google est correcteAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** @return Object [] [] où la première colonne contient 'author'* et la deuxième colonne contient 'searchKey'* /@DataProvider (nom = "SearchProvider")Objet public [] [] getDataFromDataprovider () {retourne un nouvel objet [] []{{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "USA"}};}}

Appeler DataProvider à partir d'une classe différente

Par défaut, DataProvider réside dans la même classe que la méthode de test ou sa classe de base. Pour le mettre dans une autre classe, nous devons rendre la méthode du fournisseur de données statique et dans la méthode de test, nous devons ajouter un attribut dataProviderClass dans l' annotation @Test .

Exemple de code

TestClass ParameterDataproviderWithClassLevel.java

paramètres du package;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.firefox.FirefoxDriver;import org.testng.Assert;import org.testng.annotations.BeforeTest;import org.testng.annotations.Test;Classe publique ParameterDataproviderWithClassLevel {Pilote WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTestpublic void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);pilote = nouveau FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider", dataProviderClass = DataproviderClass.class)public void testMethod (String author, String searchKey) lance InterruptedException {WebElement searchText = driver.findElement (Par.nom ("q"));// Rechercher du texte dans la zone de texte googlesearchText.sendKeys (searchKey);System.out.println ("Bienvenue ->" + auteur + "Votre clé de recherche est ->" + searchKey);Thread.sleep (3000);// récupère le texte de la zone de rechercheString testValue = searchText.getAttribute ("valeur");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// vérifier si le champ de recherche a la valeur correcteAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}

DataproviderClass.java

paramètres du package;import org.testng.annotations.DataProvider;classe publique DataproviderClass {@DataProvider (nom = "SearchProvider")Public static Object [] [] getDataFromDataprovider () {retourne un nouvel objet [] [] {{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "USA"}};}}

Types de paramètres dans Dataprovider

Il existe deux types de paramètres pris en charge par la méthode DataProvider.

Méthode - Si le SAME DataProvider doit se comporter différemment avec une méthode de test différente, utilisez le paramètre Method.

Dans l'exemple suivant,

  • Nous vérifions si le nom de la méthode est testMethodA.
  • Si oui, retournez un ensemble de valeurs
  • Sinon, retourne un autre ensemble de valeurs
paramètres du package;import java.lang.reflect.Method;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.firefox.FirefoxDriver;import org.testng.Assert;import org.testng.annotations.BeforeTest;import org.testng.annotations.DataProvider;import org.testng.annotations.Test;Classe publique ParameterByMethodInDataprovider {Pilote WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTestpublic void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);pilote = nouveau FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider")public void testMethodA (String author, String searchKey) lance InterruptedException {WebElement searchText = driver.findElement (Par.nom ("q"));// Rechercher du texte dans la zone de recherchesearchText.sendKeys (searchKey);// Imprimer l'auteur et la chaîne de rechercheSystem.out.println ("Bienvenue ->" + auteur + "Votre clé de recherche est ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("valeur");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Vérifier si la zone de texte google affiche la valeur correcteAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}@Test (dataProvider = "SearchProvider")public void testMethodB (String searchKey) lance InterruptedException {{WebElement searchText = driver.findElement (Par.nom ("q"));// Rechercher du texte dans la zone de recherchesearchText.sendKeys (searchKey);// N'imprime que la chaîne de rechercheSystem.out.println ("Welcome -> Unknown user Votre clé de recherche est ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("valeur");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Vérifier si la zone de texte google affiche la valeur correcteAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Ici, DataProvider renvoie la valeur sur la base du nom de la méthode de test* @param m* @revenir** /@DataProvider (nom = "SearchProvider")Public Object [] [] getDataFromDataprovider (Méthode m) {if (m.getName (). equalsIgnoreCase ("testMethodA")) {retourne un nouvel objet [] [] {{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "USA"}};}autre{retourne un nouvel objet [] [] {{ "Canada" },{ "Russie" },{ "Japon" }};}}}

Voici la sortie

ITestContext - Il peut utiliser pour créer différents paramètres pour les cas de test basés sur des groupes.

Dans la vie réelle, vous pouvez utiliser ITestContext pour faire varier les valeurs de paramètres en fonction des méthodes de test, des hôtes et des configurations du test.

Dans l'exemple de code suivant

  • Nous avons 2 groupes A et B
  • Chaque méthode de test est attribuée à un groupe
  • Si la valeur du groupe est A, un ensemble de données particulier est renvoyé
  • Si la valeur du groupe est B, un autre ensemble de données est renvoyé
paramètres du package;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.firefox.FirefoxDriver;import org.testng.Assert;import org.testng.ITestContext;import org.testng.annotations.BeforeTest;import org.testng.annotations.DataProvider;import org.testng.annotations.Test;Classe publique ParameterByITestContextInDataprovider {Pilote WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTest (groupes = {"A", "B"})public void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);pilote = nouveau FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider", groups = "A")public void testMethodA (String author, String searchKey) lance InterruptedException {{// recherche dans la zone de texte googleWebElement searchText = driver.findElement (Par.nom ("q"));// recherche une valeur dessussearchText.sendKeys (searchKey);System.out.println ("Bienvenue ->" + auteur + "Votre clé de recherche est ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("valeur");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// vérifier la valeur correcte dans la boîte de rechercheAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}@Test (dataProvider = "SearchProvider", groups = "B")public void testMethodB (String searchKey) lance InterruptedException {{// trouver le champ de recherche googleWebElement searchText = driver.findElement (Par.nom ("q"));// recherche une valeur dessussearchText.sendKeys (searchKey);System.out.println ("Welcome -> Unknown user Votre clé de recherche est ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("valeur");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// vérifier la valeur correcte dans la boîte de rechercheAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Ici, le DAtaProvider fournira un tableau d'objets sur la base de ITestContext* @param c* @revenir* /@DataProvider (nom = "SearchProvider")Objet public [] [] getDataFromDataprovider (ITestContext c) {Object [] [] groupArray = null;for (Groupe de chaînes: c.getIncludedGroups ()) {if (group.equalsIgnoreCase ("A")) {groupArray = nouvel objet [] [] {{"Guru99", "India"},{"Krishna", "UK"},{"Bhupesh", "USA"}};Pause;}else if (group.equalsIgnoreCase ("B")){groupArray = nouvel objet [] [] {{ "Canada" },{ "Russie" },{ "Japon" }};}Pause;}return groupArray;}}

Remarque: Si vous exécutez directement votre classe testng, elle appellera d'abord le fournisseur de données qui ne peut pas obtenir d'informations sur les groupes car les groupes ne sont pas disponibles. Mais à la place, si vous appelez cette classe via testng.xml, les informations sur les groupes seront disponibles avec ITestContext. Utilisez le code XML suivant pour appeler le test

Résumé :

  • Le paramétrage est nécessaire pour créer des tests pilotés par les données .
  • TestNG prend en charge deux types de paramétrage, en utilisant @ Parameter + TestNG.xml et en utilisant @DataProvider
  • Dans @ Parameter + TestNG.xml, les paramètres peuvent être placés au niveau de la suite et au niveau du test. Si

    Le même nom de paramètre est déclaré aux deux endroits; Le paramètre de niveau de test aura la préférence sur le paramètre de niveau de combinaison.

  • en utilisant @ Parameter + TestNG.xml, une seule valeur peut être définie à la fois, mais @DataProvider renvoie un tableau 2D d'Object .
  • Si DataProvider est présent dans la classe différente, la classe dans laquelle réside la méthode de test, DataProvider doit être une méthode statique .
  • Il existe deux paramètres pris en charge par DataProvider : Method et ITestContext.