熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

探索JUnit 4.4 新特性[1]

2013-11-23 20:48:00  來源: Java開源技術 

  文通過理論分析和詳細例子向讀者闡述 JUnit 所帶來的最新特性讀者通過本文的學習可以輕松掌握使用 JUnit 的新特性

  隨著當前 Java 開發的越發成熟Agile 和 TDD 的越發流行自動化測試的呼聲也越來越高若想將單元測試變得自動化自然 JUnit 這把利器必不可少這也是 JUnit 自 年誕生以來在 Java 開發業界一直相當流行的原因

  JUnit 是針對 Java 語言的一個單元測試框架它被認為是迄今為止所開發的最重要的第三方 Java 庫 JUnit 的優點是整個測試過程無需人的參與無需分析和判斷最終測試結果是否正確而且可以很容易地一次性運行多個測試 JUnit 的出現促進了測試的盛行它使得 Java 代碼更健壯更可靠Bug 比以前更少

  JUnit 自從問世以來一直在不停的推出新版本目前最新的版本是 月發布的 JUnit 它是繼 JUnit 以來最大的發行版提供了很多有用的新特性本文將假設讀者已經具有 JUnit 的使用經驗

  JUnit 概述

  JUnit 設計的目的就是有效地抓住編程人員寫代碼的意圖然後快速檢查他們的代碼是否與他們的意圖相匹配 JUnit 發展至今版本不停的翻新但是所有版本都一致致力於解決一個問題那就是如何發現編程人員的代碼意圖並且如何使得編程人員更加容易地表達他們的代碼意圖JUnit 也是為了如何能夠更好的達到這個目的而出現的

  JUnit 主要提供了以下三個大方面的新特性來更好的抓住編程人員的代碼意圖

  提供了新的斷言語法(Assertion syntax)——assertThat

  提供了假設機制(Assumption)

  提供了理論機制(Theory)

  新的斷言語法(Assertion syntax)—— assertThat

  JUnit 學習 JMock引入了 Hamcrest 匹配機制使得程序員在編寫單元測試的 assert 語句時可以具有更強的可讀性而且也更加靈活

  Hamcrest 是一個測試的框架它提供了一套通用的匹配符 Matcher靈活使用這些匹配符定義的規則程序員可以更加精確的表達自己的測試思想指定所想設定的測試條件比如有時候定義的測試數據范圍太精確往往是若干個固定的確定值這時會導致測試非常脆弱因為接下來的測試數據只要稍稍有變化就可能導致測試失敗(比如 assertEquals( x 只能判斷 x 是否等於 如果 x 不等於 測試失敗)有時候指定的測試數據范圍又不夠太精確這時有可能會造成某些本該會導致測試不通過的數據仍然會通過接下來的測試這樣就會降低測試的價值 Hamcrest 的出現給程序員編寫測試用例提供了一套規則和方法使用其可以更加精確的表達程序員所期望的測試的行為(具體 Hamcrest 的使用請參閱 參考資料)

  JUnit 結合 Hamcrest 提供了一個全新的斷言語法——assertThat程序員可以只使用 assertThat 一個斷言語句結合 Hamcrest 提供的匹配符就可以表達全部的測試思想

  assertThat 的基本語法如下

  清單 assertThat 基本語法

assertThat( [value] [matcher statement] );

  value 是接下來想要測試的變量值 matcher statement 是使用 Hamcrest 匹配符來表達的對前面變量所期望的值的聲明如果 value 值與 matcher statement 所表達的期望值相符則測試成功否則測試失敗

  assertThat 的優點

  優點 以前 JUnit 提供了很多的 assertion 語句assertEqualsassertNotSameassertFalseassertTrueassertNotNullassertNull 等現在有了 JUnit 一條 assertThat 即可以替代所有的 assertion 語句這樣可以在所有的單元測試中只使用一個斷言方法使得編寫測試用例變得簡單代碼風格變得統一測試代碼也更容易維護

  優點 assertThat 使用了 Hamcrest 的 Matcher 匹配符用戶可以使用匹配符規定的匹配准則精確的指定一些想設定滿足的條件具有很強的易讀性而且使用起來更加靈活如清單 所示

  清單使用匹配符 Matcher 和不使用之間的比較

// 想判斷某個字符串 s 是否含有子字符串 developerWorks 中間的一個
// JUnit 以前的版本assertTrue(sindexOf(developer)>||sindexOf(Works)> );
// JUnit
assertThat(s anyOf(containsString(developer) containsString(Works)));
// 匹配符 anyOf 表示任何一個條件滿足則成立類似於邏輯或 || 匹配符 containsString 表示是否含有參數子
// 字符串文章接下來會對匹配符進行具體介紹

[]  []  []  []  []  []  []  []  


From:http://tw.wingwit.com/Article/program/Java/ky/201311/29105.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.