JUnit与TestNG:您应该选择哪种测试框架?
JUnit與TestNG:測試框架對決
在平衡良好的開發人員團隊中,測試是軟件發布周期中不可分割的一部分。 并非總是那樣。 單元測試,集成測試,系統測試等并不總是存在的。 如今,我們很幸運能及時到達一個測試很重要且其價值已為大多數利益相關者所知的地方。
在本文中,我們將測試放在中心,并通過JUnit和TestNG的眼光探索Java測試,同時比較它們的主要功能和用例。
非常感謝OverOps的測試自動化工程師Sasson Shmuel在撰寫本文時所提供的幫助。
所以……給定一個干凈的狀態,您會選擇什么?
1.符合框架
毫無疑問,JUnit和TestNG是那里最受歡迎的測試框架。 實際上,當我們查看GitHub上Java頂級項目使用的庫時,它們都進入了前20名 。
JUnit在62%的項目中排名第一,而TestNG在6%的項目中排名第20。 Maven存儲庫顯示了類似的結果,其中JUnit的流行度排名在第1位(使用42,484次)和TestNG在第15位(使用3,873次使用)。 這也是因為默認情況下,許多Maven原型中都添加了JUnit。
版本和一些近期歷史
最新的JUnit版本是2014年12月發布的4.12, JUnit 5有望在2016年底達到GA狀態。這很快就會實現,我們也希望它成為會議中的熱門話題。
JUnit一直是采用測試驅動開發的驅動程序之一,最初由Kent Beck和Erich Gamma開發 。 在2013年,火炬傳遞給了JUnit團隊 :
我剛剛將github上的junit存儲庫轉移到junit-team。 *嗅嗅*我的孩子都長大了。
—肯特·貝克(@KentBeck) 2013年2月6日
早期的JUnit 5版本已經可供您使用,您也可以在GitHub上為它的開發做出貢獻。 一個有趣的事實是,通過眾籌活動使新版本的開發成為可能。
至于由Cedric Beust創建的TestNG,撰寫本文時的最新版本是2015年12月的6.9.10。它首次出現在JUnit 3出現的那一刻,并提供了當時不存在的新功能。專注于更廣泛的測試用例的設計時代。 其中一些功能(例如使用批注)已添加到JUnit 4中,這是我們在此處重點關注的版本,并展望了即將發布的JUnit 5版本。
2.編寫測試
TestNG和JUnit都基于類似于Java斷言的行為,該行為在Java 4中又添加了。而且我們可以直接使用斷言,所以……為什么要為測試框架而煩惱?
從簡單的Java斷言開始就很容易受到誘惑,但是隨著項目的發展,測試很快變得不平凡,使用框架來管理它非常有意義。 而且,學習曲線很快,主要概念簡單而強大。 JUnits代碼庫非常輕巧,因此引用了Martin Fowler:
“在軟件開發領域,從來沒有太多人需要這么少的代碼行”
JUnit和TestNG都遵循xUnit約定,但是有很多區別,我們在這里要強調。 組,并行性,參數化測試和依賴項:
團體
TestNG為JUnit中提供的注釋提供了附加注釋。 可能最值得注意的是在一組測試用例之前/之后運行代碼的能力。 同樣,單個測試可以屬于多個組,然后在不同的上下文中運行(例如慢速或快速測試)。 實際上,這是測試用例和測試套件之間的另一層:
@Test(groups = { "sanity", "insanity" })JUnit類別中存在類似的功能,但缺少@BeforeGroups / @AfterGroups TestNG批注,該批注允許初始化測試/將其拆解。 順便說一句,JUnit 5似乎將棄用Categories并引入一個稱為Tag的新概念:
@Tag("sanity") @Tag("insanity") void testSomething() {... }但就目前看來,看不到@BeforeTag / @AfterTag注釋。
并行性
如果您想在多個線程上并行運行相同的測試,TestNG會為您提供一個易于使用的注釋,而JUnit并沒有提供開箱即用的簡單方法。 TestNG實現看起來像:
@Test(threadPoolSize = 3, invocationCount = 9) public void testSomething() {... }意思是,同一測試有3個線程和9個調用。 如果在TestNG的XML運行配置中指定整個套件,則也可以并行運行整個套件。 使用JUnit時,您必須編寫一個自定義的運行器方法,并多次提供相同的測試參數。 這將我們帶到下一個要點。
參數化/數據驅動測試
這是將不同的測試輸入饋送到同一測試用例的問題,TestNG和JUnit都解決了這些問題,但是使用了不同的方法。 基本思想是相同的,創建一個包含參數的2D數組Object [] []。
但是,除了通過代碼提供參數之外,TestNG @DataProvider還可以支持XML,用于輸入數據,CSV甚至純文本文件。
JUnit中存在的一項功能,而TestNG缺少的一項功能是能夠在多個參數之間使用不同的組合。 這提供了長參數列表的快捷方式,并在JUnit Theories中進行了解釋。
組/方法之間的依賴關系
由于JUnit是為單元測試而構建的,并且TestNG考慮到了更廣泛的測試,因此它們在測試之間的依賴方式上也有所不同。
TestNG允許您聲明測試之間的依賴關系,如果未通過依賴項測試,則跳過它們:
@Test(dependsOnMethods = { "dependOnSomething" }) public void testSomething() {... } JUnit中不存在此功能,可以使用假設來模擬BUT。 失敗的假設會導致忽略被忽略的測試。
底線:不同的開發人員對其選擇的框架會有不同的期望。 與JUnit相比,TestNG似乎提供了更大的靈活性。
3.運行測試
在編寫測試時,我們不需要包括main方法,因為框架使用自己的main方法為我們運行這些測試,這些方法管理各個測試的執行。
如果確實需要自定義運行器,則JUnit提供@RunWith批注,使您可以使用自己的運行器。 使用TestNG也可以繞過默認運行器,但不像使用JUnit那樣簡單。 但是,值得注意的是,TestNG支持XML運行配置,這些配置在許多用例中都非常有用。
至于實際運行的測試,這兩個框架都具有CLI支持,通過ANT運行,以及可供您選擇的IDE使用的插件,它們具有非常相似的功能。 盡管JUnit隨JDT(Eclipse Java開發工具)一起提供,但是確實如此。
TestNG Eclipse插件上的測試套件結果
底線: JUnit的@RunWith注釋稍微靈活一些。
4.報告結果
測試結果引起了很多人的興趣。 運行它們的不僅僅是開發人員。 這是報告開始發揮作用的時候,兩個框架都對此問題給出了答案。
默認情況下,TestNG報告會生成到一個test-output文件夾,其中包含帶有所有測試數據,通過/失敗/跳過,運行了多長時間,使用了哪些輸入以及完整的測試日志的html報告。 此外,它還將所有內容導出到XML文件,該文件可用于構建您自己的報告模板。
在JUnit方面,所有這些數據也可以通過XML獲得,但是沒有開箱即用的報告,您需要依賴插件。
TestNG Eclipse插件上的測試套件結果
底線: TestNG提供了開箱即用的報告,JUnit僅將其導出到XML
5.自動化測試運行
這兩個框架均可用于通過Jenkins,Travis CI和Teamcity之類的工具創建自動化測試運行。 還可以使用插件從測試數據中創建報告,并將其發送給您選擇的渠道可能感興趣的任何人。 例如,將TestNG與Jenkins結合使用,并將其與email和Slack集成。
我們以前也曾寫過一些對開發人員最有用的Slack集成, 請查看 。
底線:自動化取勝。 JUnit和TestNG都可能具有您要查找的集成。
6.終止失敗的測試
糟糕,測試失敗。 接下來發生什么? 如果足夠精細,則查找故障原因應該相對容易一些,但是現實中對我們通常有不同的計劃。
盡管它主要用于生產環境,但我們的很大一部分用戶還設置了OverOps來監視其測試環境。 每當測試失敗時,他們就可以通過導致失敗的所有方法查看導致失敗的變量。
底線:要使您的環境更上一層樓 ,請查看OverOps并查看其如何幫助您解決錯誤。
7.模擬,匹配和其他框架
如果不提及一些補充測試庫,那么關于Java測試,JUnit和TestNG的博客文章是不完整的。
在本節中,我們將根據GitHub的頂級Java項目 ,對最受歡迎的庫進行這些類別的快速概述。
嘲笑
一個好的做法是隔離運行單元測試,但是如果要測試的組件依賴于其他復雜對象怎么辦? 這是進行模擬的地方,讓我們創建模擬對象,以模擬系統其他部分所需的行為:
- Mockito (#8,項目的10.2%)
- EasyMock (#49,項目的2.9%)
- Powermock (#91,項目的1.76%)
匹配
JUnit和TestNG所提供的斷言是非常基本的,使用匹配器有助于提高其可讀性,并增加更多功能供您選擇:
- Hamcrest (#34,項目的4.12%)
- AssertJ (#55,占項目的2.72%)
- 另一個值得一試的庫是Google的Truth ,我們在其中寫了一篇有關Google有趣的Java項目(超越Guava)的文章 。
還有... Spock
Spock是一個基于JUnit的新興的Groovy( 不是那種groovy )測試框架。 其背后的想法是通過簡單的Groovy DSL將測試庫生態系統整合為一個單一框架。 在關于Groovy 及其在Java中的用法的帖子中,我們討論了它的一些功能。 要進行更深入的比較,請查看Kostis Kapelonis的 這些幻燈片 。
底線:測試通常不會止于單個框架,而是要了解游戲中的其他庫。
8.社區
JUnit擁有更悠久的歷史和相當大的用戶基礎,它基本上定義了Java單元測試的標準。 因此,它擁有最大的用戶群,很容易找到答案或有人問您可能遇到的任何問題。
TestNG的用戶可能較少,但是它的社區并不短(盡管其網站可以改頭換面)。 而且...兩者都可以從一些徽標準則中受益。 人群中有設計師嗎?
在Stackoverflow上用junit和testng標記的問題
這是一些有關JUnit的有用鏈接:
- JUnit 4 網站和GitHub存儲庫
- JUnit 5 網站和GitHub存儲庫
和TestNG:
- TestNG 網站和GitHub存儲庫
- TestNG 討論組
底線:您不會對任何一個迷路。
最后的想法
Java測試已經走了很長一段路,我們很高興能在測試很重要的時代。 這里的主要收獲是創建有意義的測試。
照這樣說…
您正在使用哪個框架,為什么? 給定一個干凈的選擇,您會選擇什么? 在下面的評論部分讓我們知道。
翻譯自: https://www.javacodegeeks.com/2016/09/junit-vs-testng-testing-framework-choose.html
總結
以上是生活随笔為你收集整理的JUnit与TestNG:您应该选择哪种测试框架?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tbc自动攻击快捷键(tbc怎么设置自动
- 下一篇: 小程序 转义_为内存密集型应用程序转义J