Opbygning af en datadrevet, nøgleordsdrevet og hybrid selen-ramme

Denne blog forklarer, hvad der er en Selen-ramme, dens fordele, og hvordan man implementerer Data Driven, Keyword Driven & Hybrid rammer i selen.

Den forrige i denne serie har givet dig eksponering for grundlæggende begreber i Selen-test.I denne blog vil jeg dog fortælle dig, hvordan du bruger en Selen-ramme til at optimere din kodestruktur, og dette vil bringe dig tættere på at blive en .



Hvad er en Selen-ramme?

Selen-framework er en kodestruktur, der gør vedligeholdelse af kode enklere og bedre kodelæsbarhed. En ramme indebærer at bryde hele koden i mindre stykker kode, som tester en bestemt funktionalitet.

Koden er struktureret således, at 'datasættet' er adskilt fra den aktuelle 'test case', som vil teste webapplikationens funktionalitet. Det kan også struktureres på en måde, hvor testtilfældene, der skal udføres, kaldes (påberåbes) fra en ekstern applikation (som et .csv).

Der er en række rammer derude, men 3 almindeligt anvendte Selen-rammer er:



Disse rammer vil blive diskuteret med en demo i denne blog. Men før jeg går videre, lad mig fortælle dig, hvorfor en Selen-ramme skal være på plads, og hvilke fordele du får ud af at bruge dem.

typer sæt i java

Hvorfor har vi brug for en selen-ramme?

Uden en ramme på plads vil der være en testcase, der vil omfatte hele testfunktionaliteten. Den skræmmende del er, at denne enkelt test sag har evnen til at stige op til en million linjer kode. Så det er temmelig indlysende, at en testkasse så enorm vil være svær at læse. Selvom du vil ændre nogen funktionalitet senere, har du svært ved at ændre koden.

Da implementeringen af ​​en ramme vil resultere i mindre, men flere kodestykker, er der forskellige fordele.



Fordele ved Selen-rammen

  • Øget genanvendelse af kode
  • Forbedret kodelæsbarhed
  • Højere bærbarhed
  • Reduceret scriptvedligeholdelse

Nu hvor du kender de grundlæggende rammer, så lad mig forklare dem hver i detaljer.

Datadrevet ramme

En datadrevet ramme i selen er teknikken til at adskille 'datasættet' fra den aktuelle 'test case' (kode). Denne ramme afhænger fuldstændigt af input-testdataene. Testdataene tilføres fra eksterne kilder såsom en excel-fil, .CSV-fil eller en hvilken som helst database.

datadrevet ramme - selen ramme - edureka

Da testtilfælde er adskilt fra datasættet, kan vi nemt ændre testtilfælde for en bestemt funktionalitet uden at foretage engrosændringer i din kode. For eksempel, hvis du vil ændre koden for login-funktionalitet, kan du bare ændre det i stedet for også at skulle ændre enhver anden afhængig del i den samme kode.

Udover dette kan du også nemt kontrollere, hvor meget data der skal testes. Du kan nemt øge antallet af testparametre ved at tilføje flere brugernavn og adgangskodefelter til excel-filen (eller andre kilder).

For eksempel, hvis jeg skal kontrollere login til en webside, så kan jeg opbevare sæt brugernavn og adgangskode i en excel-fil og videregive legitimationsoplysningerne til koden for at udføre automatisering i browseren i en separat Java-klassefil.

Brug af Apache POI med Selen WebDriver

WebDriver understøtter ikke direkte læsning af excel-filer. Derfor bruger vi Apache IP til læsning / skrivning til ethvert Microsoft Office-dokument. Du kan downloade Apache POI (sæt JAR-filer) fra her . Download zip-filen eller tarfilen efter dine krav, og placer dem sammen med sættet af Selen JAR'er.

Koordineringen mellem hovedkoden og datasættet vil blive taget hånd om TestNG-dataudbydere, som er et bibliotek, der kommer som en del af Apache POI JAR-filerne. Til demo-formål har jeg oprettet en excel-fil kaldet “LoginCredentials”, hvor brugernavne og adgangskoder er gemt i forskellige kolonner.

Se på nedenstående kode for at forstå testsagen. Det er en simpel kode til test af loginfunktionaliteten i en flybookingsapplikation.

pakke DataDriven import org.openqa.selenium.By import org.openqa.selenium.chrome.ChromeDriver import org.testng.Assert import org.testng.annotations.AfterMethod import org.testng.annotations.DataProvider import org.testng.annotations.Test offentlig klasse DDTExcel {ChromeDriver driver @Test (dataProvider = 'testdata') offentlig ugyldig DemoProject (streng brugernavn, streng adgangskode) kaster InterruptedException {System.setProperty ('webdriver.chrome.driver', 'C: UsersVardhanDownloadschromedriver.exe') driver = ny ChromeDriver () driver.get ('http://newtours.demoaut.com/') driver.findElement (By.name ('userName')). sendKeys (brugernavn) driver.findElement (By.name ('password') sendKeys (password) driver.findElement (By.name ('login')). ​​klik () Thread.sleep (5000) Assert.assertTrue (driver.getTitle (). matches ('Find a Flight: Mercury Tours: '),' Ugyldige legitimationsoplysninger ') System.out.println (' Login lykkedes ')} @AfterMethod ugyldig ProgramTermination () {driver.quit ()} @DataProvider (name =' testdata ') public Object [] [] TestDa taFeed () {ReadExcelFile config = new ReadExcelFile ('C: UsersVardhanworkspaceSeleniumLoginCredentials.xlsx') int rows = config.getRowCount (0) Object [] [] credentials = new Object [rows] [2] for (int i = 0i

Hvis du har bemærket ovenfra, har vi en metode ved navn “TestDataFeed ()”. I denne metode har jeg oprettet en objektforekomst af en anden klasse ved navn “ReadExcelFile”. Mens jeg instantierede dette objekt, har jeg fodret stien til min excel-fil, der indeholder dataene. Jeg har yderligere defineret en for-loop til at hente teksten fra excel-projektmappen.

Men for at læse dataene fra et givet arknummer, søjlenummer og række nummer foretages opkaldene til 'ReadExcelFile' klassen. Koden til min “ReadExcelFile” er nedenfor.

pakke DataDriven import java.io.File import java.io.FileInputStream import org.apache.poi.xssf.usermodel.XSSFSheet import org.apache.poi.xssf.usermodel.XSSFWorkbook public class ReadExcelFile {XSSFWorkbook wb XSSFSheet public Readcel excelPath) {prøv {File src = ny fil (excelPath) FileInputStream fis = ny FileInputStream (src) wb = ny XSSFWorkbook (fis)} fangst (Undtagelse e) {System.out.println (e.getMessage ())}} offentlig String getData (int arknummer, int række, int kolonne) {ark = wb.getSheetAt (arknummer) String data = ark.getRow (række) .getCell (kolonne) .getStringCellValue () returnerer data} offentlig int getRowCount (int arkIndex) { int række = wb.getSheetAt (sheetIndex) .getLastRowNum () række = række + 1 retur række}}

Bemærk først de biblioteker, jeg har importeret. Jeg har importeret Apache POI XSSF biblioteker, der bruges til at læse / skrive data til excel-filer. Her har jeg oprettet en konstruktør (objekt med samme metode) til at videregive værdierne: arknummer, række nummer og kolonne nummer. For at forstå denne ramme bedre beder jeg dig om at gennemgå nedenstående video, hvor jeg har forklaret dette på en struktureret måde.

Datadrevet ramme i Selen WebDriver | Selen Tutorial

Lad os nu gå videre til rammen, dvs. søgeordsdrevet ramme.

Keyword Driven Framework

Keyword Driven framework er en teknik, hvor alle operationer og instruktioner, der skal udføres, er skrevet separat fra selve testsagen. Ligheden, den har med datadrevet ramme, er, at de operationer, der skal udføres, igen gemmes i en ekstern fil som Excel-ark.

De operationer, jeg taler om, er kun de metoder, der skal udføres som en del af en testsag. Fordelen med Keyword Driven framework er, at du nemt kan kontrollere de funktionaliteter, du vil teste. Du kan specificere de metoder, der tester programmets funktionalitet i excel-filen. Således testes kun de metodenavne, der er specificeret i excel.

For eksempel til at logge ind på webapplikationen kan vi skrive flere metoder i hovedtesttilfældet, hvor hver testtilfælde vil teste visse funktioner. Til instantering af browserdriveren kunne der være en metode, for at finde felterne brugernavn og adgangskode kunne der være metoder, til at navigere til en webside kunne der være en anden metode osv.

Se nedenstående kode for at forstå, hvordan rammen ser ud. Linjerne, der er kommenteret i nedenstående kode, tjener som forklaring, hvis du ikke forstår.

pakke KeywordDriven import org.openqa.selenium.chrome.ChromeDriver import org.testng.Assert import org.testng.annotations.Test import java.util.concurrent.TimeUnit import org.openqa.selenium.By import org.openqa.selenium.WebDriver public class Actions {public static WebDriver driver public static void openBrowser () {System.setProperty ('webdriver.chrome.driver', 'C: UsersVardhanDownloadschromedriver.exe') driver = ny ChromeDriver ()} offentlig statisk ugyldig navigere () {driver .manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS) driver.get ('http://newtours.demoaut.com')} offentlig statisk ugyldig input_Username () {driver.findElement (By.name (' userName ')). sendKeys (' mercury ')} public static void input_Password () {driver.findElement (By.name (' password ')). sendKeys (' mercury ')} public static void click_Login () {driver.findElement (By.name ('login')). ​​Klik ()} @ Test offentlig statisk ugyldighed verificere_login () {String pageTitle = driver.getTitle () Assert.assertEquals (pageTitle, 'Find a Flight: Mercury Tours : ')} offentlig statisk ugyldig closeBrowser () {driver.quit ()}}

Som du kan se, er de forskellige funktionaliteter, der skal testes, til stede i separate metoder, der venter på at blive kaldt. Nu kaldes disse metoder fra en anden klasse baseret på tilstedeværelsen af ​​metodens navn i excel-filen. Og på samme måde har jeg skrevet en anden klasse for at læse excel-filen og sende resultaterne tilbage. Begge vises nedenfor.

hvordan man bruger charat i java

Klassefilen, der påberåber metoderne, er denne.

pakke KeywordDriven offentlig klasse DriverScript {public static void main (String [] args) throw Exception {// Declaring the path of the Excel file with the name of the Excel file String sPath = 'C: UsersVardhanworkspaceSelenium Frameworks DemodataEngine.xlsx' // Here vi sender Excel-stien og SheetName som argumenter for at oprette forbindelse til Excel-filen ReadExcelData.setExcelFile (sPath, 'Sheet1') // Hårdkodede værdier bruges til Excel-række og kolonner for nu // Hårdkodede værdier bruges til Excel-række & kolonner for nu // I senere kapitler vil vi erstatte disse hårdt kodede værdier med varibales // Dette er sløjfen til at læse værdierne i kolonne 3 (Action Keyword) række for række for (int iRow = 1iRow<=7iRow++) { String sActions = ReadExcelData.getCellData(iRow, 1) //Comparing the value of Excel cell with all the keywords in the 'Actions' class if(sActions.equals('openBrowser')) { //This will execute if the excel cell value is 'openBrowser' //Action Keyword is called here to perform action Actions.openBrowser() } else if(sActions.equals('navigate')) { Actions.navigate() } else if(sActions.equals('input_Username')) { Actions.input_Username() } else if(sActions.equals('input_Password')) { Actions.input_Password() } else if(sActions.equals('click_Login')) { Actions.click_Login() } else if(sActions.equals('verify_Login')) { Actions.verify_login() } else if(sActions.equals('closeBrowser')) { Actions.closeBrowser() } } } } 

Og klassefilen, der læser Excel-værdierne, er denne.

pakke KeywordDriven import java.io.FileInputStream import org.apache.poi.xssf.usermodel.XSSFSheet import org.apache.poi.xssf.usermodel.XSSFWorkbook import org.apache.poi.xssf.usermodel.XSSFCell offentlig klasse ReadExcelData {privat static XSSFSheet ExcelWSheet privat statisk XSSFWorkbook ExcelWBook privat statisk XSSFCell-celle // Denne metode er at indstille filstien og åbne Excel-filen // videregive Excel-sti og arknavn som argumenter for denne metode offentligt statisk ugyldigt sætExcelFile (strengsti, strengarknavn) kaster Undtagelse {FileInputStream ExcelFile = ny FileInputStream (sti) ExcelWBook = ny XSSFWorkbook (ExcelFile) ExcelWSheet = ExcelWBook.getSheet (SheetName)} // Denne metode er at læse testdata fra Excel-cellen // I dette sender vi parametre / argumenter som række Num og Col Num offentlig statisk streng getCellData (int RowNum, int ColNum) kaster Undtagelse {Cell = ExcelWSheet.getRow (RowNum) .getCell (ColNum) String CellData = Cell.getStringCellValue () return CellData}}

Lad os nu gå videre til den sidste del af denne Selenium-rammeblog, hvor jeg vil vise dig, hvordan du bygger en hybrid ramme.

Hybrid ramme

Hybrid ramme er en teknik, hvor vi bedst kan bruge både datadrevne og nøgleordsdrevne selen-rammer. Ved hjælp af eksemplerne vist ovenfor i denne blog kan vi oprette en hybrid ramme ved at gemme metoderne til at udføre i en excel-fil (nøgleordsdrevet tilgang) og videregive disse metodenavne til Java Reflection Class (datadrevet tilgang) i stedet for at skabe en Hvis ellers loop i klassen “DriverScript”.

Se på den modificerede 'DriverScript' -klasse i nedenstående kodestykke.Her, i stedet for at bruge flere If / Else-sløjfer, bruges datadrevet tilgang til at læse metodens navne fra excel-filen.

pakke HybridFramework import java.lang.reflect.Method offentlig klasse DriverScriptJava {// Dette er et klasseobjekt, erklæret som 'offentlig statisk' // Så det kan bruges uden for rammerne af hoved [] metode offentlig statisk Handling handling Nøgleord offentlig statisk Streng sAktioner // Dette er refleksionsklasseobjekt, erklæret som 'offentlig statisk' // Så det kan bruges uden for anvendelsesområdet for hoved [] metode offentlig statisk Metode metode [] offentlig statisk ugyldig hoved (String [] args) kaster Undtagelse {// Erklæring af stien til Excel-filen med navnet på Excel-filen String sPath = 'C: BrugereVardhanworkspaceSelenium Frameworks DemodataEngine.xlsx' // Her passerer vi Excel-stien og SheetName for at oprette forbindelse til Excel-filen // Denne metode blev oprettet tidligere ReadExcelData.setExcelFile (sPath, 'Sheet1') // Hårdkodede værdier bruges til Excel række og kolonner for nu // Senere vil vi bruge disse hårdkodede værdier meget mere effektivt // Dette er sløjfen til læsning værdierne i kolonnen (Handlingsnøgleord) række ved række // Det betyder, at denne sløjfe udfører alle de trin, der er nævnt for testsagen i arket til teststrin til (int iRow = 1iRow<=7iRow++) { sActions = ReadExcelData.getCellData(iRow, 1) //A new separate method is created with the name 'execute_Actions' //You will find this method below of the this test //So this statement is doing nothing but calling that piece of code to execute execute_Actions() } } //This method contains the code to perform some action //As it is completely different set of logic, which revolves around the action only, it makes sense to keep it separate from the main driver script //This is to execute test step (Action) private static void execute_Actions() throws Exception { //Here we are instantiating a new object of class 'Actions' actionKeywords = new Actions() //This will load all the methods of the class 'Actions' in it. //It will be like array of method, use the break point here and do the watch method = actionKeywords.getClass().getMethods() //This is a loop which will run for the number of actions in the Action Keyword class //method variable contain all the method and method.length returns the total number of methods for(int i = 0i

For at forstå dette begreb Data Driven, Keyword Driven & Hybrid Driven rammer bedre beder jeg dig om at se nedenstående video.

Selen Framework ved hjælp af Java | Selen Tutorial | Selen træning online

Jeg håber, at denne blog var nyttig for dig og gav dig en klar forståelse af, hvad en Selen-ramme er, hvordan den er gavnlig, og hvordan du opbygger din kodestruktur ved hjælp af disse 3 Selen-rammer. Hold øje med flere blogs i denne serie.

Hvis du ønsker at lære selen og opbygge en karriere inden for testdomænet, så tjek vores interaktive live-online her kommer der 24 * 7 support til at guide dig gennem din læringsperiode. Begreberne relateret til 'Selenium Framework' har en dybtgående dækning i Edurekas kursus.

Har du et spørgsmål til os? Nævn det i kommentarfeltet, og vi vender tilbage til dig.