UML软件工程组织

C/C++单元测试工具Visual Unit
unitware.cn

Visual Unit(VU) 着力解决实施单元测试面临的主要问题:单元测试降低编码阶段的生产效率?VU自动生成测试代码,全方位示出程序行为,帮助整理和验证编码思路,支持快速排错和高效调试,边编码边测试反而可以提高编码的生产率;开发人员不喜欢测试自已编写的代码?VU使程序的功能和逻辑结构一目了然,既是测试工具,也是编码辅助工具,提高了编程的舒适度,容易让开发人员接受和喜爱;单元测试的效果难于保证、难于持续实施,并行开发难于保证覆盖率?VU可轻松完成100%语句、条件、分支、路径覆盖,提供详尽的测试报告和待测试文件列表,随时可以检验测试效果、找出遗漏代码或未完成覆盖的代码,保证测试的完整性,易于持续实施。

自动生成测试代码

自动生成测试文件:

自动生成测试函数:

无须手工编辑测试代码,建立、编辑测试用例在测试用例编辑器中进行。

测试用例可视化编辑

使用测试用例编辑器建立、编辑测试用例,VU自动生成类似于下图所示的代码,通常只须填入输入输出的数值。

用拷贝选中用例的方法新建测试用例,然后作相应修改,快速建立功能测试用例集。

测试用例可用点操作符访问成员变量,还可以用同样的语法调用成员函数。

特殊情况下可以在代码模式下直接编辑测试代码。

程序行为一目了然

程序的行为一目了然,有助于整理和验证编程思路,大幅提高编码效率。

上图代码窗口中黑色代码为当前用例所执行的代码。一边写代码一边测试,必要时可以用TEST_TRACE()宏输出中间变量,程序的功能和所执行的代码及路径尽在眼前,不但工作效率高,而且感觉很舒适。

空前的测试完整性

可以轻松完成100%语句覆盖、100%条件覆盖、100%分支覆盖,一般代码100%路径覆盖,复杂代码可屏蔽安全的分支,然后完成100%路径覆盖。请注意:是完成这些覆盖,而不是仅仅统计出覆盖率。

在此之前,如果要求所有代码均达到上述白盒覆盖要求,其成本是难于想象的。VU改变了这一切,使用测试用例设计器可以快速完成这些覆盖。不可达的分支可以轻易分辩出来并予剔除,对于逻辑结构很复杂的代码,可以屏蔽安全的部分,只关注易出错的部分,同样可以达到100%路径覆盖。

VU还提供自动边界测试,自动速度测试。

高效设计白盒覆盖测试用例

代码窗口显示未覆盖语句和未覆盖条件,选中后可用快捷菜单打开测试用例设计器。

路径窗口显示未覆盖分支和未覆盖路径,选中后可用快捷菜单打开测试用例设计器。

测试用例设计器计算出一个近似用例,并生成修改提示,依据修改提示对近似用例进行简单修改,即可获得可覆盖预期逻辑目标的测试用例。

上图中,待满足条件是A="=2" || X>1,两个条件的关系是逻辑或,即可以任选一个。如果选择条件A="=2,A==2与已满足条件A>1并不冲突,因此,只需把输入数据中的A" 的值改为2,即可得到可覆盖预期逻辑目标的测试用例;如果选择X>1作为修改条件,由于依赖关系中出现了变量X,这时应点击“代码”按钮查看代码的依赖关系,如下图。从下图可看出,由于X被语句X="X/A重新赋值,且A的值为3,要使待满足条件X>1成立,X的输入值必须大于等于6。因此,把近似用例中X的值改为6或大于6的数,就可以得到符合预期的测试用例。修改后点击“新建用例”按钮,新用例就会保存到测试文件中,重新运行测试,就会看到逻辑目标已被覆盖。

使用测试用例设计器设计白盒覆盖测试用例,无须象传统的方法一样分析程序的逻辑结构。在很复杂的情况下,也只需要对程序代码有基本的理解。例如下图,如果对所测试的程序有基本的理解,那么很容易看到,在strlen(head) != false,即head不是空串的前提下,不进入循环是不可能的,因此逻辑目标(分支或路径)是不可覆盖的,应在路径图中删除。

快速排错 高效调试

大多数情况下,浏览分析数据输出、代码执行、路径图,即可发现错误位置和错误原因,无须进行单步调试。

上图中,对比预期输出与实际输出,阅读执行代码,很容易找到错误原因。对某些关键数据,随时可以使用TEST_TRACE宏输出中间结果。需要单步调试时,VU增强调试器的功能,提高调试效率。

自动断点

程序自动中断时,执行调试器的“Step Into”(VC)或“Trace Into”(C++Builder)命令两三次即可进入被调试的代码。

后退与重复

使用调试器的“Run to Cursor”功能,可以实现真正的后退。跟踪时过了头或到了函数结束还没有找到错误所在,可以单击函数开始处的代码,然后点击“Run to Cursor”,即可重新跟踪,可以多次重复,一直到调试结束才退出调试,后退时,参数和成员变量的值会重新设置,是真正的后退,这一功能也使调试器的“编辑继续”功能真正生效。

用例切换

VU会自动选择当前用例作为输入数据,并可以切换用例,以比较不同输入时代码的行为或变量的值。在VU的主窗口中切换当前用例,然后执行调试器的“Run to Cursor”回到函数的入口,即可切换用例。

灵活运用VU提供的调试增强功能,可以大幅提高调试效率。

自动回归测试 速度测试 边界测试

自动回归测试将大幅降低系统测试、维护升级等阶段的成本。回归测试包括对整个类的代码的测试和对整个工程的代码的测试。

要运行速度测试和边界测试,只需要打开开关。

边界测试,是指使用预先定义的边界值,如最大值、最小值、空值、或其他特殊值作为输入数据来运行测试。所有数据类型都可以定义边界值。边界测试是功能测试的有效补充,通过检查程序是否对边界输入作了适当处理,可有效增强程序的健壮性。

详尽的测试报告

测试报告记录函数测试的详细结果,既能衡量测试的完整性,也是查找性能瓶颈和隐藏极深的错误的工具。

逻辑覆盖率是测试是否充分的重要指标,如果程序集成后发现不明错误,测试不充分的函数包含错误的可能比较大。如果程序性能不理想,可以将函数耗时由大到小排列,速度比较慢的函数可能就是性能瓶颈。

开发成本降低一半

代码编写的时间减少一半

  • 测试费时极少:程序员编码时必定要弄清代码的功能,这就是功能测试用例,使用测试用例编辑器可快速建立测试用例集;白盒测试用例使用测试用例设计器来设计,也可以高效地完成。
  • 提高编码速度:显示输入输出数据及所执行的代码,程序行为一目了然,帮助整理和验证编码思路,提高编码效率和正确性。
  • 快速发现错误:大多数代码错误只需观察输入输出数据和代码执行状况,即可找出错误所在,不需单步调试。
  • 提高调试效率:自动断点、自动用例选择、进退自如,提高调试效率。

总体来说,编程的主要时间消耗在于整理思路和调试,使用VU,在这两方面均能大幅提高效率,一边编码一边测试,在得到高质量的代码的同时,还能节约一半编码时间。

后续阶段的时间成本降低一半以上

  • 后续测试成本:集成测试、系统测试或其他测试只需关注功能和设计方面的问题,修改代码后用自动回归测试确认修改,后续测试的时间成本降低一半以上。
  • 维护升级成本:完整的测试集使维护、升级时随时可运行回归测试,大幅降低时间成本。

对系统分析和架构设计的间接支持
开发过程中更改项目设计是不可避免的,如果缺少充分的单元测试,由于对代码的任何修改都可能引入难于发现的错误,很容易导致项目延期,有了充分的单元测试,编码前的设计就可以最小化,并随时进行修改和完善。

产品质量提高十倍

代码中隐藏的Bug最小化

使用VU进行单元测试,黑盒方面,除了测试代码的功能外,还完成边界测试、速度测试;白盒方面,完成语句、条件、分支与路径覆盖,这种空前的测试完整性,使代码中遗留的缺陷最小化。虽然任何测试都不能保证发现所有的缺陷,但经过如此严密的测试之后,代码中遗留的缺陷的数量将会极少,这些代码缺陷,可能在产品的整个生命周期都不会暴露出来。

间接提高设计质量

有了充分的单元测试,项目的设计就可以随时进行修改和完善,甚至项目交付后也是如此,这对提高产品的整体质量极有帮助。


版权所有:UML软件工程组织