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

maven可以同时执行cucumber-JUnit和TestNG运行程序吗?

萧玮
2023-03-14

我有两节cucumber赛跑课。其中一个是基于JUnit的runner,另一个是基于TestNG的。Junit one是我为API测试实现的第一个运行程序,并通过maven按预期运行。我在项目中添加了一个web测试,并使用TestNG来帮助我实现跨浏览器测试。因此,我创建了一个额外的cucumber runner(基于TestNG)。当我通过< code>testng.xml文件运行web测试时,它按预期运行。在这一点上没有问题。

JUnit Cucumber跑步者:

@Suite
@IncludeEngines("cucumber")
@SelectClasspathResource("features")
@IncludeTags("api")
@ConfigurationParameter(key = GLUE_PROPERTY_NAME, value = "stepdefinitions")
@ConfigurationParameter(key = PLUGIN_PROPERTY_NAME, value = "json:target/surefire-reports/cucumber.json")


public class RunCucumberTest {
}

TestNGcucumber跑步者

@CucumberOptions(
        plugin = {"pretty", "html:target/surefire-reports/cucumber",
                "json:target/surefire-reports/cucumberOriginal.json"},
        glue = {"stepdefinitions"},
        tags = "@web-1",
        features = {"src/test/resources/features/web.feature"})
public class RunCucumberNGTest extends AbstractTestNGCucumberTests {

public final static ThreadLocal<String> BROWSER = new ThreadLocal<>();

  @BeforeTest
  @Parameters({"Browser"})
  public void defineBrowser(String browser) {
    //put browser value to thread-safe container
    RunCucumberNGTest.BROWSER.set(browser);
    System.out.println(browser);
  }

}

TestNG配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">

<suite name="Suite" parallel="tests" thread-count="5">

    <test name="Chrome Test">
        <parameter name="Browser" value="CHROME"/>
        <classes>
            <class name="config.RunCucumberNGTest"/>
        </classes>
    </test>
    <test name="Firefox Test">
        <parameter name="Browser" value="FF"/>
        <classes>
            <class name="config.RunCucumberNGTest"/>
        </classes>
    </test>
</suite>

JUnit runner是通过maven-surefire插件嵌入到POM中的,因此如果我执行maven命令,例如<code>mvn test</code>,则如预期的那样,只执行JUnit运行程序。

现在,为了同时执行两个runner,我使用<code>在maven-surefire插件中添加了TestNG runner

 <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.0.0-M5</version>
                <configuration>
                    <properties>
                        <configurationParameters>
                            cucumber.junit-platform.naming-strategy=long
                        </configurationParameters>
                    </properties>

                    <suiteXmlFiles>
                        <suiteXmlFile>testng.xml</suiteXmlFile>
                    </suiteXmlFiles>

                </configuration>
            </plugin>
            <plugin>
                <groupId>net.masterthought</groupId>
                <artifactId>maven-cucumber-reporting</artifactId>
                <version>5.6.2</version>
                <executions>
                    <execution>
                        <id>execution</id>
                        <phase>verify</phase>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                        <configuration>
                            <projectName>AutomationFrameworkSkeleton</projectName>
                            <!-- optional, per documentation set this to "true" to bypass generation of Cucumber Reports entirely, defaults to false if not specified -->
                            <skip>false</skip>
                            <outputDirectory>${project.build.directory}
                            </outputDirectory>
                            <inputDirectory>${project.build.directory}
                            </inputDirectory>
                            <jsonFiles>
                                <param>**/*.json</param>
                            </jsonFiles>

                            <!-- optional, set true to group features by its Ids -->
                            <mergeFeaturesById>false</mergeFeaturesById>
                            <!-- optional, set true to get a final report with latest results of the same test from different test runs -->
                            <mergeFeaturesWithRetest>false
                            </mergeFeaturesWithRetest>
                            <!-- optional, set true to fail build on test failures -->
                            <checkBuildResult>false</checkBuildResult>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

有没有办法和maven一起运行cucumber Junit和TestNG类?我想是有的。我可能错误地将< code>testng.xml文件添加到了POM中。

共有1个答案

程和煦
2023-03-14

从您的问题来看,您似乎正在尝试同时运行 API 和跨浏览器 Web 测试。如果您由于其他原因不必使用两个运行器,则可以通过这种方式实现跨浏览器配置。我用 docker 容器对其进行了测试,但它可以在没有 docker 的情况下使用

驱动程序工厂类中执行此操作。这个类应该与你的stepdefs一起使用,因为它正在使用@Before

public class DriverFactory {

    public static Collection tagList;

    @Before
        public void getScenarioTags(Scenario scenario) {
            tagList =  scenario.getSourceTagNames();            
         }
         
    
        public RemoteWebDriver getManager() throws MalformedURLException , IOException {          
        if (tagList.contains("@firefox")){
              //implement FirefoxManager class to return firefox instance . class may be outside your stepdefs
               return new FirefoxManager().getDriver();
                }
          else if (tagList.contains("@chrome")){
          //implement ChromeManager class to return chrome instance. class may be outside your stepdefs
              return new ChromeManager().getDriver();
             }
            else{
                return null;
              }
        } 
                    
}

在特征文件中相应地标记这些方案,并将它们包含在< code>@cucumberOptions中。我以这种方式包含标签< code>tags = {"@firefox或@chrome"},

我正在docker实例上运行这个场景级并行测试设置。但是,我使用的是courgettejvmtestNG。如果您想了解有关 testNG的更多信息,请看一下这个问题。另请查看 courgettejvm

 类似资料:
  • 下面是我的赛跑课, 配置失败:@AfterClass tearDownClass java.lang.NullPoInterException at Cucumber.api.testng.AbstractTestngCucumberTests.tearDownClass(AbstractTestngCucumberTests.java:34)at Sun.Reflect.NativeMethod

  • 我正在努力获得Cucumber-JVM V4.0.0与JUnit/Maven一起工作的新并行执行特性。 如前所述,如果在POM中相应地配置和,并使用依赖项注入来共享状态(我使用的是Pico Continer),那么Cucumber特性应该并行执行。 如果有用的话,下面是我的runner类(com.softwareAutomation.world是DI类) 请参阅下面从Maven运行时的失败堆栈跟踪

  • 我正在用cucumber和硒网络司机一起工作。我的测试工作与预期的组合。为了实现跨浏览器测试,我添加了TestNG框架。为了验证我的跨浏览器测试运行良好,我单独使用TestNG运行了它,没有使用cucumber。它在Chrome和火狐浏览器中都运行完美。 } 测试开始了。xml文件: 我需要将TestNG测试与Cucumber设置相集成,这样我就可以用Cucumber运行整个测试。为此,我将cuc

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

  • 我试图在IntelliJ中运行cucumber特征文件。 Cucumber Options指向正确的文件夹,但在尝试执行JUnit运行程序类时,我会收到“无可用任务”通知。 我做错了什么? 这是我的: