前言

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

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

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

多線程并行執(zhí)行

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

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

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

TestNG中的多線程使用姿勢(shì)

網(wǎng)友評(píng)論