变形测试:为什么几乎没人知道这一有前途的技术

图片

我必须承认:我正在阅读ACM杂志 。 即使按程序员的标准,它也使我成为一个“书呆子”。 除其他外,我从该杂志中学到了“变形测试”。 像我问过的所有人一样,我以前从未听说过他。 但是,有关该主题的科学文献令人惊讶地庞大:拥有许多在完全不同的研究领域中应用非常成功的例子。 那么,为什么我们以前没有听说过他呢? 科学界以外的人只有一篇文章。 现在让他们两个。

简要背景


大多数书面测试使用Oracle 。 也就是说,您知道答案并明确检查计算是否给出正确答案。

def test_dist(): p1 = (0, 3) p2 = (4, 0) assert dist(p1, p2) == 5 

除了oracle测试外,还有手动测试。 测试人员坐在计算机旁,将输入数据与结果进行比较。 随着系统变得越来越复杂,手动测试变得越来越有用。 他们每个人都只检查更大状态空间中的一个点,因此我们需要探索整个状态空间的东西。

这导致我们进行生成测试 :编写覆盖状态空间中随机集的测试。 生成测试最流行的样式是基于属性的测试 ,即PBT。 我们找到函数的“属性”,然后生成输入值并检查输出值是否与此属性匹配。

 def test_dist(): p1 = random_point() p2 = random_point() assert dist(p1, p2) >= 0 

PBT的优势在于它可以覆盖更多空间。 其缺点是失去特异性。 这不再是一个 oracle测试! 我们不知道答案应该是什么,而函数可能是错误的,但是具有相同的属性。 在这里,我们依靠启发式。

PBT的一个严重问题是找到良好的性能。 大多数功能具有简单的常规属性和复杂的特定属性。 常规属性可以应用于大量函数,但是它们不能给我们太多信息。 更具体的属性可提供更多信息,但更难查找,它们仅适用于任务有限的区域。 如果您具有确定图是否为非循环图的函数,那么您将编写哪些属性测试? 他们会让您确信该功能正确吗?

动机


现在考虑一个更复杂的任务。 想象一下,您想为英语编写一个语音到文本(STT)转换器。 它接收声音文件,并显示文本。 您将如何测试?

使用手工甲骨文的最简单方法。 听写句子并检查输出文本是否匹配。 但这还不够紧密! 人类演讲的范围是巨大的 。 测试1,000个或什至10,000个不同的声音文件会更好。 带有抄录的手持式甲骨文成本太高。 这意味着我们必须改用基于属性的测试。

但是我们如何产生输入呢? 例如,我们可以创建随机行,将它们通过文本到语音转换器(文本到语音,TTS),然后确保我们的STT产生相同的文本。 但是,这再次给了我们非常有限的人类声音范围。 TTS能否在语调上做出改变,“吞咽”字样,模仿强音? 如果我们无法处理这些问题,STT会特别有用吗? 最好使用任意文本,例如广播,播客和在线视频中的录音。

现在出现了一个新问题。 使用TTS时,我们以书面文字开始。 对于任意的声音文件,我们没有它,同时我们也不想手动转录。 相反,我们仅限于使用属性。 我们需要测试哪些属性? 最简单的属性示例:“程序不会因任何传入数据而崩溃”(一个很好的属性)或“它不会将原声音乐转换为单词”(也许吗?)。 这些属性不能很好地覆盖程序主要任务的验证,并且会稍微增加对程序质量的信心。

因此,我们有两个任务。 首先,我们需要大量的语音形式的输入。 其次,我们需要了解如何将它们转换为有用的测试,而无需花费大量时间手动将声音转录为预言。

变形测试


对于所有这些,将单独考虑输出。 如果我们将它们嵌入更广泛的环境中怎么办? 例如,如果将声音片段转录到out输出中,那么我们应该始终 out

  • 音量加倍
  • 频率增加
  • 加快步伐
  • 增加背景噪音
  • 增加车辆噪音
  • 以上的任意组合。

这些都是我们可以轻松测试的“简单”转换。 例如,对于具有“交通噪音”的测试,我们可以抽取10个汽车噪音样本,将它们放在声音片段上,并检查所有11个版本的识别结果是否匹配。 我们可以将音量加倍或增加,将11个版本变成33个版本,然后加倍速度以获得66个版本。 这一原理可以应用于我们数据库中的每个声音片段,从而大大扩展了传入数据的空间。

存在用于比较的66个版本非常方便。 但这还不是全部:我们仍然不需要知道输出应该是什么。 如果所有66次转换都返回,则测试成功通过,如果至少一个返回其他内容,则测试失败。 在任何阶段,我们都不需要检查out包含的内容。 这是非常重要的。 因此,我们只需很少的人力就可以大大增加测试空间。 例如,我们可以下载该系列的一集,进行转换并检查其转换为文本1的所有结果是否匹配。 我们没有听语音剪辑就得到了有用的测试。 现在,我们无需使用oracle就可以生成复杂而深入的测试!

两组输入数据及其输出数据相互连接。 这种与传入/传出数据集相关的属性称为变态链接 2 。 应用此属性的测试称为变形测试 。 在复杂的系统中,有趣的变形关系比单个传入/传出数据的有趣属性容易找到。

让我们更正式地声明一下:如果我们有xf(x) ,那么我们可以对x进行一些转换以获得x2f(x2) 。 对于STT,我们只检查f(x) = f(x2) ,但是我们可以使用两个数据集之间的任何关系。 可能存在诸如f(x2) > f(x)或“ f(x2)/f(x)是整数值”之类的变质关系。 以类似的方式,可以使用f(x)f(x3)将这个原理扩展到几组输入数据。 这样的一个示例是将没有过滤器的搜索引擎的结果与具有一个或两个过滤器的引擎的结果进行比较。 在我阅读的大多数用例描述中,仅使用了两组输入数据,因为即使它们足以发现疯狂的错误。

使用范例


说到用例:变态测试在实践中有多有效? 抽象地谈论技术或提供人工例子是一回事。 案例研究之所以有用,有三个原因。 首先,它显示该方法是否真正有效。 其次,您可以从他们那里了解使用MT的潜在困难。 第三,示例向我们展示了如何使用该技术。 可以尝试在使用示例中使用任何变形连接以适应我们的问题的解决方案。

变态测试:挑战与机遇回顾提供了许多研究的清单,但它们都是科学文章。 以下是最有趣的。 您可能会猜到,标有(pdf)文章以(pdf)布置。


问题


哦,所以所有这些来源都是PDF。

找到所有这些文章花了几个小时。 这个问题与MT开发的最大障碍有关:以上所有链接都是未来科学文章的预印本或初稿。 当我开始了解鲜为人知的技术时,我首先会问自己一个问题:“为什么它们鲜为人知?” 有时原因很明显,有时是一系列复杂的小原因,有时问题仅在于方法论“不走运”。

对于MT,问题很明显。 几乎所有信息都隐藏在科学收费墙的后面。 如果您想学习MT,则要么需要访问期刊,要么需要花费数小时来搜索预印本3

进一步研究


MT的发明者是Ty Chen 。 他成为许多研究的推动力。 这个领域的其他研究者是周志全塞尔吉奥塞古拉 ; 他们俩都在互联网上张贴了所有预印本。 大多数研究工作都是由这些人之一完成的。

可能最好的起点是变质测试:挑战与机遇的回顾以及 变质测试的调查 。 尽管本文是关于变态测试的 ,但研究人员还是将变态关系普遍应用于其他各种学科,例如,正式代码验证和调试。 我还没有详细研究该技术的这些应用领域,但是可能也值得一看。

从适用性的角度来看,从理论上讲,可以修改大多数PBT库以验证其变质特性。 实际上, Quickcheck中的第一个示例测试MS,在有关PBT的本文中,MS是间接应用的。 总的来说,在我看来,大多数PBT研究都集中在有效生成和整理输入数据上,而MT研究主要集中在确定我们真正需要测试的内容上。 因此,这些技术可能会相互补充。

多亏了Brian Ng的研究协助。

后记:要求


实际上,我之前从未听说过这种技术也就不足为奇了。 有很多真正有趣且有用的技术,它们无法留下微小的泡沫。 我通过运气而不是主动搜索发现了MT。

如果您知道一些值得广泛使用的东西, 请给我写信



  1. 好吧,这里可能存在明显的问题:播客中可能有音乐,其他语言中的语音片段等等。 但是该理论是可靠的:如果我们能够获得语音样本,则可以在不进行初步手动转录/标记的情况下将它们用作测试的一部分。
  2. 在规范中,相应的想法是超属性-行为集的属性,而不是单个行为。 大多数高特异性研究与HS安全性有关。 据我了解,它的HS是MS的超集。
  3. 我有一个第二个假设,即现在被否定的假设:由于大多数来自中国和香港的主要研究人员,也许这种技术在以中文而非英语交流的程序员社区中更为人所知。 布赖恩·恩(Brian Eun)为我检验了这一假设,但没有发现中国人使用该技术的任何明显迹象。

Source: https://habr.com/ru/post/zh-CN454458/


All Articles