1. 程式人生 > >JUnit測試框架使用介紹

JUnit測試框架使用介紹

JUnit是由 Erich Gamma 和 Kent Beck 編寫的一個迴歸測試框架(regression testing framework)。Junit測試是程式設計師測試,即白盒測試。該專案主頁:[url]http://www.junit.org/[/url] JUnit測試骨架 使用JUnit時,主要都是通過繼承TestCase類別來撰寫測試用例,使用testXXX()名稱來撰寫單元測試。 用JUnit寫測試真正所需要的就三件事: 1.  一個import語句引入所有junit.framework.*下的類。 2.  一個extends語句讓你的類從TestCase繼承。 3.  一個呼叫super(string)的建構函式。 功能類MathTool
package com.zj.c01; public class MathTool {     public static int gcd(int
 num1, int num2) {        int r = 0;        while (num2 != 0) {            r = num1 % num2;            num1 = num2;            num2 = r;        }        return num1;     } }
測試類MathToolTest
package com.zj.c01; import junit.framework.TestCase; public class MathToolTest extends TestCase {     public MathToolTest(String name) {        super
(name);     }     public void testGcd() {        assertEquals(5, MathTool.gcd(10, 5));     } }
使用Eclipse-Run As JUnit Test 在執行TestRunner執行測試時,你會發現到有Failure與Error兩種測試尚未通過的資訊。 Failure指的是預期的結果與實際執行單元的結果不同所導致,例如當使用assertEquals()或其它assertXXX()方法斷言失敗時,就會回報Failure,這時候要檢查你的單元方法中的邏輯設計是否有誤。 Error指的是你的程式沒有考慮到的情況,在斷言之前程式就因為某種錯誤引發例外而終止,例如在單元中存取某個陣列,因為存取超出索引而引發 ArrayIndexOutOfBoundsException,這會使得單元方法無法正確完成,在測試執行到asertXXXX()前就提前結束,這時候要檢查你的單元方法中是否有未考慮到的情況而引發流程突然中斷。 JUnit的各種斷言
JUnit提供了一些輔助函式,用於幫助你確定某個被測試函式是否工作正常。通常而言,我們把所有這些函式統稱為斷言。斷言是單元測試最基本的組成部分。 1. assertEquals([String message], expected,actual) 比較兩個基本型別或物件是否相等(expected和actual是原始型別數值(primitive value)或者必須為實現比較而具有equal方法); 2.assertFalse([String message],boolean condition) 對布林值求值,看它是否為“真“; 3.assertTrue([String message],boolean condition) 對布林值求值,看它是否為“假“; 4.assertNull([String message],java.lang.Object object) 檢查物件是否為“空“; 5.assertNotNull([String message],java.lang.Object object) 檢查物件是否不為“空”; 6.assertSame([String message],expected,actual) 檢查兩個物件是否為同一例項; 7.assertNotSame([String message],expected,actual) 檢查兩個物件是否不為同一例項; 8. fail( String message ) 使測試立即失敗,其中 message 引數使可選的。這種斷言通常被用於標記某個不應該到達的分支(例如,在一個預期發生的異常之後) 一個TestCase測試例項 下面是一個數字功能類,它提供了求最大值函式和求最小值函式:
package com.zj.c01; public class NumberTool {     public static int getMax(int[] arr) {        int max = Integer.MIN_VALUE;         if (arr.length == 0)            throw new RuntimeException("Empty list");        for (int index = 0; index < arr.length; index++) {            if (arr[index] > max)               max = arr[index];        }        return max;     }     public static int getMin(int[] arr) {        int min = Integer.MAX_VALUE;        if (arr.length == 0)            throw new RuntimeException("Empty list");        for (int i = 0; i < arr.length; i++) {            if (arr[i] < min)               min = arr[i];        }        return min;     } }
下面針對求最大值函式編寫測試用例: 1.簡單測試:[7,8,9]->9; 2.位序測試:[9,8,7] ->9;[7,9,8] ->9;[8,7,9] ->9; 3.重複值測試:[9,7,9,8] ->9; 4.單值測試:[1]->1; 5.負值測試:[-7,-8,-9]->-7; 6.空值測試:[]->丟擲異常; 測試類NumberToolTest:
package com.zj.c01; import junit.framework.TestCase; public class NumberToolTest extends TestCase {     public NumberToolTest(String name) {        super(name);     }     public void testSimple() {        assertEquals(9, NumberTool.getMax(new int[] { 7, 8, 9 }));     }     public void testOrder() {        assertEquals(9, NumberTool.getMax(new int[] { 9, 8, 7 }));        assertEquals(9, NumberTool.getMax(new int[] { 7, 9, 8 }));        assertEquals(9, NumberTool.getMax(new int[] { 8, 7, 9 }));     }     public void testDups() {        assertEquals(9, NumberTool.getMax(new int[] { 9, 7, 9, 8 }));     }     public void testOne() {        assertEquals(1, NumberTool.getMax(new int[] { 1 }));     }     public void testNegitave() {        assertEquals(-7, NumberTool.getMax(new int[] { -7, -8, -9 }));     }     public void testEmpty() {        try {            NumberTool.getMax(new int[] {});            fail("Should have thrown an exception");        } catch (RuntimeException e) {            assertTrue(true);        }     } }
使用Eclipse-Run As JUnit Test JUnit和異常 對於測試而言,下面兩種異常是我們可能會感興趣的: 1.  從測試程式碼丟擲的可預測異常。 2.  由於某個模組(或程式碼)發生嚴重錯誤,而丟擲的不可預測異常。 任何對assertTrue(true)的使用都應該被翻譯為“我預期控制流程會達到這個地方”。通常而言,對於方法中每個被期望的異常,你都應該寫一個專門的測試來確認該方法在應該丟擲異常的時候確實會丟擲異常。如上例中testEmpty()測試方法的設計。 對於處於出乎意料的異常,你最好簡單的改變你的測試方法的宣告讓它能丟擲可能的異常。JUnit框架可以捕獲任何異常,並且把它報告為一個錯誤,這些都不需要你的參與。 Per-method的Setup和Tear-down 對於重複出現在各個單元測試中的執行環境,可以集中加以管理,可以在繼承TestCase之後,重新定義setUp()與tearDown()方法,將數個單元測試所需要的執行環境在setUp()中建立,並在tearDown()中銷燬。 JUnit的TestCase基類提供兩個方法供你改寫,分別用於環境的建立和清理: protected void setup(); protected void teardown(); 測試類MathToolTest2:
package com.zj.c01; import junit.framework.TestCase; public class NumberToolTest2 extends TestCase {     private int[] arr;     public NumberToolTest2(String name) {        super(name);     }     protected void setUp() throws Exception {        super.setUp();        arr = new int[] { -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5 };     }     protected void tearDown() throws Exception {        super.tearDown();        arr = null;     }     public void testMax() {        assertEquals(5, NumberTool.getMax(arr));     }     public void testMin() {        assertEquals(-5, NumberTool.getMin(arr));     } }
TestSuite 每一個定義好的TestCase,都使用TestRunner來執行測試,事實上TestRunner並不直接執行TestCase上的單元方法,而是通過TestSuite ,TestSuite可以將數個TestCase組合在一起。 在上面的例子中,並沒有看到任何的TestSuite,這是因為TestRunner的run()方法中會建立TestSuite:
static public void run(Class testClass) {     run(new TestSuite(testClass)); }
在這個TestSuite的建構式中,會使用反射自動找出testXXX()方法,並加入待執行的測試方法, TestRunner的run()方法中會去執行TestSuite上的run()方法,然後TestSuite會將之委託給TestCase上的 run()方法,而該run()方法中執行每一個testXXX()方法。 如果你只想執行某TestCase中的部分測試函式,則可自己構建TestSuite,下面的程式碼針對NumberToolTest中的兩個測試函式testSimple()和testNegitave()進行測試。
package com.zj.c02; import com.zj.c01.NumberToolTest; import junit.framework.Test; import junit.framework.TestSuite; public class PartTest {     public static Test suite() {        TestSuite suite = new TestSuite();        suite.addTest(new NumberToolTest("testSimple"));        suite.addTest(new NumberToolTest("testNegitave"));        return suite;     } }
使用Eclipse-Run As JUnit Test 你也可以組合多個testCase,下面的程式碼將MathToolTest和NumberToolTest集中到一個TestSuite中:
package com.zj.c02; import com.zj.c01.MathToolTest; import com.zj.c01.NumberToolTest; import junit.framework.Test; import junit.framework.TestSuite; public class CompositeTest {     public static Test suite() {        TestSuite suite = new TestSuite("Running all tests.");        suite.addTestSuite(MathToolTest.class);        suite.addTestSuite(NumberToolTest.class);        return suite;     } }
使用Eclipse-Run As JUnit Test Per-suite Setup和Tear-down 一般而言,你只須針對每個方法設定執行環境;但是在某些情況下,你須為整個test suite設定一些環境,以及在test suite中的所有方法都執行完成後做一些清理工作。要達到這種效果,你需要per-suite setup和per-suite teardown。 Per-suite的setup要複雜一些。你需要提供所需測試的一個suite(無論通過什麼樣的方式)並且把它包裝進一個TestSetup物件。注意你可以在同一個類中同時使用per-sutie和per-test的setup()和teardown。
package com.zj.c02; import junit.extensions.TestSetup; import junit.framework.Test; import junit.framework.TestSuite; import com.zj.c01.MathToolTest; import com.zj.c01.NumberToolTest; public class WrapperCompositeTest {     public static Test suite() {        TestSuite suite = new TestSuite("Running all tests with env.");        suite.addTestSuite(MathToolTest.class);        suite.addTestSuite(NumberToolTest.class);        TestSetup wrapper = new TestSetup(suite) {            protected void setUp() {               doSetUp();            }            protected void tearDown() {               doTearDown();            }        };        return wrapper;     }     public static void doSetUp() {        // initialization codes     }     public static void doTearDown() {        // release codes     } }
參考資料 [1]單元測試之道Java版——使用Junit, 電子工業出版社

相關推薦

JUnit測試框架使用介紹

JUnit是由 Erich Gamma 和 Kent Beck 編寫的一個迴歸測試框架(regression testing framework)。Junit測試是程式設計師測試,即白盒測試。該專案主頁:[url]http://www.junit.org/[/url] JUnit測試骨架 使用JUnit時

python pytest測試框架介紹五---日誌實時輸出

同樣的,在使用pytest進行自動化測試時,需要將實時日誌打印出來,而不是跑完後才在報告中出結果。 不過,好在pytest在3.3版本開始,就支援這一功能了,而不用再像nose一樣,再去裝第三方外掛。 網上也有相關實時的日誌輸入說明,但我嘗試後,不是我想要的,比如:pytest輸出Log  

easyrest自動化介面測試框架介紹

easyrest 介紹 easyrest 是一個由資料驅動自動化介面測試框架, 可以自動執行並生成報告。 自動化測試技術交流QQ群:31043004 程式碼地址:https://gitee.com/testdevops/easyrest 測試報告效果 軟體架構

JUnit - 測試框架

什麼是 Junit 測試框架? JUnit 是一個迴歸測試框架,被開發者用於實施對應用程式的單元測試,加快程式編制速度,同時提高編碼的質量。JUnit 測試框架能夠輕鬆完成以下任意兩種結合: Eclipse 整合開發環境 Ant 打包工具 Maven 專案構建管理 特性 JUnit

Java mocking 單元測試框架介紹

我需要在資料庫裡插入一些資料,基於這些真實的資料我才可以進行單元測試,而且每次都需要重複準備指令碼,還要考慮資料的清理。 我需要啟動一個Tomcat,然後通過Http Client傳送請求,然後觀察資料,才可以進行測試。 我需要啟動Dubbo服務的提供者,因

springmvc 專案新增 Junit 測試框架

建立一支測試父類 Service:import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframewo

JUnit測試框架使用(一)

public class CatTest { Cat cat; @Before public void before(){ System.out.println("before"); cat = new Cat(); } @Test public void testRun()

介面自動化測試框架介紹

測試框架結構:jenkins+git+postman+newman 相關概念: Jenkins 一個用Java編寫的開源的持續整合工具,提供了軟體開發的持續整合服務,可監控並觸發持續重複的工作,具有開源、支援多平臺和外掛擴充套件、安裝

Junit測試框架

JUnit是一個java語言的單元測試框架。 一、簡易JUnit測試方法 直接在方法前面加上標示 @Test ,對方法右鍵選擇run as->JUnit Test 即可(在eclipse開發

基於Java Junit測試框架 + jmeter 做壓力測試

use 技術 font user tps 選擇 導包 image org 1.JUnit 用戶指南請查閱: https://junit.org/junit5/docs/current/user-guide/ 以一下代碼為例:add接口 代碼測試正常後,導出包:

詳解介紹JUnit單元測試框架(完整版)

(一)JUnit介紹 目錄 2.例子 例子 例子 1.什麼是單元測試? 單元測試負責對最小的軟體設計單元(模組)進行驗證,根據軟體設計文件中

RobotFramework自動化測試框架-移動手機自動化測試AppiumLibrary介紹

request rri port wan dpa mage simulator mac uninstall 在使用AppiumLibrary庫時,需要預先安裝好Appium自動化工具,Appium官網地址為:http://appium.io/ Appium的GitHub地

[持續交付實踐] 基於 Junit 的接口自動化測試框架實現

lis ebo 命名 早已 更多 數據集 matcher 似的 相關 前言 這半個月基本都在出差以及各種公司業務上的事情,難得有空閑整理一些測試技術上的事情。周末有些空閑抓緊碼一篇填坑,持續交付/持續集成這一系列文章不僅僅是想在壇子裏和同行者做些分享,對個人的一種自我思考和

python nose測試框架全面介紹七--日誌相關

問題分析 odin message handlers 自己 file trac 配置 statement 引: 之前使用nose框架時,一直使用--logging-config的log文件來生成日誌,具體的log配置可見之前python nose測試框架全面介紹四。 但使用

JUnit提供測試框架的優勢(JUnit Provides Advantages as a Test Framework)

java類 內測 lac 通過 test 註意力 ont 服務器端 container 測試Java類的內部功能就是剛才你做的那些工作了。真正的測試和剛才的簡單例子的主要區別是代碼庫的大小和復雜度。在處理一大堆代碼時,你會需要收集情況報告。但上面的例子遇到第一個錯誤就停

python nose測試框架全面介紹八---接口測試中非法參數的斷言

mod get 自己的 strong div com 很多 with python 2 在測接口時,會有這樣的場景,輸入非法的參數,校驗返回的錯誤碼及錯誤內容 通常做法為發請求,將錯誤的返回結果拿出,再進行對比匹配;但存在一個問題,需要再寫錯誤返回分析函數,不能與之前正常發

自動化測試框架STAF介紹

bash get 快速 rbo 支持 keyword i386 ref 外部 STAF全稱是Software Testing Automation Framework,如其官網(http://staf.sourceforge.net/)所說,STAF是一個開源、跨平臺、支持

junit搭建自動化測試框架(一)

根據 TP 運行 郵箱 改善 技術 業務邏輯層 使用 日誌 這裏主要使用Junit搭建一個分層的自動化測試框架。這就是一個有業務邏輯的單元測試的思想。靈活性很大,對測試人員的代碼能力要求較高。 以登錄QQ郵箱為例,數據源使用了集合接口Map。借鑒了MVC的思想,也分為三層處

junit單元測試框架

一般我們寫程式碼總想對方法測試一下結果,就存在這些問題:   1.如果方法需要測試,都需要在main方法上呼叫   2.目前的結果都需要我們人工對比   所以就需要用到 junit 進行測試:   1·下載 junit 的jar包並匯入   2.在需要測試的方法上加 “@Test”,然後

python nose測試框架全面介紹十一---用例的發現

nose是怎麼發現用例的??網上一大把說函式以test開頭的都會自動發現,真的是這樣嗎???還是自己來試驗下吧  首先,我們還是來看看官方文件怎麼說的吧: If it looks like a test, it’s a test. Names of directories, modules