Selenium自動化的JUnit引數化實踐
作為自動化測試人員,經常會遇到這樣Selenium
測試自動化場景:需要一次又一次地執行相同的測試用例,只是使用不同的輸入和環境配置,從而使工作變得冗長且多餘。
為了處理這種用例冗餘,大多數人都會選擇可以選擇引數化測試。使用引數化測試,測試人員可以再次執行相同的自動化測試指令碼,但使用不同的資料。引數化測試通過利用測試方法收集結果,有助於節省重複編寫相同測試所花費的時間。
在本文中,我將展示如何為Selenium
測試自動化實現JUnit
引數化測試。如果你還不熟悉JUnit
,請參閱有關使用JUnit
和Selenium
進行自動測試的文章。
- JUnit 5和Selenium基礎(一)
- JUnit 5和Selenium基礎(二)
- JUnit 5和Selenium基礎(三)
為什麼需要JUnit引數化測試?
讓我們先從Selenium JUnit
的測試場景開始,如果有個需求想要對一個購物網站執行Selenium
自動化測試。測試人員已經為產品編寫了測試用例指令碼,但是你很快意識到,不僅需要針對不同的商品,而且還要針對不同的OS系統和瀏覽器版本
重複執行用例以確保相容性。
首先,對於Selenium
測試自動化,我們需要多個數據集合來執行測試。隨之而來的是一個跨瀏覽器矩陣,可以覆蓋絕大多數使用者的實際情況。其次,我們需要學習如何編寫測試指令碼從已儲存的資料集中獲取資料。
值得關注的是,在對Web應用程式
進行自動化測試時,很難為後續的測試迭代維護單個穩定可靠的資料來源。除非是特殊基礎資料以及一些極少變更的業務場景,更多的時候我們很難建立用於相同配置的同一測試用例的多個Selenium
Selenium
測試自動化週期中的時間和精力。
為了在我們的Selenium
測試自動化指令碼中使用多個數據集,首先想到的是使用Excel
工作表來獲取該資料。但是,在打算建立更具體的Selenium
測試自動化指令碼的情況時,就需要使用像JUnit
這樣的多合一框架。JUnit
使我們能夠以更健壯的方式編寫測試用例,並使我們擁有多種功能,其中之一就是引數化。
JUnit引數化的型別
兩種使用JUnit引數化測試的有效方法。
- 使用
@Parameters
註解進行引數化 - 使用
Excel
檔案進行引數化
首先,使用@Parameters
Java集合
傳遞給Selenium
指令碼。任何資料更改,測試人員所需要做的就是使用所需資料編輯集合。
其次,使用Excel
進行引數化,測試人員可以自由地從外部檔案中獲取資料,無論數量是多少,都可以載入到Selenium
測試自動化指令碼中。
我們還可以使用JUnit params
依賴關係,通過使用註釋@ParameterizedTest
代替@Test
註解來引數化我們的測試。還可以使用下面列出的各種註釋將引數傳遞給JUnit Parameterized Tests
:
- @ValueSource
- @EnumSource
- @CsvSource
- @CsvFileSource
- @MethodSource
使用@Parameters批註進行引數化
下面是搜尋一些關鍵字的Demo
。現在,讓我們看看如果編寫沒有引數化概念的原始程式碼,程式碼將是什麼樣。
packageFunTester;
importorg.junit.After;
importorg.junit.Before;
importorg.junit.Test;
importorg.openqa.selenium.By;
importorg.openqa.selenium.WebDriver;
importorg.openqa.selenium.WebElement;
importorg.openqa.selenium.chrome.ChromeDriver;
publicclassTestNormExec{
WebDriverdriver;
@Before
publicvoidstartUp(){
System.out.println("----開始測試----");
System.setProperty("webdriver.chrome.driver","chromedriver.exe的path");
driver=newChromeDriver();
driver.get("https://www.****.com/");
driver.manage().window().maximize();
}
@Test
publicvoidsearchKeys(){
StringkeyWrd="FunTester";
WebElementsrchBox=driver.findElement(By.name("q"));
srchBox.sendKeys(keyWrd+"\n");
Stringtitle=driver.getTitle();
System.out.println("Thetitleis:"+title);
}
@After
publicvoidtearDown(){
System.out.println("----結束----");
driver.quit();
}
}
為了使用不同的資料集執行Selenium
測試自動化,keyWrd
物件每次執行測試用例時都必須手動更改字串的值。為了簡化更改輸入值的過程,我們可以使用JUnit
引數化測試對測試用例進行引數化。這也將幫助我們消除Selenium
測試用例中的冗餘。
現在,讓我們進一步探討用於Selenium
測試自動化的JUnit
測試引數化。我將建立一個包含測試方法的類。請注意,在這裡,我將關鍵字作為方法引數傳遞,這與以前的方法不同,在以前的方法中,我將搜尋關鍵字儲存在變數中。
packageFunTester;
importorg.junit.Test;
importorg.openqa.selenium.By;
importorg.openqa.selenium.WebDriver;
importorg.openqa.selenium.WebElement;
importorg.openqa.selenium.chrome.ChromeDriver;
publicclassSearch{
WebDriverdriver;
@Test
publicvoidsearchKeys(StringkyWrd,StringkyWrd1){
System.out.println("----開始測試----");
System.setProperty("webdriver.chrome.driver","chromedriver.exe的path");
driver=newChromeDriver();
driver.get("https://www.****.com/");
driver.manage().window().maximize();
WebElementsrchBox=driver.findElement(By.name("q"));
srchBox.sendKeys(kyWrd+""+kyWrd1+"\n");
Stringtitle=driver.getTitle();
System.out.println("Thetitleis:"+title);
System.out.println("----結束----");
driver.quit();
}
}
在下一步中,我將建立一個帶有@RunWith
註解的類。此類將在新例項上執行測試。除此之外,我還將為此類建立一個建構函式,該建構函式將儲存要測試的資料。
在此示例中,兩個變數將傳遞給此建構函式。接下來,要生成並返回測試資料,我將建立一個靜態方法,其返回型別為Collection
。此集合的每個條目將給出一次執行的資料,例如Selenium
、FunTester
等等,將是一次執行的資料。
此方法的Parameters
註解為要執行的測試提供了輸入資料集。這是此類的最終程式碼。
packageFunTester;
importjava.util.Arrays;
importjava.util.Collection;
importorg.junit.Before;
importorg.junit.Test;
importorg.junit.runner.RunWith;
importorg.junit.runners.Parameterized;
@RunWith(Parameterized.class)
publicclassSearchTest{
privateStringkyWrd1;
privateStringkyWrd2;
privateSearchGooglesearchGoogle;
publicSearchGoogleTest(StringkyWrd1,StringkyWrd2){
super();
this.kyWrd1=kyWrd1;
this.kyWrd2=kyWrd2;
}
@Before
publicvoidinit(){
search=newSearch();
}
@Parameterized.Parameters
publicstaticCollectiondata(){
returnArrays.asList(newObject[][]{{"FunTester","FunTester"},{"JMeter","Selenium"},{"UiAutomator","appium"}});
}
@Test
publicvoidtestSearch(){
searchGoogle.searchKeys(kyWrd1,kyWrd2);
}
}
建立JUnit
引數化測試的最後一步是建立一個測試執行類,該類將驅動我們的測試執行。此類將在JUnitCore.runClasses
的幫助下執行測試,並且我們的測試類將作為引數傳遞給它。
packageparameterizedRun;
importorg.junit.runner.JUnitCore;
importorg.junit.runner.Result;
importorg.junit.runner.notification.Failure;
publicclassRunner{
publicstaticvoidmain(String[]args){
Resultres=JUnitCore.runClasses(SearchTest.class);
for(Failurefail:res.getFailures()){
System.out.println(fail.toString());
}
System.out.println(res.wasSuccessful());
}
}
使用Excel進行引數化
使用Excel資料驅動測試(通常被稱為引數化)進行引數化是處理需要不同測試資料的測試指令碼的有效方法。來自外部檔案的資料在執行時被讀取並載入到測試指令碼中,而不是對其進行硬編碼。
一些常規方案可以是測試具有多個使用者搜尋不同的關鍵字,這種方法的主要好處是程式碼可重用性,無需維護Selenium
測試自動化指令碼,只需更新檔案中的測試資料即可。讓我們看看如何使用資料驅動框架在JUnit
中引數化我們的測試用例。
在Selenium JUnit
教程中,我們需要進行Excel引數化的主要元素是Excel
工作表。我建立了一個由要搜尋的關鍵字組成的Excel
工作表,並將其放置在我的專案位置的Data
件夾下。
一旦我們準備好資料,下一步就是建立將載入Excel
工作簿的工具類檔案,然後從工作表和相應的單元格中讀取資料。早年寫過一些實踐:java使用poi寫入excel文件的一種解決方案,java使用poi讀取excel文件的一種解決方案。
現在,我們已經準備好一個類,其中包含一個用於從Excel
讀取資料的方法,讓我們繼續在另一個類中編寫測試方法,以傳遞與我們需要檢索的關鍵字相對應的引數,同時呼叫獲取資料的方法從Excel
檔案中。
packageFunTester;
importorg.junit.After;
importorg.junit.Before;
importorg.junit.Test;
importorg.openqa.selenium.By;
importorg.openqa.selenium.WebDriver;
importorg.openqa.selenium.WebElement;
importorg.openqa.selenium.chrome.ChromeDriver;
publicclassTestSearch{
WebDriverdriver;
ReadExcelexcel=newReadExcel();
@Before
publicvoidstartUp(){
System.out.println("----開始測試----");
System.setProperty("webdriver.chrome.driver","chromedriver.exe的path");
driver=newChromeDriver();
driver.get("https://www.****.com/");
driver.manage().window().maximize();
}
@Test
publicvoidsearchKeys(){
System.out.println("----搜尋關鍵字----");
WebElementsrchBox=driver.findElement(By.name("q"));
srchBox.sendKeys(excel.getData(0,1,0)+"\n");Stringtitle=driver.getTitle();
System.out.println("Thetitleis:"+title);
}
@After
publicvoidtearDown(){
System.out.println("----結束測試----");
driver.quit();
}
}
執行上述程式碼後,Selenium
測試自動化指令碼將從Excel
工作表的第二行獲取excel資料,要想遍歷測試,可以參考@Parameters
註解提供的方案。
公眾號FunTester首發,原創分享愛好者,騰訊雲、開源中國和掘金社群首頁推薦,知乎準八級強者,歡迎關注、交流,禁止第三方擅自轉載。
FunTester熱文精選
- 寫給所有人的程式設計思維
- 2020年Tester自我提升
- 未來的神器fiddler Everywhere
- 測試開發工程師工作技巧
- Selenium4 IDE,它終於來了
- 自動化測試靈魂三問:是什麼、為什麼和做什麼
- 為什麼測試覆蓋率如此重要
- 吐個槽,非測勿入
- 自動化測試框架
- 敏捷中的端到端測試
本文分享自微信公眾號 - FunTester(NuclearTester)。
如有侵權,請聯絡 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。
來源:六個月寶寶輔食食譜推薦