作为一个有情操的测试,目标不能局限在找到问题,而是要能够精确的定位问题。在面对一大篇代码的时候,不能直接翻着白眼去找技术说,这一页里面有错,一怎么怎么执行就死了。。那样你也只能得到技术的白眼, 最好能精确的告诉技术,是具体的那一行导致的程序执行失败,这样技术也才有信念帮你解决问题。别忘了我们的目标是Get Work Done。
简单的结果能够更有效的解释事情也有助于他人更简单的理解你要说的东西。简化的过程嘛,就是一次判断问题的每一个条件是否于错误的发生有关系,如果没有关系就删除掉。最后剩下的就是导致问题出现的原因了。
测试过程中,我们当然可以手动的来做这件事,一部分一部分的排除。不过我们想要的是自动化,一个按键就解决问题。策略+自动化测试 就能完成这一点。
这里介绍一个算法 DELTA DEBUGGING:
- 将输入分成n个子集(n为粒度,初始值n=2)
- 如果任何一个子集没有通过测试代码,继续分解这个子集,设置n=max(n-1, 2),重复这个步骤。
- 否则(所有子集都通过测试),提高粒度 n=min(2n, len(input) )。
<code>
def ddmin(s):
assert test(s) == "FAIL"
n=2
while len(s) >=2:
start =0;
subset_length = len(s) / n
some_complement_is_failing =False
while start<len(s):
complement = s[:start] +s[start+subset_length:]
if test(complement) =="FAIL":
s=complement
n = max(n-1,2)
some_complement_is_failing = True
break
start = start+subset_length
if not some_complement_is_failing:
n=min(n*2,len(s))
if n==len(s):
break
return s
</code>
DELTA DEBUGGING 不仅能用于简化错误,也能用于简化代码变更。算法返回的是导致错误的原因。但是需要注意的一点在于一个真正导致代码失败的原因是只需要该改变一点点就能够对程序有影响的,所以我们在报告bug的时候,要确定他首先是一个错误,然后是它导致了程序失败。
更多文章请访问我的博客,谢谢。