您好,登錄后才能下訂單哦!
人們在使用“單元測試”這個術語時比較隨意。這可能會導致困惑,特別是當人們開始聲稱他們的單元測試“花了很長的時間執行”時。為開發者測試定義一個常用詞匯表有助于將測試進行有效的分類,從而創建一個有效的CI系統,能夠執行快速的構建。
“單元測試”驗證軟件系統中所有小元素的行為,這些小元素通常都是一個類。但是有時候,單元測試和被測試的類之間的這種一對一的關系會被放大,因為一些被測試的類耦合程度較高。
代碼清單6-1展示了利用TestNG框架編寫的單元測試。TestNG是基于annotation的,因此@testng.test這樣Javadoc一樣的注釋出現在了startPatternTest方法中。通過Java1.4的assert語句,這個測試用例驗證了RegexPackageFilter類通過一個正則表達式模式正確地過濾了字符串。
代碼清單6-1 使用TestNG的隔離單元測試
public class RegexPackageFilterTestNG {
/**
* @testng.test
*/
public void starPatternTest() throws Exception{
Filter filter = new RegexPackageFilter("java.lang.*");
assert filter.applyFilter("java.lang.String"):
"filter returned false";
assert !filter.applyFilter("org.junit.TestCase"):
"filter returned true for org.junit.TestCase";
}
}
某些單元測試需要較少的外部依賴關系,這些依賴關系通常是其他的類。這些依賴的類本身比較簡單,沒有很復雜的類間關系。有時候,單元測試甚至使用模擬對象(mock),它們是一些簡單的對象,用于替換真實的、復雜的對象。如果依賴的對象本身確實依賴于外部的實體,如一個文件系統或數據庫,而這些外部對象又沒有虛擬化,測試就變成了組件測試(后面定義)。
代碼清單6-2展示了一個用Ruby寫的單元測試的例子,它驗證了一個過濾器的行為。這個測試仍然是一個單元測試,雖然它使用了兩個類,RegexFilter和SimpleFilter,因為它只使用了一個類型來驗證行為。
代碼清單6-2 使用Ruby的隔離單元測試
require "test/unit"
require "filters"
class FiltersTest < Test::Unit::TestCase
def test_regex
fltr = RegexFilter.new(/Google|Amazon/)
assert(fltr.apply_filter("Google"))
end
def test_simple
fltr = SimpleFilter.new("oo")
assert(fltr.apply_filter("google"))
end
def test_filters
fltrs = [SimpleFilter.new("oo"), RegexFilter.new(/Go+gle/)]
fltrs.each{ | fltr |
assert(fltr.apply_filter("I love to Gooogle on the Internet"))
}
end
end
單元測試的關鍵在于沒有外部的依賴關系,如數據庫。這些外部的依賴關系通常會使測試建立和執行的時間變長。單元測試可以在開發周期的早期創建并執行(例如第一天)。因為編碼和看到單元測試結果之間的時間很短,所以單元測試是一種有效的除錯方法。
圖書詳細信息:http://bvbroadview.blog.51cto.com/addblog.php
本文節選自《持續集成:軟件質量改進和風險降低之道》一書
[美]Paul M. Duvall (保羅.M. 杜瓦爾)Steve Matyas (史蒂夫.邁耶斯) Andrew Glover(安德魯.格洛弗) 著
王海鵬 譯
電子工業出版社出版
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。