使用ant目标进行junit测试和非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

为什么genearte-xml需要很长时间?如何解决这个错误并使应用程序快速运行。我最多只有10个测试文件。我使用命令提示符来执行ant脚本。

分析:

1( 如果我只为扩展Junit测试的测试calss运行批测试,它执行得非常快。例如:

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

2( 现在,如果我有一个测试类,它将spring-junit测试扩展为:

公共类AddressLookupServiceTest扩展EswTestCase{..

公共类EswTestCase扩展AbstractDependencyInjectionSpringContextTests{..

这会导致junit目标运行非常缓慢,并导致内存不足错误。为什么会这样?

3( 当我让batchtestfork="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文件和类文件指定为:

和中的记录器罐子

<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-servicestargetclasses"/> 
   <pathelement location="${APP_DIR}bgc-esw-webtargetclasses" />

${TEST_BUILD_DIR} 中存在log4j.properties

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

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

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

这就是JavaDoc对AbstractDependencyInjectionSpringContextTests:的描述

真正用于集成测试,而不是单元测试。你通常不应该使用单元的Spring容器测试:只需在中填充POJO简单的JUnit测试!

从Spring 3.0开始,遗留的JUnit 3.8基类层次结构(即AbstractDependencyInjectionSpringContextTest、AbstractTransactionalDataSourceSpringContextTest等(已被正式弃用,并将在稍后的版本中删除。建议您使用SpringTestContext框架来编写集成测试。不应该使用AbstractDependencyInjectionSpringContextTests来扩展EswTestCase,而应该使用注释。

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

相关内容

  • 没有找到相关文章

最新更新