數(shù)據(jù)驅(qū)動框架(Apache POI – Excel)

你是否難以維護應(yīng)用程序的大量測試用例?測試數(shù)據(jù)是否分散在各種測試腳本中?您是否必須為每個測試環(huán)境維護單獨的測試腳本,然后在測試數(shù)據(jù)中一個值發(fā)生更改的情況下在所有腳本中進行搜索?這很費時間,很費力,不是嗎?我們都希望測試用例是一致的,并以統(tǒng)一的方式編寫,遵循一組規(guī)則,例如我們有交通規(guī)則,并且每個人在路上都嘗試遵循相同的規(guī)則。這就是數(shù)據(jù)驅(qū)動框架起作用的地方。

自動化測試框架是用于創(chuàng)建和設(shè)計測試用例的一組準(zhǔn)則或規(guī)則。該準(zhǔn)則包括編碼標(biāo)準(zhǔn),對象存儲庫,測試數(shù)據(jù)處理方法,存儲測試結(jié)果的過程或有關(guān)如何訪問外部資源的任何其他信息。
測試人員可以始終在沒有框架的情況下編寫測試,這不是必需的步驟,但是使用組織化的框架還可以帶來其他好處,例如增加代碼重用,更高的可移植性,降低的腳本維護成本以及更高的代碼可讀性。它還可以幫助團隊以標(biāo)準(zhǔn)格式寫下測試腳本。使用自動化測試框架,可以高效地設(shè)計和開發(fā)自動化測試腳本,并確保可靠地分析受測系統(tǒng)或應(yīng)用程序的問題或錯誤。以下部分列出了一些重要的優(yōu)點,這些優(yōu)點證明了對自動化測試框架的需求是合理的:

使用自動化測試框架非常重要,因為它可以提高自動化測試團隊的效率和測試開發(fā)速度。使用自動化框架的一些好處如下:
所有測試的標(biāo)準(zhǔn)格式
提高測試效率
降低腳本維護成本
最大測試范圍
代碼的可重用性
高效的測試數(shù)據(jù)管理

使用Selenium WebDriver測試應(yīng)用程序時,可以使用三種主要類型的框架為任何Web應(yīng)用程序創(chuàng)建自動化測試:

數(shù)據(jù)驅(qū)動測試框架。
關(guān)鍵字驅(qū)動的測試框架。
混合測試框架。
這些框架中的每一個都有其自己的體系結(jié)構(gòu)以及不同的優(yōu)缺點。在制定測試計劃時,重要的是要選擇適合您的框架。
數(shù)據(jù)驅(qū)動測試框架 用于將測試腳本與測試數(shù)據(jù)分開。您可以使用多組數(shù)據(jù)測試同一腳本。我們將在以下主題中詳細討論此框架。
關(guān)鍵字驅(qū)動測試框架 是數(shù)據(jù)驅(qū)動框架的擴展。它允許在測試腳本外部將一組稱為“關(guān)鍵字”的代碼存儲在單獨的代碼文件中。我們可以在多個測試腳本中重復(fù)使用這些關(guān)鍵字。
混合驅(qū)動框架 是數(shù)據(jù)驅(qū)動框架和關(guān)鍵字驅(qū)動框架的組合。在這里,關(guān)鍵字以及測試數(shù)據(jù)都是外部的。我們在單獨的文件中維護關(guān)鍵字,并在excel文件或CSV文件或數(shù)據(jù)庫中測試數(shù)據(jù)。
在本文中,讓我們深入研究數(shù)據(jù)驅(qū)動測試框架。

通常,當(dāng)我們手動測試應(yīng)用程序時,我們針對多個測試數(shù)據(jù)運行相同的方案。此外,我們將相同的測試數(shù)據(jù)保存在某些文件中,例如Excel文件,文本文件,CSV文件或任何數(shù)據(jù)庫。自動化也是如此,我們希望對多個測試數(shù)據(jù)運行相同的測試方案。假設(shè)您已經(jīng)寫了一個自動化腳本來填寫
ToolsQA Demo網(wǎng)站上的學(xué)生注冊表格。可能有很多學(xué)生要注冊,唯一區(qū)別在于代碼的是輸入值(姓名,地址,電話,性別等)。您會為每個學(xué)生注冊一個單獨的腳本嗎?有沒有辦法,我們可以重用代碼并僅更改學(xué)生數(shù)據(jù)?
是的,這是數(shù)據(jù)驅(qū)動框架發(fā)揮作用的地方,它可以使測試腳本針對不同的測試數(shù)據(jù)集正常工作。這樣可以節(jié)省編寫其他代碼的時間。這就像一次編寫并多次運行的機制一樣,因為您可以多次運行相同的Selenium腳本。
簡而言之,當(dāng)我們必須使用多組測試數(shù)據(jù)執(zhí)行相同的腳本時,就使用數(shù)據(jù)驅(qū)動框架,這些測試數(shù)據(jù)的存儲位于不同的位置,并且不在測試腳本內(nèi)。對數(shù)據(jù)所做的任何更改都不會影響測試代碼。


以下是質(zhì)量保證人員在使用數(shù)據(jù)驅(qū)動技術(shù)開發(fā)自動化框架時可以從中獲得的一些主要好處:
無需修改代碼即可修改測試用例。
它允許使用多組數(shù)據(jù)值測試應(yīng)用程序,尤其是在回歸測試期間。
它幫助我們從測試數(shù)據(jù)中分離出測試用例/腳本的邏輯。
該測試最常用的數(shù)據(jù)源之一是Microsoft Excel Sheets。我們可以將數(shù)據(jù)保留在excel工作表中,并在測試腳本中使用它們。讓我們看看如何通過從Excel文件讀取測試數(shù)據(jù)來創(chuàng)建數(shù)據(jù)驅(qū)動的UI自動化框架。
如何使用Apache POI在Selenium中創(chuàng)建數(shù)據(jù)驅(qū)動框架?
從Selenium中的Excel中讀取和寫入數(shù)據(jù)”中學(xué)到了如何使用Apache POI在Excel文件中讀取和寫入數(shù)據(jù),然后將與測試數(shù)據(jù)相同的數(shù)據(jù)集傳遞給Selenium測試。但是在該腳本中,從Excel文件讀取數(shù)據(jù),將數(shù)據(jù)寫入Excel文件,將數(shù)據(jù)傳遞給Selenium操作的所有動作都發(fā)生在該類的main方法中。如果我們僅編寫一個或兩個測試用例,則該格式是可以接受的。但是,當(dāng)我們必須開發(fā)一個具有多個測試方案的自動化框架時,它應(yīng)該適當(dāng)?shù)亟M織并且應(yīng)該具有定義的文件夾層次結(jié)構(gòu)。
數(shù)據(jù)驅(qū)動測試框架的基本經(jīng)驗法則是將測試數(shù)據(jù)與測試腳本分開。此外,從文件讀取/寫入數(shù)據(jù)的操作應(yīng)分開進行,并且可以作為實用程序使用。
請按照下面提到的步驟創(chuàng)建一個基本的數(shù)據(jù)驅(qū)動框架,該框架將用于自動執(zhí)行“學(xué)生注冊表“。
在您的項目中為testCases,testData和Utility創(chuàng)建三個New Packages。”。
在testData包下,將具有測試數(shù)據(jù)的Excel工作表放入。使用此方法,我們將測試數(shù)據(jù)與testCases分開。
在實用程序下,創(chuàng)建一個新類,并將其命名為“ ExcelUtils ”。它將包含與Excel有關(guān)的所有用于讀寫的功能。
在實用程序包下,創(chuàng)建另一個類“ Constants”。它將包含跨框架的常量值,例如testdata文件路徑,應(yīng)用程序的URL等。
在testCases包下,我們將創(chuàng)建包含用于與Web元素交互的Selenium代碼的測試文件。(例如,RegisterStudentTest.java)
完成上述步驟后,文件夾結(jié)構(gòu)將如下所示:

讓我們了解每個類的詳細信息:
1. ExcelUtils類–這是一個實用程序類,它將包含與Excel Sheet讀寫操作以及初始化工作簿有關(guān)的所有方法。然后,您可以通過創(chuàng)建Excel Utils類的對象在不同的測試用例中重用這些方法。該類的代碼如下:
import org.apache.poi.hssf.usermodel.HSSFCell;import org.apache.poi.hssf.usermodel.HSSFRow;import org.apache.poi.hssf.usermodel.HSSFSheet;import org.apache.poi.hssf.usermodel.HSSFWorkbook;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;public class ExcelUtils {private static HSSFWorkbook workbook;private static HSSFSheet sheet;private static HSSFRow row;private static HSSFCell cell;public void setExcelFile(String excelFilePath,String sheetName) throws IOException {//創(chuàng)建一個File類的對象來打開xls文件File file = new File(excelFilePath);//創(chuàng)建FileInputStream類的對象以讀取excel文件FileInputStream inputStream = new FileInputStream(file);//正在創(chuàng)建引用.xls文件的工作簿實例workbook=new HSSFWorkbook(inputStream);//創(chuàng)建圖紙對象sheet=workbook.getSheet(sheetName);}public String getCellData(int rowNumber,int cellNumber){//從rowNumber和cell Number獲取單元格值cell =sheet.getRow(rowNumber).getCell(cellNumber);//以字符串形式返回單元格值return cell.getStringCellValue();}public int getRowCountInSheet(){int rowcount = sheet.getLastRowNum()-sheet.getFirstRowNum();return rowcount;}public void setCellValue(int rowNum,int cellNum,String cellValue,String excelFilePath) throws IOException {//在行中創(chuàng)建新單元格并為其設(shè)置值sheet.getRow(rowNum).createCell(cellNum).setCellValue(cellValue);FileOutputStream outputStream = new FileOutputStream(excelFilePath);workbook.write(outputStream);}}
上面的代碼包含不同的方法,例如setExcelFile 初始化Excel 工作簿,getCellValue 檢索文件中特定單元格中存在的值,setCellValue 設(shè)置一些值到新創(chuàng)建的單元格中。以類似的方式,您可以在此類中創(chuàng)建與excel操作相關(guān)的不同方法。
2.常量類–用于將常量值放在文件中,以便可以在測試用例中重復(fù)使用它們。將值放置在單獨的文件中的另一個優(yōu)勢是,如果這些值在任何測試中都是通用的,那么如果其中的任何值有任何更改,則只需要在一個位置進行更新即可。例如,如果文件路徑已更改,則無需使用新值更新所有測試用例,而只需在一個文件中對其進行更新。 此類中的結(jié)構(gòu)和值如下所示–
package utilities;public class Constants {public static final String URL = "https://demoqa.com/automation-practice-form";public static final String Path_TestData = "E:\\Projects\\src\\testData\\";public static final String File_TestData = "TestData.xls";
3. RegisterStudentTest –這是學(xué)生注冊表的測試腳本,我們用于輸入特定學(xué)生的名字,姓氏,手機,電子郵件,性別等。由于我們現(xiàn)在已經(jīng)將與excel相關(guān)的方法分離在一個單獨的文件中,因此測試用例的代碼也會更改。
我們將在此測試文件中創(chuàng)建ExcelUtils 類的對象,并使用常量 引用文件的路徑。
更新后的代碼現(xiàn)在看起來像–
package testCases;import org.openqa.selenium.By;import org.openqa.selenium.JavascriptExecutor;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.chrome.ChromeDriver;import utilities.Constants;import utilities.ExcelUtils;import java.io.IOException;import java.util.concurrent.TimeUnit;public class RegisterStudentTest {//創(chuàng)建ExcelUtils類的對象static ExcelUtils excelUtils = new ExcelUtils();//將常量類值用于excel文件路徑static String excelFilePath =Constants.Path_TestData+Constants.File_TestData;public static void main(String args[]) throws IOException {//設(shè)置Chrome驅(qū)動程序路徑System.setProperty("webdriver.chrome.driver","E:\\Projects\\chromedriver.exe");//創(chuàng)建ChromeDriver對象WebDriver driver = new ChromeDriver();//啟動指定的URLdriver.get("https://demoqa.com/automation-practice-form");//確定學(xué)生登記表的WebElementsWebElement firstName=driver.findElement(By.id("firstName"));WebElement lastName=driver.findElement(By.id("lastName"));WebElement email=driver.findElement(By.id("userEmail"));WebElement genderMale= driver.findElement(By.id("gender-radio-1"));WebElement mobile=driver.findElement(By.id("userNumber"));WebElement address=driver.findElement(By.id("currentAddress"));WebElement submitBtn=driver.findElement(By.id("submit"));//調(diào)用ExcelUtils類方法初始化工作簿和工作表excelUtils.setExcelFile(excelFilePath,"STUDENT_DATA");//遍歷所有行以打印每個單元格中的數(shù)據(jù)。for(int i=1;i<=excelUtils.getRowCountInSheet();i++){//在firstname、lastname、mobile、email、address中輸入從Excel讀取的值firstName.sendKeys(excelUtils.getCellData(i,0));lastName.sendKeys(excelUtils.getCellData(i,1));email.sendKeys(excelUtils.getCellData(i,2));mobile.sendKeys(excelUtils.getCellData(i,3));address.sendKeys(excelUtils.getCellData(i,4));//使用javascript單擊gender單選按鈕JavascriptExecutor js = (JavascriptExecutor) driver;js.executeScript("arguments[0].click();", genderMale);//單擊“提交”按鈕submitBtn.click();//驗證確認消息WebElement confirmationMessage = driver.findElement(By.xpath("http://div[text()='Thanks for submitting the form']"));//檢查是否顯示確認消息if (confirmationMessage.isDisplayed()) {// 如果顯示消息,則使用excel方法在excel表中寫入PASSexcelUtils.setCellValue(i,6,"PASS",excelFilePath);} else {//如果未顯示消息,請使用excel方法在excel表中寫入FAILexcelUtils.setCellValue(i,6,"FAIL",excelFilePath);}//close the confirmation popupWebElement closebtn=driver.findElement(By.id("closeLargeModal"));closebtn.click();//單擊“關(guān)閉”按鈕后,等待頁面返回注冊頁面driver.manage().timeouts().implicitlyWait(2000,TimeUnit.SECONDS);}//關(guān)閉驅(qū)動程序driver.quit();}}
但是,如果您注意到,ExcelUtils的方法將 處理所有與excel相關(guān)的代碼。
因此,這是在Selenium中使用數(shù)據(jù)驅(qū)動框架的方法之一。此外,您可以利用在多組數(shù)據(jù)上運行相同測試的優(yōu)勢。



