天天看点

c++ 测试框架简介

 摘 要:测试驱动开发,是在明确要开发某个功能后,首先思考如何对这个功能进行测试,并完成测试代码的编写,然后编写相关的代码满足这些测试用例。文中的测试驱动示例完整的表现了一个测试驱动开发的基本过程。

中国论文网 http://www.xzbu.com/8/view-3693823.htm

  关键词:测试驱动开发 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

继续阅读