單元測試實踐的主要問題與解決(5)

(承上篇)

3.2  如何解決“做不了”

    
上面我們只是用一個獨立的函數來演示ETDD過程。在實際的工作中,代碼之間通常是互相依賴的,這種依賴關係會造成測試難於進行,這就是“做不了”的問題。

    我們首先來分析一下。“做不了”主要是指可測性問題。可測性問題的核心是內部輸入。在解釋內部輸入前,我們先來看一下一般的輸入:外部輸入。

    外部輸入是指在被測代碼的外部可以設定的輸入,包括參數、成員變量、全局變量。外部輸入一般可以直接設定。
    
    單元測試的核心難點在於內部輸入,什麼是內部輸入呢?
    像下面這個例子,這兩個數據,都是在被測試代碼的內部,通過調用關聯代碼來取得,也就是內部取得的數據。對於內部取得的數據,代碼要如何處理呢?跟參數一樣,也是分類處理。因此,測試時也要分類檢測,這就是內部輸入。
     
    內部輸入有六種情形,我們利用工具都可以處理。
    
    解決內部輸入的主要方法有打樁、模擬對象、底層模擬。
    先來介紹打樁。樁就是代替真實代碼的一些代碼。樁的功能主要有隔離、補齊和控制。可以通過編寫樁代碼,來解決內部輸入問題。這是樁的控制功能。
    
    用打樁來解決內部輸入,有一些問題:一是編寫樁代碼增加了工作量;二是內部輸入和外部輸入分離,難於管理;三是隻能解決部分內部輸入問題。例如,要在一個用例中多次調用同一關聯函數,要求每次輸出不同,樁代碼就很難做到。
    

    解決內部輸入的另一個方法是模擬對象,這個比較複雜,另外,對於C和C++也不太適用。我們可以採用底層模擬來解決內部輸入問題。

    底層模擬有三個特點:一是內部輸入與外部輸入一起管理;二是不需要考慮關聯代碼的狀態,無所關聯代碼是否存在,是否隔離,都可以直接使用;三是不需要編寫代碼。

    下面我也用一個案例來講解一下底層模擬。這個示例,是一個空調控制程序。

    代碼的功能,是首先取得環境的溫度,然後與預設的目標溫度比較,計算出溫度差,溫度每差一度,製冷器運行60秒。
    
    首先,我們設定外部數據。假設,預設的目標溫度是25度,是這個全局變量,設爲25。返回值爲1,表示操作成功。假設環境溫度是28度,那麼,製冷器應該運行180秒,這裏填180。然後執行測試。
    
    由於環境溫度還沒有設定,測試進行不下去。環境溫度由這個函數來取得。即使這個函數可以正常工作,取到的環境溫度也不可能滿足我們的測試需求。我們可以用底層模擬來解決。
    


(未完待續)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章