Understanding Self-Admitted Technical Debt in Test Code: An Empirical Study
这项实证研究调查了 50 个仓库中测试代码中自我承认的技术债务(SATD)的分布、类型及其与测试质量的关系,揭示了尽管 SATD 非常普遍且有别于生产代码中的 SATD,但它与测试异味(test smells)并无直接关联,并证明了基于 CodeBERT 的模型能有效对这些债务类型进行分类以实现更好的管理。
原始论文采用 CC BY 4.0 许可(http://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明
将软件开发想象成建造一座宏大且复杂的房屋。有时,为了赶上截止日期或快速搭建出原型,建造者(开发者)会采取一些捷径。他们可能会使用临时门而不是坚固的门,或者留下一个未完成的房间,并在墙上贴一张便签,上面写着:“稍后修复此项。”在编程世界中,这些捷径被称为技术债(Technical Debt),而这些便签则被称为自我承认的技术债(Self-Admitted Technical Debt, SATD)。
多年来,研究人员一直在研究这些便签,但他们大多只关注贴在客厅墙上(主生产代码)的便签。他们很大程度上忽略了贴在蓝图和检查清单上(测试代码)的便签。这篇论文决定终于清理一下工具箱,专门观察测试代码中发现的这些便签。
以下是研究人员的发现,用通俗易懂的方式进行了解释:
1. 便签无处不在(甚至在测试室里)
研究人员查看了 50 个不同的软件项目(就像 50 个不同的房屋社区)。他们发现,虽然测试代码中的便签比主代码少,但仍然有很多——他们发现的所有便签中,约有 15.6% 位于测试代码中。
类比: 如果主代码是房屋的结构,那么测试代码就是检查员的清单。研究发现,检查员在清单上写下“稍后检查此项”的可能性,与建造者在墙上写便签的可能性一样高。这并非微不足道、可以忽略不计的小事;这是一项重要的工作量。
2. 便签与“气味”并不匹配
在软件领域,有一些自动化工具可以嗅出测试代码中的“异味”——比如一个测试太长、过于复杂或不稳定(有时通过,有时失败)。这些被称为测试异味(Test Smells)。
研究人员想看看这些便签(SATD)是否通常出现在这些“异味”旁边。
- 发现: 令其惊讶的是,并没有。便签和异味通常出现在不同的地方。
- 类比: 想象一位房屋检查员。“异味”就像是地下室里的霉味(一种结构性问题,由机器检测到)。而“便签”就像是一张手写的笔记,上面写着“我还没完成这面墙的粉刷”。研究发现,出现霉味的地方并不一定是出现未完成粉刷笔记的地方。开发者标记出的问题,正是自动化“嗅探”工具所遗漏的问题。
3. 这些便签到底在说什么?
团队通过人工阅读了 506 条此类测试代码便签,以弄清楚开发者到底在抱怨什么。他们将这些内容分成了 20 种不同的问题类型,并归纳为 5 个主要类别:
- 生产相关问题: 笔记内容如:“如果在此 Windows 上运行,此测试将失败,”或“我无法完成这个测试,因为主代码有一个 Bug。”
- 不完整的测试: 最常见的笔记:“我开始了这项测试,但在编写检查结果是否正确的最后部分时停止了。”
- 糟糕的设计/权宜之计: 笔记内容如:“因为代码过于封闭,我不得不使用一个拙劣的技巧来让这个测试生效,”或“这个测试写得很笨拙。”
- 维护: 笔记内容如:“这个测试不稳定(flaky),”“我们需要针对新软件版本进行更新,”或“这个测试没用了,删掉它。”
- 疑问: 笔记内容如:“这个测试到底是干什么的?”或“我真的需要这个睡眠定时器吗?”
核心结论: 大多数这类笔记都关于未完成的工作。开发者经常编写了一个测试,但在添加最后的检查步骤前就停止了,并留下一个便签以便稍后完成。
4. 机器人能读懂这些笔记吗?
研究人员尝试教计算机阅读这些便签,并自动将它们分类。他们尝试了几种不同的“大脑”(算法),包括一些非常先进的基于人工智能(AI)的模型。
- 获胜者: 一个名为 CodeBERT 的专门 AI 模型表现最好。它能以约 70% 的准确率识别出债务类型。
- 惊喜: 一个更新、更强大的 AI(GPT-4)实际上在发现那些罕见且古怪的笔记方面表现更好,即使它在整体一致性上不如前者。
- 问题: AI 在处理“失败(Failures)”类别(关于测试失败的笔记)时最吃力。这部分是因为在他们的数据中,这类笔记的样本非常少,导致机器人很难学习其中的模式。
总结
这篇论文告诉我们,测试代码拥有其独特的“未竟之事”,这与主代码不同。 开发者正在记录关于不完整测试、糟糕设计和不稳定结果的笔记,而自动化工具并未捕捉到这些问题。虽然我们现在可以使用 AI 来帮助分类这些笔记,但这项技术仍需更多练习,尤其是在处理那些罕见且棘手的笔记时。
主要的教训是:不要忽视测试清单上的便签。 它们揭示了软件中另一种不同类型的混乱,而这种混乱需要不同类型的清理工作。
您所在领域的论文太多了?
获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。