Почему некоторые тесты не выполняются в моей сборке Gradle?
Я унаследовал проект с около 1000 тестов. До недавнего времени все они были казнены, когда я вошел в gradle clean test
команда.
Изо дня в день некоторые из тестов перестали включаться в статистику тестов (количество пройденных, провальных и проигнорированных тестов, которые Gradle и Idea выдают в конце выполнения всех тестов). Код все еще там, и тесты не были проигнорированы. Ни один из сценариев сборки не был изменен. Когда я запускаю тесты в IntelliJ Idea, они выполняются (т.е. нет ошибок компилятора, которые могли бы объяснить, почему тесты не выполняются).
Я считаю, что тесты выполнены, но их результаты не включены в общую статистику по следующей причине. Я выполнил команду gradle --debug --rerun-tasks clean test > 2017_11_24_gradle.log
, Затем я искал случаи одного из пропущенных тестов, com.mycompany.comm.CommApplicationTests
в результате 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
Эти сообщения выводятся на System.err
во время исполнения gradle --debug --rerun-tasks clean test
,
Как я могу исправить или обойти erorr (т.е. убедиться, что все выполненные тесты отражены в конечной статистике (количество пройденных, неудачных и проигнорированных тестов), которую Gradle печатает в конце)?
Обновление 1 (27.11.2017 10:49 мск):
Похоже, что ошибка происходит во фрагменте кода ниже (комментарий // 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 (29.11.2017 12:48 мск):
Я использую 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
1 ответ
Трудно сказать, не увидев тестовый код. Однако что именно заставляет вас думать, что "результаты не включены в общую статистику"? Я не вижу никакого понятия об этом? Уменьшилось ли указанное количество тестов?
Или это просто сообщения об ошибках? Похоже, что это "только" сообщения об ошибках, сообщаемые в стандартный вывод ошибок. Такие ошибки не обязательно означают, что тест не пройден, это всего лишь "предупреждения" - в том смысле, что ничего не делается, за исключением записи их в вывод ошибок, что можно увидеть, например, здесь.
Итак, у меня сложилось впечатление, что тесты действительно пройдены, они просто напечатали (предупреждение) сообщение об ошибке. Тот факт, что на Mac они ведут себя немного иначе, может быть вызван многими обстоятельствами.