玩轉Google開源C++單元測試架構Google Test系列(gtest)之一 – 初識gtest

來源:互聯網
上載者:User
一、前言

本篇將介紹一些gtest的基本使用,包括下載,安裝,編譯,建立我們第一個測試Demo工程,以及編寫一個最簡單的測試案例。

二、下載

如果不記得網址, 直接在google裡搜gtest,第一個就是。目前gtest的最新版本為1.3.0,從下列地址可以下載到該最新版本:

http://googletest.googlecode.com/files/gtest-1.3.0.zip 

http://googletest.googlecode.com/files/gtest-1.3.0.tar.gz 

http://googletest.googlecode.com/files/gtest-1.3.0.tar.bz2 

三、編譯

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

 

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

這裡要提醒一下的是,如果你升級為VS2008的工程,那麼你的測試Demo最好也是VS2008工程,不然你會發現很鬱悶,你的Demo怎麼也編不過,我也曾折騰了好久,當時我升級為了VS2008工程,結果我使用VS2005工程建Demo,死活編不過。(這裡有人誤解了,並不是說只能在VS2008中編譯,在VS2005中同樣可以。如果要編譯VS2005版本,最好保證gtest和你的測試工程都使用VS2005工程。)

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

四、第一個Demo

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

1.設定gtest標頭檔路徑

2.設定gtest.lib路徑

3.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,一切就緒了,我們直接運行案例試試(一片綠色,非常爽):

    五、總結

    本篇內容確實是非常的初級,目的是讓從來沒有接觸過gtest的同學瞭解gtest最基本的使用。gtest還有很多更進階的使用方法,我們將會在後面討論。總結本篇的內容的話:

        1. 使用VS編譯gtest.lib檔案

        2. 設定測試工程的屬性(標頭檔,lib檔案,/MT參數(和編譯gtest時使用一樣的參數就行了))

        3. 使用TEST宏開始一個測試案例,使用EXPECT_*,ASSER_*系列設定檢查點。

        4. 在Main函數中初始化環境,再使用RUN_ALL_TEST()宏運行測試案例。

      優點:

          1. 我們的測試案例本身就是一個exe工程,編譯之後可以直接運行,非常的方便。

          2. 編寫測試案例變的非常簡單(使用一些簡單的宏如TEST),讓我們將更多精力花在案例的設計和編寫上。

          3. 提供了強大豐富的斷言的宏,用於對各種不同檢查點的檢查。

          4. 提高了豐富的命令列參數對案例運行進行一系列的設定。

      系列連結:

      1.玩轉Google開源C++單元測試架構Google Test系列(gtest)之一 - 初識gtest

      2.玩轉Google開源C++單元測試架構Google Test系列(gtest)之二 - 斷言

      3.玩轉Google開源C++單元測試架構Google Test系列(gtest)之三 - 事件機制

      4.玩轉Google開源C++單元測試架構Google Test系列(gtest)之四 - 參數化

      5.玩轉Google開源C++單元測試架構Google Test系列(gtest)之五 - 死亡測試

      6.玩轉Google開源C++單元測試架構Google Test系列(gtest)之六 - 運行參數

      7.玩轉Google開源C++單元測試架構Google Test系列(gtest)之七 - 深入解析gtest

      8.玩轉Google開源C++單元測試架構Google Test系列(gtest)之八 - 打造自己的單元測試架構

       

        相關文章

        聯繫我們

        該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

        如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

        A Free Trial That Lets You Build Big!

        Start building with 50+ products and up to 12 months usage for Elastic Compute Service

        • Sales Support

          1 on 1 presale consultation

        • After-Sales Support

          24/7 Technical Support 6 Free Tickets per Quarter Faster Response

        • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.