看到有一句話說:單元測試是根,是基本。
如果你是一個對單元測試懵懵懂懂的小白,那么很好,接下來你可以考慮繼續看看這篇我花了三天的時間認真用心總結出來的文章了,但是如果你是一個技術大神,希望您看完這篇文章后給我提出寶貴的建議,也可以盡情吐槽我的無知啦。
目錄
1. 我所理解的單元測試——為什么要寫單元測試?
2. 開發工具 艱難坎坷的新嘗試——vs2017
3. 眾多單元測試工具該如何選擇——很頭疼
4. 單元測試的好處——判斷好的單元測試的標准
5. 寫在最后——越學習發現自己會的越少
我相信應該會有一部分人跟我一樣,以前會聽過大家在說“單元測試”這個詞,但是一直都沒有真正弄懂什么是單元測試吧,以前可能聽說過可以寫test.h加到cpp中,但是每次一修改就要更換測試。這兩天我也百度了一些資料,發現很多都是直接講單元測試的好處,之后就開始寫代碼和例子,我看的一塌糊塗,究根結底,為什么一個測試要寫這么多代碼呢?
1.官方解釋與我所理解的單元測試
首先我們百度一下單元測試的含義,總結一下:單元測試就是開發者編寫的一小段代碼,對軟件中的最小可測試單元進行檢查和驗證,看這個很小的、很明確的功能是否正確。那這個最小可測試單元是什么?這要根據實際情況去判定其具體含義,如C語言中單元指一個函數,Java里單元指一個類等等。詳情指路百度百科。
教你如何寫單元測試的書有很多,但是為什么要寫單元測試呢?這個知乎帖子中 coolhappya答主的回答讓我豁然開朗。
如果不願意細看,可以看下我在這里簡單總結的我所理解的單元測試:
代碼的終極目標有兩個,第一個是實現需求,第二個是提高代碼質量和可維護性。
單元測試是為了提高代碼質量和可維護性,是實現代碼的第二個目標的一種方法。
那什么時候需要寫單元測試呢?舉幾個例子:
1.假設你的第一個程序是Hello World,任何一個語言實現這個程序都只需要不到5行代碼。這個程序需要單元測試嗎?
答:這個時候讓你去寫單元測試,你會覺得那純粹是浪費時間,更改功能是輕而易舉的事情。
2.給學校開發一個圖書管理系統,可能會有1000行,這個系統需要單元測試嗎?
答:需求你可以滿足,代碼也能很好地被模塊化,每個功能的更改似乎也沒有那么大麻煩。似乎寫單元測試要浪費額外的功夫,而且也沒感覺到有多少好處,那就看心情吧,可寫可不寫。
3.如果讓你為一家大的電商公司做一個庫存管理系統,總代碼達到了驚人的20000行。
答:如果這個復雜系統是由1950個函數和方法組成,想要確定系統整體沒有BUG,就等同於確定組成這個系統的1950個函數和方法沒有BUG。而單元測試就是做這個事情的,顯而易見,如果你寫了單元測試,並且每個函數都通過了,這個系統起碼在代碼角度就是沒有BUG的。
從絕對的角度說,單元測試很重要,但是,從相對的角度來講,小的代碼量會讓單元測試顯得不那么重要,所以很多人感受不到單元測試的重要性,也可能的確不用寫單元測試。但是在大多數的時候,單元測試對已有代碼的威力簡直可怕。
所以是否要寫單元測試這個問題顯然有了答案了。
2. 開發工具 艱難坎坷的新嘗試——vs2017
在選擇開發工具這里我糾結了一下,因為之前在安卓移動開發課上安裝過Eclipse,接觸過一點Java語言,老師在這里也給出了一篇關於Java語言的單元測試框架Junit的具體使用安裝方法。這篇文章將 Junit的使用步驟、demo的測試和完善也已經一步一步詳細地給出了,大家可以看一下。因為我本身對於Java語言學的不深,再者可能想要嘗試一些新事物,所以綜合一下,我這次決定自己挑戰一下針對C#或C++語言的開發工具Visual Studio。
決定了我的選擇之后我便興致滿滿、摩拳擦掌。接下來一個又一個困難讓我無語凝噎。
首先是安裝,這個軟件特別的大,想要使用的人需要有耐心等待下載和安裝過程了。附上安裝教程。
Visual studio之前想安裝2015版的,但是去官網看現在已經是2017的新版了,而且還是可以免費下載,下載下來注冊一個微軟賬號,然后在visual studio installer中選擇你想要安裝的工具。這些教程中都有,注意安裝的時候選一個地方大一些的盤就可以了,過程比較慢,需要耐心等待。
附幾張我安裝時的圖片:




安裝成功就可以新建項目了,C++和C#等都可以和以前的軟件一樣使用了。如果有不會用的話再放一個使用VS2017編寫C++程序的教程鏈接使用VS2017編寫C++程序的教程鏈接。
3.令人眼花繚亂 多種多樣的單元測試選擇
由於老師已經給出了Junit工具的使用方法,而我安裝的又是vs2017,所以接下來的就是尋找單元測試工具了。這兩天我也簡單地了解了一下,對於C++語言來說,經典的單元測試框架有很多,如GoogleTest, cppunit之類,但是在我了解的過程中,發現這些框架需要很多時間去學習,需要花很多時間和精力去學習使用,即使是一個非常非常小的項目,也要配置半天。
- 比如cppunit, 它就是xUnit的成員之一。講到這里,xUnit的成員有很多,如JUnit,NUnit,PythonUnit,HtmlUnit,HttpUnit等。CppUnit就是一個專門面向C++的單元測試框架。但是我發現網上的文章講的大多都是在VC6環境下配置的,這就又是一個大難題了,我只好放棄這個測試工具。放個鏈接,有需要的可以看看。
- 至於Gtest的話,看了一下這個鏈接覺得如果短短這兩天時間可能還是學不會,我也拋棄了它。
- 在鄒欣老師構建之法第2章的內容中,這里也有寫到了用VSTS寫單元測試。
- 還有一個新興的單元測試框架:Catch 。據說特別簡單,它簡單到什么程度?只需要引入一個頭文件即可,非常簡單輕巧,把這兩個簡短的教程1和教程2看一遍,基本就掌握了
關於我安裝的vs2017,查閱資料發現有可以進行單元測試的第三方插件,這真的是讓我開心的事情了。vs提供了一個擴展插件工具市場,里面有許多第三方的插件,我使用了最經典XUnit 單元測試框架——Nunit。這里選擇Nuint3版本,比較新,支持2017。需要下載三個插件,分別是Nunit3測試適配器、Nunit 3測試模塊、Nunit 3 擴展,用這些可以直接生成單元測試。其中的步驟可以按照這個鏈接——Visual Studio 2017優雅單元測試來做。
還有這個鏈接 ,是教你如何在Visual Studio 2017 上對 C++ 進行單元測試。
在實踐過程中我還遇到了一個問題,就是右鍵想要測試的類發現並沒有創建單元測試這一個選項,這個問題該如何解決呢,這里我百度了一下發現可能是右鍵創建單元測試功能被隱藏了,如果你也出現了這個問題,可以按照這個文章所說的打開創建單元測試功能。再之后就很順利的創建測試項目和單元測試文件了。這里也放兩張我的過程截圖吧。




4.單元測試的好處?評價一個好的單元測試的標准
- 單元測試使工作完成的更輕松
- 單元測試使你的設計更好
- 可以大大減少花在調試上的時間
- 能幫助你更好的理解代碼。
鄒欣老師構建之法的第2章內容中講過有關評價好的單元測試的標准,我覺得寫的特別全面,大家可以認真了解一下。
我認為,單元測試確實是好東西,但是,能夠進行單元測試的代碼,首先必須要面向對象足夠強,才能夠很好的進行單元測試。其次,如果面對復雜的邏輯編寫的單元測試,當需求改變時,不僅需要修改代碼,還要修改單元測試代碼,這就需要同時維護兩套代碼,工作量巨大,那么單元測試是否需要寫呢,我還是很疑惑。或許框架性的代碼,是最適合做單元測試的,價值很高,覆蓋率也高。
5.寫在最后——越學習發現自己會的越少
第一次寫這種博客真的十分燒腦,一個對於單元測試完全小白的我用了三天多的時間查閱了各種資料,從認知了解單元測試是什么,到如何找到適合的單元測試工具,如何使用它等各個方面,寫下了這份說明書,希望能給其他小白們提供一點幫助。不得不說在這個過程中我成長了很多,以前對於知識總是很隨意,這次就想仔細研究,雖然累但是很舒服,對於單元測試這個小領域也算是有了一丁點兒的了解,以后有時間還會繼續學習,爭取再把這篇博客完善一下。可能我寫的會有欠缺的地方,希望眾大神們能夠提出寶貴的建議,多多包容啦,謝謝。
再送給自己和大家一句話:
自學如果缺乏恆心,專業知識就無法得到鞏固。
