介紹
軟件開發(fā)經(jīng)歷了許多階段,如需求收集和分析、溝通、設(shè)計(jì)、代碼構(gòu)建、測(cè)試和發(fā)布。企業(yè)必須確保他們交付的產(chǎn)品符合標(biāo)準(zhǔn),當(dāng)產(chǎn)品通過多維質(zhì)量檢查時(shí),這是非常有必要的。測(cè)試是 SDLC 不可或缺的一部分,可以手動(dòng)或自動(dòng)完成。單元測(cè)試是一種可靠的測(cè)試形式,它涉及測(cè)試軟件的每個(gè)組件。像 ?JUnit
? 和 ?TestNG
? 這樣的單元測(cè)試框架呈現(xiàn)出相似的測(cè)試根源,因此關(guān)于 ?TestNG
? 與 ?JUnit
? 的爭(zhēng)論仍然存在。
什么是單元測(cè)試?
測(cè)試不是單一的活動(dòng),而是涵蓋各種測(cè)試場(chǎng)景。它以不同的方式進(jìn)行分類,其中一種是基于測(cè)試級(jí)別,例如集成、單元和系統(tǒng)測(cè)試。基于目標(biāo)的應(yīng)用程序測(cè)試涵蓋移動(dòng)測(cè)試、Web 和混合測(cè)試。
單元測(cè)試涉及測(cè)試軟件產(chǎn)品中最微小的代碼。目的是檢查代碼的每個(gè)組件的質(zhì)量是否按預(yù)期執(zhí)行。它在開發(fā)階段執(zhí)行。一段代碼被隔離以確保其有效性和準(zhǔn)確性。代碼的單個(gè)組件可以是函數(shù)、模塊、對(duì)象或方法??紤]任何軟件工程;單元測(cè)試總是在集成測(cè)試之前先執(zhí)行。它有助于在應(yīng)用程序開發(fā)生命周期的早期階段識(shí)別和解決錯(cuò)誤。開發(fā)人員使用不同的單元測(cè)試框架來創(chuàng)建單元測(cè)試的自動(dòng)化測(cè)試用例。市場(chǎng)上有不同的工具可以執(zhí)行單元測(cè)試,如 ?JUnit
?、?NUnit
?、?PHPUnit
?、?JMockit
?等。
公司使用不同的單元測(cè)試框架來管理測(cè)試成本,提高速度、效率和準(zhǔn)確性。在?Selenium – Java? 中,?JUnit
?和 ?TestNG
?是最受歡迎的單元測(cè)試框架。
JUnit 于 1997 年作為基于 Java 的開源單元測(cè)試框架推出。它是 ?XUnit
?的一部分,?XUnit
? 是單元測(cè)試框架系列的代表。它允許開發(fā)人員編寫和運(yùn)行可重復(fù)的測(cè)試。它與 Selenium 一起廣泛用于編寫 Web 自動(dòng)化測(cè)試。其最新的程序員友好版本是 ?JUnit 5
?,它為 Java 虛擬機(jī)上基于開發(fā)人員的測(cè)試創(chuàng)建了一個(gè)強(qiáng)大的基礎(chǔ)。
TestNG 也是一個(gè)基于 Java 的單元測(cè)試框架,于 2007 年在 ?JUnit
?的同一行上開發(fā),但具有新的和改進(jìn)的功能。這些新功能包括靈活的測(cè)試配置、參數(shù)支持、數(shù)據(jù)驅(qū)動(dòng)測(cè)試、注釋、各種集成等等。?TestNG
? 執(zhí)行單元、端到端和集成測(cè)試。?TestNG
? 生成報(bào)告,幫助開發(fā)人員了解所有測(cè)試用例的通過、失敗和跳過狀態(tài)。借助 Selenium 中的 ?TestNG
?,您可以使用?estng-failed.xml
? 文件單獨(dú)運(yùn)行失敗的測(cè)試,以僅運(yùn)行失敗的測(cè)試用例。根據(jù) ?mvnrepository.com
?,截至 2021 年 2 月,?TestNG
?的最新版本是 ?7.4.0
?。
必須了解 ?TestNG
?和 ?JUnit
?測(cè)試框架之間的區(qū)別,以確定這兩個(gè)自動(dòng)化測(cè)試框架中的哪一個(gè)最適合您的項(xiàng)目。
TestNG 和 JUnit 的區(qū)別
?TestNG
?和?JUnit
?雖然沒有明顯區(qū)別,但都是最頂級(jí)的基于Java的自動(dòng)化框架,各有優(yōu)缺點(diǎn)。盡管如此,讓我們嘗試了解 ?Selenium WebDriver
? 中 ?JUnit
?和 ?TestNG
?框架之間的主要區(qū)別:
1、測(cè)試套件
測(cè)試套件由一組 JUnit 和 TestNG 測(cè)試組成,允許您同時(shí)執(zhí)行測(cè)試。早期版本的 JUnit 中不允許使用測(cè)試套件功能,但它是在 JUnit 5 中引入的,而該功能始終存在于 TestNG 中。盡管兩者都有測(cè)試套件,但它們對(duì)每個(gè)套件執(zhí)行測(cè)試的方式存在關(guān)鍵差異。讓我們看一下展示測(cè)試套件如何在兩個(gè)框架中運(yùn)行的代碼片段。
TestNG中的測(cè)試套件從 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è)類 JUnit 1 和 2 是使用注解?@Suite
? 編寫的。
@RunWith(Suite.class)
@Suite.SuiteClasses({
JUnit1.class,
JUnit2.class
})
public class JunitTest5 {
//code
}
2、 注釋
對(duì)于測(cè)試人員來說,使用 TestNG 更容易,因?yàn)樗鼮樗麄兲峁┝硕鄠€(gè)選項(xiàng)來使用測(cè)試套件。例如,可以通過將類捆綁成組來執(zhí)行測(cè)試套件。
JUnit 和 TestNG 框架中使用的注釋的工作方式相似,只是名稱略有不同。下表顯示了 JUnit 和 TestNG 注釋的差異。
特征 | 聯(lián)隊(duì) 5 | 測(cè)試 |
---|---|---|
將方法標(biāo)記為測(cè)試方法 | @Test | @Test |
它在類的第一個(gè)測(cè)試方法之前執(zhí)行 | @BeforeAll | @BeforeClass |
它在當(dāng)前類的所有測(cè)試方法都執(zhí)行完畢后執(zhí)行。 | @AfterAll | @AfterClass |
它在每個(gè)測(cè)試方法之前執(zhí)行 | @BeforeEach | @BeforeMethod |
在每個(gè)測(cè)試方法之后執(zhí)行 | @AfterEach | @AfterMethod |
它在套件中的所有測(cè)試運(yùn)行之前執(zhí)行。 | 不適用 | @BeforeSuite |
它在套件中的所有測(cè)試都運(yùn)行后執(zhí)行。 | 不適用 | @AfterSuite |
在測(cè)試之前執(zhí)行。 | 不適用 | @BeforeTest |
測(cè)試后執(zhí)行。 | 不適用 | @AfterTest |
在任何這些組的第一個(gè)測(cè)試方法之前執(zhí)行。 | 不適用 | @BeforeGroups |
在任何這些組的第一個(gè)測(cè)試方法之后執(zhí)行。 | 不適用 | @AfterGroups |
忽略測(cè)試 | @Disabled(在 JUnit4 中是 @ignore) | @Test(Enable=false) |
預(yù)期異常 | @Test(expected=ArithmeticException0.class ) | @Test( expectedException =ArithmeticException.class ) |
暫停 | @TimeOut | @Test(timeout = 1000) |
在 JUnit 4 中,?@BeforeClass
? 和 ?@AfterClass
? 方法被認(rèn)為是靜態(tài)的,而在 TestNG 中沒有這樣的限制。
TestNG vs. JUnit——測(cè)試用例管理
測(cè)試執(zhí)行的管理是一項(xiàng)重要任務(wù);與 JUnit 相比,TestNG 使此任務(wù)更容易。TestNG 在以下方面的幫助下實(shí)現(xiàn)了這一點(diǎn):
- 分組測(cè)試用例:這是一項(xiàng)僅適用于 TestNG 的功能。 它涉及通過創(chuàng)建多個(gè)組來執(zhí)行任務(wù)。每個(gè)都包含各種類,并且可以在單獨(dú)的組中運(yùn)行測(cè)試,而不是運(yùn)行孤立的測(cè)試。它使用?
@Test
? 注釋中的參數(shù)。
@Test(groups={"groupname1",<"group2">..,<"groupN">})
忽略測(cè)試:不需要執(zhí)行來自龐大測(cè)試套件的某些測(cè)試,尤其是當(dāng)您只想測(cè)試特定功能時(shí)。 此功能闡明是否應(yīng)忽略或考慮特定的單元測(cè)試。JUnit 和 TestNG 都配備了此功能,以及前面討論的所有注釋。在 JUnit 中,此功能使用 ?@ignore
?注解:在 TestNG 中,組包含在“groups”標(biāo)簽下的 XML 文件中,可以在 <test> 或 <suite> 標(biāo)簽下輕松識(shí)別。
@Ignore
public void method1()
{
//code
}
而在 TestNG 中,它使用 ?@Test( enabled = false )
? 注釋運(yùn)行。
@Test(enabled=false)
public void TestWithException()
{
//code
}
- 參數(shù)化:這意味著在每次測(cè)試執(zhí)行時(shí)填充值/參數(shù)。結(jié)果,我們得到了改進(jìn)的代碼可重用性。它是數(shù)據(jù)驅(qū)動(dòng)的測(cè)試,可減少代碼長度并提高其可讀性。TestNG 與 JUnit 提供此功能的方式有所不同。TestNG 有一個(gè)簡(jiǎn)單的方法來修復(fù)測(cè)試用例中的參數(shù)。它利用?
@Parameter
? 注釋并將參數(shù)添加到給定的測(cè)試方法。“瀏覽器”的值在 XML 文件(例如 testng.xml)中聲明,而 JUnit 使用 ?@ParameterizedTest
?注釋。 - 依賴測(cè)試:此功能顯示一種測(cè)試方法何時(shí)依賴于另一種測(cè)試方法。JUnit 不支持此功能,而 TestNG 支持。由于 TestNG 是最新的,它支持多種類型的測(cè)試。在TestNG中,依賴方法使用?
@DependsOnMethods
?注解。
@Test(dependsOnMethods = {"LoginBrowser"})
//code
- 異常測(cè)試:此功能驗(yàn)證在測(cè)試執(zhí)行期間遇到錯(cuò)誤時(shí)要使用的異常。TestNG 和 JUnit 都提供此功能,但處理異常的方式略有不同。TestNG在?
@Test
?注釋中使用 ?expectedException
?參數(shù)
在 JUnit 中,?assertThrows API
? 用于異常處理
@Test(expectedExceptions = ArithmeticException.class)
public void DivideByZero() {
int i = 10/0;
}
- 超時(shí)測(cè)試:這允許測(cè)試執(zhí)行中的超時(shí)功能設(shè)置時(shí)間限制,當(dāng)超過時(shí),測(cè)試自動(dòng)失敗。TestNG 和 JUnit 都以相同的語法提供此功能。
@Test(expected = ArithmeticException.class)
public void DivideByZero() {
int i = 10/0;
}
TestNG 與 JUnit – 并行測(cè)試執(zhí)行
最有效的測(cè)試方法之一是執(zhí)行并行測(cè)試。在基于云的 Selenium Grid 上同時(shí)而不按順序運(yùn)行測(cè)試比在本地 Selenium Grid 上執(zhí)行它支持更多的并行性。TestNG 和 JUnit 5 都支持并行測(cè)試。
TestNG 與 JUnit – 報(bào)告
報(bào)告是測(cè)試中分析測(cè)試結(jié)果的重要要求。TestNG 默認(rèn)生成 HTML 和索引報(bào)告。JUnit 不會(huì)為測(cè)試執(zhí)行創(chuàng)建任何此類報(bào)告,而是以 XML 文件格式提供數(shù)據(jù)。你必須使用帶有 JUnit 的附加外部插件來創(chuàng)建報(bào)告。
TestNG 與 JUnit – 社區(qū)支持
TestNG 和 JUnit 都是各自社區(qū)中的流行框架。JUnit 是在 TestNG 之前引入的,這就是為什么它具有相對(duì)更廣泛和更強(qiáng)大的社區(qū)支持。TestNG 正在逐漸迎頭趕上,其用戶群也每天以更快的速度增長。
結(jié)論
許多測(cè)試框架都支持自動(dòng)化測(cè)試,具體取決于你的測(cè)試目標(biāo)是什么。TestNG 和 JUnit 是自動(dòng)化單元測(cè)試領(lǐng)域最受信任的框架之一。TestNG克服了JUnit的異常,減輕了測(cè)試人員的任務(wù)。使用 TestNG,可以執(zhí)行單元測(cè)試、集成測(cè)試和端到端測(cè)試,而 JUnit 僅涵蓋單元測(cè)試。TestNG 和 JUnit 之間有很多不同之處,但它們有很多共同之處。因此,迫切需要在單元測(cè)試上下文中討論 TestNG 與 JUnit。我們希望這項(xiàng)比較研究可以幫助您了解框架在單元測(cè)試中的作用,并幫助你選擇適合你的測(cè)試需求和業(yè)務(wù)需求的框架。