Zachowanie sterownika wykonujące równoległe testy selenowe TestNG z dataprovider

Chcę uruchomić testy selenu w TestNg równolegle, które używają @dataprovider. Idealnie testy są równoległe metodą (jeden test = jedna metoda), a nie prostą równoległością pakietu przez przeglądarkę. Przeczytałem gdzieś, że około 5 wystąpień ChromeDrivera może być kontrolowanych jednocześnie, więc pomyślałem, że to powinno być możliwe. Później planuję przejść do siatki2. Do rozwoju używam rzeczy z testerem IntelliJ Idea klikając prawym przyciskiem myszy + uruchom plik konfiguracyjny XML.

Miałem problemy z uruchomieniem testów równolegle (na grid2 i lokalnie), więc stworzyłem próbkę mniej więcej tego, co chcę zrobić.

Oto moja klasa testowa

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"}
        };
    }
}

Wrzuciłem kilka rodzimych wydarzeń, ponieważ mocno ich używam w moim zestawie testów.

A oto plik konfiguracyjny 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>

Czytam, że tworzenie jednego sterownika na test jest zazwyczaj najbardziej możliwe do utrzymania. Problem polega na tym, że test firefox działa szeregowo, podczas gdy test chrome wypluwa wszystkie punkty danych jako przypadki testowe, próbuje otworzyć wiele instancji przeglądarki, a następnie wszystko zawiedzie. Moje testy będą miały albo 10-25 albo 300-500 punktów danych (cykl między klientami lub klientami x produktów).

Jak najlepiej skonfigurować sterownik, dataprovider i test runner, aby osiągnąć najlepszą równoległość podczas uruchamiania testów?

questionAnswers(2)

yourAnswerToTheQuestion