Распараллеливание тестов WD с использованием ThreadLocal
Итак,для тех кто не знает что такое ThreadLocal в Java
ThreadLocal — http://java.sun.com/javase/6/docs/api/java/lang/ThreadLocal.html
Незаслуженно забытый класс, существующий ещё с версии 1.2. И ставший ещё более привлекательным, подружившись с generics. Класс позволяет имея одну переменную, иметь различное значение для каждого из потоков.
То есть для тестов на WD он нам подходит идеально,чтобы не задумываться над синхронизацией между потоками и состоянии драйвера и других объектов.
Сейчас покажу то,что нам потребуется чтобы наши тесты выполнялись параллельно, каждый метод в отдельном браузере с независимым объектом WebDriver.
(каждый метод это конечно для примера,вообще на каждый метод выделять по запуску браузера-это роскошь)
Как его применить в проекте?
Примерно так:
Сделаем класс фабрику:
Сейчас покажу то,что нам потребуется чтобы наши тесты выполнялись параллельно, каждый метод в отдельном браузере с независимым объектом WebDriver.
(каждый метод это конечно для примера,вообще на каждый метод выделять по запуску браузера-это роскошь)
Как его применить в проекте?
Примерно так:
Сделаем класс фабрику:
class LocalDriverFactory { static WebDriver createInstance(String browserName) { if (browserName.toLowerCase().contains("firefox")) { return new FirefoxDriver(); } if (browserName.toLowerCase().contains("internet")) { return new InternetExplorerDriver(); } if (browserName.toLowerCase().contains("chrome")) { return new ChromeDriver(); } return new FirefoxDriver(); } }
public class LocalDriverManager { private static ThreadLocalwebDriver = new ThreadLocal (); public static WebDriver getDriver() { return webDriver.get(); } static void setWebDriver(WebDriver driver) { webDriver.set(driver); } }
Простой класс где мы сеттим в ThreadLocal переменную WD и запрашиваем его.
Настало время переопределить TestNG Listener,для действий перед методом и после.
public class WebDriverListener implements IInvokedMethodListener { @Override public void beforeInvocation(IInvokedMethod method, ITestResult testResult) { if (method.isTestMethod()) { String browserName = method.getTestMethod().getXmlTest().getLocalParameters().get("browserName"); WebDriver driver = LocalDriverFactory.createInstance(browserName); LocalDriverManager.setWebDriver(driver); } } @Override public void afterInvocation(IInvokedMethod method, ITestResult testResult) { if (method.isTestMethod()) { WebDriver driver = LocalDriverManager.getDriver(); if (driver != null) { driver.quit(); } } } }И напоследок,какой нибудь демо тест
В этом примере,у нас должны запуститься оба метода в разных потоках и с разными экземплярами WD.
Для проверки мы выводим эту информацию в консоль.
public class ThreadLocalDemo { @Test public void testMethod1() { invokeBrowser("http://www.ndtv.com"); } @Test public void testMethod2() { invokeBrowser("http://www.facebook.com"); } private void invokeBrowser(String url) { System.out.println("Thread id = " + Thread.currentThread().getId()); System.out.println("Hashcode of webDriver instance = " + LocalDriverManager.getDriver().hashCode()); LocalDriverManager.getDriver().get(url); } }
И xml suite для запуска
[TestNG] Running: Thread id = 10 Hashcode of webDriver instance = 1921042184 Thread id = 9 Hashcode of webDriver instance = 2017986718 =============================================== Suite Total tests run: 2, Failures: 0, Skips: 0 ===============================================
Вот и все.