栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java如何并行执行cucumber特征文件

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java如何并行执行cucumber特征文件

<dependency>    <groupId>com.github.temyers</groupId>    <artifactId>cucumber-jvm-parallel-plugin</artifactId>    <version>2.1.0</version>  </dependency>

首先,你需要在项目pom文件中添加具有所需配置的此插件。

<plugin> <groupId>com.github.temyers</groupId> <artifactId>cucumber-jvm-parallel-plugin</artifactId> <version>2.1.0</version> <executions>    <execution>    <id>generateRunners</id>    <phase>generate-test-sources</phase>    <goals>      <goal>generateRunners</goal>    </goals>    <configuration>        <!-- Mandatory -->        <!-- comma separated list of package names to scan for glue pre -->        <glue>foo, bar</glue>        <outputDirectory>${project.build.directory}/generated-test-sources/cucumber</outputDirectory>         <!-- The directory, which must be in the root of the runtime classpath, containing your feature files.  -->          <featuresDirectory>src/test/resources/features/</featuresDirectory>         <!-- Directory where the cucumber report files shall be written  -->         <cucumberOutputDir>target/cucumber-parallel</cucumberOutputDir>         <!-- comma separated list of output formats json,html,rerun.txt -->         <format>json</format>         <!-- CucumberOptions.strict property -->         <strict>true</strict>         <!-- CucumberOptions.monochrome property -->         <monochrome>true</monochrome>         <!-- The tags to run, maps to CucumberOptions.tags property you can pass ANDed tags like "@tag1","@tag2" and ORed tags like "@tag1,@tag2,@tag3" -->        <tags></tags>        <!-- If set to true, only feature files containing the required tags shall be generated. -->        <filterFeaturesByTags>false</filterFeaturesByTags>        <!-- Generate TestNG runners instead of default JUnit ones. -->         <useTestNG>false</useTestNG>        <!-- The naming scheme to use for the generated test classes.  One of 'simple' or 'feature-title' -->        <namingScheme>simple</namingScheme>       <!-- The class naming pattern to use.  only required/used if naming scheme is 'pattern'.-->       <namingPattern>Parallel{c}IT</namingPattern>       <!-- One of [SCENARIO, FEATURE]. SCENARIO generates one runner per scenario.  FEATURE generates a runner per feature. -->       <parallelScheme>SCENARIO</parallelScheme>       <!-- This is optional, required only if you want to specify a custom template for the generated sources (this is a relative path) -->       <customVmTemplate>src/test/resources/cucumber-custom-runner.vm</customVmTemplate>       </configuration>      </execution>    </executions>  </plugin>

现在在上方插件下方添加下方插件,它将调用由上方插件生成的运行器类

   <plugin>       <groupId>org.apache.maven.plugins</groupId>       <artifactId>maven-surefire-plugin</artifactId>       <version>2.19</version>       <configuration> <forkCount>5</forkCount><reuseForks>true</reuseForks><includes>    <include>**/*IT.class</include></includes>       </configuration>   </plugin>

上面的两个插件可以并行运行黄瓜测试(只要你的机器还具有高级硬件支持)。

<forkCount>n</forkCount>
此处严格提供的 “ n”与1)高级硬件支持和2)可用节点(即注册到HUB的浏览器实例)成正比。

一个主要的和最重要的变化是你的webdriver类必须是SHARED,你应该不执行driver.quit()方法,如封闭是照管关闭挂钩。

import cucumber.api.Scenario;import cucumber.api.java.After;import cucumber.api.java.Before;import org.openqa.selenium.OutputType;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebDriverException;import org.openqa.selenium.firefox.FirefoxDriver;import org.openqa.selenium.support.events.EventFiringWebDriver;public class SharedDriver extends EventFiringWebDriver {   private static WebDriver REAL_DRIVER = null;   private static final Thread CLOSE_THREAD = new Thread() {       @Override       public void run() {REAL_DRIVER.close();       }   };   static {       Runtime.getRuntime().addShutdownHook(CLOSE_THREAD);   }   public SharedDriver() {       super(CreateDriver());   }   public static WebDriver CreateDriver() {       WebDriver webDriver;       if (REAL_DRIVER == null)webDriver = new FirefoxDriver();       setWebDriver(webDriver);       return webDriver;   }   public static void setWebDriver(WebDriver webDriver) {       this.REAL_DRIVER = webDriver;   }   public static WebDriver getWebDriver() {       return this.REAL_DRIVER;   }   @Override   public void close() {       if (Thread.currentThread() != CLOSE_THREAD) {throw new UnsupportedOperationException("You shouldn't close this WebDriver. It's shared and will close when the JVM exits.");       }       super.close();   }   @Before   public void deleteAllcookies() {       manage().deleteAllcookies();   }   @After   public void embedScreenshot(Scenario scenario) {       try {byte[] screenshot = getScreenshotAs(OutputType.BYTES);scenario.embed(screenshot, "image/png");       } catch (WebDriverException somePlatformsDontSupportScreenshots) {System.err.println(somePlatformsDontSupportScreenshots.getMessage());       }   }}

考虑到你要执行50个以上的线程,即没有向HUB注册相同的浏览器实例,但是如果Hub没有足够的内存,它将死掉,因此,为避免这种严重情况,你应该使用-DPOOL_MAX = 512(或更大)来启动Hub如grid2文档中所述。

Really large (>50 node) Hub installations may need to increase the jetty threads by setting -DPOOL_MAX=512 (or larger) on the java command line.

java -jar selenium-server-standalone-<version>.jar -role hub -DPOOL_MAX=512



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/414896.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号