測試框架JUnit VS TestNG對比分析

引言

軟件開發經歷瞭許多階段,如需求收集和分析、設計、軟件開發、測試和發佈。測試是 SDLC 不可或缺的一部分,單元測試是一種可靠的測試類型。像 JUnit 和 TestNG 這樣優秀的單元測試框架已經成為主流選擇,但是關於 TestNG 與 JUnit 的差異的爭論一直存在。

單元測試

測試不是單一的活動,而是涵蓋各種測試場景。它以不同的方式分類,其中一種是基於測試級別,例如集成、單元和系統測試。

單元測試涉及測試軟件產品中最微小的代碼。目的是檢查代碼的每個組件的質量是否按預期執行。它在開發階段執行。隔離一段代碼以確保其有效性和準確性。代碼的單個組件可以是函數、模塊、對象或方法。單元測試總是在集成測試之前進行。它有助於在應用程序開發生命周期的早期階段發現缺陷。

開發人員使用不同的單元測試框架來創建單元測試的自動化測試用例。市場上有不同的工具可用於執行單元測試,如 JUnit、NUnit、PHPUnit、JMockit 等。

JUnit 於 1997 年作為一個開源的基於 Java 的單元測試框架推出。它是 XUnit 的一部分,它是單元測試框架傢族的代表。它允許開發人員編寫和運行可重復的測試。

TestNG 是一個基於 Java 的單元測試框架,具有新的和改進的功能。這些新功能包括靈活的測試配置、參數支持、數據驅動測試、註釋、各種集成等等。TestNG 執行單元、端到端和集成測試。TestNG 生成報告,幫助開發人員瞭解所有測試用例的通過、失敗和跳過狀態。

瞭解 TestNG 和 JUnit 測試框架之間的區別,有助於選擇最適合單元測試框架。

TestNG 和 JUnit 的區別

雖然 TestNG 和 JUnit 都是最頂級的基於 Java 的自動化框架,並且各有優缺點。下面分享 JUnit 和 TestNG 框架之間的主要差別:

測試套件

測試套件由一組測試用例組成,允許同時執行測試。測試套件功能在 JUnit 的早期版本中是不允許的,但在 JUnit 5 中引入,而 TestNG 早早地就支持瞭該功能。盡管兩者都有測試套件,但它們在每個測試套件上執行測試的方式存在關鍵差異。讓我們看一下顯示測試套件如何在兩個框架中運行的代碼片段。

TestNG 中的測試套件從XML 文件運行:

<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 等註釋,如下面的代碼片段所示。兩個類 JUnit1 和 JUnit2 是使用註解 @Suite 編寫的。

@RunWith(Suite.class)
@Suite.SuiteClasses({
   JUnit1.class,
   JUnit2.class
})
public class JunitTest5 {
   //code
}

使用 TestNG 對測試人員來說更容易,因為它為他們提供瞭使用測試套件的多種選擇。例如,可以通過將類捆綁到組中來執行測試套件。

註釋

FEATURE JUNIT 5 TESTNG
將該方法標記為測試方法 @Test @Test
它在類的第一個測試方法之前執行 @BeforeAll @BeforeClass
它在當前類的所有測試方法都執行完之後執行 @AfterAll @AfterClass
它在每個測試方法之前執行 @BeforeEach @BeforeMethod
在每個測試方法之後執行 @AfterEach @AfterMethod
它在套件中的所有測試運行之前執行 NA @BeforeSuite
它在套件中的所有測試都運行後執行 NA @AfterSuite
測試前執行 NA @BeforeTest
測試後執行 NA @AfterTest
在任何這些組的第一個測試方法之前執行 NA @BeforeGroups
在任何這些組的第一個測試方法之後執行 NA @AfterGroups
忽略測試 @Disabled (In JUnit4 it is @ignore) @Test(Enable=false)
預期異常 @Test(expected=Arithmetic @Test(expectedException=Arithmetic Exception.class)
超時 @Timeout @Test(timeout = 1000)

PS:在 JUnit 4 中,@BeforeClass@AfterClass方法被認為是靜態的,而在TestNG中沒有這樣的限制。

用例管理

管理測試執行是一項重要任務;與 JUnit 相比,TestNG 使這項任務更容易。

分組測試

這個功能目前隻有 TestNG 支持。 它涉及通過創建多個組來執行任務。每個都包含各種測試類,並且可以在單獨的組中運行測試,而不是運行孤立的測試。它使用@Test註解中的參數。

@Test(groups={"groupname1",<"group2">..,<"groupN">})

在 TestNG 中,可以在<test><suite>標記下輕松識別。

忽略測試

不需要執行來自大型測試套件的某些測試,尤其是隻想測試特定功能時。此功能包含瞭是否應忽略或考慮特定的單元測試。JUnit 和 TestNG 都配備瞭這個特性,以及前面討論的所有註釋。在 JUnit 中,此功能使用@ignore註解:

@Ignore
public void method1() {   
     //code
}

而在 TestNG 中,它使用@Test(enabled = false)註釋運行。

@Test(enabled=false)
public void TestWithException(){  
    //code
}

參數化

參數化可以理解是數據驅動的測試,可以減少代碼量並提高其可讀性。TestNG 與 JUnit 提供此功能的方式有所不同。TestNG 有一種簡單的方法來修復測試用例中的參數。它利用@Parameter註釋並將參數添加到給定的測試方法。browser的值在 XML 文件(例如testng.xml)中說明,而 JUnit 使用@ParameterizedTest註釋。

依賴測試

這個功能表示一種測試方法何時依賴於另一種測試方法。JUnit 目前不支持此功能。TestNG 支持多種類型的測試。在 TestNG 中,依賴方法使用@DependsOnMethods註解。

@Test(dependsOnMethods = {"Login"})
//code

異常測試

此功能驗證在測試執行期間遇到錯誤時要使用的異常。TestNG 和 JUnit 都支持此功能,但處理異常的方式略有不同。TestNG 在@Test註解中使用瞭expectedException參數 。

在 JUnit 中,assertThrows API 用於異常處理:

@Test(expectedExceptions = ArithmeticException.class)
public void FunTester() {
  int i = 10/0;
}

超時測試

這個功能指測試執行中的超時功能,該功能設置時間限制,當超過該時間限制時,測試會自動失敗。TestNG 和 JUnit 都以相同的語法提供此功能。

JUnit:

@Test(timeout = 1000)  
public void method1() {  
      // do nothing
}

TestNG:

@Test(timeOut = 1000)
public void testThisShouldFail() {
        // do nothing
}

結論

許多測試框架都支持自動化測試,具體取決於測試的目標。TestNG 和 JUnit 都是自動化單元測試領域最受信任的框架。TestNG 克服瞭 JUnit 的諸多不便,簡化瞭測試人員的工作。使用 TestNG,可以執行單元測試、集成測試和端到端測試,而 JUnit 僅涵蓋單元測試。

以上就是測試框架JUnit VS TestNG對比分析的詳細內容,更多關於測試框架JUnit對比TestNG的資料請關註WalkonNet其它相關文章!

推薦閱讀: