Chinaunix首页 | 论坛 | 博客
  • 博客访问: 20634
  • 博文数量: 5
  • 博客积分: 301
  • 博客等级: 二等列兵
  • 技术积分: 80
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-12 21:22
文章分类

全部博文(5)

文章存档

2011年(5)

我的朋友

分类: 项目管理

2011-08-26 10:28:16

首先给大家介绍一种测试思想,model checking,前一段时间试用了一下不过还没有机会应用到项目上,有兴趣的同学可以一起研究,以下是的model checking的介绍和一个例子。

 

软件测试(ST)是通过特定的测试方法用一些输入(inputs)执行待测程序(SUT)去检查SUT的行为是否正确。在这个过程中牵扯到两个部分的选择:输入的数据和测试预期结果。

 

测试方法的不同在于我们如何选择输入的数据(比如随机,边界值等),我们对SUT了解的程度以及执行测试的环境(black/grey/white box),这些因素决定了如何定义以及验证这些正确的行为。这些也就引起了学术上的猜想,就如Edsger说的:program testing can at best show the presence of errors but never their absence我们通常通过运行“足够”的测试来补偿这种猜想。但是对于测试一个复杂的系统就像大海捞针一样,如果是一个很有经验的测试人员可能很容易找到bug,如果不是,也不用担心,早晚有一天用户也会发现的。

Model checking不是基于猜想。至少从理论上讲,如果有违反的行为,model checking可以找到。Model checking致力于暴露程序的所有可能的行为。

下面我们用随机函数来举个例子:

  1. import java.util.Random;

  2. public class Rand {
  3.      public static void main (String[] args) {
  4.           Random random = new Random(42); // (1)

  5.           
  6.           int a = random.nextInt(2); // (2)

  7.           System.out.println("a=" + a);
  8.           
  9.           //... lots of code here

  10.           
  11.           int b = random.nextInt(3); // (3)

  12.           System.out.println(" b=" + b);
  13.          
  14.           int c = a/(b+a -2); // (4)

  15.           System.out.println(" c=" + c);
  16.      }
  17. }

我们用JVM来运行这个例子,如果我们一开始不给他一个特定的值,那么会出现不同的结果,但是每次运行只能选择一个ab的值:

  1. > java Rand
  2. a=1
  3.   b=0
  4.     c=-1
  5. >

我们来看一个图形化的表示。

下面我们就来看看model checking是如何运行的,这里用到的一个利用model checking思想的测试工具-JPF

进入JPF,如果我们只是简单的运行JPF,那么结果没有什么区别,除了a会花费长一些的时间,还有b告诉我们这是一个“search”。

  1. > bin/jpf Rand
  2. JavaPathfinder v4.1 - (C) 1999-2007 RIACS/NASA Ames Research Center
  3. ====================================================== system under test
  4. application: /Users/pcmehlitz/tmp/Rand.java

  5. ====================================================== search started: 5/23/07 11:48 PM
  6. a=1
  7.   b=0
  8.     c=-1

  9. ====================================================== results
  10. no errors detected

  11. ====================================================== search finished: 5/23/07 11:48 PM
  12. >

这里的search代表着什么呢?我们可以看代码的第四行,会发现分母可能会出现0,但是这个决定于ab的值,如果我们只是在普通的JVM里面运行那么可能很难遇到这种情况。我们重新进入JVM,但是这回我们让他寻找所有可能的选择:

  1. > bin/jpf +cg.enumerate_random=true Rand
  2. JavaPathfinder v4.1 - (C) 1999-2007 RIACS/NASA Ames Research Center
  3. ====================================================== system under test
  4. application: /Users/pcmehlitz/tmp/Rand.java

  5. ====================================================== search started: 5/23/07 11:49 PM
  6. a=0
  7.   b=0
  8.     c=0
  9.   b=1
  10.     c=0
  11.   b=2

  12. ====================================================== error #1
  13. gov.nasa.jpf.jvm.NoUncaughtExceptionsProperty
  14. java.lang.ArithmeticException: division by zero
  15.         at Rand.main(Rand.java:15)
  16. ....
  17. >

通过计入参数,我们让JPF考虑所有可能的值,JPFa=0开始,然后选择b=0,得出c=0,但是不想一般的VMJPF考虑到还有其他的选择,所以他返回然后选择b=1,然后发现c=0,接着他回去试b=2,这时出现了错误。下面的图中描述了这个过程。

上面的这个简单的例子展示了testingmodel checking的区别,model checking不会停止知道覆盖了所有数据组合或者找到了一个错误。

Model checking可以找到的问题有:deadlocks, race conditions, unhandled exceptions, application-specific assertions, ...等等。

阅读(914) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~