在实现覆盖测试的过程中,通常需要知道某些信息,例如执行可执行语句(即覆盖)的情况,程序执行的路径,变量的引用和定义。
为了获得这样的信息,有必要跟踪被测程序的执行过程,或者在执行被测程序期间由计算机自动记录。
前者需要人工进行,效率低,无聊;后者需要插入代码来完成被测程序中的相应工作,即代码插入技术。
今天的大多数覆盖测试工具都使用代码堆叠技术。
在测试常见应用程序的软件时,由于计算机配置越来越高,计算机运行得越来越快,代码检测引起的问题并不明显或在可接受的范围内。
。
但对于嵌入式软件来说,这是一个致命的问题。
由于嵌入式系统具有有限的系统资源(小内存,较少的I / O通道等),过多的代码扩展速率将使程序无法在嵌入式系统中运行;同时,嵌入式软件通常具有很强的实时性能。
程序的输出仅在有限的时间内有效,并且“正确”的输出仅在有限的时间内有效。
迟到的结果是无用的,甚至变得错误和有害。
代码检测技术可能破坏程序的时间特性等,从而导致软件执行错误。
因此,我们需要更高效的代码检测技术来完成覆盖测试,尤其是嵌入式软件的覆盖测试。
由于程序检测技术将探针插入到被测程序中,然后通过执行探针获得程序的控制流程和数据流信息,从而实现了测试的目的。
因此,根据探针插入的时间,可以分为目标代码检测和源代码检测。
(1)目标代码检测的前提是转到目标代码:执行必要的分析以确定检测的位置和内容。
由于目标代码的格式主要与操作系统有关,并且与特定的编程语言和版本无关,因此它已被广泛使用,特别是在需要监视存储器的软件中。
但是,由于目标代码中的语法和语义信息不完整,并且仪器技术需要对代码词法语法的分析有很高的要求,因此源代码通常用于覆盖测试工具中。
(2)源代码检测是基于对源文件的完整分析:词法分析和语法分析,确保源文件的检测能够实现高精度和针对性。
但是,源代码检测需要暴露给源代码,这会使工作负载变大,并且需要修改,因为编码语言和版本不同。
在下文中,我们引用了仪器的程序,它指的是源代码检测。
(1)仪器的位置:探头的植入应紧凑,精确,以确保所收集的信息全面无冗余,降低了代码的扩展速度。
因此,当确定仪器的位置时,程序被分割,并且基本分割方法基于“块”。
结构体。
根据块结构的划分,在以下情况下植入探针:a。
该计划的第一份声明;湾分支声明的开头; C。
循环语句的开始; d。
下一个条目陈述前的陈述; e。
该计划的最终声明; F。
分支声明的结尾; G。
循环语句的结尾;另外,根据覆盖测试的要求,仪器的位置,除上述情况外,覆盖测试要求的变化也有变化。
(2)仪表策略:仪表策略是解决“如何插入”的问题。
传统的检测策略是在需要检测的所有位置插入探针,在程序操作期间收集所有可能的程序信息,并将它们写入数据库进行分析和处理。
该方法将导致大量程序的大量工作,低效率和大的代码扩展速率。
每次根据不同的测试要求插入不同的探针,采用相应的仪器策略,降低了代码的扩展速度,保证了程序执行的效率。
以下是几种探针的仪器策略的简要介绍。
语句覆盖探测器(基本块探测器):在基本块的入口和出口处,分别植入相应的探针以确定在执行程序时是否覆盖基本块。
分支覆盖探测:在C / C ++语言中,分支由分支点确定。
对于每个分支,在开始时植入相应的探针以确定在执行程序时是否覆盖分支。
条件覆盖探测:在C / C ++中,if,swich,while,do-while,对于几个语法结构支持条件决策。
探针被植入用于变量跟踪的每个条件表达式的布尔表达式中。
取一个值来确定它的涵盖范围。
根据不同的测试要求,采用未使用的插入策略,每次在不同的位置植入相应的探头,每次仅植入有限数量的探头,大大降低了编码的扩展比和速度。
插入的桩。
。
使用1000行程序作为待测程序。
使用集成仪器和我们自己开发的工具的工具用于测试结果。
结果表明,前者的时间和代码扩展率分别为3s和35%。
堆的平均时间和平均代码扩展率分别为1s和8%,仪器时间显着提高,代码扩展率显着降低。
使用上述程序插入技术,除了通常的覆盖测试策略外,我们还可以实现MC / DC和LCSAJ测试。