Bygga en datadriven, nyckelordsdriven & hybrid selenram



Den här bloggen förklarar vad som är en Selen-ram, dess fördelar och hur man implementerar datadrivna, nyckelordsdrivna och hybridramar i selen.

Den förra i denna serie har du exponerat för grundläggande begrepp i Selen-testning.I den här bloggen kommer jag dock att berätta hur du använder ett Selen-ramverk för att optimera din kodstruktur och detta kommer att flytta dig närmare för att bli en .

Vad är ett Selen-ramverk?

Selenium framework är en kodstruktur som gör kodunderhåll enklare och kodläsbarheten bättre. Ett ramverk innebär att man delar upp hela koden i mindre kodbitar som testar en viss funktionalitet.





Koden är strukturerad så att ”datamängden” skiljs från det faktiska ”testfallet” som testar funktionerna i webbapplikationen. Det kan också struktureras på ett sätt där testfall som behöver utföras kallas (åberopas) från en extern applikation (som en .csv).

Det finns ett antal ramar där ute, men tre vanliga Selen-ramar är:



Dessa ramar kommer att diskuteras med en demo i den här bloggen. Men innan jag går vidare, låt mig berätta varför ett Selen-ramverk måste vara på plats och vilka fördelar du får med att använda dem.

Varför behöver vi en Selen-ram?

Utan ett ramverk på plats kommer det att finnas ett testfall som omfattar hela testfunktionaliteten. Den skrämmande delen är att detta enda testfall har förmågan att stiga upp till en miljon rader kod. Så det är ganska uppenbart att ett så stort testfall kommer att vara svårt att läsa. Även om du vill ändra någon funktion senare kommer du att ha svårt att ändra koden.

Eftersom implementeringen av ett ramverk kommer att resultera i mindre men flera kodbitar finns det olika fördelar.



Fördelar med Selen-ramverk

  • Ökad återanvändning av kod
  • Förbättrad kodläsbarhet
  • Högre bärbarhet
  • Minskat manusunderhåll

Nu när du känner till grunderna för ramar, låt mig förklara var och en av dem i detalj.

Datadriven ram

Ett datadrivet ramverk i selen är tekniken för att separera 'datamängden' från det faktiska 'testfallet' (kod). Detta ramverk beror helt på ingångstestdata. Testdata matas från externa källor som en excel-fil, .CSV-fil eller vilken databas som helst.

datadrivet ramverk - selenramverk - edureka

Eftersom testfallet är åtskilt från datamängden kan vi enkelt ändra testfallet för en viss funktionalitet utan att göra grossiständringar i din kod. Om du till exempel vill ändra koden för inloggningsfunktionalitet kan du ändra just det istället för att också behöva ändra någon annan beroende del i samma kod.

hur man genererar slumpmässig sträng i Java

Förutom detta kan du också enkelt kontrollera hur mycket data som behöver testas. Du kan enkelt öka antalet testparametrar genom att lägga till fler användarnamn och lösenordsfält i Excel-filen (eller andra källor).

Om jag till exempel måste kontrollera inloggningen till en webbsida kan jag behålla uppsättningen användarnamn och lösenord i en excel-fil och skicka referenserna till koden för att utföra automatisering i webbläsaren i en separat Java-klassfil.

Använda Apache POI med Selen WebDriver

WebDriver stöder inte direkt läsning av Excel-filer. Därför använder vi Apache IP för läsning / skrivning till alla Microsoft Office-dokument. Du kan ladda ner Apache POI (uppsättning JAR-filer) från här . Ladda ner zip-filen eller tarfilen enligt dina krav och placera dem tillsammans med uppsättningen Selen JAR.

Samordningen mellan huvudkoden och datamängden kommer att tas om hand av TestNG-dataleverantörer, vilket är ett bibliotek som kommer som en del av Apache POI JAR-filer. För demoändamål har jag skapat en excel-fil som heter “LoginCredentials” där användarnamnen och lösenorden har lagrats i olika kolumner.

Ta en titt på koden nedan för att förstå testfallet. Det är en enkel kod för att testa inloggningsfunktionen i en flygbokningsapplikation.

paket 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 public class DDTExcel {ChromeDriver driver @Test (dataProvider = 'testdata') public void DemoProject (String username, String password) kastar InterruptedException {System.setProperty ('webdriver.chrome.driver', 'C: UsersVardhanDownloadschromedriver.exe') driver = ny ChromeDriver () driver.get ('http://newtours.demoaut.com/') driver.findElement (By.name ('userName')). sendKeys (username) driver.findElement (By.name ('password') sendKeys (lösenord) driver.findElement (By.name ('login')). ​​klicka () Thread.sleep (5000) Assert.assertTrue (driver.getTitle (). matchar ('Find a Flight: Mercury Tours: '),' Ogiltiga referenser ') System.out.println (' Inloggning lyckades ')} @AfterMethod ogiltig 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

Om du märkte ovanifrån har vi en metod som heter 'TestDataFeed ()'. I den här metoden har jag skapat en objektinstans av en annan klass som heter 'ReadExcelFile'. Medan jag startade detta objekt har jag matat sökvägen till min excel-fil som innehåller data. Jag har vidare definierat en for loop för att hämta texten från Excel-arbetsboken.

Men för att läsa data från ett visst arknummer, kolumnnummer och radnummer rings samtalen till 'ReadExcelFile' -klassen. Koden för min “ReadExcelFile” är nedan.

paket 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) {prova {File src = new File (excelPath) FileInputStream fis = new FileInputStream (src) wb = new XSSFWorkbook (fis)} catch (Exception e) {System.out.println (e.getMessage ())}} public String getData (int sheetnumber, int row, int column) {sheet = wb.getSheetAt (sheetnumber) String data = sheet.getRow (row) .getCell (column) .getStringCellValue () return data} public int getRowCount (int sheetIndex) { int rad = wb.getSheetAt (sheetIndex) .getLastRowNum () rad = rad + 1 returrad}}

Notera först de bibliotek jag har importerat. Jag har importerat Apache POI XSSF bibliotek som används för att läsa / skriva data för att excel-filer. Här har jag skapat en konstruktör (objekt av samma metod) för att skicka värdena: arknummer, radnummer och kolumnnummer. För att förstå denna ram bättre, ber jag dig att gå igenom videon nedan, där jag har förklarat detta på ett strukturerat sätt.

Datadriven ram i Selen WebDriver | Selen Tutorial

Låt oss nu gå vidare till ramverket, det vill säga nyckelordsdrivet ramverk.

Nyckelorddriven ram

Keyword Driven framework är en teknik där alla operationer och instruktioner som ska utföras skrivs separat från själva testfallet. Likheten med Data Driven framework är att de operationer som ska utföras lagras igen i en extern fil som Excel-ark.

De operationer jag pratar om är ingenting annat än de metoder som behöver utföras som en del av ett testfall. Fördelen med Keyword Driven framework är att du enkelt kan kontrollera de funktioner du vill testa. Du kan ange de metoder som testar programmets funktion i excel-filen. Således testas endast de metodnamn som anges i excel.

Till exempel, för att logga in på webbapplikationen kan vi skriva flera metoder i huvudtestfallet, där varje testfall testar viss funktionalitet. För att starta webbläsardrivrutinen kan det finnas en metod, för att hitta användarnamn och lösenordsfält kan det finnas metoder, för att navigera till en webbsida kan det finnas en annan metod, etc.

Ta en titt på koden nedan för att förstå hur ramverket ser ut. Raderna som kommenteras i koden nedan fungerar som förklaring om du inte förstår.

paket 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 = new ChromeDriver ()} public static void navigate () {driver .manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS) driver.get ('http://newtours.demoaut.com')} offentligt statiskt ogiltigt input_Username () {driver.findElement (By.name (') användarnamn ')). sendKeys (' kvicksilver ')} offentligt statiskt tomrum input_Password () {driver.findElement (By.name (' lösenord ')). sendKeys (' kvicksilver ')} offentligt statiskt tomrum click_Login () {driver.findElement (By.name ('login')). ​​Klicka ()} @ Test offentligt statiskt ogiltigt verifiera_login () {String pageTitle = driver.getTitle () Assert.assertEquals (pageTitle, 'Find a Flight: Mercury Tours : ')} offentligt statiskt tomrum closeBrowser () {driver.quit ()}}

Som du kan se finns de olika funktionerna som behöver testas i separata metoder som väntar på att bli anropade. Nu kommer dessa metoder att anropas från en annan klass, baserat på närvaron av metodnamnet i excel-filen. Och på samma sätt har jag skrivit en annan klass för att läsa Excel-filen och skicka tillbaka resultaten. Båda visas nedan.

Klassfilen som åberopar metoderna är den här.

paketet KeywordDriven allmän klass DriverScript {public static void main (String [] args) kastar undantag {// Deklarerar sökvägen till Excel-filen med namnet på Excel-filen String sPath = 'C: UsersVardhanworkspaceSelenium Frameworks DemodataEngine.xlsx' // Here vi skickar Excel-sökvägen och SheetName som argument för att ansluta till Excel-filen ReadExcelData.setExcelFile (sPath, 'Sheet1') // Hårdkodade värden används för Excel-rad och kolumner för närvarande // Hårdkodade värden används för Excel-rad & kolumner för nu // I senare kapitel kommer vi att ersätta dessa hårdkodade värden med varibales // Detta är slingan för att läsa värdena för kolumn 3 (Action Keyword) rad för rad för (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() } } } } 

Och klassfilen som läser Excel-värdena är den här.

paket 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 public class ReadExcelData {private static XSSFSheet ExcelWSheet privat statisk XSSFWorkbook ExcelWBook privat statisk XSSFCell Cell // Denna metod är att ställa in filsökvägen och öppna Excel-filen // Skicka Excel-sökväg och SheetName som argument för denna metod offentliga statiska ogiltiga setExcelFile (strängbana, strängarknamn) kastar Undantag {FileInputStream ExcelFile = ny FileInputStream (sökväg) ExcelWBook = ny XSSFWorkbook (ExcelFile) ExcelWSheet = ExcelWBook.getSheet (SheetName)} // Denna metod är att läsa testdata från Excel-cellen // I detta skickar vi parametrar / argument som Rad Num och Col Num offentlig statisk sträng getCellData (int RowNum, int ColNum) kastar Undantag {Cell = ExcelWSheet.getRow (RowNum) .getCell (ColNum) String CellData = Cell.getStringCellValue () return CellData}}

Låt oss nu gå vidare till den sista delen av denna Selen-ramblogg, där jag kommer att visa dig hur du bygger ett hybridramverk.

Hybrid ram

Hybridramverk är en teknik där vi kan utnyttja både datadrivna och nyckelordsdrivna selenramar. Med hjälp av exemplen som visas ovan i den här bloggen kan vi bygga ett hybridramverk genom att lagra metoderna att köra i en excel-fil (nyckelorddriven metod) och skicka dessa metodnamn till Java Reflection Class (datadriven strategi) istället för att skapa en Om annat loop i klassen “DriverScript”.

Ta en titt på den modifierade klassen 'DriverScript' i kodavsnittet nedan.Här, istället för att använda flera If / Else-slingor, används datadriven metod för att läsa metodnamnen från excel-filen.

paket HybridFramework importerar java.lang.reflect.Method public class DriverScriptJava {// Detta är ett klassobjekt, deklarerat som 'public static' // Så att det kan användas utanför ramen för main [] -metoden public static Actions actionKeywords public static Sträng sAktioner // Detta är reflektionsklassobjekt, deklarerat som 'offentligt statiskt' // Så att det kan användas utanför ramen för huvud [] -metoden offentlig statisk Metodmetod [] offentlig statisk ogiltig huvud (String [] args) kastar Undantag {// Deklarera sökvägen för Excel-filen med namnet på Excel-filen String sPath = 'C: UsersVardhanworkspaceSelenium Frameworks DemodataEngine.xlsx' // Här skickar vi Excel-sökvägen och SheetName för att ansluta till Excel-filen // Denna metod skapades tidigare ReadExcelData.setExcelFile (sPath, 'Sheet1') // Hårdkodade värden används för Excel-rad och kolumner för tillfället // Senare kommer vi att använda dessa hårdkodade värden mycket mer effektivt // Detta är slingan för läsning värdena i kolumnraden (Action Keyword) av rad // Det betyder att den här slingan kommer att utföra alla steg som nämns för testfallet i teststegsbladet för (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

För att förstå detta koncept med datadrivna, nyckelordsdrivna och hybriddrivna ramar bättre ber jag dig att titta på videon nedan.

Selen Framework med Java | Selen Tutorial | Selenutbildning online

Jag hoppas att den här bloggen var användbar för dig och gav dig en tydlig förståelse för vad ett Selen-ramverk är, hur det är fördelaktigt och hur du bygger din kodstruktur med hjälp av dessa 3 Selen-ramar. Håll koll på fler bloggar i den här serien.

Om du vill lära dig selen och bygga en karriär inom testdomänen, kolla in vår interaktiva, live-online här kommer det med 24 * 7 support för att vägleda dig under hela din inlärningsperiod. Begreppen relaterade till ”Selenium Framework” har en djupgående täckning i Edurekas kurs.

Har du en fråga till oss? Vänligen nämna det i kommentarfältet så återkommer vi till dig.