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

編寫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架構即可。

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

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