Я пытаюсь выполнить многопоточный тест через 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, по всем потокам?
Заранее спасибо.
WebDriver
черезDataProvider
для определения области видимости переменной. - person Ben Manes   schedule 04.02.2016parallel = 'methods'
, иначе тесты будут запускаться последовательно. Однако, если остальная часть вашего набора тестов не готова к параллельному использованию, вам необходимо пометить ее с помощью@Test(singleThreaded = true)
. Я долгое время не использовал WebDriver из Java, так что, надеюсь, на одной JVM можно запускать несколько. В противном случае вам придется использовать подход fork для разделения теста на несколько JVM. - person Ben Manes   schedule 05.02.2016