安裝
項(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ù)
- SetUp和TearDown, 在每個(gè)測(cè)試用例調(diào)用前和調(diào)用后執(zhí)行
- 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)即可