做爲自動化測試人員,常常會遇到這樣Selenium
測試自動化場景:須要一次又一次地執行相同的測試用例,只是使用不一樣的輸入和環境配置,從而使工做變得冗長且多餘。java
爲了處理這種用例冗餘,大多數人都會選擇能夠選擇參數化測試。使用參數化測試,測試人員能夠再次運行相同的自動化測試腳本,但使用不一樣的數據。參數化測試經過利用測試方法收集結果,有助於節省重複編寫相同測試所花費的時間。web
在本文中,我將展現如何爲Selenium
測試自動化實現JUnit
參數化測試。若是你還不熟悉JUnit
,請參閱有關使用JUnit
和Selenium
進行自動測試的文章。chrome
爲何須要JUnit參數化測試?
讓咱們先從Selenium JUnit
的測試場景開始,若是有個需求想要對一個購物網站執行Selenium
自動化測試。測試人員已經爲產品編寫了測試用例腳本,可是你很快意識到,不只須要針對不一樣的商品,並且還要針對不一樣的OS系統和瀏覽器版本
重複運行用例以確保兼容性。編程
首先,對於Selenium
測試自動化,咱們須要多個數據集合來執行測試。隨之而來的是一個跨瀏覽器矩陣,能夠覆蓋絕大多數用戶的實際狀況。其次,咱們須要學習如何編寫測試腳本從已存儲的數據集中獲取數據。瀏覽器
值得關注的是,在對Web應用程序
進行自動化測試時,很難爲後續的測試迭代維護單個穩定可靠的數據源。除非是特殊基礎數據以及一些極少變動的業務場景,更多的時候咱們很難建立用於相同配置的同一測試用例的多個Selenium
測試自動化腳本。簡而言之,硬編碼只會帶來大量的維護工做,所以須要JUnit參數化測試來幫助您節省Selenium
測試自動化週期中的時間和精力。微信
爲了在咱們的Selenium
測試自動化腳本中使用多個數據集,首先想到的是使用Excel
工做表來獲取該數據。可是,在打算建立更具體的Selenium
測試自動化腳本的狀況時,就須要使用像JUnit
這樣的多合一框架。JUnit
使咱們可以以更健壯的方式編寫測試用例,並使咱們擁有多種功能,其中之一就是參數化。app
JUnit參數化的類型
兩種使用JUnit參數化測試的有效方法。框架
-
使用 @Parameters
註解進行參數化 -
使用 Excel
文件進行參數化
首先,使用@Parameters
批註進行參數化,它容許將測試數據做爲Java集合
傳遞給Selenium
腳本。任何數據更改,測試人員所須要作的就是使用所需數據編輯集合。編輯器
其次,使用Excel
進行參數化,測試人員能夠自由地從外部文件中獲取數據,不管數量是多少,均可以加載到Selenium
測試自動化腳本中。函數
咱們還可使用JUnit params
依賴關係,經過使用註釋@ParameterizedTest
代替@Test
註解來參數化咱們的測試。還可使用下面列出的各類註釋將參數傳遞給JUnit Parameterized Tests
:
-
@ValueSource -
@EnumSource -
@CsvSource -
@CsvFileSource -
@MethodSource
使用@Parameters批註進行參數化
下面是搜索一些關鍵字的Demo
。如今,讓咱們看看若是編寫沒有參數化概念的原始代碼,代碼將是什麼樣。
package FunTester;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
public class TestNormExec {
WebDriver driver;
@Before
public void startUp(){
System.out.println("----開始測試----");
System.setProperty("webdriver.chrome.driver","chromedriver.exe的path");
driver = new ChromeDriver();
driver.get("https://www.****.com/");
driver.manage().window().maximize();
}
@Test
public void searchKeys(){
String keyWrd = "FunTester";
WebElement srchBox = driver.findElement(By.name("q"));
srchBox.sendKeys(keyWrd + "\n");
String title = driver.getTitle();
System.out.println("The title is : " +title);
}
@After
public void tearDown(){
System.out.println("----結束----");
driver.quit();
}
}
爲了使用不一樣的數據集運行Selenium
測試自動化,keyWrd
對象每次運行測試用例時都必須手動更改字符串的值。爲了簡化更改輸入值的過程,咱們可使用JUnit
參數化測試對測試用例進行參數化。這也將幫助咱們消除Selenium
測試用例中的冗餘。
如今,讓咱們進一步探討用於Selenium
測試自動化的JUnit
測試參數化。我將建立一個包含測試方法的類。請注意,在這裏,我將關鍵字做爲方法參數傳遞,這與之前的方法不一樣,在之前的方法中,我將搜索關鍵字存儲在變量中。
package FunTester;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
public class Search {
WebDriver driver;
@Test
public void searchKeys(String kyWrd, String kyWrd1){
System.out.println("----開始測試----");
System.setProperty("webdriver.chrome.driver","chromedriver.exe的path");
driver = new ChromeDriver();
driver.get("https://www.****.com/");
driver.manage().window().maximize();
WebElement srchBox = driver.findElement(By.name("q"));
srchBox.sendKeys(kyWrd + " " + kyWrd1 + "\n");
String title = driver.getTitle();
System.out.println("The title is : " +title);
System.out.println("----結束----");
driver.quit();
}
}
在下一步中,我將建立一個帶有@RunWith
註解的類。此類將在新實例上運行測試。除此以外,我還將爲此類建立一個構造函數,該構造函數將存儲要測試的數據。
在此示例中,兩個變量將傳遞給此構造函數。接下來,要生成並返回測試數據,我將建立一個靜態方法,其返回類型爲Collection
。此集合的每一個條目將給出一次運行的數據,例如Selenium
、FunTester
等等,將是一次執行的數據。
此方法的Parameters
註解爲要運行的測試提供了輸入數據集。這是此類的最終代碼。
package FunTester;
import java.util.Arrays;
import java.util.Collection;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@RunWith(Parameterized.class)
public class SearchTest {
private String kyWrd1;
private String kyWrd2;
private SearchGoogle searchGoogle;
public SearchGoogleTest(String kyWrd1, String kyWrd2){
super();
this.kyWrd1 = kyWrd1;
this.kyWrd2 = kyWrd2;
}
@Before
public void init(){
search = new Search();
}
@Parameterized.Parameters
public static Collection data(){
return Arrays.asList(new Object[][]{{"FunTester","FunTester"},{"JMeter","Selenium"},{"UiAutomator","appium"}});
}
@Test
public void testSearch(){
searchGoogle.searchKeys(kyWrd1,kyWrd2);
}
}
建立JUnit
參數化測試的最後一步是建立一個測試運行類,該類將驅動咱們的測試執行。此類將在JUnitCore.runClasses
的幫助下運行測試,而且咱們的測試類將做爲參數傳遞給它。
package parameterizedRun;
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class Runner {
public static void main(String[] args){
Result res = JUnitCore.runClasses(SearchTest.class);
for(Failure fail: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
文件中。
package FunTester;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
public class TestSearch {
WebDriver driver;
ReadExcel excel = new ReadExcel();
@Before
public void startUp(){
System.out.println("----開始測試----");
System.setProperty("webdriver.chrome.driver","chromedriver.exe的path");
driver = new ChromeDriver();
driver.get("https://www.****.com/");
driver.manage().window().maximize();
}
@Test
public void searchKeys(){
System.out.println("----搜索關鍵字----");
WebElement srchBox = driver.findElement(By.name("q"));
srchBox.sendKeys(excel.getData(0, 1, 0) + "\n"); String title = driver.getTitle();
System.out.println("The title is : " +title);
}
@After
public void tearDown(){
System.out.println("----結束測試----");
driver.quit();
}
}
運行上述代碼後,Selenium
測試自動化腳本將從Excel
工做表的第二行獲取excel數據,要想遍歷測試,能夠參考@Parameters
註解提供的方案。
公衆號FunTester首發,原創分享愛好者,騰訊雲、開源中國和掘金社區首頁推薦,知乎準八級強者,歡迎關注、交流,禁止第三方擅自轉載。
FunTester熱文精選
本文分享自微信公衆號 - FunTester(NuclearTester)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。