使用GTest与Gmock实现C++测试驱动开发

来源 :科学与财富 | 被引量 : 0次 | 上传用户:nihaobaobeisss
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘 要:测试驱动开发,是在明确要开发某个功能后,首先思考如何对这个功能进行测试,并完成测试代码的编写,然后编写相关的代码满足这些测试用例。文中的测试驱动示例完整的表现了一个测试驱动开发的基本过程。
  关键词:测试驱动开发 GTest Gmock
  1、测试驱动简介
  测试驱动开发,英文全称Test-Driven Development,简称TDD,是一种不同于传统软件开发流程的新型的开发方法。就是在明确要开发某个功能后,首先思考如何对这个功能进行测试,并完成测试代码的编写,然后编写相关的代码满足这些测试用例。然后循环进行添加其他功能,直到完成全部功能的开发。
  测试驱动开发的整个过程跟传统的软件开发过程有很大的区别,它的基本过程如下:
  1) 明确当前要完成的功能。可以记录成一个 TODO 列表。
  2) 快速完成针对此功能的测试用例编写。
  3) 测试代码编译不通过。
  4) 编写对应的功能代码。
  5) 测试通过。
  6) 对代码进行重构,并保证测试通过。
  7) 循环完成所有功能的开发。
  2、单元测试
  传统的单元测试
  单元测试其实在各个行业被广泛应用,举个例子说生产线上生产电视机之前,必须会对每个元件都进行测试,如果连原件都是坏的,那么生产出的电视也一定有质量问题。这些元件拼装成电路板后也要进行测试,就是通过这一层层的测试保证才能生产出一个合格的产品。
  而在传统的软件开发中,单元测试是白盒测试的一部分,测试人员编写的一系列的测试代码,用于检验被测代码的一个很小的、很明確的功能是否正确。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。举个例子:开发人员开发了一个列表功能的模块,测试用例就是像列表中添加一个值,然后测试是否能取出刚刚添加的值。或者删除值,看看列表是否为空。
  测试驱动中的单元测试
  测试驱动开发,它要求在编写某个功能的代码之前先编写单元测试,然后只编写使测试通过的功能代码,通过测试来推动整个开发的进行。这有助于编写简洁可用和高质量的代码,并加速开发过程。
  举个比较生动的例子,盖房子的时候,工人师傅砌墙,会先用桩子拉上线,以使砖能垒的笔直,因为垒砖的时候都是以这根线为基准的。TDD就是这样的原理,先写测试代码,就像工人师傅先用桩子拉上线,然后编码的时候以此为基准,只编写符合这个测试的功能代码。而一个外行人垒墙,却不知道拉线,而是直接把砖往上垒,垒了一些之后再看是否笔直,这时候可能会用一根线,量一下砌好的墙是否笔直,如果不直再进行校正,敲敲打打。
  使用传统的软件开发过程就像这样,先编码,编码完成之后才写测试程序,以此检验已写的代码是否正确,如果有错误再一点点修改。
  你觉着应该先拉线再砌墙,还是先砌墙再拉线呢?如果你喜欢前者,那就转入TDD阵营吧!
  3、测试的应用框架简介
  C++语言接近汇编语言,高效。编译生成的目标代码质量高,程序执行效率高,一直是不可替代的语言。但C++语言过于底层,缺少一些高级语言的特性,导致C++上的测试驱动框架的实现各有优劣,没有一个统治地位的测试驱动框架。在C++上的测试工具主要有CppTest,CxxTest和GTest这几种。下面对这几个测试框架进行简单的介绍。
  CppUnit
  cppunit,这是一个与JUnit类似的框架,但这个框架很陈旧了,并且有着一些缺点。
  CxxUnit
  因为cppunit的多种缺陷,cppunit的鼻祖之一重写了一套C/C++单元测试框架,这就是cxxtest。与cppunit相比,可以说cxxtest具有如下一些优点:不需要RTTI;不需要成员模板功能;不需要异常处理等。它完全是作为一套头文件的集合而进行发布的。另外由于cppunit带有Make文件, 所以只能用在主要的操作系统中,而应用到不常见操作系统中源代码及Make文件修改的工作量就会很大。cxxtest不带Make文件, 所以也可用于其他操作系统中,具有更好的可移植性和可用性。
  当然cxxtest也有一些缺点,例如需要用到perl或者python对测试代码的头文件进行文法扫描,生成可执行代码,准备工作比较麻烦。
  Google C++ Testing Framework和Google C++ Mocking Framework
  Google C++ Testing Framework简称“GTest”,是大名鼎鼎的Google的开源C++单元测试框架。它已经在多个平台上验证 ( Linux, Mac OS X, Windows, Cygwin, Windows CE, and Symbian )。是一个基于 xUnit 构架的测试框架。
  相对与CxxUnit通过脚本语言扫描代码的方式,GTest则是通过C++自身的方式生成测试代码。和cxxtest来说两种实现方式各有优势,CxxTest相对来说初期配置比较麻烦,测试用例写起来简单。GTest功能相对CxxTest更强大。
  Google C++ Mocking Framework 简称“Gmock”,Gmock很强大的测试工具,它从另一种思路,对GTest难以测试的代码进行测试。它本身不是一个测试框架,它需要一个测试框架来运行测试。
  Gmock是Google 公司于 2008 年发布的用于单元测试工具,且遵循 New BSD License (可用作商业用途)的开源项目,并且 Gmock 可以支持绝大多数大家所熟知的平台。
  Gmock官方网页:http://code.google.com/p/googlemock/。
  GTest官方网页:http://code.google.com/p/googletest/。
  4、GTest(Google C++ Testing Framework)
  上面的测试驱动示例完整的表现了一个测试驱动开发的基本过程。测试用例通过断言来比较代码返回值是否正确。断言通过比较,会产生三种结果:成功,非致命失败和致命的失败。测试用例会根据程序逻辑执行所有的断言并记录返回值,但如果断言返回致命的失败,当前测试用例会被终止。
  测试通过验证断言来检测代码的正确性,如果测试崩溃或者断言返回失败,那么代码就是有问题的。
  一个测试案例包含一个或者多个测试,推荐将这些测试分组,每个分组被称为测试案例集合。这些分组反映了被测试代码的结构。当一个测试案例中的多个测试使用一个公用的对象或者子用例时,可以将它们放到一个测试固件中。
  参考文献
  [1] 测试驱动开发 Kent Beck 中国电力出版社 2004.4
  [2]Gmock官方网页:http://code.google.com/p/googlemock/。
  [3]GTest官方网页:http://code.google.com/p/googletest/。
  [4] 开源软件之道 蔡骏杰 电子工业出版社,2010.4
其他文献
在幼儿美术活动中,教师应该鼓励他们在生活中观察、体会,因而活动具有一定的情境才能更好地开展。在田园美术的情境活动中,要充分利用农村资源中的真、美、情等,给幼儿的发展带来
对小学中年级段数学作业设计中的问题进行了分析,提出了多元化作业设计的策略。
数据源组合查询对于数据库及其系统的有效利用和管理具备重要意义,本文在简单述及数据组合查询的相关技术以后,分不同的情况讨论了数据源查询设计的技术及实现途径,最后对如何实
笔者通过调查、走访,在森林经营的基础上提出了长岗实验林场的森林保护措施,并对林地占补平衡提出了相应的要求和做法。
本文就钢结构工程常见的焊接质量缺陷的成因进行分析,进而归纳出部分实践性的防治措施,以期为提高钢结构的焊接质量提供一定的借鉴。
情感教育有利于提高学生学习的积极性和主动性,在初中英语教学中具有积极的作用。教师通过分析情感教育在初中英语教学中的实施现状,提出有针对性的策略,以期提高英语教学效
内河航道整治工程一般包括疏浚工程、炸礁工程、护岸工程、桥梁拆除及跨过河管线改建工程、航标工程、配套设施工程及环境保护工程。其中疏浚工程、炸礁工程等将会对河道内的