将代码注释转换为过程规范

引用:Arianna Blasi, Alberto Goffi, Konstantin Kuznetsov, Alessandra Gorla, Michael D. Ernst, Mauro Pezzè, and Sergio Delgado Castellanos. 2018. Translating Code Comments to Procedure Specifications. In Proceedings of 27th ACM SIG- SOFT International Symposium on Software Testing and Analysis (ISSTA’18). ACM, New York, NY, USA, 12 pages. https://doi.org/10.1145/3213846.3213872.
摘要过程规范在许多软件开发任务中很有用 。例如,在自动生成测试用例的过程中,它们可以指导测试,充当能够发现错误并识别非法输入的测试先知 。尽管实际上很少有正式的规范,但是对于开发人员来说,使用半结构化注释来记录其代码是标准做法 。这些注释通过预定义标签和自然语言的组合来表达过程规范 。本文介绍了 Jdoctor,该方法结合了模式,词法和语义匹配,将 JAVAdoc 注释转换为以 Java 表达式编写的可执行过程规范 。在实证评估中,将 Javadoc 转换为过程规范时,Jdoctor 的精度达到 92%,召回率达到 83% 。
我们还将 Jdoctor 衍生的规范提供给自动测试用例生成工具 Randoop 。规范使 Randoop 能够生成测试案例,从而减少误报并揭示更多缺陷 。
1 简介程序规范表达了预期的程序行为,因此可以启用或自动化许多软件工程任务 。在软件测试中,它用作确定哪些输入合法和哪些输出正确的预言 [4, 17, 31, 37] 。在调试中,它标识错误的语句 [29, 54] 。在代码合成中,这是合成器致力于的目标 [28, 47] 。在重构中,它确保转换是一致的 [23] 。在形式验证中,它区分正确和错误的实现 [53] 。在运行时监视中,它可以识别异常行为 [15] 。自动化(部分)任务需要工具可以操纵的机器可读格式 。正式的规范很好地达到了这个目的 。但是,很少有正式的规范,因为编写规范不是常见的软件开发实践 。
? 相比之下,非正式规范很容易以自然语言编写的半结构化和非结构化文档的形式提供 。程序员在过程文档中指定前提条件、后置条件和特殊行为是标准做法 。Javadoc 标记语言和工具于 1995 年在 Java 的第一个版本中出现,而类似但跨语言的工具 Doxygen 在 2 年后出现了 。Java IDE 会自动插入 Javadoc 注释的模板 。最重要的是,程序员已经习惯于编写这些注释 。结果,大量代码包含了非正式的 Javadoc 规范 。但是,软件工程工具很少使用这些非正式规范 。
? 本文介绍了 Jdoctor,它是一种从程序员已经创建的工件(即 Javadoc 代码注释)自动构建可执行过程规范的技术,而无需程序员更改开发实践或做额外的工作 。可执行规范是可以执行的规范,例如,因为它是用编程语言而不是其他某种逻辑编写的 。它也需要在过程上表达,而不是(例如)声明性地要求某些值的存在而不指示如何计算它 。由 Jdoctor 生成的过程规范可用于多种软件工程任务中,例如自动生成测试用例,如本文所示 。
1.1 应用:测试用例生成自动生成测试用例可以降低开发成本和软件故障的社会成本 [5, 27, 44] 。要自动生成测试用例,测试生成器必须生成一个输入,该输入使被测程序执行某些操作,并生成一个 oracle 以确定程序是否正常运行 。
? 创建准确的测试 Oracle 仍然是一个未解决的问题 。正如我们现在所解释的,这将导致测试生成器同时遭受错误警报(当被测程序正确时测试失败)和错过警报(当被测程序有错误时测试通过) 。例如,假设自动生成的测试中的方法调用引发了异常 。抛出此异常并不一定意味着所测试的方法有错误 。存在以下可能性:
(1)引发的异常实际上揭示了实现缺陷 。一个示例是在主题程序中触发断言,或者以其他方式无法完成所请求的操作 。
(2)抛出异常是预期的、期望的行为 。一个示例是在不可变对象上调用变量时发生的IllegalOperationException 。
(3)引发的异常是允许的,但不是必需的行为 。例如,如果二进制搜索例程的参数数组未排序,则其行为不确定 。允许引发任何异常或返回与搜索到的元素是否在数组中不一致的结果 。
在没有规范的情况下,测试生成工具可以使用试探法来猜测给定行为是正确还是不正确 。一种试探法是,如果某个方法的参数之一为null,则以NullPointerException结尾的方法执行被认为是正确的,而不管是否可能将其视为可接受行为的特定要求 [40] 。另一试探法是使用回归预言,它认为正确的行为是受测试软件的早期版本所暴露,并且认为任何其他行为是错误的,即使其他行为也为软件设计人员所接受 [19] 。
? 这些猜测还会导致误报或警报遗漏,其中该工具无法报告暴露出错误行为的测试 。当调用应该引发异常但失败时,或者调用引发异常但工具试探性地忽略该异常以避免错误警报时,可能会发生这种情况 。


推荐阅读