maven中执行JUnit测试的时候,我使用log4j进行日志打印,怎样才能获取log4j打印的日志?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了maven中执行JUnit测试的时候,我使用log4j进行日志打印,怎样才能获取log4j打印的日志?相关的知识,希望对你有一定的参考价值。

参考技术A 修改logj.properties日记级别

如何让 maven surefire 正确执行 JUnit 和 TestNG 测试?

【中文标题】如何让 maven surefire 正确执行 JUnit 和 TestNG 测试?【英文标题】:Howto have maven surefire execute JUnit and TestNG test properly? 【发布时间】:2013-07-22 20:59:33 【问题描述】:

有一段时间可以配置 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>

(taken from here)

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

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

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

【问题讨论】:

在 Maven-Users-List 上交叉发布:maven.40175.n5.nabble.com/… 【参考方案1】:

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

    首先从插件中删除dependencies 部分。 否则,如果您使用&lt;testNGArtifactName&gt;(我们将需要它),TestNG 无论如何都会执行测试,并且会在java.lang.NullPointerException 上失败 TestNG 测试和 JUnit 测试有一些分离。在我们的例子中,NG 测试类名称以TestNg 结尾 跳过默认执行 定义两个&lt;executions&gt;,如下所示:
<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>

这个配置是来自:Running TestNG-, JUnit3- and JUnit4-tests with Maven Surefire in one run,your SUREFIRE bug report,surefire plugin configuration的想法的边缘

希望对你有帮助。

【讨论】:

我们还没有这样做,但我正在保存这个答案,等我们到达那里。【参考方案2】:

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

理论上这应该可行:)

【讨论】:

我无法将&lt;dependencies&gt; 元素拉入执行。如果可以的话,那真的是 the 解决方案,一个执行仅限于 jUnit,另一个执行仅限于 TestNG :( 你误会了。我的意思是像原始问题一样拥有两个 。但是你可以配置不同的包含/排除,一个执行只会找到 JUnit 测试,而另一个只会找到 testNG 测试。这样一来,不需要的测试就会被surefire过滤掉,并且不会传递给测试框架。 啊。是的,我也尝试过(而且情况更糟)TestNG get 已为所有执行激活,如果一个执行没有要运行的测试,则构建失败(是的,有一个属性......) - 看起来好像我发现了一个错误,maven 用户邮件列表中的某个人强烈鼓励我report an issue。 +1 解答和帮助!【参考方案3】:

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

【讨论】:

以上是关于maven中执行JUnit测试的时候,我使用log4j进行日志打印,怎样才能获取log4j打印的日志?的主要内容,如果未能解决你的问题,请参考以下文章

Maven 学习总结

如何使用 HSQLDB 内存数据库设置为 Maven 项目执行 Junit 测试套件?

从Eclipse中的Maven项目调试Junit测试

如何让 maven surefire 正确执行 JUnit 和 TestNG 测试?

Maven单元测试

Maven 依赖于 Spring Boot 和 Junit