软件编译 - 简化错误

作为一个有情操的测试,目标不能局限在找到问题,而是要能够精确的定位问题。在面对一大篇代码的时候,不能直接翻着白眼去找技术说,这一页里面有错,一怎么怎么执行就死了。。那样你也只能得到技术的白眼, 最好能精确的告诉技术,是具体的那一行导致的程序执行失败,这样技术也才有信念帮你解决问题。别忘了我们的目标是Get Work Done。

简单的结果能够更有效的解释事情也有助于他人更简单的理解你要说的东西。简化的过程嘛,就是一次判断问题的每一个条件是否于错误的发生有关系,如果没有关系就删除掉。最后剩下的就是导致问题出现的原因了。

测试过程中,我们当然可以手动的来做这件事,一部分一部分的排除。不过我们想要的是自动化,一个按键就解决问题。策略+自动化测试 就能完成这一点。

这里介绍一个算法 DELTA DEBUGGING:

  1. 将输入分成n个子集(n为粒度,初始值n=2)
  2. 如果任何一个子集没有通过测试代码,继续分解这个子集,设置n=max(n-1, 2),重复这个步骤。
  3. 否则(所有子集都通过测试),提高粒度 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的时候,要确定他首先是一个错误,然后是它导致了程序失败。

更多文章请访问我的博客,谢谢。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,777评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,843评论 25 709
  • 在 OpenGL ES 中你必须创建两种着色器:顶点着色器 (vertex shaders) 和片段着色器 (fr...
    城市之光阅读 3,717评论 0 0
  • 如果有一个机会,可以让你还原到20年前,你会还原吗? 刚刚热映的汤姆.汉克斯主演的《但丁密码》是继《达芬奇密码》之...
    拾青阅读 1,722评论 0 0
  • 关于信任的主题着着实实地通过某些事甩在我面前。例如昨天朋友邀请我为女儿治疗的事勾起了我对付出的谨慎,信任瘫踏的往事...
    爱若嘉阅读 1,885评论 0 1