你是否難以維護(hù)應(yīng)用程序的大量測(cè)試用例?測(cè)試數(shù)據(jù)是否分散在各種測(cè)試腳本中?您是否必須為每個(gè)測(cè)試環(huán)境維護(hù)單獨(dú)的測(cè)試腳本,然后在測(cè)試數(shù)據(jù)中一個(gè)值發(fā)生更改的情況下在所有腳本中進(jìn)行搜索?這很費(fèi)時(shí)間,很費(fèi)力,不是嗎?我們都希望測(cè)試用例是一致的,并以統(tǒng)一的方式編寫,遵循一組規(guī)則,例如我們有交通規(guī)則,并且每個(gè)人在路上都嘗試遵循相同的規(guī)則。這就是數(shù)據(jù)驅(qū)動(dòng)框架起作用的地方。 自動(dòng)化測(cè)試框架是用于創(chuàng)建和設(shè)計(jì)測(cè)試用例的一組準(zhǔn)則或規(guī)則。該準(zhǔn)則包括編碼標(biāo)準(zhǔn),對(duì)象存儲(chǔ)庫(kù),測(cè)試數(shù)據(jù)處理方法,存儲(chǔ)測(cè)試結(jié)果的過(guò)程或有關(guān)如何訪問(wèn)外部資源的任何其他信息。 測(cè)試人員可以始終在沒(méi)有框架的情況下編寫測(cè)試,這不是必需的步驟,但是使用組織化的框架還可以帶來(lái)其他好處,例如增加代碼重用,更高的可移植性,降低的腳本維護(hù)成本以及更高的代碼可讀性。它還可以幫助團(tuán)隊(duì)以標(biāo)準(zhǔn)格式寫下測(cè)試腳本。使用自動(dòng)化測(cè)試框架,可以高效地設(shè)計(jì)和開發(fā)自動(dòng)化測(cè)試腳本,并確??煽康胤治鍪軠y(cè)系統(tǒng)或應(yīng)用程序的問(wèn)題或錯(cuò)誤。以下部分列出了一些重要的優(yōu)點(diǎn),這些優(yōu)點(diǎn)證明了對(duì)自動(dòng)化測(cè)試框架的需求是合理的: 使用自動(dòng)化測(cè)試框架非常重要,因?yàn)樗梢蕴岣咦詣?dòng)化測(cè)試團(tuán)隊(duì)的效率和測(cè)試開發(fā)速度。使用自動(dòng)化框架的一些好處如下:
使用Selenium WebDriver測(cè)試應(yīng)用程序時(shí),可以使用三種主要類型的框架為任何Web應(yīng)用程序創(chuàng)建自動(dòng)化測(cè)試: 數(shù)據(jù)驅(qū)動(dòng)測(cè)試框架。 關(guān)鍵字驅(qū)動(dòng)的測(cè)試框架。 混合測(cè)試框架。 這些框架中的每一個(gè)都有其自己的體系結(jié)構(gòu)以及不同的優(yōu)缺點(diǎn)。在制定測(cè)試計(jì)劃時(shí),重要的是要選擇適合您的框架。 數(shù)據(jù)驅(qū)動(dòng)測(cè)試框架 用于將測(cè)試腳本與測(cè)試數(shù)據(jù)分開。您可以使用多組數(shù)據(jù)測(cè)試同一腳本。我們將在以下主題中詳細(xì)討論此框架。 關(guān)鍵字驅(qū)動(dòng)測(cè)試框架 是數(shù)據(jù)驅(qū)動(dòng)框架的擴(kuò)展。它允許在測(cè)試腳本外部將一組稱為“關(guān)鍵字”的代碼存儲(chǔ)在單獨(dú)的代碼文件中。我們可以在多個(gè)測(cè)試腳本中重復(fù)使用這些關(guān)鍵字。 混合驅(qū)動(dòng)框架 是數(shù)據(jù)驅(qū)動(dòng)框架和關(guān)鍵字驅(qū)動(dòng)框架的組合。在這里,關(guān)鍵字以及測(cè)試數(shù)據(jù)都是外部的。我們?cè)趩为?dú)的文件中維護(hù)關(guān)鍵字,并在excel文件或CSV文件或數(shù)據(jù)庫(kù)中測(cè)試數(shù)據(jù)。 在本文中,讓我們深入研究數(shù)據(jù)驅(qū)動(dòng)測(cè)試框架。 通常,當(dāng)我們手動(dòng)測(cè)試應(yīng)用程序時(shí),我們針對(duì)多個(gè)測(cè)試數(shù)據(jù)運(yùn)行相同的方案。此外,我們將相同的測(cè)試數(shù)據(jù)保存在某些文件中,例如Excel文件,文本文件,CSV文件或任何數(shù)據(jù)庫(kù)。自動(dòng)化也是如此,我們希望對(duì)多個(gè)測(cè)試數(shù)據(jù)運(yùn)行相同的測(cè)試方案。假設(shè)您已經(jīng)寫了一個(gè)自動(dòng)化腳本來(lái)填寫 ToolsQA Demo網(wǎng)站上的學(xué)生注冊(cè)表格。可能有很多學(xué)生要注冊(cè),唯一區(qū)別在于代碼的是輸入值(姓名,地址,電話,性別等)。您會(huì)為每個(gè)學(xué)生注冊(cè)一個(gè)單獨(dú)的腳本嗎?有沒(méi)有辦法,我們可以重用代碼并僅更改學(xué)生數(shù)據(jù)? 是的,這是數(shù)據(jù)驅(qū)動(dòng)框架發(fā)揮作用的地方,它可以使測(cè)試腳本針對(duì)不同的測(cè)試數(shù)據(jù)集正常工作。這樣可以節(jié)省編寫其他代碼的時(shí)間。這就像一次編寫并多次運(yùn)行的機(jī)制一樣,因?yàn)槟梢远啻芜\(yùn)行相同的Selenium腳本。 簡(jiǎn)而言之,當(dāng)我們必須使用多組測(cè)試數(shù)據(jù)執(zhí)行相同的腳本時(shí),就使用數(shù)據(jù)驅(qū)動(dòng)框架,這些測(cè)試數(shù)據(jù)的存儲(chǔ)位于不同的位置,并且不在測(cè)試腳本內(nèi)。對(duì)數(shù)據(jù)所做的任何更改都不會(huì)影響測(cè)試代碼。 以下是質(zhì)量保證人員在使用數(shù)據(jù)驅(qū)動(dòng)技術(shù)開發(fā)自動(dòng)化框架時(shí)可以從中獲得的一些主要好處: 無(wú)需修改代碼即可修改測(cè)試用例。 它允許使用多組數(shù)據(jù)值測(cè)試應(yīng)用程序,尤其是在回歸測(cè)試期間。 它幫助我們從測(cè)試數(shù)據(jù)中分離出測(cè)試用例/腳本的邏輯。 該測(cè)試最常用的數(shù)據(jù)源之一是Microsoft Excel Sheets。我們可以將數(shù)據(jù)保留在excel工作表中,并在測(cè)試腳本中使用它們。讓我們看看如何通過(guò)從Excel文件讀取測(cè)試數(shù)據(jù)來(lái)創(chuàng)建數(shù)據(jù)驅(qū)動(dòng)的UI自動(dòng)化框架。 如何使用Apache POI在Selenium中創(chuàng)建數(shù)據(jù)驅(qū)動(dòng)框架? 從Selenium中的Excel中讀取和寫入數(shù)據(jù)”中學(xué)到了如何使用Apache POI在Excel文件中讀取和寫入數(shù)據(jù),然后將與測(cè)試數(shù)據(jù)相同的數(shù)據(jù)集傳遞給Selenium測(cè)試。但是在該腳本中,從Excel文件讀取數(shù)據(jù),將數(shù)據(jù)寫入Excel文件,將數(shù)據(jù)傳遞給Selenium操作的所有動(dòng)作都發(fā)生在該類的main方法中。如果我們僅編寫一個(gè)或兩個(gè)測(cè)試用例,則該格式是可以接受的。但是,當(dāng)我們必須開發(fā)一個(gè)具有多個(gè)測(cè)試方案的自動(dòng)化框架時(shí),它應(yīng)該適當(dāng)?shù)亟M織并且應(yīng)該具有定義的文件夾層次結(jié)構(gòu)。 數(shù)據(jù)驅(qū)動(dòng)測(cè)試框架的基本經(jīng)驗(yàn)法則是將測(cè)試數(shù)據(jù)與測(cè)試腳本分開。此外,從文件讀取/寫入數(shù)據(jù)的操作應(yīng)分開進(jìn)行,并且可以作為實(shí)用程序使用。 請(qǐng)按照下面提到的步驟創(chuàng)建一個(gè)基本的數(shù)據(jù)驅(qū)動(dòng)框架,該框架將用于自動(dòng)執(zhí)行“學(xué)生注冊(cè)表“。
完成上述步驟后,文件夾結(jié)構(gòu)將如下所示: 讓我們了解每個(gè)類的詳細(xì)信息: 1. ExcelUtils類–這是一個(gè)實(shí)用程序類,它將包含與Excel Sheet讀寫操作以及初始化工作簿有關(guān)的所有方法。然后,您可以通過(guò)創(chuàng)建Excel Utils類的對(duì)象在不同的測(cè)試用例中重用這些方法。該類的代碼如下: 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)建一個(gè)File類的對(duì)象來(lái)打開xls文件 File file = new File(excelFilePath); //創(chuàng)建FileInputStream類的對(duì)象以讀取excel文件 FileInputStream inputStream = new FileInputStream(file); //正在創(chuàng)建引用.xls文件的工作簿實(shí)例 workbook=new HSSFWorkbook(inputStream); //創(chuàng)建圖紙對(duì)象 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.常量類–用于將常量值放在文件中,以便可以在測(cè)試用例中重復(fù)使用它們。將值放置在單獨(dú)的文件中的另一個(gè)優(yōu)勢(shì)是,如果這些值在任何測(cè)試中都是通用的,那么如果其中的任何值有任何更改,則只需要在一個(gè)位置進(jìn)行更新即可。例如,如果文件路徑已更改,則無(wú)需使用新值更新所有測(cè)試用例,而只需在一個(gè)文件中對(duì)其進(jìn)行更新。 此類中的結(jié)構(gòu)和值如下所示– package utilities; public class Constants { public static final String URL = "https:///automation-practice-form"; public static final String Path_TestData = "E:\\Projects\\src\\testData\\"; public static final String File_TestData = "TestData.xls"; 3. RegisterStudentTest –這是學(xué)生注冊(cè)表的測(cè)試腳本,我們用于輸入特定學(xué)生的名字,姓氏,手機(jī),電子郵件,性別等。由于我們現(xiàn)在已經(jīng)將與excel相關(guān)的方法分離在一個(gè)單獨(dú)的文件中,因此測(cè)試用例的代碼也會(huì)更改。 我們將在此測(cè)試文件中創(chuàng)建ExcelUtils 類的對(duì)象,并使用常量 引用文件的路徑。 更新后的代碼現(xiàn)在看起來(lái)像– 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類的對(duì)象 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ū)動(dòng)程序路徑 System.setProperty("webdriver.chrome.driver","E:\\Projects\\chromedriver.exe"); //創(chuàng)建ChromeDriver對(duì)象 WebDriver driver = new ChromeDriver(); //啟動(dòng)指定的URL driver.get("https:///automation-practice-form"); //確定學(xué)生登記表的WebElements WebElement 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"); //遍歷所有行以打印每個(gè)單元格中的數(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(); //驗(yàn)證確認(rèn)消息 WebElement confirmationMessage = driver.findElement(By.xpath("http://div[text()='Thanks for submitting the form']")); //檢查是否顯示確認(rèn)消息 if (confirmationMessage.isDisplayed()) { // 如果顯示消息,則使用excel方法在excel表中寫入PASS excelUtils.setCellValue(i,6,"PASS",excelFilePath); } else { //如果未顯示消息,請(qǐng)使用excel方法在excel表中寫入FAIL excelUtils.setCellValue(i,6,"FAIL",excelFilePath); } //close the confirmation popup WebElement closebtn=driver.findElement(By.id("closeLargeModal")); closebtn.click(); //單擊“關(guān)閉”按鈕后,等待頁(yè)面返回注冊(cè)頁(yè)面 driver.manage().timeouts().implicitlyWait(2000,TimeUnit.SECONDS); } //關(guān)閉驅(qū)動(dòng)程序 driver.quit(); } } 但是,如果您注意到,ExcelUtils的方法將 處理所有與excel相關(guān)的代碼。 因此,這是在Selenium中使用數(shù)據(jù)驅(qū)動(dòng)框架的方法之一。此外,您可以利用在多組數(shù)據(jù)上運(yùn)行相同測(cè)試的優(yōu)勢(shì)。 |
|
來(lái)自: 軟件測(cè)試test > 《待分類》