当前位置: 首页 > 知识库问答 >
问题:

无法使用JUnit或TestNG注解,如@BeforeClass@AfterClass,同时使用Fail安全cucumber并行插件

岑明辉
2023-03-14

我试图用硒和cucumber做并行测试。因此,我们有大约130个测试场景,运行时间约为1.5小时。现在通过并行运行所有这些测试,我可以减少时间。

我正在使用以下两个插件:

 <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并行插件,我为所有场景创建了131个runner。使用Cucumber的@Before注释,我可以调用浏览器一次,接下来的所有实例都将使用同一个浏览器实例(从而节省了反复打开和关闭浏览器的时间)

现在,如果我们可以使用@BeforeClass或@AfterClass,这将是更简单的解决方案。但正如我们不能。我必须使用@以前,因此在每个场景中一次又一次地调用相同的方法。

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();
           }}

所以这对之前有效,但对之后无效。我想在这里实现的是在测试完成后关闭所有浏览器实例。但是我怎么知道哪个1是最终实例?或者如何关闭所有实例?有没有办法使用@AfterClass或@BeforeCLass或使用SetupTeardown与JUnit/TestNG Maven-Failsec-plugin?

我尝试使用JUnit和TestNG两者。我曾经使用一个Runner文件,它扩展到SetupTearDown类,用于非并行执行。但是显然不能使用它,因为运行时正在生成运行类。尝试使用前集成,后集成阶段以及。它没有运行。可能是我没有正确使用那个阶段。

共有2个答案

穆旭尧
2023-03-14

查看现有代码时,它不是线程安全的,并且由于静态浏览器,不允许并行执行。您应该尝试为BDD/Gherkin使用QAF-Pure TestNG实现,它提供了Gherkin实现,允许您使用所有TestNG侦听器,并为驱动程序和元素提供额外的侦听器。此外,驱动程序管理由qaf负责,因此您可能不需要编写额外的代码来管理驱动程序或其他测试自动化特定需求。qaf将负责在测试后关闭所有浏览器实例,并允许场景级并行执行。

党权
2023-03-14

让我们一步一步走。首先,我们将从4.0开始使用Cucumber V,因为它支持并行执行,为了实现它,我们将添加以下依赖项。

<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-java</artifactId>
    <version>4.2.3</version>
</dependency>

<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-junit</artifactId>
    <version>4.2.3</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>datatable</artifactId>
    <version>1.1.12</version>
</dependency>

<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-testng</artifactId>
    <version>4.2.3</version>
</dependency>

<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-picocontainer</artifactId>
    <version>4.2.3</version>
    <scope>test</scope>
</dependency>  

然后,我们将开始使用maven surefire插件,以便实际使用parallel并行运行测试

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>${maven-surefire.plugin.version}</version>
    <configuration>
        <parallel>methods</parallel>
        <threadCount>1</threadCount>
        <reuserForks>false</reuserForks>
        <testErrorIgnore>true</testErrorIgnore>   
        <testFailureIgnore>true</testFailureIgnore>
        <includes>
            <include>**/*RunCukeTest.java</include>
        </includes>
    </configuration>
</plugin>

根据实现的不同,它将在不同的浏览器中运行测试用例

 类似资料:
  • 问题内容: 在下面使用这种方法时,通过设置带有套件的jUnit。当每个Testclass中的所有@BeforeClass将在开始执行任何测试之前执行时,我们遇到了问题。(对于每个n个TestClass文件,@BeforeClass运行,然后在它们执行之后,它开始执行第一个MyTest.class文件@Test) 这将导致我们分配大量的资源和内存。我的想法是一定是错误的,每个@BeforeClass

  • 我无法同时运行TestNG/JUnit的Cucumber TestRunner类。我希望在我的框架中包含Testng和junit。我得到一些abc类错误。我的项目中有所有的依赖项。我这里有2qns。1.当从cucumber junit导入时,我可以在我的cucumber脚本中使用Testng注释吗?2.如何解决错误执行我的testrun。 我错过了什么...如果我错过了什么,请帮我把它修好。

  • 我试图使用TestNG和SpringBootTest并行运行两个Cucumber测试,但当我的测试执行时,会发生以下情况 两个浏览器都打开并导航到维基百科主页 1个浏览器继续测试,另一个留在主页上 1个测试通过,另一个测试失败 我不知道为什么一个测试会停止执行,欢迎任何帮助。 回购:https://github.com/cmccarthyIrl/spring-cucumber-testng-par

  • 我对在TestNG中使用注释@beforeClass、afterClass、beforeSuite、afterSuite感到困惑。 接下来,afterSuite、beforeSuite和@test: 我的问题是关于语义,意思,而不是实际的代码。我读了testNG文档--没有帮助。

  • 这是另一堂课 和TESTNG XML-------- 当我在testNG中运行上述XML时,它没有执行@BeforeCLass和@AfterClass方法。它将输出显示为- [RemoteTestNG]在Open Test Test ONE中检测到TestNG版本7.2.0

  • 下面是我的pom.xml、testng.xml文件和TestRunners。 下面是我的pom.xml文件 [Utils][ERROR][ERROR]java.lang.NullPointerException在Cucumber.api.testng.AbstractTestngCucumberTests.Scenaries(AbstractTestngCucumberTests.java:31)