Многопоточное выполнение TestNG DataProvider

Я пытаюсь выполнить многопоточный тест через TestNG. @BeforeMethod создает экземпляры WebDrivers для теста. @AfterMethod закрывает WebDrivers после теста. @Dataprovider предоставляет данные для многократного выполнения теста в цикле.

 import java.lang.reflect.Method;

 import org.openqa.selenium.By;
 import org.openqa.selenium.WebDriver;
 import org.openqa.selenium.chrome.ChromeDriver;
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.AfterSuite;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;

 public class MultipleSession {
     private WebDriver driver;

     @BeforeMethod
     public void beforeMethod() {
         System.err.println("Before ID" + Thread.currentThread().getId());
         System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
         if (driver == null) {
             driver = new ChromeDriver();

             driver.get("https://www.google.co.in/");
         }

     }

     @DataProvider(name = "sessionDataProvider", parallel = true)
     public static Object[][] sessionDataProvider(Method method) {
         int len = 12;

         Object[][] parameters = new Object[len][1];
         for (int i = 0; i < len; i++) {
             parameters[i][0] = i;

         }
         return parameters;
     }

     @Test(dataProvider = "sessionDataProvider")
     public void executSessionOne(int input) {
         System.err.println("Test ID" + Thread.currentThread().getId());



         driver.findElement(By.name("q")).sendKeys(input + "");
         try {
             Thread.sleep(5000);
         } catch (InterruptedException e) {

             e.printStackTrace();
         }

     }

     @AfterMethod
     public void afterMethod() {
         System.err.println("After ID" + Thread.currentThread().getId());
     }

     @AfterSuite
     public void afterSuti() {
         driver.close();
         driver.quit();
     }
  }

Моя проблема в том, что даже несмотря на то, что TestNG открывает 10 браузеров одновременно, задачи выполняются только одним браузером, в то время как другие 9 браузеров ничего не делают. Как распределить экземпляры Webdriver, объявленные в beforeMethod, по всем потокам?

Заранее спасибо.


person manish    schedule 04.02.2016    source источник
comment
TestNG создает класс один раз и разделяет поля между тестовыми методами. Вместо этого передайте WebDriver через DataProvider для определения области видимости переменной.   -  person Ben Manes    schedule 04.02.2016
comment
@ben Если я сделаю это таким образом, проблема в том, что открыт только один экземпляр браузера, и все задачи выполняются в этом экземпляре. Мое требование - наличие нескольких браузеров, и все задачи должны быть распределены между всеми открытыми потоками, не закрывая браузер.   -  person manish    schedule 05.02.2016
comment
Вероятно, вам нужно установить средство запуска тестов на parallel = 'methods', иначе тесты будут запускаться последовательно. Однако, если остальная часть вашего набора тестов не готова к параллельному использованию, вам необходимо пометить ее с помощью @Test(singleThreaded = true). Я долгое время не использовал WebDriver из Java, так что, надеюсь, на одной JVM можно запускать несколько. В противном случае вам придется использовать подход fork для разделения теста на несколько JVM.   -  person Ben Manes    schedule 05.02.2016


Ответы (1)


private WebDriver driver;

Эта строка означает, что существует только один экземпляр webdriver, driver = new ChromeDriver(); создает один и тот же объект драйвера снова и снова.

Чтобы решить эту проблему, создайте фабрику и запрашивайте объект драйвера у фабрики в каждом методе @Test. Примерный код фабрики будет примерно таким:

static synchronized RemoteWebDriver getDriver()
{
System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
         if (driver == null) {
             driver = new ChromeDriver()
}
person Surbhi Sharma    schedule 23.02.2016