摘要
深度学习(DL)应用程序日益普及,测试 DL 库日趋重要。与测试确定输出的通用软件(例如,将输出与 Oracle 进行相等性比较)不同,深度学习库的测试通常需要执行 Oracle 近似,即,输出允许在 Oracle 的限定范围内。然而,尚未有 Oracle 近似方面的相关研究。因此,本文研究测试四个流行的 DL 库而实施的 Oracle 近似断言。本文的研究表明,存在不可忽略的部分断言,这些断言在测试 DL 库时利用 Oracle 近似值。另外,本文通过全面的手动研究确定了正在执行 Oracle 近似的 Oracle 常见来源。此外,本文发现开发人员经常修改与 Oracle 近似相关的代码,即使用其他近似 API,修改 Oracle 或被测代码的输出,并使用不同的近似阈值。最后,本文进行了深入的研究,以了解 Oracle 逼近断言演变的原因。本文的发现揭示了随着 DL 库中代码的发展,开发人员在维护 Oracle 近似实践时可能面临的重要维护挑战。
关键字:软件质量保证,软件测试,测试深度学习库,测试 Oracle
1、 研究背景
深度学习(DL)技术被广泛应用于解决重要的现实世界问题,例如图像和语音识别以及自动驾驶汽车。由于深度学习技术的复杂性和广泛应用,从业人员构建了 DL 库,以使 DL 技术更易于应用程序开发人员访问。现代 DL 应用程序严重依赖于流行的 DL 库,例如 TensorFlow,PyTorch,Theano 和 Keras。DL 库的质量保证实践至关重要,因为它会影响基于其构建的数百万个应用程序。
但是,很少有人关注研究 DL 库中的质量保证实践(即,由 DL 库开发人员编写的测试用例)。这样的测试用例保证了 DL 库中实现的正确性。测试用例不足或质量不佳会影响 DL 库的质量。此外,从 DL 库生成的模型也可能受到负面影响。DL 库,尤其是核心算法模块,大量编码数学公式和算术运算。DL 库中的相应测试用例具有独特的属性,以前的测试用例经验研究并未对此进行研究。
测试 DL 库通常需要 Oracle 近似(简称 OA),而不是明确声明被测代码(CUT)的输出和 Oracle 之间的相等性。由于各种原因,DL 库中需要 Oracle 近似值。 DL 库中实现的输出在每次测试运行中可能会略有不同(例如,由于随机性)。对于测试预言浮动数字的情况,测试人员可能很难在代码中精确定义预言。此外,允许 CUT 的输出与计算的预言值略有不同,例如,当预言机是其他 DL 实现时(即差异测试)。Oracle 逼近是 DL 库在实现断言时采用的基本测试实践。下面是 Keras 的 OA 断言的示例。在代码段中,p 是定义的 Oracle(第 2 行)。 OA 断言(第 4 行)比较了来自二项分布(即 rand,Keras 函数的输出)的样本均值是否足够接近所定义的 Oracle p。定义可接受范围的值称为近似阈值,即下面的代码片段中的 0.015。
Oracle 近似对开发人员提出了新的挑战。首先,开发人员需要为 OA 断言选择合适的预言源。错误的测试预言可能会引入不稳定的测试结果,即不稳定的测试。在代码演化过程中,某些测试 Oracle 的来源可能比其他源更脆弱,并且需要更频繁的更新(即修改测试 Oracle 或可接受的 Oracle 范围)。其次,Oracle 近似值要求开发人员正确确定可接受的 Oracle 的范围。如果范围太宽松,则测试用例将无法检查实现的正确性。如果范围太小,则测试用例将不断失败,并向开发人员引入失败的错误警告。最后,开发人员可能会在 OA 断言的维护和演变中遇到挑战。例如,在 TensorFlow 中测试递归神经网络(RNN)组件时,开发人员将 Keras 的输出用作 Oracle,并使用 Oracle 逼近实现比较。但是,为了适应 Keras 的最新更新,TensorFlow 开发人员必须修改近似阈值(即放宽范围),以避免持续的测试失败。
因此,为了更好地应对挑战,了解 DL 库中当前的 OA 做法很重要。在这项工作中,本文迈出了重要的第一步,研究了 DL 库中的 OA 实践。特别地,本文在四个流行的 DL 库中研究 Oracle 近似的实践和演变。本文的研究提供了定量和定性的结论,以总结常见的实践并强调维护挑战,这些挑战可能会激发未来的研究,从而为开发人员在采用和维护 OA 实践方面提供更好的工具支持,并更好地利用 Oracle 近似值来保证 DL 库的质量。
2、 研究内容
本文通过研究四个流行的 DL 库(即 TensorFlow,PyTorch,Theano 和 Keras)来回答以下四个研究问题(RQ)。
RQ1:在测试深度学习库中实现了多少个 Oracle 近似(OA)断言?
本文研究了在测试 DL 库中 OA 断言的普遍性。本文调查了开发人员在实现 OA 断言时使用的常用 API。本文发现,在 DL 库中,OA 断言存在不可忽略的部分(5%-25%)。 TensorFlow,PyTorch,Theano 和 Keras 通常使用 Numpy 的断言 API 来表示 OA 断言。开发人员可能会大量使用自定义函数来表达 Oracle 近似断言(即 TensorFlow 中的 80%)。
RQ2:OA 断言中使用的常见的预言和阈值类型是什么?
本文进行了一项手动研究,以确定 OA 断言中使用的常见测试 Oracle 类型。本文派生了一个标签系统来指导这一分类过程。本文的研究表明,OA 断言中使用了各种不同的测试预言和阈值。研究还表明,有很大一部分(27%-72%)的测试预言是通过计算得出的。这表明应用自动化的非 Oracle 测试技术(例如,变质测试,差异测试)应仔细考虑并利用 Oracle 近似实践。
RQ3:开发人员对 OA 断言执行哪些代码更改?
本文发现开发人员经常更改 OA 断言,即占所有提交的 7%-20%。在 OA 断言的代码更改中,开发人员经常对 OA 断言执行非外观修改,即最多占所有更改的 34%。开发人员可以从将来的工具支持中受益,以帮助他们更好地管理基于 OA 断言的代码演化。
RQ4:开发人员为什么要对 OA 断言进行更改?
本文对 TensorFlow 中一个测试模块(即内核测试目录下)的所有与 OA 相关的提交进行了深入分析。总共,本文深入分析了 OA 断言中的 71 个提交,包括分析提交中的代码更改,分析其他相关代码,读取提交消息以及在提交之前和之后执行测试用例。
本文发现,OA 断言通常随着代码的发展而被修改。开发人员出于各种原因修改 OA 断言,例如增加测试范围,适应不同的硬件规格,支持不同的数据表示或避免测试失败。本文的研究表明,在保持 OA 断言方面存在挑战,因为没有系统的支持来帮助开发人员管理 OA 断言,例如,检测不正确的阈值以及在代码演变时建议对 OA 断言进行更改。
3、 总结
在本文中,我们提供了有关在测试 DL 库中使用 oracle 近似的实证研究。我们的研究是了解在计算密集型软件(例如 DL 库)中使用 oracle 近似值的当前实践的重要的第一步。我们的工作回答了四个研究问题。首先,我们研究 DL 库测试案例中 oracle 近似的普遍性。我们发现,多达 25%的断言使用 oracle 近似值。其次,我们研究并总结了预言机多样性和预言机近似中使用的阈值。在许多情况下,通过计算可以获得用于 oracle 近似中的 oracle。第三,我们研究开发人员对 oracle 近似断言执行的常见代码更改。最后,我们总结了在 oracle 近似值上代码更改背后的原因。我们的发现揭示了开发人员在 oracle 近似中可能面临的维护挑战,并可能激发未来的研究,以便为开发人员提供更好的工具支持,以更好地管理 oracle 近似实践。
4、 致谢
本文由南京大学软件学院 2018 级博士杨乙霖翻译转述