1. 程式人生 > ><VS2017> 編寫VC++單元測試 -(一)新建單元測試工程

<VS2017> 編寫VC++單元測試 -(一)新建單元測試工程

pre 菜單 運行 soft 官方 turn sof 自動 平臺

開發人員自己編寫單元測試是一個非常好的習慣。單元測試不但能夠驗證自己所編寫的代碼是否存在問題,避免提交給測試人員時才發現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架構即可。

到這裏,關於使用單元測試工程的基本內容就講完了,如果想有更深一步的了解,可以參考MSDN官方文檔。

下一次,我將講一下如何創建工程內部的單元測試(不使用單獨的project)。

<VS2017> 編寫VC++單元測試 -(一)新建單元測試工程