当前位置: 首页 > 科技观察

Google如何实现10亿行代码的测试覆盖率?

时间:2023-03-12 01:01:07 科技观察

谷歌研究人员进行了一项分析,揭示了该公司的工程师如何管理10亿行代码的代码测试覆盖率。这张图片来自谷歌,其中彩色行号(用红色矩形突出显示)用于可视化代码覆盖率。如果被测试覆盖,则行号为绿色,如果未被覆盖,则为橙色,如果行未检测,则为白色。在软件开发中,一个称为代码覆盖率的通用指标衡量系统代码在部署代码之前执行的测试所覆盖的百分比。代码覆盖率通常由单独的软件程序自动测量,或者可以从命令行手动启动一些代码覆盖率工具。测试结果准确地显示了测试套件运行时执行了哪些代码行,并且可以揭示哪些代码行可能需要进一步测试。理想情况下,软件开发团队的目标是100%的代码覆盖率。但在现实中,这种情况很少发生,因为有些代码块会走很多不同的执行路径,而且由于各种边缘情况,根据系统的需要,应该(或不应该)考虑这些边缘情况。近年来,越来越多的谷歌项目非常积极地引入自动化代码覆盖率测试工具。衡量代码覆盖率已成为软件开发和测试团队的普遍做法,但这种做法是否真的能提高代码质量仍有争议。一些人认为,开发人员可能关注数量而不是质量,创建测试只是为了满足代码覆盖率,而不是足够健壮以识别代码的高风险或关键区域。其他人对其成本效益表示担忧——它需要开发人员宝贵的时间来审查结果,而且不一定会提高测试质量。对于像Google这样的大型组织(拥有10亿行代码,每天收到数万次提交,并支持七种编程语言),衡量代码覆盖率尤其困难。谷歌人工智能研究人员MarkoIvankovi?和GoranPetrovi?最近的一项研究提供了对这家科技巨头代码覆盖基础设施的幕后观察,该基础设施由四个核心层组成。底层结合了为每种编程语言设计的代码覆盖库,中间层将代码覆盖自动化流程集成到公司的开发和构建工作流程中。顶层使用代码编辑器和其他自定义工具来可视化代码覆盖率信息。作为这项研究的一部分,Ivankovi?和Petrovi?分析了5年期间的代码覆盖率采用率。他们发现,虽然谷歌没有强制执行代码覆盖率,但自2014年以来采用率稳步增长。2018年第一季度,超过90%的项目使用了自动化代码覆盖率工具。研究人员还从3,000名随机选择的Google开发人员和其他非工程师那里收集了512份关于代码覆盖有用性的问卷。在受访者中,只有45%的人在进行代码更改时经常使用代码覆盖率测试,而40%的人在进行代码审查时经常使用代码覆盖率。图表示例:来自Google的调查参与者对代码覆盖率在修改代码(红色)、检查代码更改(蓝色)和浏览代码更改(绿色)时的有用性进行了评分。Ivankovi?向IEEESpectrum介绍了他们的研究以及代码覆盖率在软件开发和测试中的作用。(为了清楚起见,下面的采访记录已经过编辑和压缩。)IEEESpectrum:为什么您认为代码覆盖率很重要?MarkoIvankovi?:很多人可能希望我们说,“良好的覆盖率可以减少错误的数量。”这当然是其中一个原因,但更令人惊讶的是(我们发现)覆盖范围值得计算,即使它不能直接作为质量信号。“覆盖率可能对查看代码的人没有直接帮助,但它仍然对工具有帮助——例如,分析依赖关系的工具。例如,如果代码A声明它依赖于代码B,但测试代码A永远不能触及代码B,那么这种依赖可能不是真实的,自动化工具可以尝试去除它以简化代码库。当然,实际实现要复杂得多。我们已经找到了很多这样的工具可以使用我们的基础设施提供改进自己的功能。对于许多这样的用例,代码覆盖率和代码质量之间的相关性根本不重要。IEEESpectrum:是什么启发你研究谷歌的代码覆盖率?Ivankovi?:因为我们面临一个问题。在代码审查期间,我们花了很多时间试图弄清楚,如果测试实际上测试审查过的代码。那时候,代码构建系统支持覆盖率计算,但你必须手动激活它,并手动覆盖封面ge结果与您正在审查的代码。有一天我们对自己说,“必须有一种自动化的方式。”一周后,我们有了第一个工作原型。其他工程师看到了它,问他们是否也能有一个。我们想确保为他们提供最好的体验,因此我们开始对此进行研究。IEEESpectrum:您的调查结果最让您感到惊讶的是什么?Ivankovi?:我们对最初对代码覆盖方法持怀疑态度但最终发现它有用的人数之多感到惊讶。我们调查的一些人基本上是反覆盖的,但他们仍然承认他们有时会使用覆盖方法并且觉得它有用。IEEESpectrum:您在研究中面临的最大挑战是什么?你是如何克服它的?Ivankovi?:从表面上看,代码覆盖率似乎是一个简单的概念:一行代码是否被测试覆盖。但事实证明,在大规模实施时,它充满了极端案例和惊喜。我们花了几年时间才修复测试基础设施中的所有故障。我们在进行研究时遇到了类似的挑战。我们调查的大多数工程师对覆盖范围的总体想法是相同的,但当被问及细节时,他们的回答却千差万别。我们必须对一小群人进行多次调查才能得到正确的答案。IEEESpectrum:您认为Google的代码覆盖基础架构有哪些优势?您认为哪些方面可以改进?Ivankovi?:我们努力确保基础设施资源得到有效利用,并能以谷歌的代码规模运行。向人们展示这是可能的可能是(我们研究的)最大贡献。我们设计我们的基础架构,以便更轻松地进行实验、A/B测试和评估假设。我们还以可访问的格式导出所有数据,以便可视化覆盖信息,这有助于团队维护健康的代码并准备好修复事件。我们在调研工程师的时候,有的给了我们改进的建议,有的是值得探讨的。一种更有趣的方法是,如果代码覆盖率测试结果太好,则不显示它们,这样工程师就不会过于自信。IEEESpectrum:对于寻求部署代码覆盖率或改进现有代码覆盖率的软件开发和测试团队,您有什么建议?Ivankovi?:我认为可以给出的最重要的建议是关注他们的工作流程。不要只是部署覆盖率测试,确保将它们集成到开发人员工作流程中覆盖率结果最有用的正确位置。根据我们的经验,代码审查是代码健康的基石。IEEESpectrum:谷歌代码覆盖基础设施的未来是什么?Ivankovi?:目前,我们正在进一步研究数据使用情况和开发人员的意见,以更好地了解覆盖率的使用方式。例如,我们正在研究感知有用性和实际有用性之间的差异。我们想要调查的一个具体问题是,“在代码审查期间,显示覆盖率是否真的加快了审查过程?”这项研究的结果将决定下一步如何改进我们的基础设施。