您好,欢迎访问三七文档
Googletest框架和单元测试杭州2011.10.12内容Googletest框架单元测试(UnitTesting)Googletest框架Googletest背景xUnit简介Googletest特性Googletest环境搭建Googletest使用1.1Googletest背景Googletest是Googletest针对C++测试的开源项目,跨平台(Linux,MacOSX,Windows,Cygwin,WindowsCE,andSymbian)。基于xUnit框架,有丰富的断言,自定义断言,事件机制,death测试,参数化测试,XML测试报告等。应用案例:Chromiumprojects(谷歌浏览器)LLVM(LowLevelVirtualMachine)ProtocalBuffers(类似XML数据描述语言)1.2xUnit简介每个测试依次执行的4个不同阶段:1、建立测试夹具(Fixture);2、与SUT(SystemUnderTest)交互;3、验证结果;4、拆卸测试Fixture,返回初始状态。测试套件对象创建创建创建测试用例类测试用例对象SUT执行执行夹具testMethod_ntestMethod_1testMethod_n运行套件建立执行验证拆卸测试运行器1.3Googletest特性断言事件机制参数化测试运行参数death测试断言宏分类:(1)ASSERT_*系列:检查点失败时,推出当前函数(2)EXPECT_*系列:检查点失败时,继续往下执行1.3.1断言布尔值检查数值型检查字符串检查浮点型检查当断言检查出错时输出的信息并不能很好的帮助你还原当时出错的状况时,可以使用“”操作符输出指定内容帮助分析出错原因。1.3.2事件机制Gtest事件机制分类:全局:发生在所有案例执行前后TestSuite:案例中所有案例执行前后TestCase:单个案例前后全局事件要实现全局事件,必须写一个类,继承testing::Environment类,实现里面的SetUp和TearDown方法。1.SetUp()方法在所有案例执行前执行2.TearDown()方法在所有案例执行后执行TestSuite事件需要实现一个类,继承testing::Test,然后实现两个静态方法1.SetUpTestCase()方法在第一个TestCase之前执行2.TearDownTestCase()方法在最后一个TestCase之后执行TestCase事件TestCase事件发生在每个TestCase执行前后1.SetUp()方法在每个TestCase执行前执行2.TearDown()方法在每个TestCase执行后执行当被测函数需要传入不同的值时,可以考虑Gtest提供的参数化测试功能。1.3.3参数化测试INSTANTIATE_TEST_CASE_P(param1,param2,param3)param1:任意取;param2:测试案例的名称;param3:参数生成器(eg:testing::Values());使用说明:在运行Gtest时,Gtest提供了一系列的参数可以使我们对案例的执行进行有效的控制。1.3.4运行参数Gtest工程产生exe文件图运行输出案例表参数图示测试案例集合参数参数列表测试案例输出参数测试案例异常处理参数1.3.5death测试在测试过程中,对于可能导致程序崩溃的输入,我们可以检查程序是否按预期的方式崩溃,验证崩溃结果。注意事项:1.不要在死亡测试里释放内存。2.在父进程里再次释放内存。3.不要在程序中使用内存堆检查。环境要求:Linux,Windows(requiresMSVC8.0orabove),Cygwin,andMac(thelatterthreearesupportedsincev1.3.0).VS2008下简单实现示例EXPECT_DEATH(statement,regex);1.statement是被测试的代码语句2.regex是一个正则表达式,用来匹配异常时在stderr中输出的内容EXPECT_EXIT(statement,predicate,regex)1.statement是被测试的代码语句2.predicate在这里必须是一个委托,接收int型参数,并返回bool。只有当返回值为true时,死亡测试案例才算通过。如果程序正常退出并且退出码与exit_code相同则返回trueVS2008下简单实现示例Windows下正规表达式风格:Simple风格:GTEST_USES_SIMPLE_RE=1(预处理处添加)1.4Googletest环境搭建搭建步骤:(1)设置gtest头文件路径(2)设置gtest.lib路径1.5Googletest使用(1)创建单元测试工程RUN_ALL_TESTS()宏功能:1.SavesthestateofallGoogleTestflags.2.Createsatestfixtureobjectforthefirsttest.3.InitializesitviaSetUp().4.Runsthetestonthefixtureobject.5.CleansupthefixtureviaTearDown().6.Deletesthefixture.7.RestoresthestateofallGoogleTestflags.8.Repeatstheabovestepsforthenexttest,untilalltestshaverun.(2)在待测试的类头文件中添加gtest头文件(3)在待测试的类头文件中添加测试单元声明此声明实质为待测试类添加友类,下图为gtest源码:(4)实现测试案例实体和所需的事件机制宏(TEST/TEST_F)源码分析:(5)验证和查看单元测试结果单元测试(UnitTesting)UnitTesting单元测试实例分析2.1UnitTesting•单元测试:简单的讲独立的测试每一个函数•良好单元测试的品质:(1)运行速度快(0.1s);(2)定位问题所在•以下测试不是单元测试:(1)与数据库有交互;(2)进行了网络通信;(3)调用了文件系统;(4)需要对环境做特定的准备和配置;•关键:解依赖原则:源代码在产品阶段和测试阶段应该是完全一样的2.2单元测试场景实例分析在实际编写单元测试中,在单元测试之前的一些对函数所用的初始化操作通常并不能满足需要,常规的方法并不能解决一些复杂的问题。例如函数中涉及到对设备sdk调用、socket通信、工程中依赖的一些第三方库函数的引用等等。单元测试中并不需要对这些纳入到测试中,我们只需要模拟这些调用产生的结果返回到需要测试的函数即可。针对以上问题常用处理方法:伪对象接缝模型2.2.1伪对象伪代码:classSale{voidscan(){...........调用设备SDK方法showLine();...........}}伪对象:指测试中用来替代单元测试环境中无法调用的对象。图例:在一个POS系统中Sale类,其中方法Scan()显示商品信息。伪代码:classSale{Displaydisplay;publicSale(Diaplaydisplay){this.display=display;}voidscan(){display.showLine();}}2.2.2接缝模型接缝(seam):在程序的一些特殊的点,可以不用修改源码就可以达到改动代码的行为。每个接缝点都有一个激活点,在这些点我们可以改变代码的行为。接缝类型:对象接缝链接接缝预处理期接缝(不适用,这里不做介绍)对象接缝Sale+Scan(barcode:string)用子类去覆盖掉基类中的。图例:在一个POS系统中Sale类,其中方法Scan()显示商品信息。伪代码:classSale{voidscan(){...........调用设备SDK方法showLine();...........}}伪代码:classSale{voidscan(){...........showLine();...........}virtualshowLine(){调用设备SDK方法showLine();}}Sale+Scan(barcode:string)+virtualShowLine()Sale+Scan(barcode:string)+virtualShowLine()ChildSale+ShowLine()链接接缝C++及很多语言在代码编译后,我们是可以在其链接期时改变其行为的。预编译编译汇编源程序链接•展开宏•处理条件编译指令•处理预编译指令•删除注释、加标识.....•词法分析•语法分析•语义分析•优化汇编代码.....•汇编码译为机器码(目标文件.obj).....•地址和空间分配•符号决议•重定位.....可执行应用程序链接图示流程图示本地实现调用第三方库功能,在加载阶段去掉第三方库文件,添加本地的.obj目标文件。参考资料1.官方文档2.CoderZh技术博客《玩转Google开源C++单元测试框架GoogleTest系列》3.《xUnit.Test.Patterns.Refactoring.Test.Code》4.《修改代码的艺术》5.《程序员的自我修养-链接、装载与库》感谢您的关注
本文标题:GTest单元测试
链接地址:https://www.777doc.com/doc-3562515 .html