On the Effectiveness of Modular Testing with EvoSuite
本文介绍了\textsc{emote},这是EvoSuite测试生成器的一个增强版本,它通过放宽对非目标设置调用的限制并优化适应度函数,提升了Java程序模块化测试的有效性,从而使目标方法的分支覆盖率提高了15.15%。
原始论文采用 CC BY 4.0 许可(http://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明
想象一下,你正在测试一台复杂机器中的某个特定部件,比如自动售货机上的“弹出”按钮。要验证该按钮是否正常工作,你首先必须将一罐汽水放入机器中。如果你试图在一台空机器上测试“弹出”按钮,它只会失败或毫无反应,而你无法从中获得任何关于该按钮应当如何工作的有用信息。
这正是论文所解决的核心问题,其使用了一种名为EvoSuite的工具。
问题:在真空中进行测试
EvoSuite 是一个自动化机器人,专为编写 Java 计算机程序的测试用例而设计。它采用“遗传算法”,这是一种类似数字进化过程的方法:它生成成千上万个随机测试场景,观察哪些效果最佳,然后将它们混合以创造出更优的测试用例。
然而,当研究人员指示 EvoSuite 仅孤立地测试一个特定方法(单个函数)时,它遇到了障碍。该机器人被施加了一条严格规则:“你只能构建对象,然后立即按下目标按钮。禁止在此之前执行任何其他操作。”
类比:
想象一位厨师(EvoSuite)试图测试某个特定食谱步骤(目标方法)是否有效。厨师被告知:“你只能将平底锅放在炉灶上并翻转煎饼。在此之前,你不能加油、不能打鸡蛋,也不能打开炉火。”
- 结果: 煎饼会烧焦或粘在锅上。测试失败并非因为翻转技巧不佳,而是因为厨师未被允许事先准备好平底锅。
- 现实影响: 在论文的示例中,一个名为
checkConsistency的方法总会失败,因为机器人在运行检查之前未被允许设置必要的数据(例如名称或类型)。机器人持续测试空泛且损坏的对象。
解决方案:"emote"
作者伊丽莎白·迪内拉(Elizabeth Dinella)创建了一个名为emote(基于 EvoSuite 的有效模块化测试)的新版本工具。
发生了什么变化?
- 放宽规则: emote 告诉机器人:“你可以使用设置步骤。”就像开发人员手动编写测试一样,机器人现在被允许调用辅助方法(如
setName或setType),以便在测试目标之前将对象置于工作状态。 - “模糊驱动”的灵感: 论文指出,人类开发人员早已这样做。他们会编写“模糊驱动”(测试脚本),在主事件发生前搭建舞台。emote 只是将这种人类直觉自动化了。
转折:避免“作弊”
这里有一个陷阱。如果允许机器人使用任何设置方法,它可能会找到捷径。
类比:
想象你想测试某个特定的门锁是否有效。
- 作弊: 机器人找到一把能从外部开门的万能钥匙,或者找到一扇通向同一房间的后门。它声称:“我打开了门!”但它从未真正测试你想要检查的那个特定锁。
- 修正: 研究人员调整了机器人的“记分牌”(适应度函数)。现在,只有当路径直接从目标方法开始时,机器人才会因覆盖代码的某些部分而得分。如果辅助方法意外触发了目标代码,这些分数不计入。这迫使机器人真正去按下它被指派测试的那个特定按钮。
结果
团队在一系列真实的 Java 项目(称为 SF100)上测试了这种新方法。
- 结果: 通过允许机器人正确搭建舞台,测试的有效性显著提高。
- 数据: 新工具 emote 将目标方法的覆盖率提高了15.15%。在某些项目中,覆盖率从几乎为零提升至覆盖所有可能路径的 100%。
- 意义: 这证明了最初的严格规则限制了机器人的能力。通过让它更像人类开发人员那样行事(先设置状态),它能够发现更多缺陷,并更好地验证代码。
总结
该论文主张,自动化测试工具不应如此僵化,以至于阻碍必要的“准备”步骤。通过允许测试机器人在主要事件发生前搭建场景,并确保它不会通过间接方式“作弊”地触及目标,该工具在其职责上的表现将显著提升。
您所在领域的论文太多了?
获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。