1. 程式人生 > >Google開源C++ 單元測試框架Google Test系列(gtest)之初始gtest

Google開源C++ 單元測試框架Google Test系列(gtest)之初始gtest

 

 

下載

          最新原始碼地址:https://github.com/google/googletest

          V1.3和V1.7地址:https://download.csdn.net/download/lengyuezuixue/10744697

 

編譯

         下載解壓後,裡面有個msvc目錄:

       使用VS的同學可以直接開啟msvc裡面的工程檔案, 如果你在使用的是高於VS2010的版本,開啟後會提示你升級,升完級後,我們直接編譯裡面的“gtest”工程,可以直接編過的。

       這裡要提醒一下的是,如果你升級為VS2017的工程,那麼你的測試Demo最好也是VS2017工程,不然你會發現很鬱悶,你的Demo怎麼也編不過,我也曾折騰了好久,當時我升級為了VS2017工程,結果我使用VS2013工程建Demo,死活編不過。

      編譯之後,在msvc裡面的Debug或是Release目錄裡看到編譯出來的gtestd.lib或是gtest.lib檔案。

 

第一個Demo

      下面我們開始建立我們的第一個Demo了,假如之前使用的VS2017編譯的gtest,那麼,我們在VS2017中,新建一個Win32 Console Application。接著就是設定工程屬性,總結如下:

設定gtest標頭檔案路徑

設定gtest.lib路徑

Runtime Library設定

        如果是Release版本,Runtime Library設為/MT。當然,其實你也可以選擇動態連結(/MD),前提是你之前編譯的gtest也使用了同樣是/MD選項。

       工程設定後了後,我們來編寫一個最簡單測試案例試試,我們先來寫一個被測試函式:

int Foo(int a, int b)
{
    if (a == 0 || b == 0){

        throw "don't do that";
    }

    int c = a % b;
    if (c == 0)
        return b;

    return Foo(b, c);
}

       沒錯,上面的函式是用來求最大公約數的。下面我們就來編寫一個簡單的測試案例。

#include <gtest/gtest.h>


TEST(FooTest, HandleNoneZeroInput)
{
    EXPECT_EQ(2, Foo(4, 10));
    EXPECT_EQ(6, Foo(30, 18));
}

      上面可以看到,編寫一個測試案例是多麼的簡單。 我們使用了TEST這個巨集,它有兩個引數,官方的對這兩個引數的解釋為:[TestCaseName,TestName],而我對這兩個引數的定義是:[TestSuiteName,TestCaseName],在下一篇我們再來看為什麼這樣定義。

        對檢查點的檢查,我們上面使用到了EXPECT_EQ這個巨集,這個巨集用來比較兩個數字是否相等。Google還包裝了一系列EXPECT_* 和ASSERT_*的巨集,而EXPECT系列和ASSERT系列的區別是:

    1. EXPECT_*  失敗時,案例繼續往下執行。

    2. ASSERT_* 失敗時,直接在當前函式中返回,當前函式中ASSERT_*後面的語句將不會執行。 

     在下一篇,我們再來具體討論這些斷言巨集。為了讓我們的案例執行起來,我們還需要在main函式中新增如下程式碼:

int _tmain(int argc, _TCHAR* argv[])
{
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

         “testing::InitGoogleTest(&argc, argv);” :gtest的測試案例允許接收一系列的命令列引數,因此,我們將命令列引數傳遞給gtest,進行一些初始化操作。gtest的命令列引數非常豐富,在後面我們也會詳細瞭解到。

         “RUN_ALL_TESTS()” :執行所有測試案例

          OK,一切就緒了,我們直接執行案例試試(一片綠色,非常爽):