Я пытаюсь провести параллельное тестирование с использованием Selenium и Cucumber. Итак, у нас есть около 130 тестовых сценариев, для запуска которых требуется около 1,5 часов.Теперь, запустив все эти тесты параллельно, я могу сократить время.
Я использую следующие 2 плагина:
<plugin>
<groupId>com.github.temyers</groupId>
<artifactId>cucumber-jvm-parallel-plugin</artifactId>
<version>5.0.0</version>
<executions>
<execution>
<id>generateRunners</id>
<phase>generate-test-sources</phase>
<goals>
<goal>generateRunners</goal>
</goals>
<configuration>
<outputDirectory>runner</outputDirectory>
<glue>
<package>${PackageName}</package>
</glue>
<featuresDirectory>${FeaturesDirectory}</featuresDirectory>
<cucumberOutputDir>target/cucumber-parallel</cucumberOutputDir>
<format>json</format>
<plugins>
<plugin>
<name>json</name>
</plugin>
</plugins>
<useTestNG>true</useTestNG>
<parallelScheme>SCENARIO</parallelScheme>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>3.0.0-M3</version>
<executions>
<execution>
<id>acceptance-test</id>
<phase>integration-test</phase>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
<configuration>
<forkCount>3</forkCount>
<reuseForks>true</reuseForks>
<argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine>
<includes>
<include>**/Parallel*IT.class</include>
</includes>
<properties>
<property>
<name>junit</name>
<value>false</value>
</property>
</properties>
</configuration>
</execution>
</executions>
</plugin>
Итак, идея в том, что если я задаю счетчик потоков или счетчик форков 3, он вызовет 3 браузера и запустит тесты.С CUcumber JVM Parallel Plug я создал 131 бегун для всех сценариев.С аннотацией @Before от Cucumber я могу вызвать браузер один раз, и для всех последующих экземпляров он будет использовать один и тот же экземпляр браузера (что позволяет сэкономить время, чтобы снова и снова открывать и закрывать браузеры.)
Теперьесли бы мы могли использовать @BeforeClass или @AfterClass, это было бы гораздо более простым решением.Но как мы не можем.Мне пришлось использовать @Before, таким образом вызывая один и тот же метод снова и снова с каждым сценарием.
import cucumber.api.java.Before;
public class stepdefs(){
static Browser browser;
public static Scenario scenario;
static TestConfiguration configuration = TestConfiguration.getConfiguration();
@Before
public void before(Scenario scenario) {
if (browser == null) {
if (System.getProperty("seleniumRemoteWebDriver") == null) {
WebTestSettings webTestSettings = configuration.getWebTestSettings();
browser = Browser.LOAD_LOCAL_BROWSER(webTestSettings.externalBrowser, webTestSettings.driverPath);
} else {
if (System.getProperty("version") == null) {
browser = new RemoteBrowser(System.getProperty("browser"), System.getProperty("seleniumRemoteWebDriver"), System.getProperty("platform"));
} else {
browser = new RemoteBrowser(System.getProperty("browser"), System.getProperty("seleniumRemoteWebDriver"), System.getProperty("platform"), System.getProperty("version"));
}
}
TestContext.getContext().setBrowser(browser);
}
Browser browser = TestContext.getContext().getBrowser();
this.scenario = scenario;
browser.driver.manage().window().maximize();
}}
Так что это сработало для @Before, но не сработает для @After.Здесь я хочу закрыть все экземпляры браузера после завершения теста.Но как я узнаю, какой из них является последним?Или как мне закрыть все экземпляры?Есть ли способ использовать @AfterClass или @BeforeCLass или использовать SetupTeardown с JUnit / TestNG + Maven-Failsafe-plugin?
Я пробовал использовать Junit и TestNG оба.Раньше я использовал файл Runner, который распространяется на класс SetupTearDown для непараллельного выполнения.Но, очевидно, не может использовать это, поскольку классы бегунов генерируются во время выполнения.Пробовал использовать этап до интеграции, а также этап после интеграции.Который не бежал.Может быть, я не правильно использую эту фазу.