Selenium自動化的JUnit參數化實踐

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

爲了處理這種用例冗餘,大多數人都會選擇能夠選擇參數化測試。使用參數化測試,測試人員能夠再次運行相同的自動化測試腳本,但使用不一樣的數據。參數化測試經過利用測試方法收集結果,有助於節省重複編寫相同測試所花費的時間。web

在本文中,我將展現如何爲Selenium測試自動化實現JUnit參數化測試。若是你還不熟悉JUnit,請參閱有關使用JUnitSelenium進行自動測試的文章。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。此集合的每一個條目將給出一次運行的數據,例如SeleniumFunTester等等,將是一次執行的數據。

此方法的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(010) + "\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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索