У меня есть 40 тестов Webdriver, разделенных на две группы-один, который должен быть запущен последовательно (где каждый имеет тег группы метаданных «crm_import») и один, который может быть запущен параллельно. На эти две группы ссылаются следующие XML-файлы:
TestNG.xml
<suite name = "Suite" thread-count="2" parallel="methods">
<test name = "TestSet">
<groups>
<run>
<exclude name = "crm_import"/>
</run>
</groups>
<classes>
<class name = "com.dcp.test.suite.TestSuite"/>
</classes>
</test>
</suite>
TestNG_includeOnly.xml
<suite name = "Suite2" verbose="1" >
<test name = "TestSet">
<groups>
<run>
<include name = "crm_import"/>
</run>
</groups>
<classes>
<class name = "com.dcp.test.suite.TestSuite"/>
</classes>
</test>
</suite>
Эти две ссылки в файле POM следующим образом:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.8</version>
<configuration>
<suiteXmlFiles>
<suiteXmlFile>testng.xml</suiteXmlFile>
<suiteXmlFile>testng-includeOnly.xml</suiteXmlFile>
</suiteXmlFiles>
...
</configuration>
Поскольку мне нужно запустить их из Jenkins, когда я получаю схему работы, я использую версию командной строки, чтобы запустить их, используя следующее, чтобы попытаться просто запустить параллельный набор:
mvn clean test -DsuiteXmlFile=testng.xml site
Возникают две проблемы…
- Он выполняет оба набора
- При выполнении 40 тестов 38 окон остаются открытыми
Если я иду в файл POM и комментировать один набор или другой и просто запустить…
mvn clean test site
…тогда все в порядке-никаких окон не остается открытым, и параллельные тесты выполняются параллельно.
Если вам интересно, как я открываю и закрываю браузер, вот скелет базового класса, который TestSuite.java — файл расширяется…
public class TestSuiteBase implements IInvokedMethodListener {
...
@Override
public void beforeInvocation(IInvokedMethod method, ITestResult testResult) {
if (method.isTestMethod()) {
System.setProperty("webdriver.firefox.marionette", "/opt/geckodriver");
ProfilesIni profile = new ProfilesIni();
String ffProfileName = properties.getProperty("ffProfileName");
FirefoxProfile myprofile = profile.getProfile(ffProfileName);
System.out.println("--> creating WebDriver instance..." + "Thread id = " + Thread.currentThread().getId());
WebDriver driver = new FirefoxDriver(myprofile);
LocalDriverManager.setWebDriver(driver);
}
}
@Override
public void afterInvocation(IInvokedMethod method, ITestResult testResult) {
if (method.isTestMethod()) {
WebDriver driver = LocalDriverManager.getDriver();
if (driver != null) {
System.out.println("After Test breakdown, quitting driver..." + "Thread id = " + Thread.currentThread().getId());
driver.quit();
}
}
}
Если вам интересно, откуда у меня эта архитектура, я позаимствовал ее здесь… https://rationaleemotions.wordpress.com/2013/07/31/parallel-webdriver-executions-using-testng/
Ваш общий блог — это мой блог 🙂
Если вы должны были смотреть на прохождение в нескольких комплектах TestNG, то вы, возможно, должны взглянуть на этот пост в блоге. Это должно в основном заботиться о вашей проблеме № 1.
Для вашей проблемы #2, т. е. у вас открыто несколько окон браузера, вы могли бы, возможно, сделать следующее в вашем
afterInvocation
методе :Здесь мы явно аннулируем контекст webdriver текущего потока.
Я не совсем уверен, что его действительно собирается исправить проблему, но вы могли бы попробовать это и посмотреть, если это поможет.