±à¼ÍƼö: |
±¾ÎÄÀ´×Ôcsdn£¬±¾ÎÄÖ÷Òª¼òµ¥½éÉÜÁËʲØïÊÇgtestÖ®ºó,ѧϰgtestµÄһЩʹÓùæÔò£¬Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£
|
|
Ò»¡¢Ê²ØïÊÇgtest
gtestÊÇÒ»¸ö¿çƽ̨µÄ(Liunx¡¢Mac OS X¡¢Windows
¡¢Cygwin ¡¢Windows CE and Symbian ) C++µ¥Ôª²âÊÔ¿ò¼Ü£¬ÓÉgoogle¹«Ë¾·¢²¼¡£gtestÊÇΪÔÚ²»Í¬Æ½Ì¨ÉÏΪ±àдC++²âÊÔ¶øÉú³ÉµÄ¡£ËüÌṩÁ˷ḻµÄ¶ÏÑÔ¡¢ÖÂÃüºÍ·ÇÖÂÃüÅжϡ¢²ÎÊý»¯¡¢¡±ËÀÍö²âÊÔ¡±µÈµÈ¡£
Á˽âÁËʲØïÊÇgtestÖ®ºóÏÂÃæÈÃÎÒÃÇÀ´Ñ§Ï°gtestµÄһЩʹÓùæÔò°É£¡
Ò»¡¢gtestϵÁÐÖ®TESTºê
TEST(test_case_name,
test_name)
TEST_F(test_fixture,test_name) //¶à¸ö²âÊÔ³¡¾°ÐèÒªÏàͬÊý¾ÝÅäÖõÄÇé¿ö£¬ÓÃTEST_F¡£TEST_F
test fixture£¬²âÊԼоߣ¬²âÊÔÌ×£¬³Ðµ£ÁËÒ»¸ö×¢²áµÄ¹¦ÄÜ¡£ |
TEST(test_case_name, test_name)
TEST_F(test_fixture,test_name) //¶à¸ö²âÊÔ³¡¾°ÐèÒªÏàͬÊý¾ÝÅäÖõÄÇé¿ö£¬ÓÃ
TEST_F ¡£TEST_F test fixture£¬²âÊԼоߣ¬²âÊÔÌ×£¬³Ðµ£ÁËÒ»¸ö×¢²áµÄ¹¦ÄÜ¡£
TESTºêµÄ×÷ÓÃÊÇ´´½¨Ò»¸ö¼òµ¥²âÊÔ£¬Ëü¶¨ÒåÁËÒ»¸ö²âÊÔº¯Êý£¬ÔÚÕâ¸öº¯ÊýÀï¿ÉÒÔʹÓÃÈκÎC++´úÂ벢ʹÓÃÌṩµÄ¶ÏÑÔÀ´½øÐмì²é¡£ºóÐøÎÄÕ»¹»áÌáµ½TEST_PÕâ¸öºê£¬ÔÚÕâÀï¾ÍÏȲ»½éÉÜÁË¡£
¶þ¡¢gtestϵÁÐÖ®¶ÏÑÔ
gtestÖжÏÑԵĺê¿ÉÒÔ·ÖΪÁ½ÀࣺһÀàÊÇASSERTºê£¬ÁíÒ»Àà¾ÍÊÇEXPECTºêÁË¡£
1¡¢ASSERT_ϵÁУºÈç¹ûµ±Ç°µã¼ì²âʧ°ÜÔòÍ˳öµ±Ç°º¯Êý
2¡¢EXPECT_ϵÁУºÈç¹ûµ±Ç°µã¼ì²âʧ°ÜÔò¼ÌÐøÍùÏÂÖ´ÐÐ
Èç¹ûÄã¶Ô×Ô¶¯Êä³öµÄ´íÎóÐÅÏ¢²»ÂúÒâµÄ»°£¬Ò²ÊÇ¿ÉÒÔͨ¹ýoperator<<Äܹ»ÔÚʧ°ÜµÄʱºò´òÓ¡ÈÕÖ¾£¬½«Ò»Ð©×Ô¶¨ÒåµÄÐÅÏ¢Êä³ö¡£
ASSERT_ϵÁУº
boolÖµ¼ì²é
1¡¢ ASSERT_TRUE(²ÎÊý)£¬ÆÚ´ý½á¹ûÊÇtrue
2¡¢ASSERT_FALSE(²ÎÊý)£¬ÆÚ´ý½á¹ûÊÇfalse
ÊýÖµÐÍÊý¾Ý¼ì²é
3¡¢ASSERT_EQ(²ÎÊý1£¬²ÎÊý2)£¬´«ÈëµÄÊÇÐèÒª±È½ÏµÄÁ½¸öÊý
equal
4¡¢ASSERT_NE(²ÎÊý1£¬²ÎÊý2)£¬not equal£¬²»µÈÓڲŷµ»Øtrue
5¡¢ASSERT_LT(²ÎÊý1£¬²ÎÊý2)£¬less than£¬Ð¡Óڲŷµ»Øtrue
6¡¢ASSERT_GT(²ÎÊý1£¬²ÎÊý2)£¬greater than£¬´óÓڲŷµ»Øtrue
7¡¢ASSERT_LE(²ÎÊý1£¬²ÎÊý2)£¬less equal£¬Ð¡ÓÚµÈÓڲŷµ»Øtrue
8¡¢ASSERT_GE(²ÎÊý1£¬²ÎÊý2)£¬greater equal£¬´óÓÚµÈÓڲŷµ»Øtrue
×Ö·û´®¼ì²é
9¡¢ASSERT_STREQ(expected_str, actual_str)£¬Á½¸öC·ç¸ñµÄ×Ö·û´®ÏàµÈ²ÅÕýÈ··µ»Ø
10¡¢ASSERT_STRNE(str1, str2)£¬Á½¸öC·ç¸ñµÄ×Ö·û´®²»ÏàµÈʱ²ÅÕýÈ··µ»Ø
11¡¢ASSERT_STRCASEEQ(expected_str,
actual_str)
12¡¢ASSERT_STRCASENE(str1, str2)
13¡¢EXPECT_ϵÁУ¬Ò²ÊǾßÓÐÀàËÆµÄºê½á¹¹µÄ
ÏÂÃæÎÒÃÇÀ´×öÒ»¸ö²âÊÔ£¬ÊµÏÖÒ»¸öÇó¾ø¶ÔÖµµÄº¯Êý£¬²¢ÔÚTESTºêÀïÃæÊ¹ÓÃASSERTÀ´½øÐвâÊÔ²»Í¬ÀàÐ͵ÄÊý¾Ý¡£
#include<iostream>
using namespace std;
#include<gtest/gtest.h>
int Abs(int x)
{
return x > 0 ? x : -x;
}
TEST(IsAbsTest,HandlerTrueReturn)
{
ASSERT_TRUE(Abs(1) == 1) << "Abs(1)=1";
//ASSERT_TRUEÆÚ´ý½á¹ûÊÇtrue,operator<<Êä³öһЩ×Ô¶¨ÒåµÄÐÅÏ¢
ASSERT_TRUE(Abs(-1) == 1) << "Abs(-1)=1";
ASSERT_FALSE(Abs(-2) == -2); //ÆÚ´ý½á¹ûÊÇfalse
ASSERT_EQ(Abs(1),Abs(-1));
ASSERT_NE(Abs(-1),0);
ASSERT_LT(Abs(-1),2);
ASSERT_GT(Abs(-1),0);
ASSERT_LE(Abs(-1),2);
ASSERT_GE(Abs(-1),0);
} |
1¡¢ÕýÈ·²âÊÔ

2¡¢½«µÚÒ»ÌõÓï¾äд³É£º ASSERT_FALSE(Abs(1) ==
1) << ¡°Abs(1)=1¡±£¬´ËʱÔٴβâÊԾͻá´òÓ¡³ö×Ô¶¨ÒåµÄ³ö´íÐÅÏ¢ÁË¡£

Èý¡¢gtestϵÁÐ֮ʼþ»úÖÆ
¡°Ê¼þ¡± ±¾ÖÊÊÇ¿ò¼Ü¸øÄãÌṩÁËÒ»¸ö»ú»á, ÈÃÄãÄÜÔÚÕâÑùµÄ¼¸¸ö»ú»áÀ´Ö´ÐÐÄã×Ô¼º¶¨ÖƵĴúÂë, À´¸ø²âÊÔÓÃÀý×¼±¸/ÇåÀíÊý¾Ý¡£gtestÌṩÁ˶àÖÖʼþ»úÖÆ£¬×ܽáÒ»ÏÂgtestµÄʼþÒ»¹²ÓÐÈýÖÖ£º
1¡¢TestSuiteʼþ
ÐèҪдһ¸öÀ࣬¼Ì³Ðtesting::Test£¬È»ºóʵÏÖÁ½¸ö¾²Ì¬·½·¨£ºSetUpTestCase
·½·¨ÔÚµÚÒ»¸öTestCase֮ǰִÐУ»TearDownTestCase·½·¨ÔÚ×îºóÒ»¸öTestCaseÖ®ºóÖ´ÐС£
2¡¢TestCaseʼþ
ÊǹÒÔÚÿ¸ö°¸ÀýÖ´ÐÐǰºóµÄ£¬ÐèҪʵÏÖµÄÊÇSetUp·½·¨ºÍTearDown·½·¨¡£SetUp·½·¨ÔÚÿ¸öTestCase֮ǰִÐУ»TearDown·½·¨ÔÚÿ¸öTestCaseÖ®ºóÖ´ÐС£
3¡¢È«¾Öʼþ
ҪʵÏÖÈ«¾Öʼþ£¬±ØÐëдһ¸öÀ࣬¼Ì³Ðtesting::EnvironmentÀ࣬ʵÏÖÀïÃæµÄSetUpºÍTearDown·½·¨¡£SetUp·½·¨ÔÚËùÓа¸ÀýÖ´ÐÐǰִÐУ»TearDown·½·¨ÔÚËùÓа¸ÀýÖ´ÐкóÖ´ÐС£
ÀýÈçÈ«¾Öʼþ¿ÉÒÔ°´ÕÕÏÂÁз½Ê½À´Ê¹Óãº
³ýÁËÒª¼Ì³Ðtesting::EnvironmentÀ࣬»¹Òª¶¨ÒåÒ»¸ö¸ÃÈ«¾Ö»·¾³µÄÒ»¸ö¶ÔÏó²¢½«¸Ã¶ÔÏóÌí¼Óµ½È«¾Ö»·¾³²âÊÔÖÐÈ¥¡£

ÏÂÃæÎÒÃÇÔÙÀ´×öÒ»¸ö²âÊÔʵÀý£¬²âÊÔMapµÄfind()ºÍsize()º¯Êý²¢Í¨¹ý¼Ì³Ðtesting::TestÀ´ÊµÏÖ¡£
´ËʱµÄTESTºê±ØÐëд³ÉTEST_F£¬¶øÇÒËüµÄµÚÒ»¸ö²ÎÊý±ØÐëÓëÀàÃûÒ»Ö£¬
TEST_F test fixture£¬²âÊԼоߣ¬²âÊÔÌ×£¬³Ðµ£ÁËÒ»¸ö×¢²áµÄ¹¦ÄÜ¡£
´úÂëʵÏÖÈçÏ£º
class TestMap:public
testing::Test
{
public:
//Ìí¼ÓÈÕÖ¾
static void SetUpTestCase()
{
cout<<"SetUpTestCase"<<endl;
}
static void TearDownTestCase()
{
cout<<"TearDownTestCase"<<endl;
}
virtual void SetUp() //TESTÅÜ֮ǰ»áÖ´ÐÐSetUp
{
cout<<"SetUp"<<endl;
test_map.insert(make_pair(1,0));
test_map.insert(make_pair(2,1));
test_map.insert(make_pair(3,2));
test_map.insert(make_pair(4,3));
test_map.insert(make_pair(5,4));
}
virtual void TearDown() //TESTÅÜÍêÖ®ºó»áÖ´ÐÐTearDown
{
cout<<"TearDown"<<endl;
test_map.clear();
}
map<int,int> test_map;
};
TEST_F(TestMap,Find) //´ËʱʹÓõÄÊÇTEST_Fºê
{
map<int,int>::iterator it=test_map.find(1);
ASSERT_NE(it,test_map.end());
}
TEST_F(TestMap,Size)
{
ASSERT_EQ(test_map.size(),5);
}
int main(int argc,char *argv[])
{
testing::InitGoogleTest(&argc, argv);//½«ÃüÁîÐвÎÊý´«µÝ¸øgtest
return RUN_ALL_TESTS(); //RUN_ALL_TESTS()ÔËÐÐËùÓвâÊÔ°¸Àý
} |
ËÄ¡¢gtestϵÁÐÖ®ËÀÍö²âÊÔ
ÕâÀïµÄ¡±ËÀÍö¡±Ö¸µÄÊdzÌÐòµÄ±¼À£¡£Í¨³£ÔÚ²âÊԵĹý³ÌÖУ¬ÎÒÃÇÐèÒª¿¼ÂǸ÷ÖÖ¸÷ÑùµÄÊäÈ룬ÓеÄÊäÈë¿ÉÄÜÖ±½Óµ¼Ö³ÌÐò±¼À££¬Õâ¸öʱºòÎÒÃǾÍÒª¼ì²é³ÌÐòÊÇ·ñ°´ÕÕÔ¤ÆÚµÄ·½Ê½¹Òµô£¬ÕâÒ²¾ÍÊÇËùνµÄ¡±ËÀÍö²âÊÔ¡±¡£
ËÀÍö²âÊÔËùÓõ½µÄºê£º
1¡¢ASSERT_DEATH(²ÎÊý1£¬²ÎÊý2)£¬³ÌÐò¹ÒÁ˲¢ÇÒ´íÎóÐÅÏ¢ºÍ²ÎÊý2Æ¥Å䣬´ËʱÈÏΪ²âÊÔͨ¹ý¡£Èç¹û²ÎÊý2Ϊ¿Õ×Ö·û´®£¬ÔòÖ»ÐèÒª¿´³ÌÐò¹Òû¹Ò¼´¿É¡£
2¡¢ASSERT_EXIT(²ÎÊý1£¬²ÎÊý2£¬²ÎÊý3)£¬Óï¾äÍ£Ö¹²¢ÇÒ´íÎóÐÅÏ¢ºÍ±»Ìáǰ¸øµÄÐÅϢƥÅä¡£
ÏÂÃæÎÒÃÇÔÙÀ´×öÒ»¸ö²âÊÔʵÀý£¬²âÊÔµ±³ÌÐò³öÎÊÌâʱºòËÀÍö²âÊÔÈçºÎʹÓã¿

Îå¡¢Ò»¸ö¹ØÓÚgtestµÄ¼òµ¥Àý×Ó
#include<iostream>
using namespace std;
#include<gtest/gtest.h>
struct LinkNode
{
int _data;
LinkNode *_next;
LinkNode(const int& data)
:_data(data)
,_next(NULL)
{}
};
class Link
{
public:
Link()
:pHead(new LinkNode(0))
{}
void PushBack(const int& data)
{
if(pHead == NULL)
return ;
LinkNode *newNode=new LinkNode(data);
if(pHead->_next == NULL){ //µÚÒ»´Î²åÈë½áµã
pHead->_next=newNode;
}
else{ //ÕÒµ½×îºóÒ»¸ö½áµãÖ±½Óβ²å
LinkNode *cur=pHead->_next;
while(cur->_next){
cur=cur->_next;
}
cur->_next=newNode;
}
}
void PopBack()
{
if(pHead == NULL)
return ;
LinkNode *cur=pHead;
LinkNode *prev=NULL;
while(cur->_next)
{
prev=cur;
cur=cur->_next;
}
prev->_next=NULL;
delete cur;
}
LinkNode *FindNode(const int& data)
{
if(pHead == NULL)
return NULL;
LinkNode *cur=pHead->_next;
while(cur)
{
if(cur->_data == data)
return cur;
cur=cur->_next;
}
return NULL;
}
bool Delete(int data)
{
LinkNode *pos=FindNode(data);
if(pos == NULL)
return false;
LinkNode *cur=pHead->_next;
while(cur->_next != pos)
{
cur=cur->_next;
}
cur->_next=pos->_next;
delete pos;
return true;
}
void Destroy()
{
if(pHead == NULL)
return;
LinkNode *cur=pHead->_next;
while(cur)
{
LinkNode *del=cur;
cur=cur->_next;
delete del;
del=NULL;
}
delete pHead; //ɾ³ýÍ·½áµã
}
LinkNode *pHead;
};
class TestLink:public testing::Test
{
public:
virtual void SetUp()
{
cout<<"SetUp"<<endl;
for(int i=1;i<=5;i++){
link.PushBack(i);
}
}
virtual void TearDown()
{
cout<<"TearDown"<<endl;
link.Destroy();
}
Link link;
};
TEST_F(TestLink,PushBack)
{
ASSERT_FALSE(link.pHead == NULL);
link.PushBack(9);
LinkNode *res=link.FindNode(9);
ASSERT_FALSE(res == NULL);
}
TEST_F(TestLink,PopBack)
{
for(int i=1;i<=5;i++){
link.PopBack();
}
}
TEST_F(TestLink,FindNode)
{
ASSERT_TRUE(link.FindNode(3));
ASSERT_TRUE(link.FindNode(2));
ASSERT_TRUE(link.FindNode(4));
ASSERT_TRUE(link.FindNode(5));
ASSERT_TRUE(link.FindNode(1));
ASSERT_FALSE(link.FindNode(7));
}
TEST_F(TestLink,Delete)
{
ASSERT_FALSE(link.pHead == NULL);
ASSERT_TRUE(link.Delete(3) == true);
ASSERT_TRUE(link.Delete(9) == false);
} int main(int argc,char *argv[])
{
testing::InitGoogleTest(&argc,argv);
return RUN_ALL_TESTS();
} |
ÒÔÉϲâÊÔÓÃÀý¶¼ÊÇÔÚLinuxϵͳϲâÊԵ쬶ÁÕßÐè×ÔÐÐÔÚLinuxϰ²×°gtest¡£
|