4

我想在TestNg中並行運行使用@dataprovider的硒測試。理想情況下,測試是通過方法(一個測試=一個方法)並行,而不是瀏覽器的簡單套件並行。我曾經在某處讀過大約5個ChromeDriver實例可以被控制,所以我認爲這應該是可能的。後來我打算轉到grid2。對於開發,我通過右鍵單擊+在XML配置文件上運行,使用IntelliJ Idea測試運行器運行。使用數據提供程序執行並行TestNG硒測試的驅動程序行爲

我在並行運行我的測試時遇到問題(在grid2和本地),所以我創建了一個或多或少我想要做的樣本。

這裏是我的測試類

package tests; 

import org.openqa.selenium.By; 
import org.openqa.selenium.Keys; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.WebElement; 
import org.openqa.selenium.chrome.ChromeDriver; 
import org.openqa.selenium.firefox.FirefoxDriver; 
import org.openqa.selenium.interactions.Actions; 
import org.testng.annotations.*; 
import java.util.concurrent.TimeUnit; 
import static org.testng.Assert.assertNotNull; 

public class ParallelTest { 
    public static final String SEARCH_TERMS = "search-terms"; 
    private WebDriver driver; 

    @BeforeMethod 
    @Parameters({"browser"}) 
    public void beforeMethod(@Optional("chrome") String browser){ 
     driver = getBrowser(browser); 
     driver.manage().deleteAllCookies(); 
     driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 
    } 

    private WebDriver getBrowser(String browser) { 
     if(browser.equals("chrome")){ 
      System.setProperty("webdriver.chrome.driver", "webdrivers\\chromedriver.exe"); 
      return new ChromeDriver(); 
     } 
     return new FirefoxDriver(); 
    } 

    @AfterMethod 
    public void afterMethod(){ 
     driver.quit(); 
    } 

    @Test(description = "Check parallel selenium works.", 
      dataProvider = SEARCH_TERMS) 
    public void parallelSeleniumTest(String searchTerm){ 
     driver.get("http://google.com"); 
     WebElement search = driver.findElement(By.id("gbqfq")); 
     new Actions(driver) 
       .sendKeys(search, searchTerm) 
       .sendKeys(search, Keys.ENTER) 
       .perform(); 
     String firstResult = driver.findElements(By.className("r")).get(0).getText(); 
     assertNotNull(firstResult); 
     System.out.println(firstResult); 
    } 

    @DataProvider(name = SEARCH_TERMS, parallel = true) 
    public Object[][] getSearchTerms(){ 
     return new Object[][]{ 
       {"google"}, 
       {"microsoft"}, 
       {"facebook"}, 
       {"amazon"}, 
       {"apple"}, 
       {"oracle"}, 
       {"yahoo"}, 
       {"jetbrains"}, 
       {"intellij idea"}, 
       {"selenium"}, 
       {"java"}, 
       {"testng"}, 
       {"code"} 
     }; 
    } 
} 

我在一些本地的事件扔,因爲我在測試套件中大量使用它們。

這裏是TestNG的XML配置文件

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> 
<suite thread-count="4" name="vfr6-ui-tests" parallel="methods"> 
    <test name="parallel-test-firefox"> 
     <parameter name="browser" value="firefox"/> 
     <classes> 
      <class name="tests.ParallelTest"/> 
     </classes> 
    </test> 
    <test name="parallel-test-chrome"> 
     <parameter name="browser" value="chrome"/> 
     <classes> 
      <class name="tests.ParallelTest"/> 
     </classes> 
    </test> 
</suite> 

我讀實例每次測試一個司機往往是最易於維護。問題在於,firefox測試以串行方式運行,而chrome測試作爲測試用例吐出所有數據點,試圖打開一大堆瀏覽器實例,然後一切都失敗。我的測試將有10-25或300-500個數據點(在客戶端或客戶端x產品之間循環)。

設置驅動程序,數據提供者和測試運行器以在運行測試中實現最佳並行性的最佳方式是什麼?

回答

3

我對dataProvider有相同的經驗。在我的情況下,我使用dataProvider(parallel = true)屬性。您的問題有兩種解決方案。

  1. 使用dataProvider並在測試類中使用您的構造函數的工廠註釋。 在工廠註解的屬性中,使用dataProvider =「您的dataProvider的名稱」。 在testng.xml中,而不是parallel =方法,請使用parallel = instances。

    上述方法的缺點是,當你得到報告時;可能是maven- surefire,testng的Eclipse報告或reportNG報告,你看不到參數前面 傳遞。爲了克服這個問題,你可以使用下面的方法。

  2. 使用 for循環創建工廠類並在工廠方法中實例化您的測試類。 (從0開始循環。)在測試類中定義一個構造函數,其中從工廠類接收參數 。在此測試類中定義一個dataProvider,其中 可以使用構造函數中收到的參數(數據點)。定義可以使用該參數或數據點的BeforeMethod 或BeforeClass,並且您的測試方法應該 具有指向所需dataProvider的「dataProvider」屬性。再次,在 testng.xml中使用parallel =「instances」。

    此外,使用try/catch塊來實例化驅動程序對象並關閉瀏覽器。這 將幫助您避免由於tearDown方法的setUp失敗而跳過。

+0

很好的迴應,聽起來很合理。我很早就回到了編寫應用程序的語言(C#)。希望別人認爲這有用! – craastad

1

您並不需要使用工廠。然後

driver = getBrowser(browser); 

,返回驅動程序實例作爲參數的個數來測試方法的第2列:如果我是你,我會的數據提供程序方法中調用此代碼。這樣做允許數據提供者生成瀏覽器實例。爲了改善這一點,您可以使用構建器設計模式(以DriverHelper類的形式)來替代getBrowser方法,以便在將驅動程序實例傳遞到測試方法之前生成更具體的驅動程序配置。

注意:請記住,如果您以後想要使用Spring加載驅動程序,那麼此方法根本無法工作。事實上,你根本無法使用DataProvider。但是,如果你不使用Spring,那麼我會說這是最優雅的做法。

相關問題