
啊胡
2022/09/12阅读:194主题:自定义主题1
白盒测试之 程序插桩
在软件白盒测试中,程序插桩
是一种基本的测试手段,有着广泛的应用。
程序插桩
是借助向被测程序中插入操作,来实现测试目的的方法,即向源程序中添加一些语句,实现对程序语句的执行、变量的变化等情况进行检查。
在调试程序时,常常要在程序中插入一些打印语句。其目的是希望在执行程序时,打印出测试人员最为关心的信息,然后进一步通过这些信息了解程序执行过程中的一些动态特性(比如,程序的实际执行路径,或是特定变量在特定时刻的取值)。程序插桩能够按用户的要求,获取程序的各种信息,成为测试工作的有效手段。
例如,想要了解一个程序在某次运行中所有可执行语句被覆盖的情况,或是每个语句的实际执行次数,就可以利用程序插桩技术。这里仅以计算整数X和整数Y的最大公约数程序为例,说明程序插桩技术的要点。下图所示为这一程序的流程图,图中虚线框部分并不是源程序的内容,而是为了记录语句执行次数而插入的计数语句,其形式为:

程序从入口开始执行,到出口结束。凡经历的计数语句都能记录下该程序点的执行次数。如果我们在程序的入口处还插入了对计数器C(i)初始化的语句,在出口处插入了打印这些计数器的语句,就构成了完整的插桩程序,它便能记录并输出在各程序点上语句的执行次数。下图所示为插桩后的程序,图中箭头所指均为插入的语句(源程序语句略)。

通过插入的语句获取程序执行中的动态信息,这一做法如同在刚研制成的机器特定部位安装记录仪表一样。安装好以后开动机器试运行,除了可以对机器加工的成品进行检验得知机器的运行特性外,还可通过记录仪表了解其动态特性。这就相当于在运行程序以后,一方面可检测测试的结果数据,另一方面还可借助插入语句给出的信息了解程序的执行特性。
正是这个原因,有时把插入的语句称为“探测器
”,借以实现“探查”和“监控”的功能。在程序的特定部位插入记录动态特性的语句,最终是为了把程序执行过程中发生的一些重要历史事件记录下来。
例如,记录在程序执行过程中某些变量值的变化情况、变化的范围等。又如程序逻辑覆盖情况,也只有通过程序的插桩才能取得覆盖信息。
设计插桩程序时需要考虑的问题如下。
• 探测哪些信息?
• 在程序的什么部位设置探测点?
• 需要设置多少个探测点?
• 如何在程序中特定部位插入某些用以判断变量特性的语句?
其中第1个问题需要结合具体情况解决,并不能给出笼统的回答。
至于第2个问题,在实际测试通常在下面一些部位设置探测点。
• 程序块的第1个可执行语句之前。
• for、do、do while、do until等循环语句处。
• if、else if、else及end if等条件语句各分支处。
• 输入/输出语句之后。
• 函数、过程、子程序调用语句之后。
• return语句之后。
• goto语句之后。
关于第3个问题,需要考虑如何设置最少探测点的方案。例如,如果想要在程序入口处,记录语句Q=X和R=Y的执行次数,只需插入C(1)=C(1)+1这样一个计数语句就够了,没有必要在每个语句之后都插入一个计数语句。
在一般的情况下,在没有分支的程序段中只需一个计数语句。但程序中如果出现了多种控制结构,使得整个结构十分复杂,则为了在程序中设计最少的计数语句,需要针对程序的控制结构进行具体的分析。
第4个问题是如何在程序中特定部位插入断言语句。在应用程序插桩技术时,可在程序中特定部位插入某些用以判断变量特性的语句,使得程序执行中这些语句得以证实,从而使程序的运行特性得到证实,一般把插入的这些语句称为断言语句。这一作法是程序正确性证明的基本作法,尽管算不上严格的证明,但方法本身仍然是很实用的。
作者介绍
