断言语句
考试要求: 掌握     
知识路径:  > 测试技术的分类  > 白盒测试技术  > 白盒测试基本技术  > 程序插桩技术


 
       在程序中的特定部位插入某些用以判断变量特性的语句,使得程序执行中这些语句得以证实,从而使程序的运行特性得到证实。我们把插入的这些语句称为断言(assertions)。这一作法是程序正确性证明的基本步骤,尽管算不上严格的证明,但方法本身仍然是很实用的。下面以求两个非负数NUM和DEN之商的Wensley迭代算法为例,对断言语句的作用作一简要说明。
       假定两个非负数中,NUM小于M(即所得之商小于1),算法中只用到加、减及除2的运算。该迭代算法的程序如下图所示。
       
       计算两非负数之商的迭代程序
       从程序中可以看出,在每次迭代中由分母得到的变量B以及权增量W都要缩小一半,而且变量A随着迭代次数的增加将接近分子。这些粗略的观察和分析可以用以下4个断言语句表达,在每次迭代开始时4个断言必定为真:
       ①W =2-K(K是迭代次数,并且K≥0);
       ②A=DEN*Q;
       ③B=DEN*W/2;
       ④NUM/DEN-W
       此外,我们还看出,在循环外W
       NUM/DEN-E
       它和上面的第④断言很相似。
       假定我们所用的编译系统能够处理表达式形式的断言语句,插入断言以后的程序如下图所示。其中带有标记@的语句是断言语句。新增加的变量K只是在计算第①断言时用到。
       
       插入断言后的迭代程序
       首先来检验在初始化以后循环后的断言。
       ①由于K=0,所以是初值。W=2-K=1。
       ②由于Q=0,A的初始A=DEN*Q=0。
       ③将W的值代入DEN * W/2,则得B的初值:B=DEN/2。
       ④我们曾假定0≤NUM
       以上说明了这些断言在初始状态下为真。如果继续迭代,要证明断言为真,就必须证明无论if-then结构中执行什么路径这些断言都为真。我们先来考虑在初始测试中NUM-A-B≥0为假,即检验失败,然后给出程序向量的新值(A′,B′,W′,Q′和K′),我们有:
       A*=A
       B*=B/2
       W*=W/2
       Q*=Q
       K*=K+1
       再来检验4个断言:
       ①W*=W/2=1/2 ** K*
       ②A*=A=DEN*Q=DEN*Q*
       ③ B*=B/2=DEN * W/4=DEN* W*/2
       ④把A和B代入(NUM-A-B<0),得到NUM-DEN * Q-DEN * W/2<0,对此关系式两端除以DEN,并加Q,得到,由于Q′=Q, W′=W/2,我们有NUM/DEN-W**,且Q≤NUM/DEN。
       如果if-then检验成立,再来看4个断言。使用A″,B″,W″,Q″和K″作为新的程序向量,我们有:
       ①W′=W/2=1/2 ** K"
       ②A"=DEN * Q+DEN * W/2=DEN *(Q+W/2)=DEN * Q"
       ③ B″=B/2=DEN * W/4=DEN * W″/2
       ④代入(NUM-A-B ≥ 0),并作同前的变换,得到NUM/DEN - W″/2
       总之,无论执行哪一路径,在每一迭代的开始,4个断言均为真。尽管并未考虑输出断言,但是我们知道,第④断言成立,由于W
 

更多复习资料
请登录电脑版软考在线 www.rkpass.cn

京B2-20210865 | 京ICP备2020040059号-5
京公网安备 11010502032051号 | 营业执照
 Copyright ©2000-2025 All Rights Reserved
软考在线版权所有