Dataprovider+TestNG - 线程“surefire-forkedjvm-command-thread”中出现异常 java.lang.OutOfMemoryError:Java 堆空间

问题描述 投票:0回答:1

我有一个基于 testng 和 dataprovider 的测试自动化框架。我在 jenkins job 的帮助下在服务器上运行我的代码。该作业使用 maven 命令行执行测试用例。这项工作的执行时间超过 3 小时,因此我想并行/并发运行我的测试用例,为此我在 dataprovider 方法中添加了parallel=true。

@DataProvider(name = "data-provider",**parallel = true**)
    protected Object[][] Credentials { return objArray[][];}

但是当这个 jenkins 作业在 Azure 上运行时,我遇到了异常。

线程“surefire-forkedjvm-command-thread”中出现异常 java.lang.OutOfMemoryError:Java 堆空间位于 java.util.concurrent.ConcurrentLinkedQueue.iterator(ConcurrentLinkedQueue.java:669) 在 org.apache.maven.surefire.booter.CommandReader$CommandRunnable.insertToListeners(CommandReader.java:469) 在 org.apache.maven.surefire.booter.CommandReader$CommandRunnable.run(CommandReader.java:424) 在 java.lang.Thread.run(Thread.java:750)

请让我知道我的选择是什么,因为我的堆大小似乎已耗尽。我还尝试在我的 pom.xml 中指定以下内容,但没有成功。

<artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <argLine>-Xms1024m -Xmx2048m</argLine>

TestNG.xml 中没有指定线程数或并行详细信息,而 dataprovider 方法中也没有指定。 刚刚使用了这个 @DataProvider(name = "data-provider",parallel = true)

但是早些时候我尝试在 testng.xml 中使用下面的内容。但可能是我在运行它曾经陷入困境的套件时无法正确配置线程。

<suite name="API AMS regression suite" verbose="10"  data-provider-thread-count="20" >
  
    <test name="POS Testcases">
        <classes>
            <class name="com.qa.apis.tests.Pos"/>
        </classes>
    </test>
</suites>
java multithreading maven testng testng-dataprovider
1个回答
0
投票

OutOfMemoryError
的根本原因很可能是由于您的测试创建了大量线程。

TestNG 有 2 个线程池可供使用

  • thread-count
    - 表示可以并行运行多少个常规测试方法(不是由数据提供者驱动)。它的默认值为
    5
  • data-provider-thread-count
    - 表示在任何给定时间点可以并行运行多少个数据驱动测试。它还要求您设置
    @DataProvider(parallel=true)
    。它的默认值为
    10

假设您将

parallel=methods
设置为
<suite>
级别或
<test>
级别:

  • 假设您的项目中有 5 个测试方法,那么 TestNG 将并行运行所有 5 个方法。
  • 现在,如果您的所有 5 个测试方法实际上都是数据提供程序驱动的方法,并配置为通过
    @DataProvider(parallel=true)
    并行运行,那么 TestNG 本质上将并行运行
    5*5 = 25 threads

根据您的机器配置和内存配置,操作系统可能能够也可能无法创建那么多数量的线程。

您有几个选项可以控制它。

  • 减少
    data-provider-thread-count
    的线程数,并显式指定
    thread-count
  • 的值
  • 转向使用 TestNG
    7.10.2
    ,它现在包含一些新功能,通过允许您使用共享线程池来帮助您管理此问题。

为了完整起见,我引用了文档中的相关部分

share-thread-pool-for-data-providers - 当此属性设置为 在套件级别为 true,TestNG 将开始使用共享线程池 对于给定的所有数据驱动测试。尺寸 线程池是使用属性确定的 数据提供者线程计数。该属性的默认值为 假的。

use-global-thread-pool - 当此属性设置为 true 时 suite级别,TestNG将开始使用公共线程池来运行 常规测试方法和数据驱动测试方法。尺寸 线程池的数量是使用属性 thread-count 确定的。 该属性的默认值为 false。

详细说明请参见https://testng.org/#_controlling_threadpool_usage

PS:当你使用

use-global-thread-pool
并且进行一些数据驱动测试时,你有可能会遇到这个错误https://github.com/testng-team/testng/issues/3028 请仔细检查此缺陷以了解导致此问题的原因。

此问题已在 TestNG 的最新快照版本中得到修复,并且应该可以与

7.11.0
一起使用。基本上,这个新版本将尝试检测可能的死锁,并通过停止执行来相应地警告您。

© www.soinside.com 2019 - 2024. All rights reserved.