データ駆動型、キーワード駆動型、ハイブリッドSeleniumフレームワークの構築



このブログでは、Seleniumフレームワークとは何か、その利点、およびデータ駆動型、キーワード駆動型、ハイブリッドフレームワークをSeleniumに実装する方法について説明します。

以前 このシリーズでは、Seleniumテストの基本的な概念を紹介しました。ただし、このブログでは、Seleniumフレームワークを使用してコード構造を最適化する方法を説明します。これにより、

Seleniumフレームワークとは何ですか?

Seleniumフレームワークは、コードの保守を簡素化し、コードの可読性を向上させるためのコード構造です。フレームワークでは、コード全体を小さなコードに分割し、特定の機能をテストします。





コードは、「データセット」がWebアプリケーションの機能をテストする実際の「テストケース」から分離されるように構成されています。また、実行する必要のあるテストケースが外部アプリケーション(.csvなど)から呼び出される(呼び出される)ように構成することもできます。

そこには多くのフレームワークがありますが、一般的に使用される3つのSeleniumフレームワークは次のとおりです。



これらのフレームワークについては、このブログのデモで説明します。ただし、先に進む前に、Seleniumフレームワークを導入する必要がある理由と、それらを使用することで得られるメリットについて説明します。

Ruby on RailsWebアプリケーション

なぜSeleniumフレームワークが必要なのですか?

フレームワークが整っていない場合、テスト機能全体を構成するテストケースが1つあります。怖いのは、この単一のテストケースには、最大100万行のコードを作成する機能があることです。したがって、非常に巨大なテストケースを読むのは難しいことは明らかです。後で機能を変更したい場合でも、コードを変更するのは困難です。

フレームワークを実装すると、コードの断片は小さくなりますが複数になるため、さまざまな利点があります。



Seleniumフレームワークの利点

  • コードの再利用の増加
  • コードの可読性の向上
  • 高い携帯性
  • スクリプトの削減メンテナンス

フレームワークの基本がわかったところで、それぞれについて詳しく説明します。

データ駆動型フレームワーク

Seleniumのデータ駆動型フレームワークは、「データセット」を実際の「テストケース」(コード)から分離する手法です。このフレームワークは、入力テストデータに完全に依存しています。テストデータは、Excelファイル、.CSVファイル、その他のデータベースなどの外部ソースから提供されます。

データ駆動型フレームワーク-セレンフレームワーク-edureka

テストケースはデータセットから分離されているため、コードに大幅な変更を加えることなく、特定の機能のテストケースを簡単に変更できます。たとえば、ログイン機能のコードを変更する場合は、同じコード内の他の依存部分も変更する代わりに、それだけを変更できます。

これに加えて、テストする必要のあるデータの量を簡単に制御することもできます。ユーザー名とパスワードのフィールドをExcelファイル(または他のソース)に追加することで、テストパラメーターの数を簡単に増やすことができます。

たとえば、Webページへのログインを確認する必要がある場合は、ユーザー名とパスワードの資格情報のセットをExcelファイルに保持し、資格情報をコードに渡して、ブラウザーで別のJavaクラスファイルの自動化を実行できます。

SeleniumWebDriverでのApachePOIの使用

WebDriverは、Excelファイルの読み取りを直接サポートしていません。したがって、 Apache POI MicrosoftOfficeドキュメントの読み取り/書き込み用。 Apache POI(JARファイルのセット)はからダウンロードできます。 ここに 。要件に応じてzipファイルまたはtarファイルをダウンロードし、SeleniumJARのセットと一緒に配置します。

メインコードとデータセット間の調整は、 TestNGデータプロバイダー、 これは、Apache POIJARファイルの一部として提供されるライブラリです。デモの目的で、ユーザー名とパスワードが異なる列に保存されている「LoginCredentials」というExcelファイルを作成しました。

テストケースを理解するには、以下のコードをご覧ください。これは、フライト予約アプリケーションのログイン機能をテストするための単純なコードです。

パッケージDataDrivenimport 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)throws InterruptedException {System.setProperty( 'webdriver.chrome.driver'、 'C​​:UsersVardhanDownloadschromedriver.exe')driver = new ChromeDriver()driver.get( 'http://newtours.demoaut.com/')driver.findElement(By.name( 'userName'))。sendKeys(username)driver.findElement(By.name( 'password' ))。sendKeys(password)driver.findElement(By.name( 'login'))。click()Thread.sleep(5000)Assert.assertTrue(driver.getTitle()。matches( 'Find a Flight:Mercury Tours: ')、'無効な資格情報 ')System.out.println('ログイン成功 ')} @AfterMethod void ProgramTermination(){driver.quit()} @DataProvider(name =' testdata ')public Object [] [] TestDa taFeed(){ReadExcelFile config = new ReadExcelFile( 'C:UsersVardhanworkspaceSeleniumLoginCredentials.xlsx')int rows = config.getRowCount(0)Object [] []資格情報= new Object [rows] [2] for(int i = 0i

上からお気づきの方もいらっしゃると思いますが、「TestDataFeed()」という名前のメソッドがあります。このメソッドでは、「ReadExcelFile」という名前の別のクラスのオブジェクトインスタンスを作成しました。このオブジェクトをインスタンス化するときに、データを含むExcelファイルのパスを指定しました。さらに、Excelワークブックからテキストを取得するためのforループを定義しました。

ただし、指定されたシート番号、列番号、および行番号からデータを読み取るために、「ReadExcelFile」クラスが呼び出されます。私の「ReadExcelFile」のコードは以下のとおりです。

パッケージDataDrivenimport 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 sheet public ReadExcelFile(String excelPath){try {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 row = wb.getSheetAt(sheetIndex).getLastRowNum()row = row + 1 return row}}

まず、インポートしたライブラリに注意してください。インポートしました Apache POI XSSF Excelファイルへのデータの読み取り/書き込みに使用されるライブラリ。ここでは、シート番号、行番号、列番号の値を渡すコンストラクター(同じメソッドのオブジェクト)を作成しました。このフレームワークをよりよく理解するために、構造化された方法でこれを説明した以下のビデオをご覧ください。

SeleniumWebDriverのデータ駆動型フレームワーク| Seleniumチュートリアル

それでは、フレームワーク、つまりキーワード駆動型フレームワークに移りましょう。

キーワード駆動型フレームワーク

キーワード駆動型フレームワークは、実行されるすべての操作と指示が実際のテストケースとは別に記述される手法です。データ駆動型フレームワークとの類似点は、実行される操作がExcelシートなどの外部ファイルに再度保存されることです。

私が話している操作は、テストケースの一部として実行する必要があるメソッドに他なりません。キーワード駆動型フレームワークの利点は、テストする機能を簡単に制御できることです。アプリケーションの機能をテストするメソッドをExcelファイルで指定できます。したがって、Excelで指定されているメソッド名のみがテストされます。

たとえば、Webアプリケーションにログインする場合、メインのテストケースに複数のメソッドを記述して、各テストケースで特定の機能をテストできます。ブラウザドライバをインスタンス化するための1つの方法、ユーザー名とパスワードのフィールドを見つけるための方法、Webページに移動するための別の方法などがあります。

フレームワークがどのように見えるかを理解するために、以下のコードを見てください。以下のコードでコメントアウトされている行は、理解できない場合の説明として役立ちます。

パッケージKeywordDrivenimport 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ナビゲーター(){ドライバー.manage()。timeouts()。implicitlyWait(10、TimeUnit.SECONDS)driver.get( 'http://newtours.demoaut.com')} public static void 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'))。click()} @Test public static void verify_login(){String pageTitle = driver.getTitle()Assert.assertEquals(pageTitle、 'Find a Flight:Mercury Tours : ')} public static void closeBrowser(){driver.quit()}}

ご覧のとおり、テストが必要なさまざまな機能は、呼び出されるのを待っている別々のメソッドに存在します。これで、これらのメソッドは、Excelファイル内のメソッド名の存在に基づいて別のクラスから呼び出されます。同様に、Excelファイルを読み取り、結果を送り返すために、別のクラスを作成しました。両方を以下に表示します。

フィボナッチ関数c ++

メソッドを呼び出すクラスファイルはこれです。

パッケージKeywordDrivenpublic class DriverScript {public static void main(String [] args)throws Exception {// ExcelファイルのパスをExcelファイルの名前で宣言StringsPath = 'C:UsersVardhanworkspaceSelenium Frameworks DemodataEngine.xlsx' //ここにExcelファイルに接続するための引数としてExcelパスとSheetNameを渡しますReadExcelData.setExcelFile(sPath、 'Sheet1')//今のところExcelの行と列にはハードコード値が使用されています// Excelの行と列にはハードコード値が使用されています今のところ列//後の章でこれらのハードコードされた値を変数に置き換えます//これは列3(アクションキーワード)の値を行ごとに読み取るためのループです(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() } } } } 

そして、Excelの値を読み取るクラスファイルはこれです。

パッケージKeywordDrivenimport 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 private static XSSFWorkbook ExcelWBook private static XSSFCell Cell //このメソッドは、ファイルパスを設定し、Excelファイルを開きます//このメソッドの引数としてExcelパスとSheetNameを渡しますpublic static void setExcelFile(String Path、String SheetName)throws例外{FileInputStreamExcelFile = new FileInputStream(Path)ExcelWBook = new XSSFWorkbook(ExcelFile)ExcelWSheet = ExcelWBook.getSheet(SheetName)} //このメソッドは、Excelセルからテストデータを読み取るためのものです//これでは、パラメーター/引数を渡しますas RowNumおよびColNum public static String getCellData(int RowNum、int ColNum)throws Exception {Cell = ExcelWSheet.getRow(RowNum).getCell(ColNum)String CellData = Cell.getStringCellValue()return CellData}}

それでは、このSeleniumフレームワークブログの最後の部分に移りましょう。ここでは、ハイブリッドフレームワークを構築する方法を紹介します。

ハイブリッドフレームワーク

ハイブリッドフレームワークは、データ駆動型とキーワード駆動型の両方のSeleniumフレームワークを最大限に活用できる手法です。このブログで上記の例を使用して、実行するメソッドをExcelファイルに保存し(キーワード駆動型アプローチ)、これらのメソッド名をに渡すことで、ハイブリッドフレームワークを構築できます。 Javaリフレクションクラス (データ駆動型アプローチ)作成する代わりに If / Else 「DriverScript」クラスのループ。

以下のコードスニペットで変更された「DriverScript」クラスを見てください。ここでは、複数のIf / Elseループを使用する代わりに、データ駆動型アプローチを使用して、Excelファイルからメソッド名を読み取ります。

package HybridFramework import java.lang.reflect.Method public class DriverScriptJava {//これは 'publicstatic'として宣言されたクラスオブジェクトです// main []メソッドのスコープ外で使用できるようにpublicstatic Actions actionKeywords public static String sActions //これは 'publicstatic'として宣言されたリフレクションクラスオブジェクトです// main []メソッドのスコープ外で使用できるようにpublicstaticメソッドmethod [] public static void main(String [] args)throws Exception {// ExcelファイルのパスをExcelファイルの名前で宣言するStringsPath = 'C:UsersVardhanworkspaceSelenium Frameworks DemodataEngine.xlsx' //ここでは、Excelファイルに接続するためのExcelパスとSheetNameを渡します//このメソッド以前に作成されたReadExcelData.setExcelFile(sPath、 'Sheet1')//ハードコードされた値は今のところExcelの行と列に使用されます//後で、これらのハードコードされた値をはるかに効率的に使用します//これは読み取りのループです列(アクションキーワード)行の値行ごと//これは、このループが(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

データドリブン、キーワードドリブン、ハイブリッドドリブンのフレームワークのこの概念をよりよく理解するために、以下のビデオをご覧ください。

Javaを使用したSeleniumフレームワーク| Seleniumチュートリアル| Seleniumトレーニングオンライン

このブログがお役に立てば幸いです。Seleniumフレームワークとは何か、それがどのように有益であるか、これら3つのSeleniumフレームワークを使用してコード構造を構築する方法を明確に理解できたと思います。このシリーズの他のブログにご期待ください。

Seleniumを学び、テストドメインでキャリアを築きたい場合は、インタラクティブなライブオンラインをご覧ください。 ここでは、24時間365日のサポートが付属しており、学習期間全体をガイドします。 「SeleniumFramework」に関連する概念は、Edurekaのコースで詳細に説明されています。

質問がありますか?コメント欄にご記入ください。折り返しご連絡いたします。