java - 为什么有些测试没有在我的 Gradle 构建中执行?

标签 java testing gradle automated-tests jvm-crash

我继承了一个包含大约 1000 个测试的项目。直到最近,当我输入gradle clean test命令时,它们都被执行了。

从一天到另一天,一些测试不再包含在测试统计中(Gradle 和 Idea 在所有测试执行结束时输出的通过、失败和忽略的测试的数量)。代码仍然存在,测试没有被忽略。也没有修改任何构建脚本。当我在 IntelliJ Idea 中运行测试时,它们会被执行(即没有编译器错误可以解释为什么测试不运行)。

我相信测试已执行,但由于以下原因,它们的结果未包含在总体统计数据中。我执行了命令 gradle --debug --rerun-tasks clean test > 2017_11_24_gradle.log。然后我在生成的 2017_11_24_gradle.log 文件 (grep "com.mycompany.comm. CommApplicationTests”2017_11_24_gradle.log)。

这是 grep 的输出:

17:00:54.861 [QUIET] [system.out] 17:00:54.860 [DEBUG] [org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor] Executing test class com.mycompany.comm.CommApplicationTests
17:00:54.867 [DEBUG] [TestEventLogger] com.mycompany.comm.CommApplicationTests STARTED
17:00:55.169 [DEBUG] [TestEventLogger] com.mycompany.comm.CommApplicationTests > validateProtocol STARTED
17:00:55.875 [DEBUG] [TestEventLogger] com.mycompany.comm.CommApplicationTests > validateProtocol STANDARD_OUT
17:00:57.272 [DEBUG] [TestEventLogger] com.mycompany.comm.CommApplicationTests > validateProtocol PASSED
17:00:57.273 [DEBUG] [TestEventLogger] com.mycompany.comm.CommApplicationTests > contextLoads STARTED
17:00:57.273 [DEBUG] [TestEventLogger] com.mycompany.comm.CommApplicationTests > contextLoads PASSED
17:00:57.274 [DEBUG] [TestEventLogger] com.mycompany.comm.CommApplicationTests PASSED

由此我得出结论,测试已执行。

唯一可能会或可能不会导致未包含某些测试结果的可疑之处是:

16:37:47.251 [ERROR] [system.err] *** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at JPLISAgent.c line: 844
16:37:47.343 [ERROR] [system.err] *** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at JPLISAgent.c line: 844
16:37:47.343 [ERROR] [system.err] *** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at JPLISAgent.c line: 844
16:37:47.346 [ERROR] [system.err] *** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at JPLISAgent.c line: 844
16:37:47.346 [ERROR] [system.err] *** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at JPLISAgent.c line: 844
16:37:47.347 [ERROR] [system.err] *** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at JPLISAgent.c line: 844

这些消息在gradle --debug --rerun-tasks clean test执行期间输出到System.err

我如何修复或解决错误(即确保所有执行的测试都反射(reflect)在 Gradle 最后打印的最终统计数据(通过、失败和忽略的测试的数量)中)?

更新 1(2017 年 11 月 27 日 10:49 MSK):

看起来错误发生在 code fragment 中下面(注释 //Line 844):

if ( !errorOutstanding ) {
    jplis_assert(agent->mInstrumentationImpl != NULL);
    jplis_assert(agent->mTransform != NULL);
    transformedBufferObject = (*jnienv)->CallObjectMethod(
                                        jnienv,
                                        agent->mInstrumentationImpl,
                                        agent->mTransform,
                                        loaderObject,
                                        classNameStringObject,
                                        classBeingRedefined,
                                        protectionDomain,
                                        classFileBufferObject,
                                        is_retransformer);
    errorOutstanding = checkForAndClearThrowable(jnienv);
    jplis_assert_msg(!errorOutstanding, "transform method call failed"); // Line 844
}

更新 2(2017 年 11 月 27 日 16:51 MSK):此错误不会发生在 Mac 上(Gradle 报告正确的总数、通过和失败的测试)。

更新 3(2017 年 11 月 29 日 12:48 MSK):

我使用的是 Java 1.8.0_152 和 Gradle 2.14。由于客户要求,我无法升级Gradle版本。

java -version
java version "1.8.0_152"
Java(TM) SE Runtime Environment (build 1.8.0_152-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.152-b16, mixed mode)


gradle -version

------------------------------------------------------------
Gradle 2.14
------------------------------------------------------------

Build time:   2016-06-14 07:16:37 UTC
Revision:     cba5fea19f1e0c6a00cc904828a6ec4e11739abc

Groovy:       2.4.4
Ant:          Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM:          1.8.0_152 (Oracle Corporation 25.152-b16)
OS:           Windows 10 10.0 amd64

最佳答案

不看测试代码很难判断。然而,究竟是什么原因让你认为“结果未纳入总体统计”呢?我没有看到任何概念?报告的测试数量是否减少了?

还是只是错误信息?这些似乎是报告给标准错误输出的“唯一”错误消息。这样的错误并不一定意味着测试失败,它们只是“警告”——从某种意义上说,除了将它们写入错误输出之外什么也没做,例如可以看到 here .

因此,我的印象是测试确实通过了,它们只是打印了一条(警告)错误消息。它们在 Mac 上的行为略有不同,这可能是由多种情况造成的。

关于java - 为什么有些测试没有在我的 Gradle 构建中执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47486638/

相关文章:

java - 如何在java中使用重复键构造以下数据

java - Imageloader.save 到 ByteArrayOutputStream 的速度非常慢

testing - 在 Go 中,当使用示例...测试方法时,有没有办法让它显示差异而不是得到...想要...?

gradle - 如何告诉 Gradle 一直使用 --console=plain?

安卓工作室 : ZipException duplicate entry custom class

java - 第一次连接到 Glassfish v3 很慢

ftp - java库做FTP操作

testing - 检查网络应用程序爬虫是否有任何错误?

testing - 检查点是否位于凸四边形内或凸四边形上的最有效方法

groovy - 如何在gradle中打印任务名称?