我的问题的核心是我担心我的Ant构建文件缺少允许测试完成并自我清理的东西。详情如下。
我有一套测试,当我通过Eclipse运行它时总会通过,但是当我使用我的Ant构建运行它时,有时会通过或失败。测试通过JOCL使用openCL,因此我在GPU上的内存有限,必须正确管理。有时当我运行我的Ant构建时,我会在输出中得到这个,
[junit] Caused an ERROR
[junit] CL_MEM_OBJECT_ALLOCATION_FAILURE
[junit] org.jocl.CLException: CL_MEM_OBJECT_ALLOCATION_FAILURE
问题不在于测试本身。我认为在套件的最后调用了我最需要内存的测试。当调用最后一次测试时,不知何故GPU从我之前的测试中处于不良状态。当我通过Eclipse运行测试时,这不会发生。当我让内存饥饿测试套件中的第一个测试时,它在我的Ant构建中从未失败过。这是一个熟悉的案例吗?为什么通过Eclipse运行测试始终有效?有什么我可以尝试的吗?
这是我的Ant构建中的测试目标:
<target name="test" if="testing.enabled">
<mkdir dir="${test.bin.dir}" />
<javac srcdir="test" destdir="${test.bin.dir}" debug="true" classpathref="testclasspath" source="1.6"/>
<junit haltonerror="true" haltonfailure="true">
<classpath refid="testclasspath"/>
<formatter type="plain" usefile="false" />
<batchtest>
<fileset dir="test">
<include name="*Test.java"/>
</fileset>
</batchtest>
</junit>
</target>
答案 0 :(得分:5)
如果您确定代码中没有遗漏任何剩余清理,您可以创建一个JUnit测试套件并从eclipse和ant运行它。通过创建测试套件,您可以独立于eclipse(项目中的顺序?)和ant(文件系统中的顺序?)的测试顺序,在两种情况下都使用并确定顺序。
如果你真的不确定你的代码是无问题的,你可以通过在测试类列表上调用Collections.shuffle()
来创建一个测试套件,在eclipse中引入未知的测试执行顺序,看看你的测试仍然永不失败。
答案 1 :(得分:3)
问题可能是您在测试用例中没有释放内存。据我所知,JUnit会在启动时实例化所有测试类,然后运行它们。如果您的测试类中有引用对象的字段,则当您未在null
方法中为tearDown()
分配class Test extends TestCase {
private Data data;
public void setUp() {
data = new Data();
}
public void tearDown() {
data = null; // required to allow garbage collection of the Data object
}
}
时,将通过整个testrun保留所有字段。例如:
{{1}}
也许Eclipse会在执行后对Test实例进行非实例化,以便可以对字段进行垃圾回收。但是使用标准的JUnit TestRunner会导致很多对象不再使用,但仍然被引用并耗尽所有内存。
答案 2 :(得分:2)
如果测试是在Eclipse中传递而在其他地方失败,那么你会遭受多种开发者综合症中的一种:“......但是当我在这里运行时它会起作用......!”
您已经设法配置Eclipse以允许您使用代码,功能在,但是您的代码到目前为止,不可部署,这意味着它没有完成。
搁置Eclipse一段时间(停止指责它),然后放到命令行(或使用不同的IDE),直到工作正常。甚至可以在不同的计算机上试用代码!
然后返回Eclipse,重复上述循环,直到您确定已删除对Eclipse或硬盘/设置的任何依赖关系。最后,您的代码必须能够在谁知道哪个服务器上运行。
您是否尝试过安装干净的Eclipse(在另一台计算机上),只关注代码的源代码快照?这将是一个很好的配置管理测试,我很确定你的代码不会按原样通过。
认真地尝试让Eclipse在干净的(虚拟)机器上发挥其魔力。它不会在第一次运行时起作用,但您将了解如何使其在您的设置下工作。
答案 3 :(得分:0)
Ant查找名为ANT_OPTS的环境变量,该变量用于设置Java参数。 &GT;只需设置环境变量即可。所以我添加了以下内容来增加&gt;堆大小:
导出ANT_OPTS = -Xmx256m
使用Eclipse运行时,JVM(以及因此Ant)很可能已经拥有比默认更多的内存。