測試的依賴與分組
我們在將依賴與分組放在一起描述,是因為他們之間有著緊密的聯(lián)系。
測試依賴
測試方法之間的依賴是一種很常見的需求,您也許認為,測試之間的依賴不是破壞了測試方法之間的隔離性嗎?確實是這樣的,但是有時為了這種隔離性,在彼此隔離的測試方法當(dāng)中要付出很大的代價去相互模擬,所以為了方便起見,testng提供了這種依賴的方式。
Testng當(dāng)中通過@Test的屬性dependsOnMethods,dependsOnGroups來實現(xiàn)針對方法和分組的依賴。
依賴還包括軟依賴和硬依賴。硬依賴是很強的關(guān)聯(lián),如果被依賴的測試失敗,那么依賴它的測試會跳過。而軟依賴則不會跳過。通過給@Test設(shè)定alwaysRun=true來實現(xiàn)軟依賴。使用依賴時需要注意的是要避免循環(huán)依賴
測試分組
Testing當(dāng)中提供的組名,與java當(dāng)中包的概念有些類似,都是將包含相似點的類歸為一組。
分組的重要的目標是:使固定的測試代碼和執(zhí)行哪些測試實現(xiàn)清晰的分離。當(dāng)你需要指定執(zhí)行哪些組的測試時,在動態(tài)執(zhí)行時指定組即可。
關(guān)于分組的語法是非常簡單的,@Test,@BeforeClass,@AfterClass,@BeforeMethod等都可以屬于分組。相關(guān)的語法是@Test(groups=”group1”),一個@Test的groups還可以指定多個組名,如@Test(groups=”group1,groups2”)。
定義好的組名,其實是給運行時使用的,也是在testng.xml文件當(dāng)中可以配置。前面的testng.xml說明當(dāng)中提到了<groups>的用法。
Group的組織可以根據(jù)各種維度來進行劃分,如單元測試,集成測試,性能測試;蛘呤强蚣芊謱觼韯澐秩鏰ction,service,dao等。在配置文件當(dāng)中還可以定義組中組,通過define標簽來實現(xiàn),前面也有所說明。
在一般項目中,我建議組分類可按照架構(gòu)分層來定義,分為基礎(chǔ)功能,service業(yè)務(wù)以及dao層。
expectedExceptions
用expectedExceptions來測試異常有兩個好處:其一,它消除了try/catch語句給代碼帶來的干擾。其二,使得測試代碼表達的意圖更加清楚。只要看到@Test注釋當(dāng)中定義的expectedExceptions屬性,知道該測試方法的意圖,把Exception的用例和預(yù)期業(yè)務(wù)功能的用例分到不同測試方法中。
語法很簡單,@Test(expectedExceptions=”XXXException.class”) ,異常類可以有多個,用逗號隔開。
異步與并發(fā)測試
異步與并發(fā)在單元測試當(dāng)中通常都比較困難。
關(guān)于異步測試,如JMS,發(fā)送和接收是解耦的,如果是測試發(fā)送消息的方法,當(dāng)收到響應(yīng)時,會有返回值。根據(jù)這個場景,測試代碼通常是這樣:
Private volatile Boolean success=”false”;
@Test(groups=”send”)
Public void sendMessage(){
//send message code
}
@Test(timeOut=10000,invocationCount=1000,successPercentage=98,dependsOnGroups={“send”})
Public void waitForAnser(){
While(!success){
Thread.sleep(1000);
}
}
@Test(timeOut = 10000, invocationCount = 1000,successPercentage = 98),是用于測試系統(tǒng)的可用性和響應(yīng)速度所設(shè)的值。這里告訴testng調(diào)用該方法1000次,如果98%的調(diào)用是成功的,認為是通過測試。當(dāng)然,前面也要調(diào)用sendMessage方法1000次。timeOut是防止死鎖而產(chǎn)生的。
Testing內(nèi)建了對并發(fā)的支持,可以分為兩種
1,并發(fā)測試
Testng在做并發(fā)測試時提供了threadPoolSize,invocationCount和timeOut三個屬性來完成。threadPoolSize可以指定多個線程池來執(zhí)行測試方法。
2,并發(fā)執(zhí)行測試
Testing還可以通過testng.xml來設(shè)置并發(fā)執(zhí)行。testng.xml默認是單線程執(zhí)行的。
<suite>標簽可以設(shè)置parallel屬性。Thread-count指定線程數(shù)
parallel=”methods”:每個測試方法都在它自己的線程中執(zhí)行(以方法為粒度)。
parallel=”tests”:在某個<test>標簽內(nèi)的所有測試方法都在它自己的線程中執(zhí)行(以<test>為粒度)。