1. 程式人生 > 其它 >關於testNG 整合測試序列&並行配置

關於testNG 整合測試序列&並行配置

技術標籤:springjavaTestNG

問題:整合測試套件中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"  >

深入分析:

  1. 實際使用中往往一個suite 中會配置多個子套件或者多個測試包檔案,一個包檔案往往有幾十到幾百個case
  2. 而基於我們的工程結構,所有的case 都是集成於基礎test 類,基礎test 類會幫我初始化很多物件系資訊。
  3. 當我們在配置suite 可以進行多執行緒執行case 時,就容易引起初始化物件錯亂,一些case 的初始化配置異常,導致case 丟擲thrreadpool 異常。

以上結論不是很肯定,但從結果分析,每次失敗的case 是隨機的,但異常都是一樣的,然而本地單個case 執行時卻是通過的,另外通過改變suite 配置取消並行執行後,不再出現ThreadPool 異常

因此斷定是上述原因導致。