關於testNG 整合測試序列&並行配置
阿新 • • 發佈:2021-01-06
問題:整合測試套件中case 執行出現Threadpool 異常但本地單case 執行結果pass ?
程式碼結構:
/** * 基礎test 類,處理基礎請求體封裝 */ public class BaseTest extends AbstractTestNGSpringContextTests { //省略內容 } /** * 繼承基礎test類,處理業務相關的部分特性業務 */ public class XMBaseTest extends BaseTest { //省略內容 } public class TestAddRelation extends XMBaseTest { //普通測試類 @Test public void testAddRelation() { //資料封裝 //請求 //結果斷言 } }
整合配置 testng.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="xm-autotest-live" parallel="true" thread-count="20" data-provider-thread-count="5" > <listeners> <listener class-name="com.demo.RetryListener" /> <listener class-name="com.demo.TestListener" /> <listener class-name="com.demo.ExtentTestNGIReporterListener"/> </listeners> <test name="demo" preserve-order="true" verbose="3"> <packages> <package name="com.demo.cases"></package> </packages> </test> </suite>
說明:因為我們有近1000個case,執行時間已經超預期的長,為了降低case 執行時間,開啟了並行數 parallel ,並且配置了執行緒總數為 20 ,並行資料最大提供5執行緒池。
原始碼說明:
<!ATTLIST suite name CDATA #REQUIRED junit (true | false) "false" verbose CDATA #IMPLIED parallel (false | true | none | methods | tests | classes | instances) "none" parent-module CDATA #IMPLIED guice-stage (DEVELOPMENT | PRODUCTION | TOOL) "DEVELOPMENT" configfailurepolicy (skip | continue) "skip" thread-count CDATA "5" annotations CDATA #IMPLIED time-out CDATA #IMPLIED skipfailedinvocationcounts (true | false) "false" data-provider-thread-count CDATA "10" object-factory CDATA #IMPLIED group-by-instances (true | false) "false" preserve-order (true | false) "true" allow-return-values (true | false) "false" >
- parallel (false | true | none | methods | tests | classes | instances) "none"
- 註釋:Whether TestNG should use different threads to run your tests (might speed up the process) Do not use "true" and "false" values, they are now deprecated.
- 翻譯:TestNG是否應該使用不同的執行緒來執行測試(可能會加快程序)不要使用“true”和“false”值,它們現在已經被棄用了。
- 說明:也就是說parallel 是同來控制是否使用多執行緒執行測試,預設是不開啟,可以指定到 方法,檔案等,“true”和“false”值 已經不提倡使用了。
- thread-count: An integer giving the size of the thread pool to use if you set parallel.
- 翻譯:如果設定parallel,則給出要使用的執行緒池大小的整數。
- 說明:整合測試設定的執行緒池大小
- data-provider-thread-count: An integer giving the size of the thread pool to use for parallel data providers.
- 翻譯:如果使用並行模式,則給出要使用的執行緒池大小的整數。覆蓋套件級別值。
- 說明:該欄位多用於具體測試包指定執行緒數大小
大概分析:
我們會出現Threadpool 異常,多半是配置指令碼在並行執行時出現資源物件搶佔混亂導致。
解決辦法:
將原來並行的指令碼執行改為序列問題解決
<!--<suite name="xm-autotest-live" parallel="true" thread-count="20" data-provider-thread-count="5" >-->
<!--可能存線上程不安全情況讓sutie case 按順序執行 parallel="false" -->
<suite name="xm-autotest-live" parallel="none" >
深入分析:
- 實際使用中往往一個suite 中會配置多個子套件或者多個測試包檔案,一個包檔案往往有幾十到幾百個case
- 而基於我們的工程結構,所有的case 都是集成於基礎test 類,基礎test 類會幫我初始化很多物件系資訊。
- 當我們在配置suite 可以進行多執行緒執行case 時,就容易引起初始化物件錯亂,一些case 的初始化配置異常,導致case 丟擲thrreadpool 異常。
以上結論不是很肯定,但從結果分析,每次失敗的case 是隨機的,但異常都是一樣的,然而本地單個case 執行時卻是通過的,另外通過改變suite 配置取消並行執行後,不再出現ThreadPool 異常
因此斷定是上述原因導致。