gtest

安裝

項(xiàng)目地址: https://github.com/google/googletest

git clone https://github.com/google/googletest
cd googletest/googletest
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local
make
sudo make install

其中-DCMAKE_INSTALL_PREFIX指定的是安裝目錄,這里安裝到了/usr/local目錄,后續(xù)編譯測(cè)試代碼均使用此目錄下的gtest庫(kù)

使用

檢查結(jié)果

檢查結(jié)果可用EXPECT_ASSERT_兩組宏,前者如果驗(yàn)證失敗會(huì)繼續(xù)執(zhí)行,后者會(huì)退出當(dāng)前測(cè)試用例,但仍舊會(huì)執(zhí)行后續(xù)的測(cè)試用例,兩組宏的使用方式完全一致,下面列出EXPECT_宏的使用方式

EXPECT_TRUE(condition);
EXPECT_FALSE(condition);
EXPECT_EQ(val1,val2);
EXPECT_NE(val1,val2);
EXPECT_LT(val1,val2);
EXPECT_LE(val1,val2);
EXPECT_GT(val1,val2);
EXPECT_GE(val1,val2);
EXPECT_STREQ(str1,str_2);
EXPECT_STRNE(str1,str2);
EXPECT_STRCASEEQ(str1,str2);
EXPECT_STRCASENE(str1,str2);

顧名思義,就不多解釋了

簡(jiǎn)單用例

使用TEST宏,每個(gè)宏定義一個(gè)測(cè)試用例,宏的兩個(gè)參數(shù)分別代表測(cè)試類名和測(cè)試名,可隨意定義

// filename: test1.cpp
#include "gtest/gtest.h"

int Add(int x, int y)
{
    return x + y;
}

TEST(TestClass, TestName1)
{
    EXPECT_EQ(2, Add(1, 1)) << "Add error";
}

TEST(TestClass, TestName2)
{
    ASSERT_NE(3, Add(2, 3));
}

int main(int argc, char** argv)
{
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

EXPECT_EQ(2, Add(1, 1)) << "Add error";表示在EXPECT_EQ宏比較失敗時(shí)會(huì)打印后面的錯(cuò)誤信息

編譯

g++ test1.cpp -I/usr/local/include -L/usr/local/lib -lgtest -lpthread -o test1

注意編譯時(shí)需指定pthread庫(kù)

運(yùn)行

./test1 -h 查看參數(shù)說(shuō)明
./test1 --gtest_list_tests 查看用例
./test1 運(yùn)行所有用例
./test1 --gtest_filter=TestClass.Testname1 運(yùn)行指定用例
./test1 --gtest_filter='TestClass.*' 使用通配符
./test1 --gtest_filter=-TestClass.Testname1 排除指定用例

共享成員變量

使用TEST_F宏,宏參數(shù)含義和TEST一樣,區(qū)別是第一個(gè)參數(shù)必須是已定義的類,每個(gè)類對(duì)應(yīng)一組測(cè)試用例,可以選擇定義如下幾組函數(shù)

  1. SetUp和TearDown, 在每個(gè)測(cè)試用例調(diào)用前和調(diào)用后執(zhí)行
  2. SetUpTestCase和TearDownTestCase,在每組測(cè)試用例調(diào)用前和調(diào)用后執(zhí)行,必須為static void類型

亦可定義成員變量在該組例間共享,以上定義都必須是public或protected類型

#include <stdio.h>
#include <vector>
#include "gtest/gtest.h"

using std::vector;

class TestFixture : public testing::Test
{
protected:
    static void SetUpTestCase()
    {
        printf("SetUpTestCase\n");
    }
    // static void TearDownTestCase() {}
    virtual void SetUp()
    {
        v1_.push_back(1);
        printf("SetUp\n");
    }
    //virtual void TearDown() {}

    vector<int> v1_;
    vector<int> v2_;
};

TEST_F(TestFixture, TestName1)
{
    EXPECT_EQ(1, v1_.size()) << "v1_.size() error";
}

TEST_F(TestFixture, TestName2)
{
    EXPECT_EQ(0, v2_.size());
}

int main(int argc, char** argv)
{
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

全局事件

全局事件可以在所有測(cè)試用例運(yùn)行前后執(zhí)行

#include <stdio.h>
#include "gtest/gtest.h"
using std::vector;

class FooEnvironment : public testing::Environment
{
public:
    virtual void SetUp()
    {
        printf("Foo FooEnvironment SetUp\n");
    }
    virtual void TearDown()
    {
        printf("Foo FooEnvironment TearDown\n");
    }
};

class TestFixture : public testing::Test
{
protected:
    static void SetUpTestCase()
    {
        printf("SetUpTestCase\n");
    }
    // static void TearDownTestCase() {}
    virtual void SetUp()
    {
        v1_.push_back(1);
        printf("SetUp\n");
    }
    //virtual void TearDown() {}

    vector<int> v1_;
    vector<int> v2_;
};

TEST_F(TestFixture, TestName1)
{
    EXPECT_EQ(1, v1_.size()) << "v1_.size() error";
}

TEST_F(TestFixture, TestName2)
{
    EXPECT_EQ(0, v2_.size());
}

TEST(TestClass, TestName1)
{
    EXPECT_EQ(1, 1);
}

int main(int argc, char** argv)
{
    testing::AddGlobalTestEnvironment(new FooEnvironment);
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

定義一個(gè)類FooEnvironment繼承自testing::Environment,并定義SetUp和TeawDown成員函數(shù)函數(shù),在main函數(shù)里調(diào)用testing::AddGlobalTestEnvironment(new FooEnvironment)即可

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,695評(píng)論 19 139
  • 本文參考 CoderZh的技術(shù)博客gtest官方文檔 1. 最簡(jiǎn)單的測(cè)試 以下代碼來(lái)源于gtest的示例代碼 sa...
    記憶悔中行閱讀 6,352評(píng)論 0 2
  • 5/17/2017 10:46:37 AM Google Test Source Code Learning Ex...
    JiShi閱讀 797評(píng)論 0 1
  • 1.gtest測(cè)試C++中的函數(shù) 文件samp1.h //samp1.h #ifndef SAMP1_H #def...
    一木之夏閱讀 1,358評(píng)論 0 0
  • Xcode下使用gtest 編譯gest 下載gest代碼 進(jìn)到目錄:googletest-master/goog...
    龍翱天際閱讀 3,656評(píng)論 0 0

友情鏈接更多精彩內(nèi)容