如何减轻软件开发的回测压力?

这种方法有一个明显的缺点:它以说「是的,本测试受到影响」告终的次数比实际所需要的要多。平均而言,对于移动代码库的每项更改,该方法都会导致执行多达四分之一的可用测试。如果传递依赖于修正文件的所有测试都真正受到影响,他们将别无选择,而只能将每项测试都执行一遍。然而,在他们的单片代码库中,终端产品依赖于许多可重复使用的组件,这些组件使用一小组低级库。在实践中,许多传递性依赖实际上与回归测试无关。例如,当某个低级库发生更改时,在使用该库的每个项目上重新运行所有测试将是低效的。

软件开发研究领域也开发了其他的回归测试选择方法,例如基于静态更改-影响分析的方法。然而,由于他们代码库的大小和使用的不同编程语言的数量,这些技术在他们的使用案例中是不现实的。

一种新方法:预测性测试选择

基于创建依赖项的选择测试涉及到判断哪些测试可能受到更改的影响的问题。为了开发更好的方法,Facebook 的研究团队考虑了一个不一样的问题:指定的一项测试发现某个代码修改中的回归问题的可能性有多大果他们能估计到这个可能性,就可以做出明智的决定,来排除那些极不可能发现回归的测试。这是对传统测试选择的重大背离,并且开辟了一种新的、更有效的选择测试方法。

作为第一步,该研究团队创建了一个预测模型,该模型针对新提出的代码更改估计每项测试失败的概率。他们通过使用包括历史代码更改上的测试结果在内的大型数据集,然后采用标准的机器学习技术来创建模型,而非手动定义模型。

为此,该系统使用了标准机器学习算法的变体——梯度提升决策树模型。研究团队虽然可以使用其他机器学习算法,但其之所以选择这种方法,有几个原因:决策树是可解释的、易于训练的,并且已经是 Facebook 机器学习算法基础结构的一部分。

他们可以使用这个模型分析特定的代码更改,来找到所有传递依赖于修改文件的可能受影响的测试,然后估计测试检测到由更改引入的回归的概率。基于这些估计,系统选择对于特定更改最有可能失败的测试。下图显示了将选择哪些测试(用蓝色表示),来更改影响前一示例中的两个文件,而在前一示例中,用 0 到 1 之间的数字来表示每个被考虑在内的测试的概率。

由于代码库结构的不断演变,测试选择策略必须适应继续满足这些严格的正确性要求。然而,他们的系统让其变得简单,因为他们可以使用最近提交的代码更改的测试结果来定期地重新训练模型。

处理测试片状

为了确保他们的测试选择很好地适用于现实世界的测试,系统需要处理测试片状问题:当被测试的代码没有真正被更改时,测试结果从通过变为失败。正如他们在论文中所做的更详细的解释,如果他们训练一个模型而不去识别片状测试失败,该模型可能无法学习去一致地预测测试结果。在下面的示例中,两个测试选择策略捕获所有失败的测试执行的共同部分。如果系统不能区分哪些测试失败是片状的以及哪些不是,那么它将无法知道哪个策略是最好的。策略 A 具有明显更好的准确性,因为它捕获了所有无法发现实际回归的测试。然而,策略 B 选择了大量由于片状性而非代码的实际问题而失败的测试。

为了减轻片状性对所学到的测试选择模型的影响,研究团队在收集训练数据时积极地重新尝试失败的测试。这种方法让他们将连续失败的测试(指示真实回归)与那些呈现片状、非重现性失败的测试区分开来。

检测和固定回归:30000 英尺的视角

这个系统是研究团队创建智能工具以使代码开发过程更加可靠和高效的更广泛努力的一部分。他们的基于搜索的自动化软件测试系统 Sapienz 和自动化缺陷修复工具 Getafix,也可以帮助他们自动检测和修复回归——也就是说,这些工作仅要求工程师们投入很少的注意力甚至不投入注意力。

预测性测试选择(这篇博客文章中描述的系统)通过选择由工程师定义的正确的测试集,来高效地检测回归。Sapienz 生成新的测试序列,来发掘让移动应用程序崩溃的条件,Getafix 则为他们使用测试和验证工具所发现的问题推荐补丁,然后由编写更改的工程师检验并选择接受或拒绝这些补丁。总而言之,这些系统让工程师能够为使用 Facebook 产品的数十亿人,更快、更有效地创建和部署新特征。

未来规划

预测性测试选择是 Facebook 的数个项目中的一个,它旨在应用统计学方法和机器学习来提高回归测试的有效性。随着研究团队进一步提高系统的效率和准确性,他们也将应用相关的方法来识别测试范围中的潜在差距。

机器学习正在变革生活的方方面面。他们相信软件工程在这方面也一样。(转自人工智能)

via:Predictive test selection: A more efficient way to ensure reliability of code changes,https://code.fb.com/developer-tools/predictive-test-selection/ 

上一篇 2019年1月1日
下一篇 2019年1月1日

相关推荐