前言

最近在做項(xiàng)目里的自動(dòng)化測試工作,使用的是TestNG測試框架,主要涉及的測試類型有接口測試以及基于業(yè)務(wù)實(shí)際場景的場景化測試。由于涉及的場景大多都是大數(shù)據(jù)的作業(yè)開發(fā)及執(zhí)行(如MapReduce、Spark、Hql等任務(wù)的執(zhí)行),而這些任務(wù)的執(zhí)行都需要耗費(fèi)較多的時(shí)間。舉一個(gè)普遍的例子,其中一條場景測試用例是:

  • 執(zhí)行一個(gè)MapReduce作業(yè),校驗(yàn)作業(yè)的執(zhí)行結(jié)果和執(zhí)行日志。

對(duì)于一個(gè)最簡單的MR任務(wù),如果YARN集群資源充足,它的執(zhí)行時(shí)間也要花上將近一分鐘的時(shí)間。更不用說當(dāng)YARN集群計(jì)算資源飽和時(shí),任務(wù)還需要持續(xù)等待資源分配等。當(dāng)測試回歸用例集里包含了大量此類的用例時(shí),如果還用傳統(tǒng)的單線程執(zhí)行方式,則一次自動(dòng)化回歸將會(huì)耗費(fèi)大量的時(shí)間。

多線程并行執(zhí)行

基于上述場景,我們可以考慮將自動(dòng)化用例中相互之間沒有耦合關(guān)系,相對(duì)獨(dú)立的用例進(jìn)行并行執(zhí)行。如,我可以通過起不同的線程同時(shí)去執(zhí)行不同的MR任務(wù)、Spark任務(wù),每個(gè)線程各自負(fù)責(zé)跟蹤任務(wù)的執(zhí)行情況。

此外,即使是單純的接口自動(dòng)化測試,如果測試集里包含了大量的用例時(shí),我們也可以借助于TestNG的多線程方式提高執(zhí)行速度。

必須要指出的是,通過多線程執(zhí)行用例時(shí)雖然可以大大提升用例的執(zhí)行效率,但是我們?cè)谠O(shè)計(jì)用例時(shí)也要考慮到這些用例是否適合并發(fā)執(zhí)行,以及要注意多線程方式的通?。壕€程安全與共享變量的問題。建議是在測試代碼中,盡可能地避免使用共享變量。如果真的用到了,要慎用synchronized關(guān)鍵字來對(duì)共享變量進(jìn)行加鎖同步。否則,難免你的用例執(zhí)行時(shí)可能會(huì)出現(xiàn)不穩(wěn)定的情景(經(jīng)常聽到有人提到用例執(zhí)行地不穩(wěn)定,有時(shí)100%通過,有時(shí)只有90%通過,猜測可能有一部分原因也是這個(gè)導(dǎo)致的)。

TestNG中的多線程使用姿勢

延伸閱讀

學(xué)習(xí)是年輕人改變自己的最好方式-Java培訓(xùn),做最負(fù)責(zé)任的教育,學(xué)習(xí)改變命運(yùn),軟件學(xué)習(xí),再就業(yè),大學(xué)生如何就業(yè),幫大學(xué)生找到好工作,lphotoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)學(xué)習(xí)是年輕人改變自己的最好方式