随机测试

随机测试

      TDD的好处就是我们可以用一些确定的需求自然而然的写出测试用例,进而完成源代码的创建和重构。这样做的好处不用多说,其中我的体会较深的就是,这个过程悄无声息帮你完成了测试的大覆盖率。有了高的覆盖,我们可以“自动化”定位错误并且迫使开发朝着预想的轨道走。但是这样常规的测试并不能检测出需求规范和实现的细微区别,随机的抽样就可以帮助我们做到这一点,因为其随机数的特点,为我们测试源码的非常规的问题提供了一条途径。

利用随机数

    这背后道理很简单,就是用一些随机生成的数字来驱动你的测试过程。像下面的代码,就是随机生成的数字来确定数据的顺序和参数:
	
     Random random = new Random (); 
		int count = random.nextInt (10000); 
		for (int i = 0; i < count; i++) { 
		  boolean add = random.nextBoolean (); 
		  
		if (add) { 
		    list.add (random.nextInt(list.size ()), new Integer (random.nextInt (100))); 
		  } else { 
		    list.remove (random.nextInt (list.size ())); 
		  } 
		}
通过随机的产生测试数据,总有可能碰到源代码预想不到的情况。这样也就发现了代码的隐患。

无法复现?

    如果一个测试能报出bug但是这个bug却不能复现,那确实是很遗憾觉得不明不白的。随机测试比较麻烦的就是随机产生的数值序列看似没有规律的,初次接触的人一来确实不达能摸到规律。终极武器还是得看源码!!! 其实Random生成的数值序列,都是由Seed确定的,而默认的seed是System.currentTimeMillis().解决方案也就明朗了,找到seed,因此 我们在项目这样组织随机测试的代码:
     private void doRandomOperations (long seed) throws Throwable { 
		  Random random = new Random (seed); 
		  try { 
		    // do the random operations 
		  } catch (AssertionFailedError err) { 
		    AssertionFailedError ne = new AssertionFailedError ("For seed: " + seed + " was: " + err.getMessage ());
		    throw ne.initCause (err); 
		  } 
				 
     public void testSomeNewRandomScenarioToIncreaseCoverage () throws Throwable { 
		  doRandomOperations (System.currentTimeMillis ()); 
		}
    我们在报错信息中加入seed信息后,事情就变得明朗了。  这只是第一步,我们暂且叫做定位随机错误。接下来,我们回到传统的回归测试,加入:
     public void testThisUsedToFailOnAuthorBirthday () throws Throwable { 
			  doRandomOperations (105730909304L); 
	}
    当然我们可以更进一步把测试代码写得更人性一点:把seed 翻译成具体操作的序列。这里就留给读者了。

随机但不随意

    上一节讲了随机测试进行的步奏,我们在具体的实践中如果真正做到了,这不光可以发现系统漏洞,并且可以有效的覆盖源码测试率。我们在实践中确实有这样的感觉。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值