TestNG或JUnit

多年以來,無論何時使用Java代碼進行單元測試,我始終會回到TestNG。 每當我拿起TestNG時,人們都問我為什么要繼續使用TestNG,尤其是默認開發環境(例如Eclipse或Maven)提供的JUnit時。

繼續進行同樣的戰斗,昨天我開始研究Spring的測試支持 。 它也建立在JUnit之上。 但是,在使用相同功能的幾分鐘后,我一直在尋找JUnit中一直找不到的功能。 TestNG使用DataProviders提供參數化測試 。 考慮到我再次問自己一個熟悉的問題– TestNG或JUnit,我決定對此進行記錄,以便下次可以確定是哪個以及為什么。

基本上一樣

如果您只是要進行一些基本的單元測試,那么這兩個框架基本上是相同的。 這兩個框架都允許您快速有效地測試代碼。 他們在Eclipse和其他IDE中具有工具支持。 他們還獲得了諸如Ant和Maven之類的構建框架的支持。 對于初學者來說,JUnit一直是首選,因為它是第一個用于單元測試的框架,并且一直可用。 我談論的許多人直到我們談論它之前都沒有聽說過TestNG。

靈活性

讓我們來看兩個簡單的測試用例。

package com.kapil.itrader;
import java.util.Arrays;
import java.util.List;
import junit.framework.Assert;
import org.junit.BeforeClass;
import org.junit.Test;public class FibonacciTest
{private Integer input;private Integer expected;@BeforeClasspublic static void beforeClass(){// do some initialization}@Testpublic void FibonacciTest(){System.out.println("Input: " + input + ". Expected: " + expected);Assert.assertEquals(expected, Fibonacci.compute(input));assertEquals(expected, Fibonacci.compute(input));}
}

好吧,這是示例展示,我正在使用4.x +版本并正在使用注釋。 優先于4.0版本; JUnit不支持注釋,這是TestNG相對于競爭對手的主要優勢; 但是JUnit很快就適應了。 您會注意到,JUnit還支持靜態導入,并且我們可以像以前的版本中那樣省去更多繁瑣的代碼。

package com.kapil.framework.core;
import junit.framework.Assert;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.Test;public class BaseTestCase
{protected static final ClassPathXmlApplicationContext context;static{context = new ClassPathXmlApplicationContext("rootTestContext.xml");context.registerShutdownHook();}@BeforeSuiteprivate void beforeSetup(){// Do initialization}@Testpublic void testTrue(){Assert.assertTrue(false);}
}

首先看一下這兩個代碼,可以推斷兩者幾乎相同。 但是,對于那些已經完成足夠的單元測試的人,我會同意TestNG可以提供更大的靈活性。 JUnit要求我將初始化方法聲明為static; 因此,我將在該方法中編寫的任何內容也必須是靜態的。 JUnit還要求我將初始化方法公開。 但是TestNG不會。 我也可以在測試課程中使用OOP的最佳實踐。 除了@ BeforeClass,TestNG還允許我聲明測試套件,組,方法,并使用@ BeforeSuite,@ BeforeMethod,@ BeforeGroups等注釋。 當編寫需要訪問公共數據集的任何級別的集成測試或單元測試用例時,這非常有用。

測試隔離和依賴性測試

在進行隔離測試時,Junit非常有效。 從本質上講,這意味著您無法控制測試的執行順序。 而且,因此,如果由于某種依賴關系而有兩個要按特定順序運行的測試,則無法使用JUnit進行。 但是,TestNG允許您非常有效地執行此操作。 在Junit中,您可以解決此問題,但它并不整齊,也不那么容易。

基于參數的測試

TestNG提供的一個非常強大的功能是“參數化測試”。 JUnit在4.5+版本中對此添加了一些支持,但是它不如TestNG有效。 您可能與FIT合作過,您會知道我在說什么。 但是,JUnit中添加的支持是非常基本的,并且效果不佳。 我已經修改了我以前的測試用例,以包括參數化測試。

package com.kapil.itrader;import static org.junit.Assert.assertEquals;import java.util.Arrays;
import java.util.List;import junit.framework.Assert;import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;@RunWith(Parameterized.class)
public class FibonacciTest
{private Integer input;private Integer expected;@Parameterspublic static List data(){return Arrays.asList(new Integer[][] { { 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 } });}@BeforeClasspublic static void beforeClass(){System.out.println("Before");}public FibonacciTest(Integer input, Integer expected){this.input = input;this.expected = expected;}@Testpublic void FibonacciTest(){System.out.println("Input: " + input + ". Expected: " + expected);Assert.assertEquals(expected, Fibonacci.compute(input));assertEquals(expected, Fibonacci.compute(input));}}

您會注意到,我已經使用@RunWith批注來對測試用例進行參數化。 在這種情況下,將使用已用@Parameters注釋的內聯方法– data()將數據提供給該類。 但是,最大的問題是將數據傳遞給類構造函數。 這使我只能在此類中編寫邏輯綁定的測試用例。 而且,我最終將對一個服務擁有多個測試用例,因為該服務中的所有各種方法都需要不同的數據集。 好消息是,有各種開放源代碼框架擴展了此方法,并添加了自己的“ RunWith”實現,以允許與CSV,HTML或Excel文件等外部實體集成。

TestNG提供了開箱即用的支持。 不支持讀取CSV或外部文件,但支持數據提供程序。

package com.kapil.itrader.core.managers.admin;import org.testng.Assert;
import org.testng.annotations.Test;import com.uhc.simple.common.BaseTestCase;
import com.uhc.simple.core.admin.manager.ILookupManager;
import com.uhc.simple.core.admin.service.ILookupService;
import com.uhc.simple.dataprovider.admin.LookupValueDataProvider;
import com.uhc.simple.dto.admin.LookupValueRequest;
import com.uhc.simple.dto.admin.LookupValueResponse;/*** Test cases to test {@link ILookupService}.*/
public class LookupServiceTests extends BaseTestCase
{@Test(dataProvider = "LookupValueProvider", dataProviderClass = LookupValueDataProvider.class)public void testGetAllLookupValues(String row, LookupValueRequest request, LookupValueResponse expectedResponse){ILookupManager manager = super.getLookupManager();LookupValueResponse actualResponse = manager.getLookupValues(request);Assert.assertEquals(actualResponse.getStatus(), expectedResponse.getStatus());}
}

上面的代碼片段展示了我已經將dataProvider用作批注的值,然后提供了一個類,該類負責創建在調用時提供給方法的數據。 使用這種機制,我可以輕松地以分離的方式編寫測試用例及其數據提供者,并非常有效地使用它。

為什么我選擇TestNG

對我而言,參數化測試是我選擇TestNG而非Junit的最大原因。 但是,上面列出的所有內容都是為什么我總是要花幾分鐘的時間在新的Eclipse安裝程序或maven項目中設置TestNG的原因。 當運行大型測試套件時,TestNG非常有用。 對于小型項目或培訓活動,JUnit很好; 因為任何人都可以很快開始使用它; 但不適用于需要數千個測試用例的項目,并且在大多數測試用例中,您會遇到各種情況。

參考: Scratch Pad博客上來自我們JCG合作伙伴 Kapil Viren Ahuja的TestNG或JUnit 。


翻譯自: https://www.javacodegeeks.com/2012/01/testng-or-junit.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373272.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373272.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373272.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

event php,PHP event 事件機制

/** PHP 事件機制*/class baseClass{private $_e;public function __set($name,$value){if( strncasecmp($name,"on",2) 0 ){if(!isset($this->_e[$name]))$this->_e[$name] array();return array_push($this->_e[$name] , $value);}}public function __g…

Android JNI編程(五)——C語言的靜態內存分配、動態內存分配、動態創建數組...

版權聲明:本文出自阿鐘的博客,轉載請注明出處:http://blog.csdn.net/a_zhon/。 目錄(?)[] 一:什么是靜態內存什么又是動態內存呢? 靜態內存:是指在程序開始運行時由編譯器分配的內存,它的分配是在程序開始…

Visual Studio-C#-20160411

函數的四個要素包括:名稱,輸入,輸出,加工 注釋的方式://只注釋一行;/**/注釋一段區域; namespace ConsoleApplication6 ---------//命名空間{ class Program ---------------------------//類…

配置MyBatis 3

MyBatis是一個非常流行且也是最有效的SQL映射框架。 MyBatis可用于Java和.net語言。 MyBatis并不是Hibernate的真正替代品,但是我們可以使用該框架來減少MyBatis提供的高效和高性能的數據庫相關代碼。 本教程將向您展示使用數據庫配置MyBatis 3的步驟。 MyBatis 3支…

php獲取src,PHP讀取文件

本文概述PHP提供了各種功能來從文件讀取數據。有多種功能允許你讀取所有文件數據, 逐行讀取數據以及逐字符讀取數據。下面提供了可用的PHP文件讀取功能。fread()fgets()fgetc()PHP讀取文件-fread()PHP fread()函數用于讀取文件的數據。它需要兩個參數:文件資源和文件…

HDOJ(HDU) 1406 完數

Problem Description 完數的定義:如果一個大于1的正整數的所有因子之和等于它的本身,則稱這個數是完數,比如6,28都是完數:6123;28124714。 本題的任務是判斷兩個正整數之間完數的個數。 Input 輸入數據包…

Allegro padstack

在ALLEGRO中,建立PCB封裝是一件挺復雜的事,而要建立FOOTPRINT,首先要有一個PAD,所以就要新建PADSTACK。 焊盤可以分兩種,表貼焊盤和通孔焊盤,表貼焊盤結構相對簡單,下面首先分析表貼焊盤的成分&…

java中datetime類型轉換,Java中日期格式和其他類型轉換詳解

涉及的核心類:Date類、SimpleDateFormat類、Calendar類一、Date型與long型Date型轉換為long型Date date new Date();//取得當前時間Date類型long date2long date.getTime();//Date轉longlong型轉換為Date型long cur System.currentTimeMills();//取得當前時間lon…

GWT MVP變得簡單

GWT Model-View-Presenter是用于大規模應用程序開發的設計模式。 它源于MVC,它在視圖和邏輯之間進行劃分,并有助于創建結構良好,易于測試的代碼。 為了幫助像我這樣的懶惰開發人員,我研究了如何減少使用聲明式UI時要編寫的類和接口…

php如何編寫通信協議,定制通訊協議

## 如何定制協議實際上制定自己的協議是比較簡單的事情。簡單的協議一般包含兩部分:* 區分數據邊界的標識* 數據格式定義## 一個例子### 協議定義這里假設區分數據邊界的標識為換行符"\n"(注意請求數據本身內部不能包含換行符),數據格式為Json&#xff0c…

今年計劃要看的書全部備齊

上個月購買的書《今年計劃看的書其中幾本》 http://www.cnblogs.com/insus/p/5325513.html 昨天購買的書回來了,今年計劃要看的書全部備齊。《MongoDB》,《深入理解Bootstarp》和《ASP.NETSignalR編程實踐》…… 轉載于:https://www.cnblogs.com/in…

Codevs 2756 樹上的路徑

2756 樹上的路徑 時間限制: 3 s    空間限制: 128000 KB    題目等級 : 大師 Master題目描述 Description給出一棵樹&#xff0c;求出最小的k&#xff0c;使得&#xff0c;且在樹中存在路徑P&#xff0c;使得k> S 且 k <E. &#xff08;k為路徑P上的邊的權值和&a…

圖形教程

眾所周知&#xff0c;我們可以借助Java庫制作游戲&#xff0c;這些庫為我們提供制作游戲所需的圖形。 因此&#xff0c;今天我將開始一個關于Java圖形的非常新的部分。 我之前曾發表過有關如何制作所得稅計算器的文章 。 首先要滿足一些先決條件&#xff1a; -您應該對Java語法…

文件上傳預覽

<fieldset><legend>使用readAsDataUrl()方法預覽圖片</legend><input type"file" name"fileUpload" id"fileUpload" onchange"filePrevImg(this.files);" multiple"true" /><ul id"prevUpl…

c++強制類型轉換:dynamic_cast、const_cast 、static_cast、reinterpret_cast

一、介紹 dynamic_cast: 通常在基類和派生類之間轉換時使用const_cast: 主要針對const和volatile的轉換static_cast: 一般的轉換(no run-time check)通常&#xff0c;如果你不知道該用哪個&#xff0c;就用這個。 reinterpret_cast: 用于進行沒有任何關聯之間的轉換&…

K8S Pod Terminating/Unknown故障排查

一、pod異常出現現象 優雅終止周期(Graceful termination period): 當pod被刪除時&#xff0c;會進入"Terminating"狀態&#xff0c;等待容器優雅關閉。如果容器關閉所需時間超過默認期限(默認30秒)&#xff0c;則pod將保持在"Terminating"狀態。 Finalize…

矩陣指數 matlab,矩陣指數 - MATLAB Simulink Example - MathWorks 中國

方法 1&#xff1a;加權平方expmdemo1 是以下著作中算法 11.3.1 的實現&#xff1a;Golub, Gene H. and Charles Van Loan.Matrix Computations, 3rd edition.Baltimore, MD:Johns Hopkins University Press, 1996.% Scale A by power of 2 so that its norm is < 1/2 .[f,e…

向導設計模式

我們都喜歡巫師……。 &#xff08;我的意思是軟件向導&#xff09;。 我們總是很高興跳上那些“下一步”按鈕&#xff0c;就像我們在我們的時髦的小雞上跳舞一樣。 因此&#xff0c;今天我們將您心愛的向導帶入您的編碼經驗中。 讓我們跳入一個例子。 假設您要設計一個Conserv…

IO(三)字節流練習

public class ByteStreamDemo {/*int available(); 可以取得輸入文件的大小&#xff08;字節個數&#xff09;,沒有返回0void close(); 關閉輸入流abstract int read(); 讀取一個字節&#xff0c;并把讀…

基于matlab的人臉五官邊緣檢測方法,人臉邊緣檢測方法研究與仿真

人臉表情是人類情感的主載體之一,它含有豐富的人體行為信息。通過臉部表情能夠表達人微妙的情緒反應以及對應的心理狀態[1],人臉表情識別技術隨著人們對表情信息的日益重視而受到關注,現已成為人們研究的熱點。基于幾何特征提取是一個快速、直接、有效的人臉表情識別方法,運用基…