Page 102 - 《软件学报》2025年第4期
P. 102
1508 软件学报 2025 年第 36 卷第 4 期
工编写的测试, 自动生成的测试通常可读性较差并且难以理解 [110] , 尤其是其变量名和函数名令开发者困惑 [114] . 此
外, 自动生成的测试断言有效性较差, 例如仅包含常规的断言或是不相关断言 [123] , 因而开发人员在实践中大多不
愿直接采纳 [110] . 为此, 研究者进一步尝试应用深度学习以及神经机器翻译等方法, 通过更充分地学习数据集上开
发人员编写的断言语句, 生成更加自然的断言.
Watson 等人 [124] 提出一种自动生成断言语句的方法 Atlas, 该工具利用神经机器翻译, 可以自动生成语义和语
法正确的单元测试. 为训练神经机器翻译模型生成与开发者编写风格相近的断言语句, 研究者从 GitHub 中分析了
超过 9 000 个使用 JUnit 断言类的 Java 项目, 并从相关测试方法中提取了超过 200 万个开发人员编写的断言语句
作为训练数据. 在给定的测试用例和其对应的待测方法的情况下, Atlas 可以将这些输入“翻译”为适当的断言语句.
实验结果显示在 31.4% 的情况下, Atlas 可以自动生成与开发者手动编写完全一致的断言.
为了达到和 Atlas 相同的目标, 后续 Mastropaolo 等人 [125,126] 尝试使用迁移学习的方法, 通过对一种文本到文
本转换器模型进行预训练和微调, 进而处理单元测试中的断言生成任务, 而 Yu 等人 [127] 使用信息检索技术进一步
改进 Atlas 生成的断言语句. 最近 Nie 等人提出了一种深度学习方法 TECO [128] . 与 Atlas 相比, 该工具在利用语法
层面信息的基础上, 进一步将代码语义等信息与深度学习相结合, 获得了更好的效果.
4.1.3 传统和基于学习的技术所面对的关键挑战
不同于基于循环神经网络 (recurrent neural network, RNN) 的 Atlas [124] 和 Mastropaolo 等人 [125,126] 基于文本到文
本转换器模型的技术, Tufano 等人 [129] 在富语义的英文语料库上对 BART 转换器模型进行预训练, 然后在大型代
码语料库上对模型进行半监督训练, 最后在断言生成任务上进行微调. 实验显示, 在相同的测试数据集上, 该模型
生成断言语句的 Top-1 准确率达到 62%, 相较于 Atlas 和 Mastropaolo 等人的模型分别进步了 80% 和 33%. 他们还
尝试将断言生成用于增强传统工具生成的测试用例, 发现自动生成的断言语句能够增加由 EvoSuite 生成的测试
用例的覆盖率.
Dinella 等人 [130] 发现由开发者编写的单元测试中的断言通常遵循一组常见模式. 基于此, 他们通过人工分析
并提取这些模式的分类以及对应的约束, 从而在满足句法和类型正确性的条件下, 构建了一套断言生成技术
TOGA. 具体而言, TOGA 基于待测试的程序文档字符串以及带有遮蔽断言的测试用例前缀对代码模型进行微调,
然后通过模型决定给定方法是否需要断言来测试其异常行为. 之后, 该技术应用人工预定义的断言分类法生成断
言, 并最后通过神经网络模型进行排序. 尽管 TOGA 在其实验评估中有不俗的表现, 并与 EvoSuite 集成创建了一
个端到端的测试生成工具, 最近的研究 [131] 指出了评估方法的几个缺陷, 使得其报告结果的有效性受到怀疑.
除了仅生成断言外, Tufano 等人 [132] 提出了一种基于 BART 转换器模型的自动化测试生成工具 AthenaTest. 对
于给定的测试用例, 该工具依赖启发式策略识别正在测试的焦点类和方法, 然后使用这些测试用例来微调模型, 通
过将此任务表示为将焦点方法 (以及焦点类等) 映射到测试用例的翻译任务以产生单元测试. 在基于 Defects4J 缺
陷数据库的实验中, AthenaTest 达到了与 EvoSuite 相当的测试覆盖率, 并且该工具生成的测试用例在代码风格上
接近开发者编写的测试用例, 具有更好的代码可读性.
如第 1 节所述, 大语言模型是指具有更大参数规模和预训练数据集的预训练语言模型. 上述两个 Tufano 等
人完成的工作中 [129,132] 都使用了转换器架构的预训练模型 BART, 并使用大量自然语言文本和代码片段对模型进
行预训练, 其工作原理已十分接近大语言模型. 随着算力的提升和开源语料库规模的扩展, 基于大模型的技术呼
之欲出.
尽管传统和基于学习的测试用例自动生成技术被不断改进, 这些技术仍然面临着一系列关键挑战.
(1) 基于搜索的技术由于难以将生成测试的质量和有效性可读性等方面纳入其搜索函数, 因而容易生成低质
量的测试代码. 研究显示 [123,133] , 基于搜索的技术很容易生成难以理解的断言, 并且同时测试一个焦点类中过多的
焦点方法, 或生成包含大量重复代码的测试用例, 使测试代码难以被开发者理解和维护.
(2) 基于随机变异的技术受限于庞大的突变空间, 生成的测试无法很好覆盖边际条件, 因而很难检测到需要特
定输入数据触发的缺陷. 一项研究显示 [110] , 在对需要特定的输入数据引发故障的方法生成测试用例时, 基于随机
变异的技术检测到的缺陷数量远低于基于搜索的技术.