Почему некоторые тесты не выполняются в моей сборке 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 они ведут себя немного иначе, может быть вызван многими обстоятельствами.

Другие вопросы по тегам