单元测试的主要目的是获取应用程序中可测试软件的最小片段,将其同代码的其余部分隔离开来,然后确定它的行为是否与预期的一样。单元测试并不能保证程序是完美无缺的,但是在所有的测试中,单元测试是第一个环节,也是最重要的一个环节。单元测试的对象是软件设计中的最小单位--模块,它是一种程序员对自己的代码进行自测试的工作,其测试依据就是软件模块的详细设计文档。单元测试通常采用白盒测试的方式,白盒测试也称结构测试或逻辑驱动测试,已知产品内部工作过程,通过测试来检测内部动作是否正常。测试按照程序内部结构进行,检验程序中的每条通路是否正确工作,而不顾它的功能。测试是从代码的路径结构和内部逻辑信息设计测试用例并覆盖全部代码、分支、路径、条件。 所以,单元测试的一个很重要的指标就是代码覆盖率,很多软件开发标准化组织都对单元测试的代码覆盖率有很明确的要求,低于标准就意味着单元测试不通过。
目前有很多单元测试工具都支持程序覆盖率的自动统计,应用较广的分析覆盖率的工具有 Logiscope TestChecker、 TrueCoverage 、 PureCoverage 等,本文主要是介绍如何使用Rational公司的PureCoverage工具统计测试代码覆盖率。PureCoverage是Rational公司的单元测试工具PurifyPlus三套件之一,PurifyPlus的另外两个套件分别是内存检查工具purify和代码效率分析工具pureQuantity。本文主要介绍如何使用PureCoverage配合Microsoft的开发工具Visual C++统计单元测试的代码覆盖率。PureCoverage通过记录执行过的代码,生成代码覆盖分析报告,其代码覆盖分析可以详细到语句级,技术上的原理就是使用目标码插入OCI(Object Code Insertion)技术。所谓的目标对象插入技术,就是直接对目标码进行分析,并插入相应的汇编代码,不过源代码插入SCI(Source Code Instrumentation)和执行码替换ECI(Executable Code Interception)都需要源代码或编译环境的支持,并且会引起程序运行缓慢和系统资源占用过多的问题。但是瑕不掩瑜,PureCoverage凭借着与Visual Studio集成开发环境的无缝连接,依然是单元测试工具的首选利器。
PureCoverage有两种运行界面,一种是应用程序界面,可以脱离开发环境独立运行;另一种是嵌入式界面,可以集成到Visual Studio的集成开发环境中,不过两种运行方式的基本功能是相同的。下面用一个简单的例子作个演示,使大家对PureCoverage有一个感性的认识,这个例子就是PureCoverage自带的一个例子hello.exe。
首先运行PureCoverage,然后选择“File”菜单的“Run”命令,在弹出的“Run Program”对话框中选择hello.exe程序:
图1. 选择程序
由于hello.exe是使用Visual C++ 6.0编写的Win32应用程序,所以在“Collect Data From”选项处选择“Unmanaged Code(非托管代码)”,点击“Run”按钮就开始运行Hello.exe。PureCoverage首先分析Hello.exe装载的模块,然后润行hello.exe,出现一个标题是“Hello,World”的消息框,这是hello.exe程序的提示,要用户选择是不是看看当前的时间,我们先点击“确定”按钮看看结果。hello.exe弹出另一个消息框显示当前时间,点击“确定”按钮结束程序的运行,此时PureCoverage已经统计出了结果,如图(2)所示:[Page]
图2. 运行结果的“Module View”视图
这个视图显示了hello.c的有两个函数,DisplayLocalTime()和WinMain(),在刚才那次测试运行中被调用的次数和代码行覆盖率。用鼠标双击函数名可以将视图切换到代码窗口,如图(3)所示:
图3. 运行结果的“Source Code”视图
代码视图中被标记为蓝色的代码是刚才这次测试走过的代码,被标记为红色的代码表示这次测试没有走过的代码。如果想了解每个函数的具体情况,可以点击工具栏的“Function List”图标,图(4)就是本例中的函数列表,包括函数被调用的次数,总的代码行数,被测试过的行数以及代码覆盖率。
图4. Function List 显示
有时候一次测试通常不能覆盖所有的代码,以上面的hello.exe为例,WinMain()函数的一个分支就没有走到,PureCoverage充分考虑到了这种情况,它能够记录每一次测试结果,并提供了对结果进行分析、对比和合并的功能。下面我们再Run一下hello.exe,这次选择不看当前时间,使程序走过WinMain()函数的另一个流程。此时PureCoverage右边的“Navigator”窗口就记录下了对hello.exe的两次测试结果,如图(5)所示:
图5. 查看Navigator窗口
在Navigator窗口上用鼠标双击第二次测试的结果条目,就可以在右边看到这次测试的详细信息,如图(6)所示,这次测试Missing了DisplayLocalTime()函数,只走过了WinMain()函数的else分支。
文章来源于领测软件测试网 https://www.ltesting.net/