specflow selenium webdriver end end example
End to End Eksempel på brug af Specflow & Selen Webdriver:
I denne Gratis Specflow-træningsserie , til Kort introduktion til Specflow blev givet i vores tidligere tutorial.
I denne artikel vil vi se et eksempel fra slutning til slut på brug af Specflow-baserede BDD-specifikationer, og testene udføres via Selenium Webdriver.
Testene kunne være lige så enkle som at teste login-funktionaliteten i en applikation. Det er bare det, vi vil beskrive disse tests ved hjælp af Specflow, og trinimplementeringerne bruger Selenium-driver og -kommandoer og NUnit som påstandsramme.
Vi bruger også NUnit-baseret Specflow runner (i modsætning til Specrun, som ikke er open source og introducerer en tilfældig forsinkelse i den gratis version).
Hvad du lærer:
Videoundervisning: Specflow og selen
Se videoundervisningen om Specflow og Selen:
hvad er regressionstest i qa
Lad os komme igang.
For at komme i gang, lad os oprette et enhedstestprojekt i Visual Studio og installere følgende forudsætninger:
# 1) Opret et enhedstestprojekt
Installer Nuget-pakke til Nunit og Specflow.
Install-Package Specflow.NUnit
# 2) Installer Seleniums Webdriver til Chrome-browser.
Dette kan også installeres via Nuget Package Manager-konsol via nedenstående kommando.
Install-Package Selenium.WebDriver.ChromeDriver
# 3) Installer Selenium Webdriver-biblioteker og Selenium Wait-hjælpere til tilføjelse af ExpectedCondition-ventetid.
Install-Package Selenium.WebDriver Install-Package DotNetSeleniumExtras.WaitHelpers
# 4) Fjern nu test.cs-filen fra det projekt, der oprettes automatisk.
Vi gør dette trin for at undgå enhver forvirring, da vi bruger funktionsfiler og trindefinitionsfiler til Specflow.
# 5) Opret mapper til funktioner og trindefinitioner for at gemme implementeringsfiler for funktion og trindefinition.
Dette er ikke et obligatorisk trin, men det er nyttigt at organisere funktionerne og trinimplementeringerne i separate mapper.
# 6) I slutningen af ovenstående trin skal løsningsstrukturen og pakkerne.config se ud som vist nedenfor.
Feature og trinimplementering
Lad os nu komme i gang med funktionsfilen og den faktiske trinimplementering.
Om funktionen - Eksempelfunktionen vil være at teste / validere søgefunktionaliteten på Youtube-webstedet. Vi vil søge efter et nøgleord og hævde, at brugeren blev omdirigeret til søgeresultatsiden.
Tilføj en ny funktionsfil, og navngiv den som YoutubeSearchFeature.feature
Tilføj et søgefunktionalitetsscenarie og funktionsbeskrivelse som vist nedenfor:
Feature: YoutubeSearchFeature In order to test search functionality on youtube As a developer I want to ensure functionality is working end to end @mytag Scenario: Youtube should search for the given keyword and should navigate to search results page Given I have navigated to youtube website And I have entered India as search keyword When I press the search button Then I should be navigate to search results page
Ovenstående scenario forventer, at testen:
- Naviger til Youtube-webstedet: Dette kræver en webautomatiseringsramme som Selenium, som bruger en Webdriver til at navigere til en webside i en browser.
- Søg efter et nøgleord: Dette trin indebærer at kigge efter passende inputelementer og knapper for at indtaste nøgleordet og udføre henholdsvis søgningen.
- Gør gældende, at søgeresultaterne vises, og at brugeren er på resultatsiden: Dette trin involverer påstande om verificering af, om brugeren landede på den rigtige side.
Lad os nu se trinimplementeringerne hvert trin.
Før det skal vi forstå, hvordan vi integrerer Selen-logik / kode i den eksisterende Specflow-definition.
Selen eller ethvert andet værktøj (eller enhedstest stubs / mocks / drivere osv.) er i det væsentlige en mellemliggende del af Step Execution, men nøglen til at forstå er måden at integrere begge disse rammer på.
Specflow giver brugerne mulighed for at skrive testspecifikationer. Det dikterer ikke det værktøj, der skal bruges. Derfor er testudvikleren fri til at vælge så mange testværktøjer, som han vil afhænge af, hvilken brugssag der løses.
For at bruge Selen i dette scenarie har vi brug for følgende:
- En forekomst af WebDriver (vi bruger ChromeDriver for enkelhedens skyld), som gør det muligt for brugeren at navigere til websiden ved hjælp af en browser i henhold til driverimplementering.
- Få WebElement-erklæringer (og kan kun gøres som en del af trinimplementeringer), som er nødvendige for at interagere med brugeren og videregive input og udføre handlinger osv.
- Få påstande om vinduetitel, webadresser osv., Som kan udføres på driverinstans.
Vi opretter en forekomst af ChromeWebdriver i Step Implementations-filen.
Lad os derfor oprette Step Definition-filen. Som vi så i den sidste artikel, giver Specflow en mekanisme til automatisk at generere trindefinitionerne (som senere kan tilpasses / ændres efter behov).
- Naviger til funktionsfilen, højreklik og vælg 'Generer trindefinitioner'.
- Opret en ny fil i StepDefinitions-mappen, som vi oprettede tidligere, og navngiv filen som YoutubeSearchFeatureSteps.cs
- Sørg for, at alle trin i scenariet er bundet korrekt til trindefinitionerne.
Tip - Ændring af automatisk genererede trindefinitioner:
Hvis du nu omhyggeligt observerer, trindefinitionen, der blev genereret til vores søgeordstrin, dvs. 'Jeg har indtastet Indien som søgeord', den auto-genererede kode, identificerer / adskiller ikke søgeordet og parametriserer det derfor ikke.
(Given(@&'I have entered India as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword() { ScenarioContext.Current.Pending(); }
Men det er ikke det, vi ønsker. Vi har brug for at søgeordet skal parametriseres, ellers bliver vi nødt til at oprette en tilpasset trindefinition for hver søgeordsøgning.
Så lad os se, hvordan man ændrer denne trindefinition til en mere generisk, hvilket gør det muligt at parametrere søgeordet. Dette kan gøres gennem simpel regex-matcher.
Se nedenstående kodeeksempel. Vi har erstattet søgeordet gennem en regex-matcher, dvs. (. *) ”Hvad dette vil gøre er, at det vil erstatte værdien af ethvert nøgleord, som du sender fra scenariet, og indstille værdien for søgeordet i inputparameteren med navnet“ searchString ”i nedenstående kodeeksempel.
(Given(@'I have entered (.*) as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword(String searchString) { ScenarioContext.Current.Pending() }
På denne måde holder den koden modulær og undgår gentagen kedelpladekode for hver trinimplementering.
Selenintegration og trindefinitionslogik
Lad os nu se den faktiske integration af Selen med Specflow. Når trindefinitionerne er genereret, vil vi nu tilføje kode til dem for at udføre den aktuelle testscenarie.
Lad os se, hvor vi kan placere og initialisere Selenium-driverforekomsten, så den er tilgængelig i hele scenarieudførelsen. Vi placerer driveren som et privat felt i den bindende klasse, der blev genereret. Føreren initialiseres som en del af klassekonstruktøren.
På denne måde forbliver driveren initialiseret i hele løbet af testen, da vi bare har en bindende fil til alle trin (og den initialiseres, før testudførelsen starter).
Bemærk også, at vi også vil implementere Kan ikke bruges interface for at bortskaffe driverinstansen, hvorefter den ikke længere er påkrævet. Placering af den i bortskaffelsesmetoden () vil garantere, at når klassens objekt bliver bortskaffet, kan føreren også bortskaffes.
Sådan ser koden til erklæring og initialisering af WebDriver-instans ud:
(Binding) public class YoutubeSearchFeatureSteps : IDisposable { private String searchKeyword; private ChromeDriver chromeDriver; public YoutubeSearchFeatureSteps() => chromeDriver = new ChromeDriver(); //... other Step defintion implementations public void Dispose() { if(chromeDriver != null) { chromeDriver.Dispose(); chromeDriver = null; } } }
Med ovenstående kan driverinstansen bruges som en del af enhver trinimplementering, der er en del af scenarieudførelsen.
Lad os nu se trinimplementeringen af hvert enkelt scenarie.
# 1) Arranger trin:
Given I have navigated to youtube website And I have entered India as search keyword
Begge disse trin involverer interaktion med driverinstansen. Det første trin åbner browservinduet og navigerer til youtube-webstedet
Det andet trin ser efter knappen til indtastning af søgning og indtaster 'Indien' som søgeord.
Nedenfor er implementeringen af begge disse trin:
((Given(@'I have navigated to youtube website')) public void GivenIHaveNavigatedToYoutubeWebsite() { chromeDriver.Navigate().GoToUrl('https://www.youtube.com'); Assert.IsTrue(chromeDriver.Title.ToLower().Contains('youtube')); } 7. (Given(@'I have entered (.*) as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword(String searchString) { this.searchKeyword = searchString.ToLower(); var searchInputBox = chromeDriver.FindElementById('search'); var wait = new WebDriverWait(chromeDriver, TimeSpan.FromSeconds(2)); wait.Until(ExpectedConditions.ElementIsVisible(By.Id('search'))); searchInputBox.SendKeys(searchKeyword); }
I det første trin skal du bemærke påstanden om, at den sikrer, at navigationen til youtube var vellykket ved at kontrollere vinduetitlen.
Bemærk: Der kan være forskellige måder at placere påstande på forskellige webelementer eller driveregenskaber, men det endelige mål med denne vejledning er bare at illustrere med den mest forenklede måde.
I det andet trin har vi tilføjet en dynamisk ventetid ved hjælp af ExpectedConditions hvilket vil sikre, at søgefeltet er synligt, før koden forsøger at indtaste søgeordet.
Vi gemmer også searchString i en privat feltsøgning Nøgleord. Dette gøres, så searchKeyword også kan bruges i andre trinimplementeringer.
Tip - videregivelse af data på tværs af trinene
Videregivelse / lagring af data ved denne tilgang (dvs. gennem klassevariabler) er et af de metoder, hvormed data kan deles på tværs af trinbindinger.
Der er andre måder at gøre dette på, ligesom Specflow i sig selv giver et dynamisk ordbogobjekt kaldet ScenarioContext. Vi vil se flere detaljer om dette i de kommende artikler.
# 2) Handlingstrin
When I press the search button
Lad os nu se på den aktuelle handling, som klikker på knappen Søg. Trinimplementeringsfilen vil søge efter søgeknappen og klikke på den for at udføre scenarietrinet.
Koden til dette trin ser ud som vist nedenfor:
(When(@'I press the search button')) public void WhenIPressTheSearchButton() { var searchButton = chromeDriver.FindElementByCssSelector('button#search-icon-legacy'); searchButton.Click(); }
# 3) Endelig Assert Step:
Then I should navigate to search results page
I dette trin kontrollerer vi bare fra driveregenskaberne, om URL'en og sidetitlen indeholder søgeordet eller ej.
Koden til dette trin vises nedenfor:
(Then(@'I should be navigate to search results page')) public void ThenIShouldBeNavigateToSearchResultsPage() { // After search is complete the keyword should be present in url as well as page title` Assert.IsTrue(chromeDriver.Url.ToLower().Contains(searchKeyword)); Assert.IsTrue(chromeDriver.Title.ToLower().Contains(searchKeyword)); }
Udførelse
Lad os nu prøve at udføre scenariet og se resultaterne. Når scenariet er udført, udføres alle scenarie trin sekventielt. Testen åbner en browser, navigerer til et websted og udfører derefter en handling.
Testens output kan ses ved at klikke på “Output” -knappen fra testoversigten, som viser succes / fiasko for hvert enkelt trin.
Tips
Mellemliggende manglende trin
I tilfælde af et scenarie, der har mellemliggende trin, der mislykkes, skal du være opmærksom på, at Specflow i disse scenarier simpelthen ikke udfører nogen resterende trin i dette scenario og markerer resultatet af testen som mislykket.
hvordan man finder sikkerhedsnøgle til wifi
Kører tests med NUnit Adapter
Til dette eksempel har vi udført vores tests ved hjælp af Specflow.NUnit testkøreren (som vi havde installeret via Nuget Package Manager).
Dette er anderledes på få måder som vist nedenfor fra Specrun-løberen, som vi havde brugt i den tidligere artikel.
- Specflow.NUnit runner er open source.
- Det indfører ikke nogen forsinkelse under udførelsen af testene.
Konklusion
I denne artikel så vi et ende-til-slut-eksempel på integration af selen med Specflow-rammer gennem et simpelt testscenarie med en videosøgning i Youtube-applikationen.
Mens vi integrerede Selen, gik vi også igennem, hvordan vi deler data på tværs af forskellige bindinger gennem private klassefelter. Vi dækkede også kørsel af testen på NUnit runner vs Specrun runner og sammenlignede begge i detaljer.
Kode filer
YoutubeSearchFeature.feature
Feature: YoutubeSearchFeature In order to test search functionality on youtube As a developer I want to ensure functionality is working end to end @mytag Scenario: Youtube should search for the given keyword and should navigate to search results page Given I have navigated to youtube website And I have entered India as search keyword When I press the search button Then I should be navigate to search results page
YoutubeSearchFeatureSteps.cs
using NUnit.Framework; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using OpenQA.Selenium.Support.UI; using SeleniumExtras.WaitHelpers; using System; using System.Collections.Generic; using System.Linq; using TechTalk.SpecFlow; namespace SepcflowSelenium.StepDefinitions { (Binding) public class YoutubeSearchFeatureSteps : IDisposable { private String searchKeyword; private ChromeDriver chromeDriver; public YoutubeSearchFeatureSteps() => chromeDriver = new ChromeDriver(); (Given(@'I have navigated to youtube website')) public void GivenIHaveNavigatedToYoutubeWebsite() { chromeDriver.Navigate().GoToUrl('https://www.youtube.com'); Assert.IsTrue(chromeDriver.Title.ToLower().Contains('youtube')); } (Given(@'I have entered (.*) as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword(String searchString) { this.searchKeyword = searchString.ToLower(); var searchInputBox = chromeDriver.FindElementById('search'); var wait = new WebDriverWait(chromeDriver, TimeSpan.FromSeconds(2)); wait.Until(ExpectedConditions.ElementIsVisible(By.Id('search'))); searchInputBox.SendKeys(searchKeyword); } (When(@'I press the search button')) public void WhenIPressTheSearchButton() { var searchButton = chromeDriver.FindElementByCssSelector('button#search-icon-legacy'); searchButton.Click(); } (Then(@'I should be navigate to search results page')) public void ThenIShouldBeNavigateToSearchResultsPage() { System.Threading.Thread.Sleep(2000); // After search is complete the keyword should be present in url as well as page title` Assert.IsTrue(chromeDriver.Url.ToLower().Contains(searchKeyword)); Assert.IsTrue(chromeDriver.Title.ToLower().Contains(searchKeyword)); } public void Dispose() { if(chromeDriver != null) { chromeDriver.Dispose(); chromeDriver = null; } } } }
Se vores kommende tutorial for at vide mere om Shared & Scoped Bindings, Hooks and Step Reuse in Specflow!
PREV-vejledning | NÆSTE vejledning
Anbefalet læsning
- Agurk Selen Tutorial: Agurk Java Selen WebDriver Integration
- Introduktion til Selen WebDriver - Selen Tutorial # 8
- Integration af Jenkins med Selen WebDriver: Trin-for-trin vejledning
- Implementering af vores første WebDriver Script - Selenium WebDriver Tutorial # 10
- Sådan håndteres alarmer / pop op i Selen WebDriver - Selen Tutorial # 16
- WebDriver hele opsætningen og installationen med Eclipse - Selenium-tutorial # 9
- Kontroller synligheden af webelementer ved hjælp af forskellige typer WebDriver-kommandoer - Selen-vejledning nr. 14
- GeckoDriver Selen Tutorial: Sådan bruges GeckoDriver i Selenium-projekter