一句话:提出 DDSET,用输入文法将单个失败输入泛化为抽象失败输入,用于诊断失败条件并生成更多测试。
论文研究程序失败在何种输入条件下发生。给定一个引发失败的具体输入和输入文法,DDSET 通过系统化测试自动将该输入泛化为抽象失败输入:其中既包含具体终结符,也包含来自文法的抽象非终结符,例如将 ((4)) 泛化为 (( )),表示任意双重括号表达式。这种抽象失败输入有两种用途:一是作为调试诊断,刻画失败发生的条件;二是作为生成器,产生更多引发失败的测试,以帮助设计并验证修复方案。作者在 JavaScript、Clojure、Lua 和 UNIX 命令行工具的真实缺陷上进行评估,结果表明 DDSET 的抽象失败输入能提供切中要点的诊断,并精确生成后续失败输入。
A program fails. Under which circumstances does the failure occur? Starting with a single failure-inducing input ("The input ((4)) fails") and an input grammar, the DDSET algorithm uses systematic tests to automatically generalize the input to an abstract failure-inducing input that contains both (concrete) terminal symbols and (abstract) nonterminal symbols from the grammar—for instance, "(( ))", which represents any expression in double parentheses. Such an abstract failure-inducing input can be used (1) as a debugging diagnostic, characterizing the circumstances under which a failure occurs ("The error occurs whenever an expression is enclosed in double parentheses"); (2) as a producer of additional failure-inducing tests to help design and validate fixes and repair candidates ("The inputs ((1)), ((3 * 4)), and many more also fail"). In its evaluation on real-world bugs in JavaScript, Clojure, Lua, and UNIX command line utilities, DDSET’s abstract failure-inducing inputs provided to-the-point diagnostics, and precise producers for further failure inducing inputs.