JUnit java.lang.OutOfMemoryError при выполнении всех тестов в пакете

При загрузке всех модульных тестов в пакете задача make выдает ошибку java.lang.OutOfMemoryError: Java heap space.

Однако, если я запускаю все тесты в каждом подпакете, все тесты загружаются и завершаются нормально. Только когда я пытаюсь запустить все тесты в родительском пакете, возникает ошибка OOM.

Я не думаю, что эту проблему следует решать путем настройки параметров виртуальной машины. Я попытался увеличить максимальный размер кучи и пермь, и это не решило проблему.

Это наводит меня на мысль, что между загрузкой тестов в разных пакетах возникают какие-то проблемы со сборкой мусора или что происходит какая-то слишком активная загрузка классов.

Есть ли параметр JUnit, который мог бы решить эти проблемы, или проблема должна быть решена путем изменения или добавления кода в тестовых примерах?


person Simon Tower    schedule 20.11.2009    source источник
comment
Вы уверены, что у вас нет значительного потребления памяти в статике ваших тестовых классов или в статике, полученной из ваших тестовых классов?   -  person bmargulies    schedule 20.11.2009
comment
как на самом деле вы настроили параметры виртуальной машины? Попробуйте подтвердить, что они были установлены правильно с помощью методов в java.lang.Runtime.   -  person Bozho    schedule 20.11.2009
comment
Насчет потребления памяти статикой не уверен, но обязательно посмотрю. Что касается параметров VM, я пробовал следующие: -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m, но их увеличение не помогло решить ошибку OOM.   -  person Simon Tower    schedule 20.11.2009


Ответы (4)


Вы должны установить для всех полей тестовых классов значение null в tearDown().

Причина в том, что JUnit создает один экземпляр тестового класса для каждого теста. Он держит этот экземпляр все время, чтобы сохранить результаты теста (успех, неудача, трассировка стека). Поэтому, если вы используете поля, они останутся, и вам не хватит памяти.

person Aaron Digulla    schedule 20.11.2009
comment
Круто, я сначала протестирую это исправление. - person Simon Tower; 20.11.2009
comment
К сожалению, это не решило проблему. разве tearDown() не вызывается только после загрузки всех классов и запуска тестов? Ошибка OOM, которую я вижу, происходит во время задачи Make, еще до того, как тесты начнут выполняться. - person Simon Tower; 20.11.2009
comment
Нет, tearDown вызывается после каждого отдельного теста. Но я пропустил в задаче Make. О какой постановке задачи вы говорите? Вы используете Ант? Или сделать GNU? - person Aaron Digulla; 21.11.2009
comment
Хорошо. Доходит ли муравей до запуска модульных тестов? Запустите его с -d, чтобы увидеть, где он действительно терпит неудачу. - person Aaron Digulla; 01.12.2009

Я столкнулся с аналогичной проблемой, используя TestNG, и проследил ее до объема информации журнала, которую я генерировал для консоли. Как только я уменьшил это, я смог запустить свой набор тестов без проблем с памятью.

person Adamski    schedule 20.11.2009
comment
Наблюдал эту же проблему при выполнении тестов с JUnit и maven. Уровень журнала был на уровне DEBUG и создавал ошибки OOM, после переключения на ERROR проблемы исчезли. - person Rich; 20.03.2013

Сборщик мусора запускается, когда у ЦП есть свободное время или когда свободной памяти мало. Если ваши тесты дают сбой, возможно, у вас где-то есть утечка памяти. (Да, они есть и в java)

Посмотрите на циклические ссылки и статические классы/переменные. Это распространенные причины утечек памяти IIRC. Вы также должны взглянуть на jconsole.

person Patrick Cornelissen    schedule 20.11.2009

Для меня установка нулевого тестового класса не решает проблему. Потому что каждый тест занимает память на eclipse vm, поэтому лучшее (решение для меня) - это убить контекст приложения junit (с помощью @DirtiesContext) для каждого тестового класса! Как ниже

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
@DirtiesContext(classMode=ClassMode.AFTER_CLASS)  // this one
public class SomeControllerTest {
  ....
}
person デビット    schedule 27.03.2019