тест джунит и не джунит тест с целью муравья - PullRequest
3 голосов
/ 16 июня 2011
<junit printsummary="on" fork="yes" forkmode="once" 
haltonerror="false" haltonfailure="false" 
    failureproperty="junit.failure" showoutput="false" maxmemory="1024m">
    <classpath>
        <path refid="CLASSPATH_JUNIT"/> 
        <dirset dir="${TEST_BUILD_DIR}"/>
    </classpath>            
    <batchtest fork="no"  todir="${TEST_BUILD_DIR}">
         <fileset dir="${COMP_TEST_SRC}">                   
              <include name="**/*Test.java" />
              <include name="**/Test*.java" />
              <exclude name="**/EswTestCase.java" />
         </fileset>             
    </batchtest>    
    <formatter type="xml" />            
</junit>

генерация отчета в формате xml занимает много времени и выдает следующую ошибку:

Caught an exception while logging the end of the build.  Exception was:
java.lang.OutOfMemoryError: PermGen space

Почему Genearte XML занимает много времени? Как устранить эту ошибку и заставить приложение работать быстро. У меня есть только максимум 10 тестовых файлов. Я использую командную строку для выполнения скрипта ant.

Анализ:

1) Если я запускаю пакетный тест только для тестовых вызовов, которые расширяют тест Junit, он выполняется очень быстро. например:

открытый класс ImpactsParserTest расширяется TestCase {..

2) Теперь, если у меня есть тестовый класс, который расширяет тест весеннего джунита как:

открытый класс AddressLookupServiceTest extends EswTestCase {..

открытый класс EswTestCase расширяется AbstractDependencyInjectionSpringContextTests {..

это заставляет цель junit работать очень медленно и вызывает ошибку нехватки памяти. почему так происходит?

3) когда я делаю batchtest fork = "yes" вместо no, тогда сборка происходит быстро и не выбрасывает память. Но выдает ошибку вроде:

java.lang.NoClassDefFoundError
at org.apache.log4j.Logger.getLogger(Logger.java:118)
..
java.lang.NoClassDefFoundError: com.bgc.ordering.wizard.back.services.EswTestCase

, хотя я указал эти файл jar и файл класса в элементе classpath как:

и регистратор банок в

<path id="CLASSPATH_JUNIT">
   <fileset dir="${BUILD_LIBS_HOME}">       
       <include name="*.jar" /> 
   </fileset>
   <pathelement location="${TEST_CLASSES_DIR}" />
   <pathelement location="${TEST_BUILD_DIR}" />
   <pathelement location="${COMP_BUILD}" />     
   <pathelement location="${COMP_CLASSES}" />   
   <path location="${APP_DIR}\bgc-esw-services\target\classes"/> 
   <pathelement location="${APP_DIR}\bgc-esw-web\target\classes" />

...

log4j.properties присутствует в ${TEST_BUILD_DIR}

, используя: apache-ant-1.8.1 и junit-3.8.1.jar

1 Ответ

3 голосов
/ 16 июня 2011

Эта ошибка возникает, когда JVM не хватает места в куче постоянной генерации.Память в виртуальной машине разделена на несколько регионов.Одним из таких регионов является PermGen.Это область памяти, которая используется (помимо прочего) для загрузки файлов классов.Размер этой области памяти фиксирован, то есть он не изменяется во время работы виртуальной машины.Вы можете указать размер этого региона с помощью переключателя командной строки: -XX:MaxPermSize.По умолчанию 64 МБ на виртуальных машинах Sun.Чтобы устранить эту проблему, вы можете присвоить ей более высокое значение, например 256 МБ.

Я предполагаю, что вы не только запускаете модульные тесты, но и интеграционные тесты, например, у вас есть класс, связанный с Spring, и вам нужны их зависимости.Вот почему у вас есть EswTestCase.Если вы просто хотите написать модульные тесты, я бы порекомендовал вам создать экземпляр вашего класса и смоделировать зависимости от других классов, которые вы не тестируете напрямую.Это минимизирует использование памяти, поскольку вам не нужно создавать контекст приложения Spring.

Это то, что JavaDoc говорит о AbstractDependencyInjectionSpringContextTests:

Действительно для интеграционного тестирования, а не модульного тестирования.Обычно вам не следует использовать контейнер Spring для модульных тестов: просто заполняйте ваши POJO в простых тестах JUnit!

Начиная с Spring 3.0, иерархия базовых классов устаревшего JUnit 3.8 (т.е..) официально устарела и будет удалена в более позднем выпуске.Для написания интеграционных тестов рекомендуется использовать Spring TestContext Framework .Вместо расширения EswTestCase на AbstractDependencyInjectionSpringContextTests вы должны использовать аннотации.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class EswTestCase 
{
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...