【发布时间】:2021-06-09 13:38:08
【问题描述】:
我遇到了一个问题,但无法理解它发生的原因。我开发自动化测试,现在有一项任务是比较我们内部数据库和供应商数据库中的用户数据计数。
所以我们有大约 8k 用户,我需要比较他们的语句数。
我执行的步骤:
- 从 DB 获取用户及其语句计数(使用
HashMap<userId, count>完成一次) - 为每个 userId 执行 API 调用,获取带有 JSON 对象列表的 JSON 并映射它们(使用 Apache HttpClient)
- 将数据库中的计数与映射对象的计数进行比较。
问题:
如果我使用 TestNG 使用 @Test 执行它,在 ~2-3k 请求之后,我在执行 API 调用 (httpClient.execute) 的步骤中收到错误 java.lang.OutOfMemoryError: Java heap space。
如果我在 main 方法中使用相同的步骤将它作为类运行,我可以执行超过 8k 个请求而不会出现问题和堆错误。
那么问题来了,运行测试和运行类是否存在内存分配差异?
public class TransactionsCountTest extends BaseTest {
public static void main(String[] args) {
int i = 1;
DatabaseHelper databaseHelper = DatabaseHelper.getInstance();
HashMap<String, String> users = databaseHelper.getTransactionUserIdsWithCount();
TransactionsCountTest transactionsCountTest = new TransactionsCountTest();
for (String user : users.keySet()) {
System.out.println(i);
transactionsCountTest.compareStatementsCount(user, users.get(user));
i++;
}
}
private void compareStatementsCount(String user, String DbCount) {
int dbCount = Integer.parseInt(DbCount);
int vendorCount = 0;
try {
logger.info("Checking " + user);
List<SalesItemShort> venTransactions = Helpers.getCollectionFromResponse(salesDataSteps.getUserSalesData(user).getBody(), SalesItemShort[].class);
vendorCount = venTransactions.size();
assertEquals(vendorCount, dbCount);
} catch (AssertionError e) {
if (e.getMessage().contains("was NOT")) {
logger.info("Request timeout for user " + user);
} else {
logger.info("Data for user " + user + " is incorrect");
logger.info("Transactions in DB " + dbCount);
logger.info("Transactions in Vendor " + vendorCount);
}
}
}
【问题讨论】:
-
请提供minimal reproducible example,以及您在哪里执行测试。是否在可能内存有限等的环境中?
-
我在笔记本电脑上执行,两次运行都在同一个环境中完成
-
您将堆设置为什么?这可能就像一种方式比另一种方式具有更少的堆内存一样简单。
标签: java memory testng heap-memory