測試框架JUnit VS TestNG對比分析
引言
軟件開發(fā)經(jīng)歷了許多階段,如需求收集和分析、設(shè)計(jì)、軟件開發(fā)、測試和發(fā)布。測試是 SDLC 不可或缺的一部分,單元測試是一種可靠的測試類型。像 JUnit 和 TestNG 這樣優(yōu)秀的單元測試框架已經(jīng)成為主流選擇,但是關(guān)于 TestNG 與 JUnit 的差異的爭論一直存在。
單元測試
測試不是單一的活動,而是涵蓋各種測試場景。它以不同的方式分類,其中一種是基于測試級別,例如集成、單元和系統(tǒng)測試。
單元測試涉及測試軟件產(chǎn)品中最微小的代碼。目的是檢查代碼的每個(gè)組件的質(zhì)量是否按預(yù)期執(zhí)行。它在開發(fā)階段執(zhí)行。隔離一段代碼以確保其有效性和準(zhǔn)確性。代碼的單個(gè)組件可以是函數(shù)、模塊、對象或方法。單元測試總是在集成測試之前進(jìn)行。它有助于在應(yīng)用程序開發(fā)生命周期的早期階段發(fā)現(xiàn)缺陷。
開發(fā)人員使用不同的單元測試框架來創(chuàng)建單元測試的自動化測試用例。市場上有不同的工具可用于執(zhí)行單元測試,如 JUnit、NUnit、PHPUnit、JMockit 等。
JUnit 于 1997 年作為一個(gè)開源的基于 Java 的單元測試框架推出。它是 XUnit 的一部分,它是單元測試框架家族的代表。它允許開發(fā)人員編寫和運(yùn)行可重復(fù)的測試。
TestNG 是一個(gè)基于 Java 的單元測試框架,具有新的和改進(jìn)的功能。這些新功能包括靈活的測試配置、參數(shù)支持、數(shù)據(jù)驅(qū)動測試、注釋、各種集成等等。TestNG 執(zhí)行單元、端到端和集成測試。TestNG 生成報(bào)告,幫助開發(fā)人員了解所有測試用例的通過、失敗和跳過狀態(tài)。
了解 TestNG 和 JUnit 測試框架之間的區(qū)別,有助于選擇最適合單元測試框架。
TestNG 和 JUnit 的區(qū)別
雖然 TestNG 和 JUnit 都是最頂級的基于 Java 的自動化框架,并且各有優(yōu)缺點(diǎn)。下面分享 JUnit 和 TestNG 框架之間的主要差別:
測試套件
測試套件由一組測試用例組成,允許同時(shí)執(zhí)行測試。測試套件功能在 JUnit 的早期版本中是不允許的,但在 JUnit 5 中引入,而 TestNG 早早地就支持了該功能。盡管兩者都有測試套件,但它們在每個(gè)測試套件上執(zhí)行測試的方式存在關(guān)鍵差異。讓我們看一下顯示測試套件如何在兩個(gè)框架中運(yùn)行的代碼片段。
TestNG 中的測試套件從XML
文件運(yùn)行:
<suite name=”TestSuite”> <test name=”Demo”> <classes> <class name=”com.fsecure.demo.testng.TestNGTest1″ /> <class name=”com.fsecure.demo.testng.TestNGTest2″ /> </classes> </test> </suite>
而在 JUnit 中,使用 @RunWith
和 @Suite
等注釋,如下面的代碼片段所示。兩個(gè)類 JUnit1 和 JUnit2 是使用注解 @Suite
編寫的。
@RunWith(Suite.class) @Suite.SuiteClasses({ JUnit1.class, JUnit2.class }) public class JunitTest5 { //code }
使用 TestNG 對測試人員來說更容易,因?yàn)樗鼮樗麄兲峁┝耸褂脺y試套件的多種選擇。例如,可以通過將類捆綁到組中來執(zhí)行測試套件。
注釋
FEATURE | JUNIT 5 | TESTNG |
---|---|---|
將該方法標(biāo)記為測試方法 | @Test | @Test |
它在類的第一個(gè)測試方法之前執(zhí)行 | @BeforeAll | @BeforeClass |
它在當(dāng)前類的所有測試方法都執(zhí)行完之后執(zhí)行 | @AfterAll | @AfterClass |
它在每個(gè)測試方法之前執(zhí)行 | @BeforeEach | @BeforeMethod |
在每個(gè)測試方法之后執(zhí)行 | @AfterEach | @AfterMethod |
它在套件中的所有測試運(yùn)行之前執(zhí)行 | NA | @BeforeSuite |
它在套件中的所有測試都運(yùn)行后執(zhí)行 | NA | @AfterSuite |
測試前執(zhí)行 | NA | @BeforeTest |
測試后執(zhí)行 | NA | @AfterTest |
在任何這些組的第一個(gè)測試方法之前執(zhí)行 | NA | @BeforeGroups |
在任何這些組的第一個(gè)測試方法之后執(zhí)行 | NA | @AfterGroups |
忽略測試 | @Disabled (In JUnit4 it is @ignore) | @Test(Enable=false) |
預(yù)期異常 | @Test(expected=Arithmetic | @Test(expectedException=Arithmetic Exception.class) |
超時(shí) | @Timeout | @Test(timeout = 1000) |
PS:在 JUnit 4 中,@BeforeClass
和@AfterClass
方法被認(rèn)為是靜態(tài)的,而在TestNG
中沒有這樣的限制。
用例管理
管理測試執(zhí)行是一項(xiàng)重要任務(wù);與 JUnit 相比,TestNG 使這項(xiàng)任務(wù)更容易。
分組測試
這個(gè)功能目前只有 TestNG 支持。 它涉及通過創(chuàng)建多個(gè)組來執(zhí)行任務(wù)。每個(gè)都包含各種測試類,并且可以在單獨(dú)的組中運(yùn)行測試,而不是運(yùn)行孤立的測試。它使用@Test
注解中的參數(shù)。
@Test(groups={"groupname1",<"group2">..,<"groupN">})
在 TestNG 中,可以在<test>
或<suite>
標(biāo)記下輕松識別。
忽略測試
不需要執(zhí)行來自大型測試套件的某些測試,尤其是只想測試特定功能時(shí)。此功能包含了是否應(yīng)忽略或考慮特定的單元測試。JUnit 和 TestNG 都配備了這個(gè)特性,以及前面討論的所有注釋。在 JUnit 中,此功能使用@ignore
注解:
@Ignore public void method1() { //code }
而在 TestNG 中,它使用@Test(enabled = false)
注釋運(yùn)行。
@Test(enabled=false) public void TestWithException(){ //code }
參數(shù)化
參數(shù)化可以理解是數(shù)據(jù)驅(qū)動的測試,可以減少代碼量并提高其可讀性。TestNG 與 JUnit 提供此功能的方式有所不同。TestNG 有一種簡單的方法來修復(fù)測試用例中的參數(shù)。它利用@Parameter
注釋并將參數(shù)添加到給定的測試方法。browser
的值在 XML 文件(例如testng.xml
)中說明,而 JUnit 使用@ParameterizedTest
注釋。
依賴測試
這個(gè)功能表示一種測試方法何時(shí)依賴于另一種測試方法。JUnit 目前不支持此功能。TestNG 支持多種類型的測試。在 TestNG 中,依賴方法使用@DependsOnMethods
注解。
@Test(dependsOnMethods = {"Login"}) //code
異常測試
此功能驗(yàn)證在測試執(zhí)行期間遇到錯(cuò)誤時(shí)要使用的異常。TestNG 和 JUnit 都支持此功能,但處理異常的方式略有不同。TestNG 在@Test
注解中使用了expectedException
參數(shù) 。
在 JUnit 中,assertThrows API
用于異常處理:
@Test(expectedExceptions = ArithmeticException.class) public void FunTester() { int i = 10/0; }
超時(shí)測試
這個(gè)功能指測試執(zhí)行中的超時(shí)功能,該功能設(shè)置時(shí)間限制,當(dāng)超過該時(shí)間限制時(shí),測試會自動失敗。TestNG 和 JUnit 都以相同的語法提供此功能。
JUnit:
@Test(timeout = 1000) public void method1() { // do nothing }
TestNG:
@Test(timeOut = 1000) public void testThisShouldFail() { // do nothing }
結(jié)論
許多測試框架都支持自動化測試,具體取決于測試的目標(biāo)。TestNG 和 JUnit 都是自動化單元測試領(lǐng)域最受信任的框架。TestNG 克服了 JUnit 的諸多不便,簡化了測試人員的工作。使用 TestNG,可以執(zhí)行單元測試、集成測試和端到端測試,而 JUnit 僅涵蓋單元測試。
以上就是測試框架JUnit VS TestNG對比分析的詳細(xì)內(nèi)容,更多關(guān)于測試框架JUnit對比TestNG的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解inet_pton()和inet_ntop()函數(shù)
這篇文章主要介紹了inet_pton()和inet_ntop()函數(shù),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12一文助你搞懂參數(shù)傳遞原理解析(java、go、python、c++)
這篇文章主要介紹了多種語言參數(shù)傳遞原理解析(java、go、python、c++),本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01