bdd cucumber tutorial with examples
Ce didacticiel détaillé sur le concombre présente BDD et ses avantages, le cadre de concombre, les paramètres environnementaux, la création de scripts de test, les fonctionnalités de concombre, les rapports, etc.:
Le concombre est devenu très populaire et est maintenant largement utilisé dans l'industrie des tests de logiciels.
Conditions préalables - Les destinataires prévus doivent avoir une connaissance de Scrum, Maven, TestNG, etc.
Ce que vous apprendrez:
- Contexte de BDD
- Avantages du développement axé sur le comportement (BDD)
- Outils BDD
- Pourquoi le concombre?
- Comment fonctionne le concombre?
- Paramètres environnementaux
- Rédaction de cas de test à l'aide de concombre
- Création de fichiers pour le concombre
- Caractéristiques du concombre
- TestNG avec concombre
- Conclusion
- lecture recommandée
Contexte de BDD
Dans le cadre TDD de la méthodologie Agile, nous écrivons normalement d'abord les cas de test, puis nous les exécutons. C'est bon pour atteindre la couverture de test et s'assurer que la version est prête pour la production.
Cependant, nous pouvons améliorer le cadre TDD en introduisant des comportements, des fonctionnalités, etc. au test, puis en l'exécutant. Cette amélioration de TDD est appelée BDD (Behavior Driven Development).
Avantages du développement axé sur le comportement (BDD)
Certains avantages de l'utilisation de BDD sont:
#1) Comble le fossé entre les parties prenantes de l'entreprise et l'équipe technique grâce à une plate-forme commune. Par conséquent, la communication entre l'équipe devient plus transparente.
#deux) Les scénarios peuvent être écrits par n'importe qui, y compris des personnes du côté client, un membre de l'équipe commerciale, de la direction, etc. Par conséquent, les exigences, les scénarios sont couverts.
# 3) Les développeurs écriront le code conformément aux scénarios écrits dans le cadre BDD au lieu d'écrire / développer le code selon leur compréhension.
# 4) Les tests deviennent plus précis, le temps passé à la création et à l'exécution d'un test est économisé, les défauts critiques, en particulier ceux qui peuvent avoir un impact sur l'entreprise, peuvent être trouvés dans le front-end lui-même.
# 5) Le code, la documentation relative à BDD sont facilement compréhensibles et maintenables car aucun autre effort n'est requis pour maintenir le code car les documents et son code correspondant sont déjà liés. Par conséquent, ce qui est mentionné dans la documentation, c'est-à-dire les scénarios, aura son code correspondant.
# 6) Puisque nous avons des scénarios compréhensibles très faciles, nous pouvons facilement les diviser en tâches, sous-tâches, etc. de manière logique.
# 7) L'équipe peut être plus dynamique et agile car il y a une clarté initiale sur les scénarios, les critères d'acceptation et une estimation de test presque précise.
# 8) Très bonne plateforme pour un New Joined pour se préparer avec l'équipe existante tant en termes de documentation que de code en raison de sa simplicité.
# 9) Aide non seulement à valider les scénarios (principalement l'interface utilisateur, liés au comportement), mais également dans les cas de test au niveau de l'unité.
# dix) En outre, il est utile de suivre les progrès de l’équipe dès le premier jour, car les exigences et les scénarios sont clairement définis (ce que les développeurs ont généralement du mal à collecter dans TDD).
Par conséquent, la mise en œuvre de BDD supprime l'hypothèse selon laquelle «le client final ne pense pas à l'importance des tests», «le client ne veut pas s'impliquer dans les activités de test», etc.
Outils BDD
Il existe plusieurs outils de test qui nous permettent de mettre en œuvre l'approche BDD.
Tel que:
- Concombre
- SpecFlow
- Jbehave
- Salade
- Concordion
- FitNesse
- BeanSpec
- Facile B
- Jdave
- Givwenzen-flex
- GivWenZen
- Instinct
- Verre à gobelet
- Gospécifier
- Spectaculaire
- dSpec
- Spécifications
- Bifteck
- JSSpec
Parmi les outils ci-dessus, Jbehave fonctionne assez similaire à Cucumber, cependant, ceux-ci sont légèrement différents en termes de mise en œuvre.
JBEHAVE | CONCOMBRE |
---|---|
Prend en charge les sources de données externes | Il ne prend pas en charge les sources de données externes |
Soutient les histoires | Prend en charge les fonctionnalités |
Très bonne documentation | Pas de documentation standard |
Prend en charge les étapes composites | Ne prend pas en charge les étapes composites |
Pas si flexible | Flexible dans le passage des paramètres |
Ne prend pas en charge l'arrière-plan | Prend en charge l'arrière-plan |
Rapports pas si complets | Meilleure flexibilité de mise en forme, rapports intégrés |
Développé avec Java | Développé avec Ruby |
Pourquoi le concombre?
Cucumber est utilisé pour écrire toutes sortes de cas de test, en particulier les cas de test de niveau d'acceptation (dont les utilisateurs finaux sont plus concernés) écrits dans un style de développement axé sur le comportement. Il prend en charge l'utilisation d'analyseurs de langage tels que Gherkin.
À l'origine, Cucumber a été écrit en utilisant le langage de programmation Ruby et a été développé spécialement pour les tests Ruby. Mais maintenant, il est pris en charge par d'autres langages de programmation tels que Java.
Gherkin est utilisé comme langage dans lequel les cas de test sont écrits dans un format simple et peuvent également être lus et modifiés par un utilisateur non technique.
Outre l'anglais, Cucumber prend également en charge d'autres langues.
Comment fonctionne le concombre?
En ce qui concerne son mécanisme de travail, nous laissons d'abord les utilisateurs (techniques / non techniques) écrire leurs cas de test souhaités (en tant que fonctionnalités) en utilisant la syntaxe Gherkin, une fois que cela est fait, nous devons nous assurer qu'ils sont approuvés afin qu'ils puissent aller à le niveau suivant.
Après cela, nous devons implémenter, c'est-à-dire écrire des scripts pour chaque ligne (en utilisant un fichier stepdef) comme mentionné dans le fichier de fonctionnalités. Une fois les codes implémentés, la prochaine chose à faire serait d'exécuter les scripts (en utilisant un fichier runner).
Configuration environnementale
La configuration de l'environnement pour Cucumber est légèrement complexe par rapport à l'utilisation de tout autre outil comme Eclipse ou tout autre IDE.
Défis
Nous devons nous assurer que les versions des bocaux Cucumber correspondent à la version Java installée ainsi qu'à l'EDI dans lequel nous travaillons actuellement.
Paramètres environnementaux
# 1) Plugin Eclipse Cucumber : Cela aide l'Eclipse à comprendre la syntaxe Gherkin et met en évidence la syntaxe du fichier d'entités au lieu d'un texte brut.
Nous devons aller à Eclipse >> Aide >> Installer un nouveau logiciel >> Cliquez sur le bouton Ajouter >> Spécifiez l'emplacement comme ce . Le nom dit «concombre», puis cliquez sur OK et suivez le processus d'installation du reste.
Enfin, redémarrez votre IDE, c'est-à-dire Eclipse.
#deux) Utilisez Maven pour avoir tous les jars, c'est-à-dire les dépendances, les plugins, etc. comme mentionné ci-dessous.
4.0.0 com cucumber.example 0.0.1-SNAPSHOT jar cucumber.example http://maven.apache.org UTF-8 org.seleniumhq.selenium selenium-java 3.6.0 org.seleniumhq.selenium selenium-chrome-driver 3.6.0 info.cukes cucumber-core 1.2.5 info.cukes cucumber-java 1.2.5 test info.cukes cucumber-junit 1.2.5 test junit junit 4.11 test info.cukes cucumber-testng 1.2.0 info.cukes gherkin 2.12.2 provided log4j log4j 1.2.17 org.apache.poi poi-ooxml 3.9 org.apache.poi poi 3.11-beta3 xml-apis xml-apis 2.0.2 xerces xercesImpl 2.8.0 info.cukes cucumber-jvm-deps 1.0.5 provided org.apache.maven.plugins maven-surefire-plugin 2.18 org.apache.maven.surefire surefire-junit47 2.18
# 3) Assurez-vous que nous faisons Ctrl + s ou effectuons l'installation de Maven.
# 4) Après cela, assurez-vous d'exécuter la construction de Maven pour éviter toute erreur liée aux dépendances afin que nous n'ayons plus d'erreurs de dépendance, de plug-in ou d'incompatibilité de version.
mise en œuvre de tri à bulles c ++
# 5) Une fois les étapes ci-dessus terminées, notre environnement est prêt.
Rédaction de cas de test à l'aide de concombre
Le concombre comprend les trois fichiers suivants:
- Fichier de fonctionnalités: Ici, nous écrivons les fonctionnalités à tester au format Gherkin, c'est-à-dire donné quand alors. Nous pouvons même exécuter le fichier de fonctionnalités pour exécuter les scripts de test écrits dans le fichier Stepdef.
- Fichier Stepdef: Une fois que le fichier de fonctionnalités est prêt, chaque phrase du fichier de fonctionnalités peut être implémentée davantage sur le fichier Stepdef.
- Fichier Runner: Il s'agit simplement d'exécuter le script de test réel écrit sur le fichier Stepdef en se référant au fichier de fonctionnalités. En dehors de cela, il dispose de nombreuses autres options de personnalisation, de reporting, d'exécution sélective, etc.
Voici un exemple simple de fichier Runner
package runner; import org.junit.runner.RunWith; import cucumber.api.CucumberOptions; import cucumber.api.junit.Cucumber; @RunWith(Cucumber.class) @CucumberOptions( features='Features', glue='com.Multi', plugin={'html:target/cucumber-html-report', 'json:target/cucumber.json', 'pretty:target/cucumber-pretty.txt','usage:target/cucumber-usage.json', 'junit:target/cucumber- results.xml'}, dryRun = false, monochrome = true, tags={'@Smoke,@Regression'} ) public class Runner { }
Création de fichiers pour le concombre
- Fichier stepdef - Src / test / java >> Nouveau >> Autres >> Concombre >> Classe StepDef.
- Fichier de caractéristiques - Projet >> Nouveau >> Fichier >> spécifiez le nom du fichier avec l'extension '.feature'.
- Fichier Runner - C'est similaire à toute autre création de classe Java mais nous pouvons avoir besoin d'implémenter une méthode ici.
Caractéristiques du concombre
Voici quelques-unes des fonctionnalités de base de Cucumber que nous allons implémenter dans notre script de test.
# 1) Crochets de concombre
Ce sont les blocs du code qui s'exécute avant ou après chaque scénario. Pour que nous puissions les définir, n'importe où dans notre projet. Par exemple, Définition de l'étape.
Selon la définition, ce ne sont que deux annotations @After et @Before. Dans la console, nous pouvons voir les blocs s'exécuter et donner une sortie claire. Nous pouvons également exécuter les hooks pour des balises spécifiques.
# 2) Étiquettes de concombre
Celles-ci sont normalement utilisées sur le fichier d'entités pour classer les scénarios sur les fichiers d'entités selon leur nom de balise donné. Nous pouvons avoir plusieurs balises pour un scénario donné dans le fichier d'entités.
Les balises sont définies par l'utilisateur et nous pouvons lui donner n'importe quel nom tel que @Smoke, @Regression, etc.
# 3) Annotations de concombre
Ceux-ci sont intégrés au concombre. Normalement, les balises sont @Given, @When, @Then.
Cependant, plus tard, si nous en avons besoin, nous pouvons créer notre propre annotation et l'utiliser ensuite dans notre programme. Pendant l'exécution, le code glue correspondant, c'est-à-dire que les fonctions sont écrites dans un fichier Stepdef ayant @Given, @When, @Then sera exécuté.
# 4) Contexte de concombre
Il s'agit d'étapes ou de séries d'étapes communes à tous les scénarios du fichier d'entités.
Cela nous permet d'ajouter du contexte aux scénarios pour une fonctionnalité où elle est définie. Il s'exécute avant chaque scénario pour une fonction dans laquelle il est défini.
# 5) Tableaux de données sur les concombres
Cucumber a la fonctionnalité de prendre en charge les tests basés sur les données, ce qui nous permet d'exécuter automatiquement un cas de test plusieurs fois avec différentes valeurs d'entrée et de validation pour un script donné.
Le concombre prend en charge la table de données. La première ligne est considérée comme la colonne et les lignes à côté sont les données pour les scripts.
# 6) Transposition de concombre
Il s'agit d'une légère modification de la table de données du concombre. Ici, la première colonne serait considérée comme colonne et les colonnes suivantes sont considérées comme des données pour les scripts.
# 7) Scénarios multiples de concombre
Cucumber nous permet de tester plusieurs scénarios sous un seul fichier de fonctionnalités.
# 8) Rapports sur les concombres
Contrairement à la création de rapports et à d'autres outils tiers où nous devons effectuer une configuration pour afficher les rapports.
Ici, dans Cucumber, nous avons des plugins intégrés tels que pretty, JSON, HTML, XML qui nous donnent le rapport complet de l'exécution des tests.
TestNG avec concombre
Nous pouvons toujours exécuter les cas de test JUnit écrits en Cucumber en utilisant TestNG en suivant:
- Nous devons ajouter les dépendances au projet Maven.
- Étendez la classe de la classe Runner en tant que package runner AbstractTestNGCucumberTests.
- Convertissez le projet maven et ajoutez le package (où la classe runner existe).
Après cela, nous pouvons exécuter le cas de test Cucumber entier en tant que TestNG et générer des rapports relatifs au même (si nous avons les écouteurs).
Dans ce didacticiel, nous discuterons de 3 exemples différents de concombre pour couvrir les concepts ci-dessus
Exemple 1
Il couvrira les crochets, les balises, les annotations, l'arrière-plan, plusieurs scénarios et TestNG avec Cucumber.
Une fois l'environnement de test configuré:
- Ajoutez le plugin Eclipse Cucumber dans Eclipse.
- Créez un projet Maven et ajoutez-y toutes les dépendances requises et ajoutez également une dépendance liée à TestNG dans Maven.
- Créez un nouveau fichier d'entités.
- Ajoutez l'implémentation requise dans le fichier Stepdef.
- Créez maintenant un fichier d'exécution avec étend AbstractTestNGCucumberTests.
- Convertissez le projet Maven en TestNG et dans le testng.xml ajoutez le chemin du package de la classe runner Cucumber.
- Exécutez le fichier TestNG.xml.
Fichier de caractéristiques
Fonctionnalité:
En tant qu'utilisateur
Je souhaite pouvoir ajouter de nouveaux clients dans le système
Afin que je puisse ajouter des données comptables pour ce client
Fond:
Étant donné que je suis sur la page d'accueil de Github
Lorsque je spécifie le nom d'utilisateur comme «xxxxxxxxxxxxxxxxxxxx» et le mot de passe comme «xxx»
Et cliquez sur le bouton Connexion
@Fumée
Scénario: Modifier le profil
Étant donné que je clique sur l'option Votre profil
Lorsque je clique sur le bouton Modifier le profil
Et a téléchargé une nouvelle image
Alors je devrais voir une nouvelle photo de profil
@Régression à chaque fois
Scénario: Créer un nouvel élément
Étant donné que je clique sur l'option Your Gists
Lorsque je fournis le nom du fichier, la description
Et cliquez sur Create public gist method
Alors je devrais voir le nouveau sens
Fichier Stepdef
package com.Multi; import cucumber.api.PendingException; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; import cucumber.api.java.en.When; import cucumber.api.java.After; import cucumber.api.java.Before; import cucumber.api.java.en.But; import java.util.List; import cucumber.api.PendingException; import cucumber.api.java.it.Data; import cucumber.runtime.ScenarioImpl; import gherkin.formatter.model.Scenario; import gherkin.formatter.model.ScenarioOutline; import cucumber.api.DataTable; import org.junit.Assert; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.interactions.Actions; import cucumber.api.cli.Main; public class Step2 { static public String sb; static public String sa; static WebDriver driver = null; @Before('@Smoke,@Regression') public void beforeScenario(){ System.out.println('New scenario begins'); } @After('@Smoke,@Regression') public void afterScenario(){ System.out.println('Scenario ends'); } @MyAnnotation public static void myanno() { System.out.println('my annot gets executed'); } @Given('^I am on Github home page$') public void i_am_on_Github_home_page(){ String site = 'https://www.github.com/login'; System.setProperty('webdriver.chrome.driver', 'Executables\chromedriver.exe'); driver = new ChromeDriver(); driver.navigate().to(site); //driver.findElement(By.cssSelector('a(contains(@href, 'login'))').click(); // Write code here that turns the phrase above into concrete actions } @When('^I specify Username as '((^')*)' and Password as '((^')*)'$') public void i_specify_Username_as_and_Password_as(String arg1, String arg2){ driver.findElement(By.cssSelector('input#login_field')).sendKeys(arg1); driver.findElement(By.cssSelector('input#password')).sendKeys(arg2); // Write code here that turns the phrase above into concrete actions } @When('^Click on SignIn button$') public void click_on_SignIn_button(){ driver.findElement(By.cssSelector('input.btn')).click(); // Write code here that turns the phrase above into concrete actions } @Given('^I click on Your Profile option$') public void i_click_on_Your_Profile_option(){ driver.findElement(By.xpath('//*(@id='user -links')/li(3)/details/summary/img')).click(); List olist = driver.findElements(By.xpath('//*(@id= 'user-links')/li(3)/details/ul/li/a(@class='dropdown-item')')); for(WebElement o:olist) { if(o.getText().equals('Your profile')) { o.click(); break; } } // Write code here that turns the phrase above into concrete actions } @When('^I click on edit profile button$') public void i_click_on_edit_profile_button(){ driver.findElement(By.xpath('//*(@id='js-pjax -container')/div/div(2)/div(1)/a')).click(); // Write code here that turns the phrase above into concrete actions } @When('^Uploaded new picture$') public void uploaded_new_picture() throws InterruptedException{ WebElement s1 = driver.findElement(By.xpath('//*(@class='avatar-upload -container clearfix')/Img')); sb=s1.getAttribute('src'); System.out.println(s1.getAttribute('src')); driver.findElement(By.id('upload-profile -picture')).sendKeys('D://cucumberFinal//multiple//Files//images.jpg'); Thread.sleep(10000); String wh = driver.getWindowHandle(); driver.switchTo().window(wh); Actions actions = new Actions(driver); WebElement element = driver.findElement(By.xpath('//div(@class='facebox -content')/form/div(3)/button')); Thread.sleep(10000); actions.moveToElement(element); //Thread.sleep(10000); actions.click(); //actions.sendKeys('GIST1 Description'); actions.build().perform(); // driver.findElement(By.xpath('//div(@class='facebox -content')/form/div(3)/button')).click(); Thread.sleep(3000); // Write code here that turns the phrase above into concrete actions } @Then('^I should be seeing new profile picture$') public void i_should_be_seeing_new_profile_picture(){ WebElement s1 = driver.findElement(By.xpath('//*(@class='avatar-upload -container clearfix')/Img')); sb=s1.getAttribute('src'); System.out.println(s1.getAttribute('src')); if(!(sb.equals(sa))) { Assert.assertTrue('File Upload successful', true); } // Write code here that turns the phrase above into concrete actions } @Given('^I click on Your Gists option$') public void i_click_on_Your_Gists_option(){ driver.findElement(By.xpath('//*(@id='user-links')/li(3)/details/summary/img')).click(); List olist = driver.findElements(By.xpath('//*(@id= 'user-links')/li(3)/details/ul/li/a(@class='dropdown-item')')); for(WebElement o:olist) { if(o.getText().equals('Your Gists')) { o.click(); break; } } // Write code here that turns the phrase above into concrete actions } @When('^I provide filename, description$') public void i_provide_filename_description() throws InterruptedException { // Write code here that turns the phrase above into concrete actions driver.findElement(By.xpath('//div(@class='edit container')/div(@id='gists')/input')).sendKeys('Gist1'); Thread.sleep(2000); Actions actions = new Actions(driver); WebElement element = driver.findElement(By.xpath('//*(@id='gists')/div(2)/div/div(2)/div/div(5)/div(1)/ div/div/div/div(5)/div/pre/span')); actions.moveToElement(element); actions.click(); actions.sendKeys('GIST1 Description'); actions.build().perform(); // driver.findElement(By.xpath('//*(@id='gists')/div(2)/div/div(2)/div/div(5)/div(1)/ div/div/div/div(5)/div/pre/span')).sendKeys('GIST1 Description'); Thread.sleep(2000); } @When('^click on Create public gist method$') public void click_on_Create_public_gist_method() { driver.findElement(By.xpath('//*(@id='new_gist')/div(2)/div(2)/button(1)')).click(); // Write code here that turns the phrase above into concrete actions } @Then('^i should be seeing the new gist$') public void i_should_be_seeing_the_new_gist(){ List glist = driver.findElements(By.xpath('//div(@class='container repohead-details- container')/ul(1)/li(@class='flex-auto')/div/a')); for(WebElement o:glist) { if(o.getText().equals('Gist1')) { System.out.println('Gist created successfully'); } } // Write code here that turns the phrase above into concrete actions } }
Voici le résultat du test de TestNG XML
Le rapport TestNG par défaut ressemble à celui ci-dessous.
Exemple 2
Il couvrira les tableaux de données et les transposera.
Une fois l'environnement configuré:
- Ajoutez le plugin Eclipse Cucumber dans Eclipse.
- Créez un projet Maven et ajoutez-y toutes les dépendances requises.
- Créez un nouveau fichier d'entités.
- Ajoutez l'implémentation requise dans le fichier stepdef.
- Exécutez directement à partir du fichier de fonctionnalités en cliquant avec le bouton droit sur le fichier >> Exécuter en tant que >> Cucumber.feature
Fichier de fonctionnalités
Fonctionnalité: Titre de votre long métrage
Je souhaite utiliser ce modèle pour mon fichier d'entités
Fond:
Étant donné que je suis sur la page de connexion Gmail
Lorsque je spécifie le nom d'utilisateur et le mot de passe
Et cliquez sur le bouton Connexion
Scénario: Créer un nouveau message à partir de la table de données
Lorsque je suis sur une nouvelle page e-mail
Et je précise les détails suivants
| To1 | Sujet |
| Person1@email.com | Sujet Person1 |
| Person2@email.com | Sujet Person2 |
Scénario: Créer un nouveau message à partir de la table de données transposée
Lorsque je suis sur une nouvelle page e-mail
Et je spécifie les détails suivants de la table de transposition
| To1 | Person1@email.com | Person2@email.com |
| Sujet | Sujet Person1 | Sujet Person2 |
Fichier stepdef
package com.datatable; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.time.*; import org.openqa.selenium.By; import org.openqa.selenium.Keys; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.interactions.Actions; import cucumber.api.DataTable; import cucumber.api.Transpose; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; import cucumber.api.java.en.When; import gherkin.formatter.model.Examples; import cucumber.runtime.CucumberException; import cucumber.runtime.ParameterInfo; import cucumber.runtime.xstream.LocalizedXStreams; public class Step3 { static public WebDriver driver; @Given('^I am on Gmail login page$') public void i_am_on_Gmail_login_page() throws InterruptedException{ System.setProperty('webdriver.chrome.driver', 'Executables/chromedriver.exe'); driver= new ChromeDriver(); Actions act = new Actions(driver); driver.manage().window().maximize(); driver.navigate().to('https://www.google.com/gmail/about'); driver.findElement(By.xpath('//nav/div/a(2)')).click(); Thread.sleep(3000); } @When('^I specify Username and Password$') public void i_specify_Username_and_Password() throws InterruptedException{ driver.findElement(By.xpath('//input(@type='email')')).sendKeys('xxxxxx@xxx. com'); driver.findElement(By.xpath('//*(@id='identifierNext')/content/span')).click(); Thread.sleep(3000); driver.findElement(By.xpath('//input(@type='password')')).sendKeys('xxxxxxxx xxx'); } @When('^Click on SignIn button$') public void click_on_SignIn_button() throws InterruptedException{ driver.findElement(By.xpath('//*(@id='passwordNext')/content/span')).click(); Thread.sleep(5000); } @When('^I am on New Email Page$') public void i_am_on_New_Email_Page(){ } @When('^I specify following details$') public void i_specify_following_details(DataTable tables)throws Throwable{ for (Map row : tables.asMaps(String.class, String.class)) { driver.findElement(By.xpath('//*(@id=':x4')/div/div')).click(); //driver.switchTo(). System.out.println(row.get('To1')); System.out.println(row.get('Subject')); String whandle = driver.getWindowHandle(); driver.switchTo().window(whandle); driver.findElement(By.xpath('//td(@class='eV')/div(1)/div/textarea')).sendKeys (row.get('To1')); driver.findElement(By.xpath('//table(@class='aoP aoC bvf')/tbody/tr/td/form/div(3)/input')).sendKeys(row.get('Subject')); driver.findElement(By.xpath('//table(@class='IZ')/tbody/tr/td/div')).click(); Thread.sleep(3000); } } @When('^I specify following details from transpose table$') public void i_specify_following_details_from_transpose_table(DataTable tables) throws InterruptedException { // DataTable tables = null; for (Map row : tables.transpose().asMaps(String.class, String.class)) { driver.findElement(By.xpath('//*(@id=':x4')/div/div')).click(); //driver.switchTo(). Thread.sleep(2000); System.out.println(row.get('To1')); System.out.println(row.get('Subject')); String whandle = driver.getWindowHandle(); driver.switchTo().window(whandle); driver.findElement(By.xpath('//td(@class='eV')/div(1)/div/textarea')).sendKeys (row.get('To1')); Thread.sleep(3000); driver.findElement(By.xpath('//table(@class='aoP aoC bvf')/tbody/tr/td/form/div(3)/input')).click(); driver.findElement(By.xpath('//table(@class='aoP aoC bvf')/tbody/tr/td/form/div(3)/input')).sendKeys(row.get('Subject')); Thread.sleep(3000); driver.findElement(By.xpath('//table(@class='IZ')/tbody/tr/td/div')).click(); Thread.sleep(3000); } } @When('^then click on Send button$') public void then_click_on_Send_button(){ // Write code here that turns the phrase above into concrete actions } @Then('^I should be able to send the email successfully$') public void i_should_be_able_to_send_the_email_successfully() { // Write code here that turns the phrase above into concrete actions }
Production : Ainsi, l'exemple ci-dessus doit se connecter à Gmail et envoyer deux e-mails pour chaque scénario qui concerne la table de données et la table de données transposées.
Exemple 3
Il couvrira les rapports.
Une fois l'environnement configuré:
- Ajoutez le plugin Eclipse Cucumber dans Eclipse.
- Créez un projet Maven et ajoutez-y toutes les dépendances requises.
- Créez un nouveau fichier d'entités.
- Ajoutez l'implémentation requise dans le fichier Stepdef.
- Créez une classe de coureur et exécutez la classe de coureur.
- Consultez tous les types de rapports.
Fichier de caractéristiques
Fonctionnalité: Titre de votre long métrage
Je souhaite utiliser ce modèle pour mon fichier d'entités
@ tag1
Scénario: Titre de votre scénario
Étant donné que je suis sur la page d'accueil de Github
Lorsque je spécifie le nom d'utilisateur et le mot de passe
Et cliquez sur le bouton Connexion
Ensuite, je devrais pouvoir voir l'option de déconnexion
Fichier Stepdef
package com.cucumber; import cucumber.api.PendingException; import cucumber.api.java.en.Given; import cucumber.api.java.en.Then; import cucumber.api.java.en.When; import cucumber.api.java.en.But; import java.util.List; import cucumber.api.PendingException; import cucumber.api.java.it.Data; import cucumber.api.DataTable; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.firefox.FirefoxDriver; import cucumber.api.cli.Main; public class Step1 { static WebDriver driver = null; @Given('^I am on Github home page$') public void i_am_on_Github_home_page(){ String site = 'https://www.github.com/login'; System.setProperty('webdriver.chrome.driver', 'Executables\chromedriver.exe'); driver = new ChromeDriver(); driver.navigate().to(site); //driver.findElement(By.cssSelector('a(contains(@href, 'login'))').click(); // Write code here that turns the phrase above into concrete actions } @When('^I specify Username and Password$') public void i_specify_Username_and_Password() { driver.findElement(By.cssSelector('input#login_field')).sendKeys('chintamoni .patra@gmail.com'); driver.findElement(By.cssSelector('input#password')).sendKeys('Test@123'); // Write code here that turns the phrase above into concrete actions } @When('^Click on SignIn button$') public void click_on_SignIn_button(){ driver.findElement(By.cssSelector('input.btn')).click(); // Write code here that turns the phrase above into concrete actions } @Then('^I should be able to see logout option$') public void I_should_be_able_to_see_logout_option() throws InterruptedException{ driver.findElement(By.xpath('//*(@id='user -links')/li(3)/details/summary/img')).click(); WebElement opt = driver.findElement(By.xpath('//*(@id='user- links')/li(3)/details/ul/li')); List olist = opt.findElements(By.xpath('//li/form/button')); for(WebElement o : olist) { System.out.println(o); } //int a = olist.size(); System.out.println(olist.get(0).getText()); olist.get(0).click(); Thread.sleep(2000); // Write code here that turns the phrase above into concrete actions } }
Voici les différents types de rapports générés par Cucumber:
Rapport HTML
Jolie
Junit
Conclusion
Étant un outil open-source, Cucumber est largement utilisé dans BDD. Et il est très facile à comprendre et il a beaucoup de possibilités en ce qui concerne les nouvelles fonctionnalités et il est pratiquement possible d'intégrer Cucumber avec Selenium ou tout autre outil / bocal tiers, etc.
Comme il a des groupes / membres d'aide actifs, il devient vraiment facile pour tous ceux qui viennent de commencer à apprendre le concombre ou pour ceux qui ont des connaissances intermédiaires en concombre / BDD.
Cucumber prend également en charge l'intégration avec la feuille Excel et Jenkins.
lecture recommandée
- Tutoriel Cucumber Selenium: Intégration Cucumber Java Selenium WebDriver
- Tutoriel Python DateTime avec des exemples
- Test de l'API REST avec le concombre à l'aide de l'approche BDD
- Test d'automatisation à l'aide de l'outil Cucumber et du sélénium - Tutoriel Selenium # 30
- Tutoriel de concombre Gherkin: Test d'automatisation à l'aide de Gherkin
- Tutoriel de script Unix Shell avec exemples
- Tutoriel de recherche d'élément par texte Selenium avec des exemples
- Mot-clé Java 'this': Tutoriel avec des exemples de code