通常來(lái)說(shuō),單元測(cè)試和開發(fā)人員相關(guān)度很高。中培《軟件自動(dòng)化測(cè)試與持續(xù)集成》的劉老師認(rèn)為,主要的原因是:根據(jù)定義,單元測(cè)試用于測(cè)試系統(tǒng)中與其他部分隔離、定義良好的部分。因此,它們比較容易編寫和使用。
許多構(gòu)建系統(tǒng)已經(jīng)內(nèi)置對(duì)單元測(cè)試的支持,不用花費(fèi)太大力氣就可以使用。
例如Maven,就有這樣的約定:描述如何寫測(cè)試才能讓構(gòu)建系統(tǒng)找到測(cè)試、執(zhí)行測(cè)試并最終準(zhǔn)備報(bào)告結(jié)果。編寫測(cè)試基本上可以歸結(jié)為編寫測(cè)試方法,通過(guò)在源代碼加注解來(lái)標(biāo)記它們。因?yàn)檫@些都是普通的方法,所以它們可以做任何事情,但是根據(jù)約定,應(yīng)該編寫測(cè)試,這樣就不需要花費(fèi)很大的力氣去運(yùn)行。如果測(cè)試代碼開始需要復(fù)雜的設(shè)置和運(yùn)行時(shí)依賴,我們處理的就不再是單元測(cè)試了。
這里單元測(cè)試和功能測(cè)試的差別很讓人困惑。通常來(lái)說(shuō),相同的底層技術(shù),類庫(kù)會(huì)在單元測(cè)試和功能測(cè)試之間重復(fù)使用。
復(fù)用一般來(lái)說(shuō)是一件好事情,因?yàn)樗梢宰屇愎ぷ髟诹硪粋€(gè)領(lǐng)域時(shí),從你的專業(yè)領(lǐng)域中獲益。盡管如此,還是會(huì)時(shí)不時(shí)地帶來(lái)困擾,你必須打起精神,花費(fèi)一些力氣,確保你正在做正確的事情。
—般的JUnit和特殊的JUnit你需要一些東西去運(yùn)行你的測(cè)試。JUnit是一個(gè)框架,它可以讓你在Java代碼中定義和運(yùn)行測(cè)試。
JUnit屬于統(tǒng)稱為xUnit的測(cè)試框架家族。SUnit是這個(gè)家族的祖先,由Kent Beck在1998年為Smalltalk語(yǔ)言而設(shè)計(jì)。
JUnit是Java語(yǔ)言的測(cè)試框架,同樣想法被移植到了其他語(yǔ)言,如C#。C#對(duì)應(yīng)的測(cè)試架毫無(wú)想象力地叫作NUnit。N來(lái)自.NET,微軟軟件平臺(tái)的名字。
在話題繼續(xù)之前,我們需要了解下面的命名法則。命名的法則不特定于JUnit,但是我們會(huì)用JUnit作為例子來(lái)熟悉涉及到的定義。
測(cè)試運(yùn)行器( Test runner):測(cè)試運(yùn)行器運(yùn)行由xUnit框架定義好的測(cè)試。
JUnit可以通過(guò)命令行去運(yùn)行單元測(cè)試,Maven使用的測(cè)試運(yùn)行器叫作Surefire。
測(cè)試運(yùn)行器也會(huì)同時(shí)收集和匯報(bào)測(cè)試結(jié)果。以Surefue為例,報(bào)告是XML格式的,并且可以被其他工具進(jìn)一步處理,如可視化。
測(cè)試用例(Test case):測(cè)試用例是最基本類型的測(cè)試定義。
用不同的JUnit版本創(chuàng)建測(cè)試用例存在些許不同。在早期的版本中,需要從JUnit基類繼承,最近的版本中,只需要給測(cè)試方法添加注解。這樣的方式會(huì)更好些,因?yàn)镴ava不支持多繼承,而且你有可能想使用自己的繼承結(jié)構(gòu)而不是JUnit的繼承結(jié)構(gòu)。按照約定,Surefire也會(huì)定位類名前綴為TeSt的測(cè)試類。
測(cè)試夾具( Test fixt"res):測(cè)試夾具是測(cè)試用例可以依賴的一個(gè)已知狀態(tài),可以使測(cè)試具有良好定義的行為。開發(fā)者有責(zé)任去實(shí)現(xiàn)這些測(cè)試夾具。測(cè)試夾具有時(shí)也被稱為測(cè)試上下文( test context)。
在JUnit中,你通常會(huì)使用@Before和@After注解去定義測(cè)試夾具。@Before,顧名思義,是在測(cè)試用例前運(yùn)行,用于準(zhǔn)備好整個(gè)環(huán)境。同理,如果有需要,用 @After來(lái)恢復(fù)成初始狀態(tài)。
有時(shí),為了更好表意,@Before和@After也被命名為Setup和蠆eardovvn。因?yàn)槭褂昧俗⒔猓谏舷挛闹蟹椒梢杂凶钪庇^的名字。
測(cè)試套件(TeMsuites):在測(cè)試套件中你可以將測(cè)試用例分組。測(cè)試套件通常是一組共享測(cè)試夾具的測(cè)試用例。
測(cè)試執(zhí)行器(Test exeeUtion):測(cè)試執(zhí)行器運(yùn)行測(cè)試套件和測(cè)試用例。
這里結(jié)合了前面的所有方面。定位測(cè)試套件和測(cè)試用例,創(chuàng)建相關(guān)的測(cè)試夾具,然后運(yùn)行測(cè)試用例。最后,收集和整理測(cè)試結(jié)果。
測(cè)試結(jié)果格式化工具( Test result formatter):測(cè)試結(jié)果格式化工具格式化測(cè)試輸出結(jié)果,方便人們閱讀。JUnit使用多種多樣的格式,可以被其他和JUnit沒(méi)有直接關(guān)聯(lián)的測(cè)試框架和格式化工具使用。所以,如果你的一些測(cè)試沒(méi)有使用任何的xUnit測(cè)試框架,你還是可以通過(guò)提供XML格式的測(cè)試結(jié)果,將其展示在Jenkins中。因?yàn)槲募袷绞荴ML,如果有必要,你也可以用自己的工具去生成。
斷言(Assertions):斷言是xUnit框架的一種構(gòu)造,用來(lái)確保條件被滿足。如果條件沒(méi)有滿足,它會(huì)認(rèn)為這是個(gè)錯(cuò)誤,并且匯報(bào)這個(gè)測(cè)試錯(cuò)誤。測(cè)試用例通常在斷言失敗時(shí)終止。
想了解更多IT資訊,請(qǐng)?jiān)L問(wèn)中培偉業(yè)官網(wǎng):中培偉業(yè)