Google Test 学习笔记

google Test learning notes
jingwenlai 2009-09-30

 

     之前使用过cppunit,尝到了用Test Case辅助开发的甜头,但是现在在我的Mac OS上并没有编译出可用的版本,而且当时知道cppunit有mfc,qt两种ui,只用过mfc的ui,后来在网上搜资料,发现还有其他几种不同的单元测试框架,如CxxTest,Boost.Test等。因为对Boost库有好感,毕竟算是c++的准标准库,花了一个下午在看Boost.Test的文档,看得有点晕,其一个很好的特性是自动注册,这个特性相对 于cppunit来说是一个很好的特性,因为不用担心是否忘记注册test_case了,直接用BOOST_AUTO_TEST_CASE即可,但是看了文档之后发现有点晕,可能是不够清晰吧,今天又再看了一下另一个测试库:google test,发现挺简洁的,实际上只需要使用TEST()及TEST_F()这两个宏即可。把自己看文档的要点记一下,以后自己要参照的时候也是个好主意。


1. Assertions : google test提供了三种基本的断言形式,在googletestAdvancedGuide中有更多的断言形式,如支持HRESULT返回型等。
* Basic Assertions: (note: ASSERT si fatal assertion, EXPECT is nonfatal assertion)
  ASSERT_TRUE(considtion);  EXPECT_TRUE(condition);
  ASSERT_FALSE(condition);  EXPECT_TRUE(condition); 

* Binary Comparision
  ASSERT_EQ(expected,actual);     ...             ==
  ASSERT_NE(val,val2);    ...    !=
  ASSERt_LT(val1,val2);    ...    val1< val2
  ASSERt_LE(val1,val2);    ...    val1 <=val2
  ASSERt_GT(val1,valw);    ..    val1 > val2
  ASSERT_GE(val1,val2);    ...    val1 >= val2
  (note:这些值,即val1,val2必须是可比较的,否则会出现编译错误。另外,这些类型需要支持ostream << 的流输出形式。这对于所有C++ 内置类型来说都支持,对于用户自定义的类型,可以通过重载以上的比较操作以及输出流来做到 )

* String comparison
  ASSERT_STREQ(expected_str,actual_str);
  ASSERT_STRNE(str1,str2);
  ASSERt_STRINGCASEEQ(expected_str,actual_str);
  ASSERT_STRINGCASENE(str1,str2);

2. Simple Tests : 创建简单的测试用例
   To create a test:
   1. 用TEST() 宏来定义测试函数,例如 TEST(test_case_name,test_name){}
   2. 在此函数体内,可以用任何的c++语句,并可以使用上述的断言来检测计算值。


3. Test Fixtures: Using the Same Data Configuration for Multiple Tests,测试集,可以用来共享测试数据
   To create a fixture:
   1. .用protected: 或 public: 的形式 继承类::testing::Test,因为我们需要在子类中使用其成员函数.
   2. 在类中,可以定义你想要使用的对象.
   3. 如果需要,可以写一个构造函数或用 SetUp() 函数来初始化用于每个测试的数据.
   4. 也可以写析构函数或用 TearDown() 函数来释放在SetUp()中创建的资源。
   5. 定义成员函数作为测试用例.
   用法:使用 TEST_F() 宏。例子:
   TEST_F(test_case_name,test_name){
   }
   需要注意的是,这里的test_case_name 即是你前面创建的test fixture的名字.当然,你需要在使用之前已经定义过这个test fixture.


4. Invoking the Tests 调用测试用例
   因为google test是自动注册的,所以用TEST()或TEST_F()写完测试用例后,直接用RUN_ALL_TESTS();即可运行所有测试。

5. 主函数main() 中的写法
   eg. int main(int argc,char ** argv)
       {
             ::testing::InitGoogleTest(&argc,argv);
             return RUN_ALL_TESTS();
        }

 

====================================

以上是PrimeGuide(初级教程)中的主要内容。假如你写控制台程序或Qt程序,因为在其程序的入口就是int main(int argc,char ** argv),所以,可以很容易地用上面的第5条来测试效果。而如果你用的是MFC程序,你可以自行添加一个console, 但是在MFC中主程序的入口已经被封闭起来了,而且并没有显式地显示argc,argv等参数,怎么办?今天突然被我想到了,实际上的windows的程序在你双击的时候会运行,而如果你在控制台,直接敲入exe的名字,其也一样运行。这样的话,我们可以把argc看成1,把argv看成你的程序的名字,因此,我们可以在MFC 的App的InitInstance中,加入如下代码来做到:

                          int argc = 1;

                          char ** argv = new (char*);

                          argv[0] = new char [30]; //the array to store the app name

                          sprintf(argv[0],"${YourAppBinaryName}"); //use your project's output binary name

                          ::testing::InitGoogleTest(&argc,argv);

                          RUN_ALL_TESTS();

即可。

这使如果你有控制台与MFC程序一起运行的话,可以看到输出的效果。 It seems that google Test can take control of the control window,

if you want to print message of your own using cout statement, it has no effects. but if you printf your message using cerr, the win32 console can display message you want.

 


* 更高级的使用指南可以参见google test Advanced Guide, 其主要提供了另外一些flags来控制google test的运行,实际是通过增加command line中的参数来做到,即增加argv[1],argv[2]等。以上这些已经暂时够用了,如果需要一些比较特殊地再看指南了。

 

另外,在网上发现有篇文章不错,在reference中。
  
References:
1. code.google.com/p/googletest/
2. http://www.cnblogs.com/coderzh/archive/2009/04/11/1433744.html

你可能感兴趣的:(Google Test 学习笔记)