1. 程式人生 > 實用技巧 >Selenium自動化的JUnit引數化實踐

Selenium自動化的JUnit引數化實踐

作為自動化測試人員,經常會遇到這樣Selenium測試自動化場景:需要一次又一次地執行相同的測試用例,只是使用不同的輸入和環境配置,從而使工作變得冗長且多餘。

為了處理這種用例冗餘,大多數人都會選擇可以選擇引數化測試。使用引數化測試,測試人員可以再次執行相同的自動化測試指令碼,但使用不同的資料。引數化測試通過利用測試方法收集結果,有助於節省重複編寫相同測試所花費的時間。

在本文中,我將展示如何為Selenium測試自動化實現JUnit引數化測試。如果你還不熟悉JUnit,請參閱有關使用JUnitSelenium進行自動測試的文章。

  • JUnit 5和Selenium基礎(一)
  • JUnit 5和Selenium基礎(二)
  • JUnit 5和Selenium基礎(三)

為什麼需要JUnit引數化測試?

讓我們先從Selenium JUnit的測試場景開始,如果有個需求想要對一個購物網站執行Selenium自動化測試。測試人員已經為產品編寫了測試用例指令碼,但是你很快意識到,不僅需要針對不同的商品,而且還要針對不同的OS系統和瀏覽器版本重複執行用例以確保相容性。

首先,對於Selenium測試自動化,我們需要多個數據集合來執行測試。隨之而來的是一個跨瀏覽器矩陣,可以覆蓋絕大多數使用者的實際情況。其次,我們需要學習如何編寫測試指令碼從已儲存的資料集中獲取資料。

值得關注的是,在對Web應用程式進行自動化測試時,很難為後續的測試迭代維護單個穩定可靠的資料來源。除非是特殊基礎資料以及一些極少變更的業務場景,更多的時候我們很難建立用於相同配置的同一測試用例的多個Selenium

測試自動化指令碼。簡而言之,硬編碼只會帶來大量的維護工作,因此需要JUnit引數化測試來幫助您節省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。此集合的每個條目將給出一次執行的資料,例如SeleniumFunTester等等,將是一次執行的資料。

此方法的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源創計劃”,歡迎正在閱讀的你也加入,一起分享。

來源:六個月寶寶輔食食譜推薦