我有一个基于 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>
OutOfMemoryError
的根本原因很可能是由于您的测试创建了大量线程。
TestNG 有 2 个线程池可供使用
thread-count
- 表示可以并行运行多少个常规测试方法(不是由数据提供者驱动)。它的默认值为 5
。data-provider-thread-count
- 表示在任何给定时间点可以并行运行多少个数据驱动测试。它还要求您设置 @DataProvider(parallel=true)
。它的默认值为 10
。假设您将
parallel=methods
设置为 <suite>
级别或 <test>
级别:
@DataProvider(parallel=true)
并行运行,那么 TestNG 本质上将并行运行 5*5 = 25 threads
。根据您的机器配置和内存配置,操作系统可能能够也可能无法创建那么多数量的线程。
您有几个选项可以控制它。
data-provider-thread-count
的线程数,并显式指定 thread-count
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
一起使用。基本上,这个新版本将尝试检测可能的死锁,并通过停止执行来相应地警告您。