Почему некоторые тесты не выполняются в моей сборке Gradle?

Я унаследовал проект с примерно 1000 тестов. До недавнего времени все они выполнялись при вводе команды gradle clean test.

Со дня на день некоторые тесты перестали попадать в статистику тестов (количество пройденных, проваленных и проигнорированных тестов, которые Gradle и Idea выдают по окончании выполнения всех тестов). Код все еще там, и тесты не были проигнорированы. Ни один из сценариев сборки не был изменен. Когда я запускаю тесты в IntelliJ Idea, они выполняются (т.е. нет ошибок компилятора, которые могли бы объяснить, почему тесты не запускаются).

Я считаю, что тесты выполняются, но их результаты не включаются в общую статистику по следующей причине. Я выполнил команду gradle --debug --rerun-tasks clean test > 2017

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
24_gradle.log. Затем я искал вхождения одного из отсутствующих тестов, com.mycompany.comm.CommApplicationTests, в результирующем файле 2017
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
24_gradle.log
(grep "com.mycompany.comm.CommApplicationTests" 2017
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
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.

Как я могу исправить или обойти ошибку (т. е. убедиться, что все выполненные тесты отражены в конечной статистике (количество пройденных, неудачных и проигнорированных тестов), которую 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 ноября 2017 г., 16:51 МСК): эта ошибка не возникает на 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

person Mentiflectax    schedule 25.11.2017    source источник
comment
учитывая, что ваше предупреждение исходит от JDK, может быть более целесообразно указать, какую версию Java вы используете в системах с ошибкой или без нее. Также версия gradle может иметь смысл. И, наконец, форумы Gradle могут быть лучшим местом для получения поддержки по этому поводу.   -  person tkruse    schedule 29.11.2017
comment
Относительно версий Java и Gradle см. обновление 3.   -  person Mentiflectax    schedule 29.11.2017


Ответы (1)


Трудно сказать, не видя тестового кода. Однако что именно заставляет вас думать, что «результаты не входят в общую статистику»? Я не вижу никакого понятия об этом? Уменьшилось ли заявленное количество тестов?

Или это просто сообщения об ошибках? Кажется, это «единственные» сообщения об ошибках, сообщаемые в стандартный вывод ошибок. Такие ошибки не обязательно означают, что тест провален, это просто «предупреждения» — в том смысле, что ничего не делается, кроме их записи в вывод ошибок, что можно увидеть, например, здесь.

Итак, у меня сложилось впечатление, что тесты действительно прошли, они просто напечатали (предупреждающее) сообщение об ошибке. Тот факт, что они ведут себя немного иначе на Mac, может быть вызван многими обстоятельствами.

person Marwin    schedule 28.11.2017
comment
Что именно заставляет вас думать, что результаты не входят в общую статистику?: Несколько вещей. Во-первых, некоторые тестовые классы не отображаются в финальном отчете (если я выполняю ту же задачу Gradle в Idea, я могу экспортировать результаты тестов в HTML). Эти отсутствующие классы существуют и не имеют ошибок (я могу выполнить эти тесты в Идее). 2) В файле журнала Gradle эти тестовые классы появляются в сообщениях типа X STARTED и X PASSED (X - имя тестового класса). Когда я сравниваю экспортированные отчеты за два дня, я вижу, что некоторые тесты были там в один день и исчезли на следующий. - person Mentiflectax; 28.11.2017
comment
Я должен добавить, что это кажется фантомной ошибкой, потому что иногда сообщаются правильные результаты. - person Mentiflectax; 28.11.2017
comment
Иногда? Разве это не проблема зависимостей задач Gradle? Например, некоторые классы могут не компилироваться, но выполняться после компиляции. Вы всегда используете очистку перед тестом? Это действительно трудно сказать, не видя этого. - person Marwin; 28.11.2017
comment
Re Разве это не какая-то проблема с зависимостями задач gradle?: Если бы была проблема с зависимостями, сборка всегда завершалась бы ошибкой. - person Mentiflectax; 28.11.2017
comment
Не обязательно. Однако вернемся к вопросу. Вы утверждаете, что TestEventLogger регистрирует некоторые тесты как НАЧАЛО и ПРОЙДЕНО, но те же тесты не отображаются в отчете/статистике тестирования в одном и том же запуске. Верный? Это было бы очень странно, и я боюсь, что это невозможно решить, не увидев (не)рабочий пример. - person Marwin; 29.11.2017