为什么我的testNG测试得到了java.lang.OutOfMemoryError

时间:2014-11-12 09:22:49

标签: java exception testng

我创建了一个简单的testNG测试,它不起作用并抛出OutOfMemoryError。我找不到原因。

我做了什么:

我计算这个大双数组的大小,它大约是76MB,小于最大堆大小。我认为原因在于testNG。我不清楚testNG如何传递参数(我检查了异常跟踪,发现有一个char数组副本,它让我困惑)。我通过谷歌搜索了很多“如何测试testNG传递参数”,但没有得到一些有用的信息。所以任何人都可以帮助指出根本原因,谢谢。

环境:

Yosemite 10.10
Java 1.8.0_25
Eclipse luna 4.4.1
-XX:MaxPermSize=256m
-Xms40m
-Xmx512m

代码:

import java.util.Arrays;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class TestNGTest {
    static int ARRAY_SIZE = 10000000;

    @DataProvider(name = "array to sort")
    public static Object[][] arrayProvider() {
        double[] myArray = new double[ARRAY_SIZE];
        for (int i = 0; i < ARRAY_SIZE; i++) {
            myArray[i] = Math.random();
        }
        return new Object[][] { { myArray } };
    }

    @Test(dataProvider = "array to sort")
    public void testSort(double[] array) {
        Arrays.sort(array);
    }

}

结果:

FAILED: testSort
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3332)
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:137)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:121)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:421)
at java.lang.StringBuilder.append(StringBuilder.java:136)
at org.testng.remote.strprotocol.TestResultMessage.toString(TestResultMessage.java:320)
at org.testng.remote.strprotocol.TestResultMessage.<init>(TestResultMessage.java:106)
at org.testng.remote.strprotocol.TestResultMessage.<init>(TestResultMessage.java:124)
at org.testng.remote.strprotocol.RemoteTestListener.onTestFailure(RemoteTestListener.java:72)
at org.testng.internal.Invoker.runTestListeners(Invoker.java:1895)
at org.testng.internal.Invoker.runTestListeners(Invoker.java:1879)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:778)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
at org.testng.TestRunner.privateRun(TestRunner.java:767)
at org.testng.TestRunner.run(TestRunner.java:617)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
at org.testng.SuiteRunner.run(SuiteRunner.java:240)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1149)
at org.testng.TestNG.run(TestNG.java:1057)
at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)

1 个答案:

答案 0 :(得分:2)

问题确实可能是TestNG,但绝对确定我们需要看到更多的堆栈跟踪。

在生成报告时,TestNG可能会尝试将您的数组转换为字符串,并将其用作测试用例的名称。

最简单的解决方案(除了在单元测试中不使用巨大的数组)是将数组包装在一个对象中,该对象具有一个简单的toString()方法,不需要打印整个数组。