7

一段时间以来,可以配置 maven surefire 以在一个构建中执行 jUnit 测试和 testNG 测试。我不会详细说明我这样做的原因(好吧,提示:testNG 是我们的标准框架,但像jnario这样的一些框架需要 jUnit)。

一般的方法是像这样配置surefire插件:

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>${surefire.version}</version>
    <dependencies>
        <dependency>
            <groupId>org.apache.maven.surefire</groupId>
            <artifactId>surefire-junit47</artifactId>
            <version>${surefire.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.surefire</groupId>
            <artifactId>surefire-testng</artifactId>
            <version>${surefire.version}</version>
        </dependency>
    </dependencies>
</plugin>

(取自这里)

这工作得很好,jUnit 测试和 testNG 测试得到执行。

但是 - 现在我看到 testNG 也尝试执行 jUnit 测试(反之亦然) - 当然,没有成功,因为它看不到任何注释,但看起来它重新标记了测试到“通过”......无论如何,一些报告工具不再在 jUnit 测试中显示测试失败,除非我评论第二个依赖项。

有没有更好的方法来配置surefire,以便两个框架的测试只能由它们的测试运行者执行?

4

3 回答 3

6

和你有同样的问题。TestNG 报告中的结果为零,但看起来已经运行了测试。最后在两个单独的执行中完成这项工作maven-surefire-plugin

  1. 首先dependencies从插件中删除该部分。
    • 否则,如果您使用<testNGArtifactName>(我们将需要它)测试将由 TestNG 执行并且将失败java.lang.NullPointerException
  2. 将 TestNG 测试和 JUnit 测试分开。在我们的例子中,NG 测试类名称以TestNg
  3. 跳过默认执行
  4. 定义两个<executions>如下:
<plugin>
    <!-- configured to work with JUnit and TestNg in same project separatelly -->
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>              
    <configuration>
        <!-- whatever you need... -->
        <!-- skip the default execution, we have separate for Ng and for JUnit -->
        <skip>true</skip>
    </configuration>
    <executions>
        <execution>
            <id>TestNg-execution</id>
            <phase>test</phase>
            <goals>
                <goal>test</goal>
            </goals>
            <configuration>
                <!-- overwrite skip from default config -->
                <skip>false</skip>
                <includes>
                    <include>%regex[.*TestNg.*]</include>
                </includes>
                <!-- used to skip JUnit profider -->
                <junitArtifactName>dev:null</junitArtifactName>
                <!-- to continue on next execution in case of failures here -->
                <testFailureIgnore>true</testFailureIgnore>
            </configuration>
        </execution>
        <execution>
            <id>JUnit-execution</id>
            <phase>test</phase>
            <goals>
                <goal>test</goal>
            </goals>
            <configuration>

                <skip>false</skip>
                <!-- used to skip TestNg profider -->
                <testNGArtifactName>dev:null</testNGArtifactName>
                <excludes>
                    <exclude>%regex[.*TestNg.*]</exclude>                               
                </excludes>
            </configuration>                    
        </execution>
    </executions>
</plugin>

经测试:

<junit-version>4.11</junit-version>
<maven-surefire-plugin-version>2.16</maven-surefire-plugin-version>
<org.testng-version>6.8.7</org.testng-version>

此配置是来自以下想法的集合:
在一次运行中使用 Maven Surefire 运行 TestNG-、JUnit3- 和 JUnit4-tests
您的 SUREFIRE 错误报告、 surefire
插件配置

希望能帮助到你。

于 2013-11-30T23:14:39.827 回答
1

我自己还没有这样做,但是您可以尝试配置 maven-surefire-plugin 的两个不同执行,并将其中一个执行配置为仅运行 JUnit 测试,另一个仅运行 testNG 测试。要区分 JUnit 和 testNG 测试,您应该将测试放在不同的目录中,或者使用可区分的名称方案,并使用合适的包含和排除模式配置每个执行。

理论上这应该有效:)

于 2013-07-24T08:08:54.297 回答
0

不确定页面底部的Running TestNG 和 JUnit Tests部分是否存在于 2013 年,但提供程序中的设置现在似乎可以回答您的问题。junit=falsesurefire-testng

于 2021-01-10T21:57:23.623 回答