张晓雯++杨健++祁薇
摘要:本文从分析单元测试中人工测试和自动测试的特点入手,分析了自动测试的优点,并选取了流行的开源软件CppUnit作为测试工具,介绍了使用方法,以及如何建立测试项目,最终给出基于CppUnit的单元测试规范。
关键词:单元测试;CppUnit;测试规范
中图分类号:TP311.52 文献标识码:A 文章编号:1007-9416(2017)02-0079-02
1 单元测试
在软件项目研发过程中,编码和单元测试属于同一阶段,是同样重要的组成部分。有效适度的单元测试可以用来理解和验证代码的功能特性,是保证软件质量的关键步骤。由于对单元测试的覆盖率要求很高,通常需要反复的进行,因此需要大量的测试用例,造成人力物力的負担。 还有人认为单元测试就是编写测试代码对模块中的类或函数进行测试,需要很强的编程能力,从而对单元测试产生畏难情绪。但实际上,正确熟练的使用单元测试工具,开发人员之外的测试人员也可以很好的完成单元测试工作。
1.1 单元测试的分类
按照进行测试的方式分类,基本分为静态分析(static analysis)和动态分析(dynamic analysis)。静态分析就是对源代码进行走读检查,查找错误或收集一些相关数据,但不用对代码进行编译和执行。动态分析是观察软件执行时的过程,来提供跟踪,及时间分析,还包含测试覆盖度方面的信息[1]。
任何软件都可以进行人工测试,但进行人工测试可能存在一些问题,如:回归性、效率、覆盖率、数据的重用性问题等。测试工具的出现是为了提高测试的效率和质量,好的工具是测试工作的有力帮手。
使用测试工具的自动化测试可以是动态执行,也可以是静态检查的方式。自动化的静态检查主要根据代码的语法来识别错误,测试工具把这些错误特征归纳成为规则库,扫描代码时自动与规则库进行匹配比较。自动化的动态单元测试通过执行实现了测试用例的代码来进行测试,测试工具可以动态生成测试用例,然后转换到测试代码并执行。
1.2 选择合适的单元测试工具
自动化测试工具的优点:(1)节省时间,免去了重复的操作;(2)测试数据的可重用性;(3)测试的可控性。
如果选择利用测试工具来进行单元测试,就要了解如何选择,如何保证所选工具是最合适的。选择前要了解测试环境、待测系统类型、开发语言等。
现在市面上常见的C++类的测试软件,主要有CppUnit、parasoft公司的C++test、Google公司的GoogleTest以及国产凯乐公司的VisualUnit。主要分为开源的和非开源两类。开源测试工具具有以下优势:相对成本比较低;选择的空间比较大;源代码开放,可以根据实际进行修改、补充和完善。本文选取开源软件CppUnit进行单元测试工具。
2 单元测试工具CppUnit特点及安装
CppUnit是Micheal Feathers由JUnit移植过来的一个在GNU LGPL条约下的并在sourcefogre网站上开源的C++单元测试框架。
2.1 CppUnit的特点
CppUnit是在JUnit成功后,在C语言环境下开发的白盒测试工具软件。CppUnit以静态库的形式提供给用户使用,用户编写程序的时候直接链接此静态库就可以了。它提供了一个简单的单元测试框架,并且为常用的数据类型提供了丰富的断言语句支持。 CppUnit项目被定义为一个testing framework,其功能很强大,能针对一个项目,灵活的提供测试方案,同时具备对测试用例的管理功能。
2.2 CppUnit的安装
在官网下载解压后,子目录src下已经配置好VC的工程文件,其中example文件夹是CppUnit自带的测试例子,是针对CppUnit自身的单元测试集,可以通过这些例子来学习如何在工程中添加测试用例。
CppUnit将要进行单元测试管理为树状结构。最小的单元为TestMethod,多个相关的TestMethod组成一个TestCase,多个TestCase又组成TestSuite。测试包之间是互相嵌套的,最终形成树状结构,用户可根据需要选择任意的树节点来开始单元测试。
在使用CppUnit前,需要设置一下相关的开发环境。CppUnit提供了两套实施的框架库,一个为静态的lib,一个为动态的dll。在目录下,进入src文件夹,打开CppUnitLibraries.dsw。对这两个project分别进行编译后输出,输出的位置为lib文件夹。
最后还要给TestRunner.dll设置环境变量。另外一个要注意的project是TestRunner,它的输出是一个dll,它提供了一个测试环境,这个环境是基于GUI 方式的,这个project也需要编译,输出位置同样为lib文件夹。测试程序要想正确的调用,它必须位于你的测试程序的路径下。
安装及配置好环境后,就可以利用CppUnit建立测试项目了。
3 建立单元测试项目
在工作项目(Demo)中实现被测试的工作类,Sample
Sample.h--
class Sample
{ public:
Sample();
virtual ~Sample();
int Add(int i, int j) {
return i+j; } };
Sample.cpp—
#include "stdafx.h"
#include "Sample.h"
Sample::Sample()
{ }
Sample::~Sample()
{ }
为测试项目Project(本例为DemoTest)添加测试类,因为被测试的目标类为Sample,根据以上的命名规则,定义一个SampleTest的测试类。
在cpp中将Sample.cpp 包含进来,这样在编译SampleTest单元时,setUp 中new Sample() 才能找到Sample构造函数的实現(在Sample.cpp中)。
在测试项目Project中,新建一个源文件,这个源文件要写测试项目的main函数,测试框架如下
#include "stdafx.h"
#include "SampleTst.h"
#include
#include
//以上为相关的头文件
int main(int argc, char* argv[])
{
CppUnit::TextUi::TestRunner runner;
CppUnit::TestFactoryRegistry ®istry = CppUnit::TestFactoryRegistry::getRegistry();
runner.addTest(registry.makeTest());
runner.run();
return 0;
}
运行Project后,可以看到测试的结果。在测试运行过程中,如果某一assert失败,测试函数执行将中断,而后面的断言也不会被执行。因此,在设计测试函数时应尽可能压缩,使得测试功能相对单一。
4 基于CppUnit的单元测试标准
在相关测试项目完成后,测试人员应该删除无关的临时文件,保留要提交的项目,并整体保留TestDemo 的目录结构并进行提交。并且要完成相关的单元测试总结报告[2]。
4.1 测试结束后需要提交的测试产品
(1)每个被测类的相关测试文档。
包括测试类.h头文件和测试类实现的.cpp 文件。
(2)每个测试单元的测试文档产品。
包含测试类主函数.cpp 文件。
(3)单元测试总结报告.report。
报告需要手工填写,内容单元测试情况的总结。应包括:
被测类名:项目中所有被测类的类名;
测试用例:列出被测类对应测试用例及其描述和注释信息;
正确性测试报告:列出测试单元运行的测试结果。
4.2 单元测试工作产品验收规范
单元测试通过的准则如下:
(1)正确性测试结果文件:测试用例应该覆盖模块中的所有功能点。
(2)其它测试特性结果文件:测试该模块要求的其它特性并通过。
(3)每个单元的Bug 清单都已更改,不能改正的已给出详细说明。
(4)单元测试工作的验收应采用同级评审的方法,最终由评审组决定测试是否通过,从而保证单元测试的质量。
参考文献
[1]陈能技.软件测试技术大全[J].人民邮电出版社,2015.
[2]李龙等.软件测试实用技术与常用模板[J].机械工业出版社,2013.