<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
{
...
}