編寫VC++單元測試 -(一)新建單元測試工程
開發人員自己編寫單元測試是一個非常好的習慣。單元測試不但能夠驗證自己所編寫的程式碼是否存在問題,避擴音交給測試人員時才發現bug,也可以為將來改動程式碼的人提供驗證程式碼功能正確性的途徑。在我有限的工作生涯中並未寫過太多單元測試,所以我在這方面亦存在諸多不足,所述如果有紕漏,還望各位讀者不吝指點。
單獨的單元測試工程一般是為了測試暴露給外部程式呼叫的介面,這樣可以保證呼叫者(單元測試程式)和被呼叫者(介面)的分離。不過有些時候,我們也要給工程的內部關鍵方法寫一些單元測試,這個時候就需要將測試用例寫在工程內部。首先我們先來學習一下如何建立一個單元測試工程。
1. 準備工作
我們先建立一個動態連結庫工程,並準備好一個匯出函式。關於如何建立動態連結庫我就不贅述了,我們匯出的函式如下:
int getOddCount(int number) { int nCount = 0; for (int i = 1; i <= number; i++) { if (i % 2 != 0) { nCount++; } } return nCount; }
這個函式的功能是,給定一個整數,返回1到這個整數範圍內的所有偶數的個數。
為了配合單元測試,請保證這個動態連結庫工程能夠正常生成dll和對應的lib檔案,並提供匯出函式對應的標頭檔案。
2. 建立單元測試工程
在Solution中單擊右鍵,建立新的單元測試工程。這裡我們選擇Native Unit Test Project.
工程名字可以隨便寫,暫時用預設的就可以。
工程建立完成夠,整個solution的結構應該如下圖所示:
其中在 unittest1.cpp 中是自動生成的單元測試模板。
3. 配置單元測試工程
為了能夠讓單元測試工程和我們建立的動態連結庫工程關聯上,我們需要做如下配置。
首先,讓單元測試工程引用動態連結庫工程。
然後再將動態連結庫的程式碼路徑加入到單元測試的Include Directories。
4. 編寫單元測試程式碼
我們先簡單看一下unittest1.cpp這部分程式碼。
namespace UnitTest1 { TEST_CLASS(UnitTest1) { public: TEST_METHOD(TestMethod1) { // TODO: Your test code here } }; }
namespace UnitTest1 :
這個名稱空間名字可以改,但是建議和檔名一致,這樣方便以後看程式碼
TEST_CLASS(UnitTest1) :
這個巨集設定單元測試的類的名稱,單元測試的名字也儘量要可讀。需要注意的是這是class的名字,需要符合class的命名規範
TEST_METHOD(TestMethod1) :
要測試的方法,名字也可以隨便起,但是最好要和要測試的方法保持一致。比如要測試的方法叫做method,那麼測試方法就叫TestMethod。
在編寫測試程式碼時和正常編碼並沒有什麼不同。單元測試的主要思想是通過給定輸入以及預期的輸出,來判斷方法實現是否有問題。比如要測試一個求和函式,輸入為1和2,那麼預期輸出是3。如果呼叫方法之後得到的結果不是3,那麼這個測試用例就會失敗,單元測試結果則為失敗。
具體到我們這個測試,參照如下程式碼,輸入引數是10,那麼我們應該得到的結果是5,因為1到10之間共有5個偶數。
(注意,不要忘記在unittest1.cpp中include動態連結庫的標頭檔案)
TEST_METHOD(TestMethod1) { Assert::AreEqual(getOddCount(10), 5); }
在單元測試中,需要使用Assert這個類中的方法對結果進行判斷,這樣測試結果才會正確的反饋到IDE中。上面的程式碼中用到的是AreEqual方法,用於判斷預期結果與方法呼叫後的結果是否相同。
Assert類中有很多用於測試的方法,除了相等還有不等,真假等等,也有讓測試強制失敗的方法,可以根據具體的情況是使用。
測試程式碼寫完後,我們編譯整個solution或者編譯單元測試project,如果編譯沒有問題的話,就可以開始測試了。
5. 執行單元測試
在上一步中,如果沒有編譯問題的話,我們就可以在Test Explorer中看到現在所有的單元測試。注意,如果更新了單元測試程式碼,需要對project重新進行編譯。通過選單中的 Test->Windows->Test Explorer可以開啟Test Explorer。
在Test Explorer中點選Run All就會開始執行所有的單元測試。稍等一會,如果測試通過,就會有如下圖顯示:
這綠色看著真舒服(?)。那麼如果測試未通過呢?
讓我們再修改一下我們的程式碼,讓我們的getOddCount函式產生一點小小的錯誤…
int getOddCount(int number) { int nCount = 0; for (int i = 2 i <= number; i++) { if (i % 2 != 0) { nCount++; } } return nCount; }
重新編譯整個 solution 之後,再次重新執行所有的單元測試 …
啊...多麼醒目的紅色...
雙擊失敗的單元測試,我們可以快速定位到出錯的地方。
6. 可能遇到的錯誤
如果使用的時x64平臺,可以會因為單元測試工程和目標工程的平臺(x86和x64)不一致導致執行時錯誤,錯誤提示如下:
Make sure that test discoverer & executors are registered and platform & framework version settings are appropriate and try again.
這個時候只要通過選單Test -> Test Settings -> Default Processor Architecture調整單元測試使用的CPU架構即可。
到這裡,關於使用單元測試工程的基本內容就講完了,如果想有更深一步的瞭解,可以參考 ofollow,noindex">MSDN官方文件 。
下一次,我將講一下如何建立工程內部的單元測試(不使用單獨的project)。