Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
gtestµÄ½éÉܺÍʹÓÃ
 
  43084  次浏览      27
 2019-5-6
 
±à¼­ÍƼö:

±¾ÎÄÀ´×Ô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¡£

   
43084 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

΢·þÎñ²âÊÔÖ®µ¥Ôª²âÊÔ
һƪͼÎÄ´øÄãÁ˽â°×ºÐ²âÊÔÓÃÀýÉè¼Æ·½·¨
È«ÃæµÄÖÊÁ¿±£ÕÏÌåϵ֮»Ø¹é²âÊÔ²ßÂÔ
È˹¤ÖÇÄÜ×Ô¶¯»¯²âÊÔ̽Ë÷
Ïà¹ØÎĵµ

×Ô¶¯»¯½Ó¿Ú²âÊÔʵ¼ù֮·
jenkins³ÖÐø¼¯³É²âÊÔ
ÐÔÄܲâÊÔÕï¶Ï·ÖÎöÓëÓÅ»¯
ÐÔÄܲâÊÔʵÀý
Ïà¹Ø¿Î³Ì

³ÖÐø¼¯³É²âÊÔ×î¼Ñʵ¼ù
×Ô¶¯»¯²âÊÔÌåϵ½¨ÉèÓë×î¼Ñʵ¼ù
²âÊԼܹ¹µÄ¹¹½¨ÓëÓ¦ÓÃʵ¼ù
DevOpsʱ´úµÄ²âÊÔ¼¼ÊõÓë×î¼Ñʵ¼ù