程的办公室里有一只大猛兽,不仅可爱,而且人见人爱。是bug ——小黄鸭的终结者!黄鸭的调试大法在民间代代相传。《程序员修炼之道》这本书里记载了这个高深的技巧。在故事中,神出鬼没的程总是带着一只橡皮鸭。每当需要调试的时候,他就一行一行的给小黄鸭解释。突然,小黄鸭施展神力,与程的意念相遇,虫子出现了!
小黄鸭跟着程在风雨中并肩战斗,没有一句怨言。直到有一天,程良心发现:你要我的代码成千上万行,为什么不能自己做一行能调试的代码?于是,程序的自动调试逐渐兴起,自动评测和代码修正也逐渐给程序员带来福音。编程即将进入AI时代。
那么,人工智能能在多大程度上从根本上改变人类的工作方式呢?它能改变管理流程吗?人工智能会增加还是取代测试员?如何在引入人工智能计划的同时,保证测试团队继续发挥作用?
为了更好地理解人工智能在整个测试过程中的应用位置,我们需要分解测试人员的任务和挑战。我们需要了解每个任务的潜在动机,以及它如何与整体测试目标相互作用,以便在目标仍然服务的情况下,想象如何改变和改进流程。在下面,我们讨论的是目标,而不是人类测试人员的实际任务。
我们大致将测试分为两种情况:
测试新软件和功能。
测试现有软件和功能。
新功能需要仔细测试。我们必须确保新功能有意义,符合用户体验设计原则,安全、可靠、高效,并按预期工作。更正式地说,ISO25010标准包含产品质量的八个主要特征,我们将分别讨论:
1.功能(完整性、正确性和适当性)
2.性能(时间行为、资源利用率、容量)
3.兼容性(共存、互操作性)
4.可用性(可操作性、可学性、用户错误保护、用户界面美学、可访问性、可识别性)
5.可靠性(成熟度、可用性、容错性和可恢复性)
6.安全性(机密性、完整性、不可否认性、可测量性和真实性)
7.可维护性(模块化、可重用性、可分析性、可修改性和可测试性)
8.便携性(适应性、可安装性和可更换性)
确定正确完整的功能基本上是一个完整的AI问题,也就是说AI需要至少和人类一样聪明。例如,当在脸书等社交网站中搜索名字和姓氏时,它应该返回具有指定姓名的每个人。在AshleyMadison这样的隐私敏感网站上做同样的事情,这将是一个严重的问题。任何给定的函数是对还是错通常取决于旁观者的观点。这个问题叫做Oracle问题,因为我们需要一个Delphi的Oracle来判断一个显示的函数是否正确。这意味着在可预见的未来,我们无法用人工智能来测试软件功能的正确性。
另一方面,性能标准通常可以用一种简单且非常通用的方式来规定:例如,站点的加载时间不得超过2秒,按钮被按下后的反馈时间不得超过500毫秒。所以AI可以测试性能,其实做这个的产品已经有了。
兼容性有许多不同的含义。一些广泛的兼容性测试示例,如跨浏览器测试、跨设备测试或跨操作测试(主要关注设计和功能),可以轻松实现自动化。而且,我们看到了兼容的产品。其他兼容性问题更加微妙,面向技术或具体。在这些情况下,往往因为经济原因过高,所以禁止开发特殊AI。
现在的AI系统很难分析软件的可用性,虽然这可能是未来的一个趋势。有趣的是,提高软件的可用性也可以通过提高AI系统理解和测试软件的能力来实现,从而进一步鼓励软件的可用性。
即使没有AI,也有一些软件可以分析软件系统的可靠性,比如容错性和可恢复性。AI只会改进这种分析,产生更好的结果。其他方面,如成熟度和可用性,与这些系统的长期使用和操作更相关,并且通常很难测试,即使对人类来说也是如此。
此外,就安全性而言,已经有软件利用现有的和众所周知的攻击场景来测试某些方面。除了这种标准攻击,一般来说,安全性很难测试。安全分析师通常是高薪的专业人士,他们精通各自的领域,并巧妙地结合系统的各个方面,以发现新的弱点和漏洞。如果使用人工智能很难测试业务功能,那么安全性(已知攻击除外)就是重点课题,也是我们最终需要解决的问题。
可维护性和可移植性通常涉及软件系统的内部方面,这些方面与系统的开发和运行非常相关,但几乎没有经过测试。
ISO25010标准还定义了服务质量的五个特征:
1.有效性
2.效率
3.满意度(实用性、信任、快乐和舒适)
4.无风险(经济、健康和安全以及环境风险缓解)
5.覆盖上下文(上下文完整性和灵活性)
显然,这些特征与人类与软件交互的结果有关。所以他们很个性化,很难系统的进行资质认证和检测。
虽然上述所有特性对软件产品都很重要,但它们很难解释该领域相同数量的测试工作。很难得到数值来评价测试结果,但我们明白最重要的是测试有正确完整的功能。不幸的是,这也是在甲骨文问题之后,我
们无法使用人工智能来协助我们进行测试工作的原因。软件与非数字世界中的许多事物截然不同。例如,如果我们修理汽车的前灯,不需要测试喇叭。但是,由于软件具有如此多的不可见和未知的内在依赖性,因此对软件系统的某个部分进行更改,可能会对系统的任何其他部分产生无法预料和意外的负面影响。因此,有必要重新测试已经测试过的和已获批准的功能,即使它没有改变,这样做也是为了确保它确实没有改变。这种形式的测试称为回归测试,它占据了测试工作的很大一部分。
现在,回归测试的一个非常有趣的方面是它已具有测试和批准的功能,这意味着我们可以专注于测试变化,而不是测试正确性。按照这种思路,回归测试不是一种测试形式,而是一种特定形式的变更控制。
开发人员常以版本控制系统的形式使用变更控制。但问题是,这些系统只管理源代码和配置文件等静态文件。
然而,用户受测试的软件是一种动态的东西,存在于计算机的存储器中。程序代码和配置是创建软件动态状态的起点。但是许多成分,例如底层硬件和操作系统的细节、输入数据和用户交互,形成了动态软件状态。虽然源代码和配置类似于建筑物的原始蓝图,但动态状态与实际建筑物相当。该建筑的具体特征取决于更多方面,如建筑材料、绘画、家具、装饰和室内植物,所有这些都不是蓝图的一部分,但所有这些都与建筑的用户体验完全相关。对于软件的动态状态也是如此。
为了解决软件本质(动态状态)不受版本控制系统控制的事实,当前事件的状态是创建和维护自动回归测试的。然后,这些测试将编码软件的动态状态,并因此将其转换为静态伪像,这些伪像可由现有版本控制系统控制。然而,问题是大多数现有的回归测试系统都是按照非常成功的JUnit建模的。这其中继承了一部分,包括检查机制。这种检查机制包括单独的检查(称为断言),它一次检查一个事实。这些事实被认为是难以改变(和不变)的真理。因此,这些测试目前是手动创建和维护的,需要付出大量的精力,并且不适合于检测和允许改变的情况。
但是,这里存在这种方法的替代方案。这些系统的名称包括GoldenMaster测试,Characterization测试,Approval测试或基于Snapshot的测试,现在很受欢迎。这些测试不仅更容易创建,而且更易于维护,因为检测到的更改可以简单地应用于基础测试(如果需要)。此外,它表明这些测试弥补了一些其他长期存在的回归测试的问题。
使用此测试范例,人工智能可以因此为现有(和批准的)软件版本创建此类的GoldenMaster测试。在更改软件之后,这些测试将向测试者显示功能的改变(或其缺失)。然后,测试人员只需要检查新功能或检测到对现有功能的更改即可。在许多情况下,这已经大大节省了工作量并且大大降低了风险。这对AI起作用的原因很简单,就是它绕过了Oracle问题。人工智能现在不需要确定特定功能是否正确——它只需要执行软件并记录其行为。
在解决了让人工智能免于测试软件的主要挑战之后,我们现在需要关注剩下的问题。一个是人工智能需要了解如何执行软件。也就是说,如果对以前的动作(可能是空的)和软件的当前状态进行跟踪,那么人工智能需要决定接下来要执行什么样的用户动作。这样制定的问题与玩国际象棋或Go等游戏的问题非常相似。实际上,我们已经有玩电脑游戏的人工智能,并且它已经解决了完全相同的问题。
因此,我们明确了完成这个任务的方法。唯一的区别是如何制定合适的奖励机制。对于计算机游戏,这样的奖励功相当容易:“增加点数”。为了执行不同的商业软件用例,增加点数可能类似于“增加代码覆盖率”或某些类似指标。为人工智能提供典型的使用场景来克服初始挑战,例如猜测正确的用户名/密码组合或查找日期,电子邮件或其他更加模糊的输入数据的有效值(想想SAP事务代码)。
在产生这种记录的过程中,AI已经可以测试软件性能,并具有某方面的可靠性和安全性了。人工智能可能会遇到任何技术错误(oracle这样的错误应该永远不会发生),它可以报告,从而使单独的烟雾测试也过时了。请注意,如上所述,改进软件的可用性也可能会提高人工智能在测试中的性能。
值得注意的是,我们掌握一种自动化测试方法已经很久了,原则上它能够实现相同的结果。它被称为monkey测试。这种方法以猴子定理命名,猴子定理指出打字机上的猴子,随意敲击键盘按键,最终会写出莎士比亚的所有作品。这是个很简单的推理:最终,它会产生所有可能的角色组合。这样的组合可能是莎士比亚的作品,以及其任何可能的变化组合。猴子测试只是将这个定理应用于测试,在GUI上生成随机输入。这已存在于系统中了。使用人工智能,我们只需在合理的时间内提高效率并获得一些有价值的结果。
鉴于前面部分的见解,可以设想一个新的测试过程,如下所示:创建一个新软件。测试人员确保此软件正确完整可用且安全。请注意,前两个任务也可以分配给业务分析师。
然后将该软件提供给人工智能,人工智能通过记录典型的使用场景进行训练,从而知道如何执行该软件。人工智能执行软件并记录充足的不同输入/输出场景,因为GoldenMaster允许在下一版本的软件中检测到更改。其他质量方面也由人工智能处理,例如:它测试性能、已知的安全攻击和容错。
通过来自人工智能、测试人员、业务分析师、实际用户的反馈,开发人员可以在下一个sprint中改进软件。GoldenMaster测试的一个子集可以在每晚或每次提交后执行,为开发人员提供早期反馈。创建下一个版本后,将执行完整的GoldenMaster测试集,显示行为的每个变化,并批准这些更改和稳定的GUI测试。这也将增加测试覆盖率并显著降低未检测到的更改风险。
测试人员可以自由地专注于新功能和软件行为的变化。注意这也可以更好的实现跟踪以及更容易的软件认证。
此过程将省去测试人员重复又平凡的任务,例如手动回归测试。因此,它将释放测试人员更多的能力,而不是取代他们。这意味着我们把许多测试人员从他们不想做的职业选择中解放出来,让其转向测试自动化。将人工智能应用到这样的测试中,测试人员可以获得很多收益。
提议流程的变更使得它们可以通过人工智能当前的功能来实现。研究人员预计,这些功能只会随着时间的推移而改善和扩大。一旦人工智能获得了人类或超人类的能力,就几乎没有人工智能所不能执行的任务了,不论从测试人员到开发人员还是再到管理人员。但目前还不清楚何时会达到这个情况。
但在实现这些功能的过程中,还有许多有趣的里程碑。
一个热门话题是人工智能是否威胁到测试人员的工作。遵循上述思路将产生近乎完整的自动化测试,以及按需生成更多此类测试的功能。这基本上打破了影响分析的问题——找出任何给定变化影响的软件部分。解决此问题允许将人工智能应用于源代码的自适应和生成。考虑自动生成错误补丁,自动消除性能瓶颈或通过重构源代码自动提高源代码的质量,例如:进入更短的方法和类。
没有什么主要的能力是伴随着大爆炸而来的。在我们全面的进行自动驾驶之前,我们得到了协助驾驶程序的帮助,它帮助我们在车道上保持平稳行驶、适应前灯或保持距离。软件的开发和测试也是如此。让人工智能生成或改进代码的一小部分将是生成简单的方法、模块或最终整个系统的第一步。当发生这种情况时,Oracle问题仍然没有得到解决。因此,即使使用这些方法,仍然需要确保生成的功能正确且完整。这个角色是否被称为开发人员,业务分析师或测试人员已超出了我们的猜测。但那些自称为开发者的人应该比那些自称为测试人员的人更担心他们工作的长期前景。