Selenium フレームワーク: データ、キーワード、ハイブリッド駆動
何ですか Selenium フレームワーク?
この Selenium 自動化フレームワーク コードのメンテナンスを簡単かつ効率的にするコード構造です。フレームワークがないと、ユーザーは「コード」と「データ」を同じ場所に配置することになり、再利用も読み取りもできなくなります。フレームワークは、コードの再利用性の向上、移植性の向上、スクリプトのメンテナンス コストの削減、コードの読みやすさの向上など、有益な結果をもたらします。
の種類 Selenium フレームワーク
主にXNUMXつです フレームワークの種類 によって作成された Selenium 手動テストケースを自動化する WebDriver
- データドリブンフレームワーク
- キーワード駆動フレームワーク
- ハイブリッド駆動フレームワーク
データドリブンフレームワーク Selenium
データドリブンフレームワーク Selenium データセットをテストケースから分離する方法です。 データ セットがテスト ケースから分離されると、コードを変更することなく、特定の機能に合わせてデータ セットを簡単に変更できます。 これは、次のような外部ファイルからテスト ケースとスイートをフェッチするために使用されます。 Excel、.csv、.xml、または一部のデータベース テーブル。
Excel を読み書きするために、Apache は非常に有名なライブラリ POI を提供します。 このライブラリは、両方の読み取りと書き込みに十分な機能を備えています。 XLS と XLSX Excelのファイル形式です。
読むために XLS ファイル、 HSSF 実装は POI ライブラリによって提供されます。
読むために XLSX、 XSSF の実装 THEN ライブラリ の選択になります。 これらの実装を詳しく調べてみましょう。
データ駆動型テストについてはすでに学習しました。 前のチュートリアル
キーワード駆動フレームワーク Selenium
キーワード駆動フレームワーク Selenium 共通の機能と命令のセットのキーワードを分離することで、自動テストを高速化するために使用される方法です。実行されるすべての操作と命令は、Excel シートなどの外部ファイルに記述されます。ユーザーは、テストする機能を簡単に制御および指定できます。
完全なフレームワークは次のようになります
ご覧の通り、これは5段階のフレームワークです。段階的に詳しく見ていきましょう。
ステップ1)
- ドライバー スクリプト Execute.java は ReadGuru99ExcelFile.java を呼び出します。
- ReadGuru99ExcelFile.java には Excel からデータを読み取るための POI スクリプトがあります
ステップ2)
- ReadGuru99ExcelFile.java は TestCase.xlsx からデータを読み取ります
- シートはこんな感じです~
- Excel ファイルに記述されたキーワードに従って、フレームワークは UI 上で操作を実行します。
- たとえば、「ログイン」ボタンをクリックする必要があります。 同様に、Excel には「クリック」というキーワードが含まれます。 これで、AUT はページ上に何百ものボタンを配置できるようになり、ログイン ボタンを識別するために、Excel でオブジェクト名を loginButton として入力し、オブジェクト タイプを名前として入力します (上の画像で強調表示された行を参照)。 オブジェクト タイプは、Xpath、名前 CSS、またはその他の値です。
ステップ3) ReadGuru99ExcelFile.java は、このデータをドライバー スクリプト Execute.java に渡します。
ステップ4)
- すべての UI Web 要素について、要素ロケーター (Xpath、名前、CSS パス、クラス名など) を配置するオブジェクト リポジトリを作成する必要があります。
- Execute.java (ドライバー スクリプト) はオブジェクト リポジトリ全体を読み取り、変数に保存します。
- このオブジェクト リポジトリを読み取るには、それを読み取る getObjectRepository メソッドを持つ ReadObject クラスが必要です。
注: なぜオブジェクト リポジトリを作成する必要があるのかと思われるかもしれません。 答えはコードのメンテナンスに役立ちます。 たとえば、10 の異なるテスト ケースで、名前 = btnlogin のボタンを使用しています。 将来的には、開発者は名前を btnlogin から submit に変更することを決定します。 10 個のテスト ケースすべてに変更を加える必要があります。 オブジェクト リポジトリの場合は、リポジトリ内で XNUMX 回だけ変更を加えます。
ステップ5)
- ドライバーは Excel およびオブジェクト リポジトリから UI にデータを渡しますOperaクラス
- UIOperation クラスには、Excel に記載されている CLICK、SETTEXT などのキーワードに対応するアクションを実行する関数があります。
- UIOperaションクラスは Java ウェブ要素に対する操作を実行するためのコードの実際の実装を持つクラス
完全なプロジェクトは次のようになります-
例を見てみましょう:
テストシナリオ: 2 つのテスト ケースを実行しています
- テストケース1:
- 後藤
http://demo.guru99.com/V4/
- ユーザーIDを入力してください
- パスワードを入力します
- [リセット]をクリックします
- テストケース2:
- 後藤
http://demo.guru99.com/V4/
- ユーザーIDを入力してください
- パスワードを入力します
- ログインをクリックします
オブジェクトのプロパティ
url=http://demo.guru99.com/V4/
username=uid
password=password
title=barone
loginButton=btnLogin
resetButton=btnReset
ReadGuru99ExcelFile.java
package excelExportAndFileIO; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ReadGuru99ExcelFile { public Sheet readExcel(String filePath,String fileName,String sheetName) throws IOException{ //Create a object of File class to open xlsx file File file = new File(filePath+"\\"+fileName); //Create an object of FileInputStream class to read excel file FileInputStream inputStream = new FileInputStream(file); Workbook guru99Workbook = null; //Find the file extension by spliting file name in substing and getting only extension name String fileExtensionName = fileName.substring(fileName.indexOf(".")); //Check condition if the file is xlsx file if(fileExtensionName.equals(".xlsx")){ //If it is xlsx file then create object of XSSFWorkbook class guru99Workbook = new XSSFWorkbook(inputStream); } //Check condition if the file is xls file else if(fileExtensionName.equals(".xls")){ //If it is xls file then create object of XSSFWorkbook class guru99Workbook = new HSSFWorkbook(inputStream); } //Read sheet inside the workbook by its name Sheet guru99Sheet = guru99Workbook.getSheet(sheetName); return guru99Sheet; } }
ReadObject.java
package operation; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class ReadObject { Properties p = new Properties(); public Properties getObjectRepository() throws IOException{ //Read object repository file InputStream stream = new FileInputStream(new File(System.getProperty("user.dir")+"\\src\\objects\\object.properties")); //load all objects p.load(stream); return p; } }
UIOperation.java
package operation; import java.util.Properties; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; public class UIOperation { WebDriver driver; public UIOperation(WebDriver driver){ this.driver = driver; } public void perform(Properties p,String operation,String objectName,String objectType,String value) throws Exception{ System.out.println(""); switch (operation.toUpperCase()) { case "CLICK": //Perform click driver.findElement(this.getObject(p,objectName,objectType)).click(); break; case "SETTEXT": //Set text on control driver.findElement(this.getObject(p,objectName,objectType)).sendKeys(value); break; case "GOTOURL": //Get url of application driver.get(p.getProperty(value)); break; case "GETTEXT": //Get text of an element driver.findElement(this.getObject(p,objectName,objectType)).getText(); break; default: break; } } /** * Find element BY using object type and value * @param p * @param objectName * @param objectType * @return * @throws Exception */ private By getObject(Properties p,String objectName,String objectType) throws Exception{ //Find by xpath if(objectType.equalsIgnoreCase("XPATH")){ return By.xpath(p.getProperty(objectName)); } //find by class else if(objectType.equalsIgnoreCase("CLASSNAME")){ return By.className(p.getProperty(objectName)); } //find by name else if(objectType.equalsIgnoreCase("NAME")){ return By.name(p.getProperty(objectName)); } //Find by css else if(objectType.equalsIgnoreCase("CSS")){ return By.cssSelector(p.getProperty(objectName)); } //find by link else if(objectType.equalsIgnoreCase("LINK")){ return By.linkText(p.getProperty(objectName)); } //find by partial link else if(objectType.equalsIgnoreCase("PARTIALLINK")){ return By.partialLinkText(p.getProperty(objectName)); }else { throw new Exception("Wrong object type"); } } }
ExecuteTest.java
package testCases; import java.util.Properties; import operation.ReadObject; import operation.UIOperation; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.annotations.Test; import excelExportAndFileIO.ReadGuru99ExcelFile; public class ExecuteTest { @Test public void testLogin() throws Exception { // TODO Auto-generated method stub WebDriver webdriver = new FirefoxDriver(); ReadGuru99ExcelFile file = new ReadGuru99ExcelFile(); ReadObject object = new ReadObject(); Properties allObjects = object.getObjectRepository(); UIOperation operation = new UIOperation(webdriver); //Read keyword sheet Sheet guru99Sheet = file.readExcel(System.getProperty("user.dir")+"\\","TestCase.xlsx" , "KeywordFramework"); //Find number of rows in excel file int rowCount = guru99Sheet.getLastRowNum()-guru99Sheet.getFirstRowNum(); //Create a loop over all the rows of excel file to read it for (int i = 1; i < rowCount+1; i++) { //Loop over all the rows Row row = guru99Sheet.getRow(i); //Check if the first cell contain a value, if yes, That means it is the new testcase name if(row.getCell(0).toString().length()==0){ //Print testcase detail on console System.out.println(row.getCell(1).toString()+"----"+ row.getCell(2).toString()+"----"+ row.getCell(3).toString()+"----"+ row.getCell(4).toString()); //Call perform function to perform operation on UI operation.perform(allObjects, row.getCell(1).toString(), row.getCell(2).toString(), row.getCell(3).toString(), row.getCell(4).toString()); } else{ //Print the new testcase name when it started System.out.println("New Testcase->"+row.getCell(0).toString() +" Started"); } } } }
実行後の出力は次のようになります –
ダウンロード Selenium このチュートリアルのデモ用のプロジェクト ファイル
ハイブリッド駆動フレームワーク
ハイブリッド駆動フレームワーク in Selenium これは、キーワード駆動フレームワークとデータ駆動フレームワークの両方の利点を使用するコンセプトです。これは使いやすいフレームワークであり、手動テスターはフレームワーク内でコーディングすることなく、キーワード、テスト データ、オブジェクト リポジトリを確認するだけでテスト ケースを作成できます。
ここでキーワードについては、テスト ケースを維持するために Excel ファイルを使用します。テスト データについては、データ、プロバイダーを使用できます。 テスト フレームワーク。
ここのハイブリッド フレームワークでは、キーワード駆動フレームワークでは何も変更する必要はありません。ExecuteTest.java ファイルを HybridExecuteTest.java ファイルに置き換えるだけです。
この HybridExecuteTest ファイルには、データ プロバイダーの概念に基づくキーワード駆動のコードがすべて含まれています。
ハイブリッド フレームワークの完全な図表現は次のようになります。
ハイブリッド実行テスト.java
package testCases; import java.io.IOException; import java.util.Properties; import operation.ReadObject; import operation.UIOperation; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import excelExportAndFileIO.ReadGuru99ExcelFile; public class HybridExecuteTest { WebDriver webdriver = null; @Test(dataProvider="hybridData") public void testLogin(String testcaseName,String keyword,String objectName,String objectType,String value) throws Exception { // TODO Auto-generated method stub if(testcaseName!=null&&testcaseName.length()!=0){ webdriver=new FirefoxDriver(); } ReadObject object = new ReadObject(); Properties allObjects = object.getObjectRepository(); UIOperation operation = new UIOperation(webdriver); //Call perform function to perform operation on UI operation.perform(allObjects, keyword, objectName, objectType, value); } @DataProvider(name="hybridData") public Object[][] getDataFromDataprovider() throws IOException{ Object[][] object = null; ReadGuru99ExcelFile file = new ReadGuru99ExcelFile(); //Read keyword sheet Sheet guru99Sheet = file.readExcel(System.getProperty("user.dir")+"\\","TestCase.xlsx" , "KeywordFramework"); //Find number of rows in excel file int rowCount = guru99Sheet.getLastRowNum()-guru99Sheet.getFirstRowNum(); object = new Object[rowCount][5]; for (int i = 0; i < rowCount; i++) { //Loop over all the rows Row row = guru99Sheet.getRow(i+1); //Create a loop to print cell values in a row for (int j = 0; j < row.getLastCellNum(); j++) { //Print excel data in console object[i][j] = row.getCell(j).toString(); } } System.out.println(""); return object; } }
まとめ
- 次を使用して 3 種類のテスト フレームワークを作成できます。 Selenium ウェブドライバー。
- A Selenium データ駆動型、キーワード駆動型、ハイブリッド フレームワークに分類できる自動化フレームワーク。
- データ駆動型フレームワークを実現するには、 TestNGのデータプロバイダー。
- キーワード駆動フレームワークでは、キーワードは Excel ファイルなどの外部ファイルに書き込まれ、Java コードがこのファイルを呼び出してテスト ケースを実行します。
- ハイブリッド フレームワークは、キーワード駆動フレームワークとデータ駆動フレームワークを組み合わせたものです。
ダウンロード Selenium このチュートリアルのデモ用のプロジェクト ファイル