C C 單元測試理論精要(六)

2021-08-25 04:12:27 字數 1615 閱讀 7915

2.1 可測性問題詳解(2)

接下來我們討論重點問題:覆蓋輸入。乙個函式,輸入會有哪些呢?輸入包括兩方面:外部輸入,內部輸入。外部輸入容易理解,就是函式外部可以設定的輸入,包括引數,全域性變數,成員變數。

關鍵是內部輸入。因為很少有文獻討論內部輸入,對很多人來說,內部輸入可能是乙個陌生的詞,我們首先來看看內部輸入是什麼。乙個函式,對於呼叫底層函式獲得的資料,是如何處理的呢?跟引數一樣,也是分類處理。所以,測試時也要分類檢測,這與引數沒什麼區別。這就是內部輸入。

內部輸入有幾種情形?一共有六種:自然輸入、不可控、失真、難於初始化、靜態輸入,中斷輸入。

自然輸入

自然輸入就是呼叫底層函式的實際**,獲得自然的計算結果。底層函式必須存在,可控,並且正確。對於自然輸入,測試時並不是什麼也不用做。為了檢測程式是否對底層函式的各種可能輸出做合適的判斷和處理,需要讓底層函式輸出合適的資料,這就要通過設定合適的引數等資料來間接控制底層函式的輸出。有時候,這個工作是很困難的,這就是難以初始化,後面有專門介紹。

不可控

底層函式還是呼叫實際**,但是底層函式的輸出不符合測試需求。在這個例子中,底層函式的功能是取得環境溫度,我們要檢測程式是否對各種環境溫度做了合適的處理,但是真實的環境溫度不可能實時大幅變化,這就是不可控。不可控在單元測試當中是相當常見的,例如底層函式返回乙個隨機數、也是不可控,底層函式是用來連線網路的,可能無法控制它的各種狀態,這些都是不可控。

失真

底層函式呼叫的是樁**。樁**當然不能實現原有**的功能,這就是失真。這個例子跟介紹不可控是同乙個函式,不同的是,底層函式呼叫的是樁**,一般的樁**是什麼也不做的,底層函式的返回值總是0,並且未輸出環境溫度,測試做不下去。失真是打樁造成的,是打樁的必然結果。可不可以通過修改樁**來解決失真呢?有時候是可以的,有時候不行,後面會有進一步的介紹。

剛才我們討論了失真。

難於初始化

在談到自然輸入時,我們討論過,為了使底層函式產生需要的測試輸出,需合設定合適的外部輸入,即通過設定外部輸入的方式來初始化底層函式,很多時候,這個工作是很困難的,例如,要使圓的面積等於100.00,半徑應該是多少?再如,為了使乙個對映表在搜尋某個物件時能返回真,需要預先建立該物件並加入表中,很簡單的乙個輸出,卻需要比較麻煩的初始化。實際工作中比這些例子更難的多得是。這些就是難於初始化。

靜態輸入

區域性靜態變數在c**中,尤其是嵌入式**中相當常用。區域性靜態變數與全域性變數一樣,通常每個用例也需要設定不同初值。但在外部卻無法訪問,這也是一種內部輸入。

中斷輸入

中斷輸入常見於嵌入式專案。如果在被測程式執行過程中,系統有可能產生中斷,中斷可能呼叫某些**,並且可能造成全域性變數的修改,而且這種修改又會影響程式的功能邏輯,那麼,這也是一種內部輸入,測試時也必須考慮。

前面介紹了內部輸入的六種情形,除了自然輸入外,其他五種都是必須解決的。

如果解決可測性問題呢?前面說過,試圖通過改進開發流程來解決可測性是不現實的。通過對可測性問題的具體分析,我想大家也已經了解,無論怎樣改進開發流程,最多只能解決一小部分問題。例如內部輸入問題,多數都不是因為**寫得不夠好形成的。我們只能通過改進測試技術,使用合適的工具來解決。

C C 單元測試理論精要(二)

1.2 單元測試的目標和方法 單元測試的目標是什麼呢?就是完整檢測 單元的功能邏輯。找出 單元本身的所有功能邏輯錯誤,具體來說,就是檢測對資料的各種分類是否考慮全面,處理是否正確。單元測試並不是用來代替系統測試 效能測試的,它的目標相當明確,就是檢測 單元本身的功能邏輯錯誤。如果時間緊張,應該優先測...

C C 單元測試理論精要(四)

題外篇 單元測試難於長期堅持的原因與解決 我以前主要關注如何做得了 做得快 做得好,幾乎沒有單獨考慮長期堅持的問題,原因大概是 對我自己來說,這不是問題,我已經做了十年的單元測試,這十年,我寫 時基本上都是一邊寫一邊測試。那麼,是什麼原因讓我長期進行單元測試呢?這十年分為兩個階段,後六年專門研究單元...

單元測試 理論篇

測試是軟體開發的重要環節之一。按照軟體開發的過程測試可分為 單元測試 整合測試 系統測試 域測試 field test 等。我們這裡將討論面向程式設計師的單元測試。本文首先介紹單元測試的定義,為什麼要使用單元測試?單元測試能給我們帶來的好處。之後我們將介紹單 元測試的範疇,最後將討論很多朋友不寫單元...