为什么在我的Gradle构建中不执行某些测试?
我已经继承了大约1000次测试的项目。直到最近,当我输入gradle clean test
命令时,它们全部被执行。为什么在我的Gradle构建中不执行某些测试?
从一天到另一天,一些测试停止包含在测试统计中(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)中丢失的测试com.mycompany.comm.CommApplicationTests
中的一个。
这是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
。
我该如何解决或解决erorr问题(即确保所有已执行的测试都反映在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(27.11。 2017 16:51 MSK): Mac上不会发生此错误(Gradle报告正确的总数,通过和失败的测试数)。
更新3(2017年11月29日12:48 MSK):
我使用Java 1.8.0_152和摇篮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上表现稍有不同的事实可能是由许多情况引起的。
Re“究竟是什么让您认为”结果未包含在整体统计数据中?“:几件事情。首先,一些测试类不会出现在最终报告中(如果我在Idea中执行相同的Gradle任务,我可以将测试结果导出为HTML)。那些“缺失”类确实存在并且没有错误(我可以在Idea中执行这些测试)。 2)在Gradle日志文件中,这些测试类出现在诸如'X STARTED'和'X PASSED'(测试类的X-name)之类的消息中。当我比较两天之间的出口报告时,我发现一些测试在某一天出现,并在下一次测试中消失。 –
我必须补充一点,这似乎是一个幻影错误,因为有时会报告正确的结果。 –
有时候?这不是一些问题的gradle任务依赖关系?例如,某些类可能无法编译,但在编译时会执行。你在“测试”之前总是使用“干净”吗? 没有看到这一点真的很难说。 – Marwin
由于您的警告来自JDK,因此在有/无错误的系统上使用哪个Java版本可能更有意义。此外,gradle版本可能是有意义的。最后,Gradle论坛可能是获得这方面支持的更好的地方。 – tkruse
关于Java和Gradle版本,请参阅更新3。 –