与蚂蚁目标的junit测试和非junit测试

时间:2011-06-16 07:51:34

标签: spring ant junit

<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

为什么需要很长时间才能生成xml?如何解决此错误并使应用程序快速运行。我最多只有10个测试文件。我使用命令promt来执行ant脚本。

分析:

1)如果我只为测试calss运行批量测试,它扩展了Junit测试,它执行速度非常快。例如:

  

公共类ImpactsParserTest扩展   的测试用例 {..

2)现在,如果我有测试类,它将spring junit test扩展为:

  

公共类AddressLookupServiceTest   扩展 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

尽管如此,我已经在classpath元素中将这些jar文件和类文件指定为:

中的记录器jar
<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" />

...

${TEST_BUILD_DIR}

时出现的log4j.properties

使用:apache-ant-1.8.1和junit-3.8.1.jar

1 个答案:

答案 0 :(得分:3)

当JVM用尽永久生成堆中的空间时,会发生此错误。虚拟机中的内存分为多个区域。其中一个区域是PermGen。它是一个用于(除其他外)加载类文件的内存区域。该存储区域的大小是固定的,即当VM运行时它不会改变。您可以使用命令行开关指定此区域的大小:-XX:MaxPermSize。 Sun VM上的默认值为64 Mb。要解决此问题,您可以为其提供更高的值,如256mb。

我的猜测是你不仅运行单元测试,还运行集成测试,例如你有一个连接Spring的类,你需要它们的依赖项。这就是你EswTestCase的原因。如果您只想编写单元测试,我建议您实例化您的类并将依赖项模拟到您未直接测试的其他类。这将最大限度地减少内存占用,因为您不必创建Spring应用程序上下文。

这是JavaDoc关于AbstractDependencyInjectionSpringContextTests所说的内容:

  

真的进行集成测试,而不是   单元测试。你不应该正常   使用Spring容器作为单元   测试:只需填充您的POJO   普通的JUnit测试!

从Spring 3.0开始,旧版JUnit 3.8基类层次结构(即AbstractDependencyInjectionSpringContextTests,AbstractTransactionalDataSourceSpringContextTests等)已被正式弃用,将在以后的版本中删除。建议您使用Spring TestContext Framework编写集成测试。不应使用EswTestCase扩展AbstractDependencyInjectionSpringContextTests,而应使用注释。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class EswTestCase 
{
    ...
}