gtest Test_F 和Test 区别

一般来说简单的测试用TEST

简单测试TEST
Cpp代码
#include <gtest/gtest.h>  
int Factorial( int n )  
{  
  if(n==2) return 100; //故意出个错,嘻嘻  
  return n<=0? 1 : n*Factorial(n - 1);  

//用TEST做简单测试  
TEST(TestFactorial, ZeroInput) //第一个参数是测试用例名,第二个参数是测试名:随后的测试结果将以"测试用例名.测试名"的形式给出  
{  
   EXPECT_EQ(1, Factorial(0));  //EXPECT_EQ稍候再说,现在只要知道它是测试两个数据是否相等的就行了。  
}  
 
TEST(TestFactorial, OtherInput)  
{  
   EXPECT_EQ(1, Factorial(1));  
   EXPECT_EQ(2, Factorial(2));  
   EXPECT_EQ(6, Factorial(3));  
   EXPECT_EQ(40320, Factorial(8));  
}  
 

主函数:

int main(int argc, char* argv[])  
{  
   testing::InitGoogleTest(&argc,argv); //用来处理Test相关的命令行开关,如果不关注也可不加  
   RUN_ALL_TESTS();  //看函数名就知道干啥了  
       std::cin.get();   //只是让它暂停而已,不然一闪就没了  
      return 0;  
}

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

多个测试场景需要相同数据配置的情况,用TEST_FCpp代码
//用TEST_F做同配置的系列测试  
typedef std::basic_string<TCHAR> tstring;  
struct FooTest : testing::Test {  
  //这里定义要测试的东东  
   tstring strExe;  
  //可以利用构造、析构来初始化一些参数  
   FooTest() {}  
  virtual ~FooTest() {}  
 
//如果构造、析构还不能满足你,还有下面两个虚拟函数  
virtual void SetUp() {  
  // 在构造后调用  
   strExe.resize(MAX_PATH);  
   GetModuleFileName(NULL, &strExe[0], MAX_PATH);  
}  
 
virtual void TearDown() { }   // 在析构前调用  
};  
 
tstring getfilename(const tstring &full)  //偶写的从完整路径里取出文件名的函数(路径分隔符假定为'\\')  
{  
return full.substr(full.rfind(_T('\\')));  
}  
 
tstring getpath(const tstring &full)   //偶写的从完整路径里取出路径名的函数(Windows路径)  
{  
return full.substr(0, full.rfind(_T('\\')));  
}  
 
TEST_F(FooTest, Test_GFN) //测试getfilename函数  
{  
EXPECT_STREQ(_T("Projectexe"), getfilename(strExe).c_str());  
}  
 
TEST_F(FooTest, Test_GP) //测试getpath函数  
{  
EXPECT_STREQ(_T("D:\\Code\\libs\\google\\gtest-1\\BCC_SPC\\bcc\\ex"), getpath(strExe).c_str());  
}  
 
int main(int argc, TCHAR* argv[])  //主函数还是一样地  
{  
testing::InitGoogleTest(&argc,argv);  
RUN_ALL_TESTS();  
      std::cin.get();  
     return 0;  
}


两个及以上的测试使用相同的数据,可以使用 test fixtures.使用相同的数据测试几个不同的测试.

1.从::testing::Test中继承.类中使用public或者protected,以便子类调用.

2.在类中,声明任何计划准备使用的任何对象.

3.如果需要,写一个默认的构造函数或者SetUp()函数,为测试准备对象.注意大小写

4.如果需要,写一个析构函数或TearDown()函数,释放各种资源.注意大小写

什么时候使用构造函数和析构函数,或SetUp函数和TearDown函数?

5.如果需要定义测试共享的子程序.

使用fixture,用TEST_F替代TEST(),允许访问对象和子程序.

TEST_F(test_case_name, test_name) { ... test body ...}

与TEST()相同,_F是指fixture.

在使用TEST_F()之前必须定义test fixture,否则会编译错误."`virtual outside class declaration`"

对于每个定义了TEST_F的测试,google test会

1.每次运行时创建一个新的test fixture.

2.通过SetUp,立即初始化

3.运行测试

4.通过调用TearDown进行清除工作.

5.删除test fixture.同一测试用例中,不同测试有不同的test fixture对象,每次google test 都会在创建下一个test fixture 之前删除上一个test fixture.google test不会对多个测试重复使用相同的test fixture.任何对fixture实例的改变不会影响到其他的测试.


使用EXPECT_CALL()宏来设置一个mock函数调用的预期结果。其语法为:

EXPECT_CALL(mock_object,method(matchers))

.Times(cardinality)

.WillOnce(action)

.WillRepeatedly(action);

第一个参数是mock对象,第二个参数是mock函数名及其参数。二者中间是以逗号(而不是点号)分隔的,至于为什么是这样,回答只有一个:技术原因。

宏后面还可以紧跟若干语句,以提供对mock函数调用的预期结果的更多信息。这种风格的语法被一些人称作是“特定领域语言”(Domain-SpecificLanguageDSL



  1. ON_CALL(subObj, readBuf(1000)).WillByDefault(Return(blen)); 

ON_CALL(#1, #2(#3)).WillByDefault(Return(#4));

#1表示mock对象。

#2表示想定义的那个方法名称。

#3表示readBuf方法的参数。这里的1000表示,只有调用CSubscriber::readBuf同时传递参数为1000时,才会用到ON_CALL的定义。

#4表示调用CSubscriber::readBuf同时传递参数为1000时,返回blen这个变量的值。

猜你喜欢

转载自blog.csdn.net/wangjingqi930330/article/details/80567892