<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}
使用:apache-ant-1.8.1和junit-3.8.1.jar
答案 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
{
...
}