2011-06-08 62 views
8

我對單元測試有點困惑。我看到了諸如自動化測試之類的東西的價值。我認爲一個好例子可能是幫助我理解的最好方式。可以說我有一個二進制搜索功能,我想單元測試。請解釋單元測試

現在在測試中,我想知道的東西,如:進行搜索找到的第一個元素,最後一個元素,以及其他元素?搜索是否正確比較unicode字符。搜索是否處理符號和其他「痛苦」字符。單元測試會覆蓋這個,還是我錯過了?你將如何爲我的二分查找編寫單元測試?

function search(collection, value){ 
var start = 0, end = collection.length - 1, mid; 
while (start <= end) { 
    mid = start + ((end - start)/2); 
    if (value == collection[mid]) 
    return mid; 
    if (collection[mid] < value) 
    end = mid - 1; 
    else 
     start = mid + 1; 
} 
return mid; 
} 

單元測試的僞代碼很可愛。

所以,我們可能有:

function testFirst(){ 
var collection = ['a','b','c','x','y','z'],first = 'a', findex = 0; 
assert(seach(collection,first),findex); 
} 
function testLast(){ 
var collection = ['a','b','c','x','y','z'], last = 'z', lindex = 5; 
assert(seach(collection,last),lindex); 
} 

回答

2

你對單元測試的期望是正確的;它非常重要的是驗證和驗證預期的行爲。

我認爲很多人錯過單元測試的一個價值是它的價值隨着時間的推移而增加。當我編寫一段代碼並編寫一個單元測試時,我基本上只是測試了代碼做了我認爲應該做的事情,它並沒有以我選擇檢查的任何方式失敗,等等。事情,但它們的價值有限,因爲它們表達了當時對系統的知識;他們不能幫助你處理你不知道的事情(我的算法中有一個偷偷摸摸的錯誤,我不知道,也沒有想過去測試?)。

單元測試的真正價值,在我看來,是他們獲得了時間的價值。這個值有兩種形式;文檔值和驗證值。

文檔值是單元測試說:「這是什麼代碼的作者期望這段代碼做」的價值。很難誇大這類事情的價值;當你參與一個有大量不完整的遺留代碼的項目時,讓我告訴你,這種文檔價值就像是一個奇蹟。

另一個值是驗證的值;隨着代碼在項目中的生存,事物會被重構,改變和轉移。單元測試提供了驗證,認爲您以某種方式工作的組件繼續以這種方式工作。這對於幫助發現潛伏在項目中的錯誤非常重要。例如,更改數據庫解決方案有時可能是透明的,但有時,這些更改可能會導致某些事情發生意外的變化;對依賴於您的ORM的組件進行單元測試可以捕捉潛在行爲中的關鍵細微變化。如果您有一段時間能夠完美工作多年的代碼,並且沒有人認爲它在失敗中扮演着潛在角色,那麼這真的很有用。這些類型的錯誤可能需要很長時間才能找到,因爲您要查看的最後一個位置在很長一段時間內已經非常穩定的組件中。單元測試提供了對「Rock Solidity」的驗證。

3

不,你不會錯過它,這就是單元測試的目的是告訴你。通過測試好的和壞的輸入,邊緣情況等,你有正確的想法。你需要對每個條件進行一次測試。測試將設立任何先決條件,然後斷言,你的計算(或任何可能)與您的期望

2

是的,僅此而已。您提出的每個問題都可以用作測試。將單元測試視爲三個步驟。設置一些先決條件,運行一些「正在測試」的代碼,並編寫一個可以記錄您的期望的斷言。

在你的情況下,設立「集」與一些特定值(或沒有值)是設置了先決條件。

使用特定參數調用您的搜索方法正在運行測試中的代碼。

檢查您的方法返回的值是否符合您期望的是斷言步驟。

給這三樣東西的名稱,描述你正在嘗試做的(DoesTheSearchMethodFailIfCollectionIsEmpty),瞧你有一個單元測試。