C 單元測試

2021-08-01 07:53:03 字數 2176 閱讀 2851

單元測試,或者更大一些的自動化測試,對提高軟體質量是有很大幫助的。通過一系列預先設計的規則,就可以覆蓋大量的測試點。尤其是對重構一類的任務,確保修改前後系統行為不變很重要,而修改後的回歸測試工作量又極其繁重,此時單元測試,或者自動化測試就能體現出無以倫比的效率。

我在2023年學python不久,就鬱悶於自己那點**手工測試很麻煩,恰好那時得知了很多python工程師有做單元測試的習慣,於是就學習了一下,果然效果卓群。後來又經過數年整理出自己的一套單元測試的規範。

我做過的各類python專案,**總量的50%左右是單元測試。經過這個級別的單元測試覆蓋,確保了底層函式基本不會出錯,這樣高層功能的除錯才更方便。同時也是這個覆蓋程度確保了,被測試工程師發現bug的可能性已經很低了。

我給自己的單元測試設定了5個級別:

1. level1:正常流程可用,即乙個函式在輸入正確的引數時,會有正確的輸出

2. level2:異常流程可丟擲邏輯異常,即輸入引數有誤時,不能丟擲系統異常,而是用自己定義的邏輯異常通知上層呼叫**其錯誤之處

3. level3:極端情況和邊界資料可用,對輸入引數的邊界情況也要單獨測試,確保輸出是正確有效的

4. level4:所有分支、迴圈的邏輯走通,不能有任何流程是測試不到的

5. level5:輸出資料的所有字段驗證,對有複雜資料結構的輸出,確保每個欄位都是正確的

如上的單元測試分級是我2023年整理出來的,後來在我做的各種專案中,一般只做到level2,重要系統或者底層服務,要做到level3或level4。而很少做到level5。即便如此,就已經實現了如上所說的,很難被測試工程師發現bug。

除了級別外,測試方法也要區分不同系統的玩法。比如基於web的系統,就需要確保單元測試裡可以模擬傳送請求,這個一般是web框架提供支援的。比如我常用的web.py、flask、django都有支援。不僅僅可以模擬簡單的請求,還可以模擬post、cookie等。另外一般建議單獨寫個函式來模擬登入過程,這樣系統登入後行為的測試就不必反覆模擬登入了。

單元測試一大痛苦是構造測試資料。我的看法是測試資料應該是人造的,而不是隨便從產品環境dump出來乙份。只有人造的資料能確保環境可控,每次執行不會因為環境改變而頻繁修改testcase。我的常用玩法是測試資料分為基礎資料和附加資料兩部分。基礎資料是所有testcase共享的,比如建立幾個常用角色的使用者等等。附加資料是testcase內部自己建立的。這樣每次testcase執行時,先清空資料庫,匯入基礎資料,匯入附加資料,然後執行測試,驗證結果。

各類程式的函式可以分為純函式和***函式。純函式對應的是數學裡函式的概念,輸出和輸入是一一對應的。對乙個輸入有確定的輸出。比如1+1=2。而***函式則相反,同樣的輸入,在不同時間和環境裡,可能有不同的輸出。比如任何涉及io、網路、資料庫的。***函式的測試比純函式麻煩的多,因為你必須要完整的構造其所依賴的所有環境,才能夠復現乙個***函式的行為。也正因為如此,***函式出bug的概率比純函式高的多。理解這個概念以後,應該盡可能的把程式裡的純函式和***函式進行拆解,降低***函式的比例和邏輯複雜度。還有,***函式是會傳染的,乙個函式如果呼叫了***函式,那麼它也會變成***函式。

肯定有人會給你推薦一些經典的單元測試框架,如googletest, cppunit 之類。

但我負責任的告訴你,那些框架太折騰了,你需要花很多時間和精力去學習使用,然後即使是乙個非常非常小的專案,也要配置半天。

推薦給你乙個新興的單元測試框架:catch

它簡單到什麼程度?你只需要引入乙個標頭檔案:

#include

"catch.hpp"

另外,它因為非常簡單輕巧,所以很容易學習,把這個簡短的教程看一遍,基本就掌握了。

為了更直觀的了解這個框架,貼出教程上的乙個例子:

#define catch_config_main  // this tells catch to provide a main() - only do this in one cpp file

#include

"catch.hpp"

unsigned

intfactorial

( unsigned

int number )

test_case( "factorials are computed", "[factorial]" )

這就是測試乙個斐波那契函式的全過程。感覺如何?

使用vs2012內建的c++測試架構進行單元測試 

c 單元測試

資料庫單元測試 1.資料庫設計 person id int,主鍵 username password age 2.新建乙個專案 2.1.定義person類 public class person set public string username set public string passwor...

C 單元測試

學歷代表你的過去,能力代表你的現在,學習代表你的將來 十年河東,十年河西,莫欺少年窮 學無止境,精益求精 廢話咱也不多說,直接進入正題 首先說說單元測試的好處 今天說說c 的單元測試特點 1 單元測試的類名用 testclass 標註 2 單元測試的方法名用 testmethod 標註 3 單元測試...

單元測試 單元測試文章收藏

前言 前段時間公司計畫做自動化測試,自己也打算圍繞幾個點做相關調研,現在想想呢?其實對自動化測試的概念都還不是十分清晰,當時主要還是圍繞 單元測試 向qa小夥伴學習了一段時間,現由於公司重組,學習中斷,這裡簡單記錄一些單元測試好文,留待後續參考.什麼叫自動化測試?自動化測試覆蓋率?覆蓋率如何做到的?...