如何保障软件测试充分性之逻辑覆盖率统计
软件测试充分性这一概念是Goodenough和Gerhart于1975年在研究软件测试是否能够保证软件的正确性时引入的。此后,软件测试充分性的研究成为软件测试的研究焦点之一。
我们在做系统级测试、功能测试、黑盒测试的过程中,测试用例设计是否充分?所有测试用例执行完是否覆盖到了所有有效代码?关键函数、功能点是否有未覆盖到的逻辑、分支?这些未知都导致测试人员不敢确定自己的测试是完全充分的,而代码逻辑覆盖率是用来确定测试充分性的唯一可靠度量指标。这是一种最可操作、最容易起步的方法,而且在一些软件开发工程化文件和软件研制任务书中,通常会对逻辑覆盖率提出明确的要求,它可以让测试人员清晰的了解到每一条测试用例覆盖了哪些代码,还有哪些代码未被覆盖到。目前很多海军装备项目都明确要求要做系统级、配置项级的逻辑覆盖率测试,以保证测试的充分性。
在这样的情况下,选用合适的逻辑覆盖测试与统计工具,就成为开展逻辑覆盖测试、提高测试用例逻辑覆盖率的前提条件。
逻辑覆盖
逻辑覆盖,就是以程序内部的逻辑结构为基础,设计若干测试用例,使程序用这些测试用例运行时,能执行(或叫覆盖)程序中的每个语句/分支/条件/路径/子程序调用等等.
根据覆盖测试的目标不同,逻辑覆盖率测试可分为语句覆盖、判定覆盖、条件覆盖、判定-条件覆盖、条件组合覆盖、路径覆盖、子过程调用覆盖等。
语句覆盖,就是选择足够的测试用例,使得被测程序中的每个语句至少执行一次;判定覆盖,又叫分支覆盖,则要求程序中每个判定的每个可能的结果都应该至少执行一次;条件覆盖,则要求程序中每个判定的每个条件的所的可能值至少执行一次;判定-条件覆盖,则要求程序中每个判定的每个条件的所有可能值至少执行一次,而且每个判定的所有可能判断结果至少执行一次;条件组合覆盖,则要求每个判断表达式中条件的各种可能组合都至少出现一次;路径覆盖,则要求程序的每条可能路径都至少执行一次(如果程序中有环,则要求每个环至少经过一次);子过程调用覆盖,则要求程序中每个调用子过程的地方都至少被执行一次。
逻辑覆盖测试与统计工具
逻辑覆盖测试通常需要逻辑覆盖测试工具来支持。逻辑覆盖测试工具通常是一种白盒测试工具。从覆盖测试的原理来看,覆盖测试工具要对被测程序进行插桩。工具在对被测程序进行语法分析的基础上,建立一系列表格,从源程序中按顺序定位出每个覆盖目标(如语句、分支、子过程调用等)。然后在目标处插入插桩语句(插桩语句是一个子过程调用,调用的子过程能在运行到插桩点时记录下有关的运行情况)。插桩完毕后,插桩后的文件代替插桩前的文件,连同工具提供的插桩库(插桩库中有插桩语句调用的子过程以及其他子过程的定义)进行编译、连接形成新的可执行程序。然后运行此可执行程序,注入测试用例。插桩语句在执行过程中或执行完毕后,就能将测试结果记录到事先确定的缓冲区或文件中。测试人员就能根据测试结果判定覆盖情况是否满足要求了。
从以上工作过程和测试效果可以看出,一个好的覆盖测试工具,从功能和性能上应满足一定的要求。
在功能上,覆盖测试工具应尽可能进行多种目标的覆盖测试,如能进行语句、分支甚至路径(或基本路径)的覆盖,最好能提供图形化的界面,便于测试人员直观地进行覆盖分析,确定新的待测路径,补充新的测试用例。
在性能上,覆盖测试工具应尽量减少插桩开销。一方面,为达到不同的逻辑覆盖目标(如语句覆盖、分支覆盖、路径覆盖、子过程调用覆盖等),尽量减少插桩操作次数。若能仅仅插桩一次,就能完成多种目标的覆盖测试,则可以大大减轻测试人员的工作量。另一方面,应优化插桩代码,减少插桩代码的数量、减少插桩代码的运行次数,从而达到减少插桩代码运行开销的目的。特别是对于一些实时系统的覆盖测试,在这方面的要求尤其苛刻。
统计解决方案之CuttleITE
CuttleITE是一款基于实时总线监听技术、完全面向测试过程的白盒测试工具, CuttleITE采用赋值语句或汇编语言的插桩方式,结合硬件辅助测试,可将测试对被测系统的影响降到最低。是目前在集成级、系统级软件测试,特别是嵌入式系统软件测试的最佳实践工具之一。下面我们将通过一个实例向大家介绍该款工具。
首先我们会使用源码插桩 工具对被测程序插桩。在打开的插桩页面(如下图),打开插桩工程,配置插桩级别、目标路径、平台配置文件等信息,开始插桩,等待插桩完毕。
查看插桩后的工程文件(如下图),我们可以看到依据不同的插桩级别,在源码程序中插入了桩点。
接着,配置数据采集类型、服务器地址等信息(如下图),为运行插桩后的工程项目做准备。
然后,在CuttleITE中打开插桩后的工程项目(如下图)。
连接到服务器端(如下图),连接成功会在下方的窗口中提示Connect Success。
下载插桩后的工程项目(如下图)。
开始对被测工程项目进行覆盖测试,在测试结果的覆盖率页面(如下图)可以查看到每个函数的覆盖率统计结果,打开其中的一个函数,查看代码的测试覆盖情况,未覆盖到的代码会以红色字体高亮显示。
结语
逻辑覆盖测试与统计工具的使用,使得逻辑覆盖率统计成为可能。在工程中的实践表明,逻辑覆盖测试工具能大大提高测试用例设计的针对性,有效地弥补墨盒测试的不足。CuttleITE逻辑覆盖测试与统计工具,以其最小的插桩开销、友好的操作界面,大大提高了测试效率。