软件开发行业最近最热门的词汇之一就是人工智能。但它的真正含义是什么?软件测试自动化背景下的人工智能与其更广泛的定义有何不同?
当我们谈论人工智能及其姊妹词机器学习时,我们是什么意思?我想我会澄清我们的用法,以便清楚我们如何使用AI和机器学习来推进最先进的API测试。
人工智能是数字市场中最超负荷的流行语之一。“人工智能”让人联想到诸如全能的超级计算机,一心想要毁灭人类;Alexa或Siri的语音控制协助;电脑棋牌对手;或自动驾驶汽车。
维基百科将人工智能研究定义为“......对‘智能代理人’的研究:任何能够感知环境并采取最大限度地提高其成功实现目标的机会的行动的设备”。但这有点太抽象了。我喜欢把人工智能看作是计算机程序或机器的思考(为自己推理)和学习(收集数据并以有益的方式修改未来行为)的能力。正是在这个定义中,我们开始看到一些更有意义的东西,即AI对软件开发工具和技术的意义。
同样重要的是要意识到,被认为是“AI”的范围会随着时间的推移而改变。例如,曾经,人们认为光学字符识别(OCR)是人工智能中最先进的技术。或者是Siri和Alexa的问答式回答,在一段时间内,其影响被认为是最先进的,但现在基本上被认为是理所当然的,并不总是被认为是AI系统。同样的事情也会发生在软件测试工具上--随着新功能的发展,今天自动化方面的创新将成为预期。但现在,让我们考虑2019年软件测试自动化中的AI。
目前,人工智能在软件开发中的应用还处于起步阶段,与自动驾驶系统或语音辅助控制等发展较快的工作领域相比,自主化程度要低得多,不过仍在向自主测试的方向推进。人工智能在软件测试工具中的应用主要集中在让软件开发生命周期变得更容易。通过应用推理、解决问题,以及在某些情况下应用机器学习,人工智能可以用来帮助自动化和减少开发和测试中的平凡而繁琐的任务。
“测试自动化工具不是已经做到了吗?”你可能会问。
答案当然是,“是的!他们做的!”......但它们有局限性。
人工智能在软件开发中大放异彩的地方是,当它被应用于消除这些限制时,使软件测试自动化工具能够为开发人员和测试人员提供更多的价值。AI的价值来自于减少开发人员或测试人员对最平凡任务的直接参与。(在应用业务逻辑等方面仍然非常需要人类智能。)
例如,考虑到大多数(如果不是全部)测试自动化工具为你运行测试并提供结果。大多数人不知道要运行哪些测试,所以他们会运行所有的测试或一些预定的集合。那么,如果一个支持人工智能的机器人能够审查测试状态的当前状态、最近的代码变化、代码覆盖率和其他指标,决定运行哪些测试,然后运行它们呢?将基于变化数据的决策引入,就是应用AI的一个例子(顺便说一下,Parasoft也是这样做的)。在决策过程中,软件能够有效地取代开发人员/测试人员。将其应用于CI/CD流水线的好处是显而易见的。
那么,机器学习呢?机器学习可以通过应用算法,让工具通过收集测试产生的大量数据自动改进,从而增强人工智能的功能。
机器学习研究是整个人工智能研究的一个子集,重点是基于之前观察到的数据进行决策管理。这是整体人工智能的一个重要方面,因为智能需要随着学习的提高而修改决策。不过在软件测试工具中,机器学习并不总是必要的——有时,一个支持AI的工具最好是手动微调,以适应使用该工具的组织,然后每次都可以应用相同的逻辑和推理,无论结果如何。
在其他情况下,数据收集是决策过程的关键,机器学习可能非常有价值,最初需要一些数据,然后随着收集更多的数据而改进或适应。例如,代码覆盖率、静态分析结果、测试结果或其他软件指标,随着时间的推移,可以让人工智能了解软件项目的状态。
机器学习有自己的子集,叫做深度学习,它建立在处理大量数据的基础上进行学习。这些数据,在大多数情况下,是由多层分析神经网络代表的——它们是受人类神经元网启发的模型,帮助计算机获取新知识,并进行高度智能的推理。
深度学习的关键方面是由神经网络代表的海量信息来驱动决策过程。这样的数据量在软件测试中并不总是可用或不适用——也许这就是为什么我们还没有看到很多深度学习在这些领域的应用案例。一个可能的例子是,从数千万行代码中“学习”,以了解不同类型的安全违规行为,并实现基于深度学习模型的静态分析引擎。
这是Parasoft研发的一个重要领域。令人振奋的是,目前的产品只是一个开始,其在AI和ML方面的持续研究将继续带来新的方法,将这些技术整合到Parasoft的产品中。以下是Parasoft已经将它们引入的几种方式。
第一个例子是在Parasoft Jtest中,Jtest为Java开发者提供的软件测试解决方案,包括静态分析、单元测试、覆盖率和可追溯性等。在这里应用人工智能,Jtest发布了自动测试用例生成功能,当从稀疏的JUnit线束开始时,它可以帮助开发人员填补空白。
Parasoft Jtest的IDE插件为单元测试实践增加了有用的自动化功能,通过简单的一键操作来创建、扩展和维护单元测试。通过使用支持AI的Jtest,用户可以实现更高的代码覆盖率,同时将构建一套全面而有意义的Junit测试用例所需的时间和精力减少一半。
它实现这一目标的方式之一是使创建用于隔离被测代码的存根和mocks变得更加容易。底层的AI使Jtest能够观察被测单元,以确定其对其他类的依赖性,当这些依赖性的实例被创建时,它建议用户对其进行mock,以创建更多的隔离测试。自动创建必要的mock和存根,减少了测试创建中最耗时的一个环节的工作量。
Parasoft Jtest还能自动检测现有测试套件未覆盖的代码,并遍历源代码的控制路径,以弄清哪些参数需要传递到被测方法中,以及需要如何初始化子/mocks才能到达该代码。通过启用这个AI,Jtest可以自动生成新的单元测试,应用修改后的参数来提高整个项目的整体代码覆盖率。
另一个很好的例子,将机器学习加入其中,是Parasoft SOAtest的智能API测试生成器,它超越了记录和回放测试,利用人工智能和机器学习将人工UI测试转化为完整的自动化API测试场景。
智能API测试生成器使用推理来理解行使UI时进行的不同API调用的模式和关系。从该分析中,构建了一系列的API调用,代表了UI流程中的底层接口调用。然后,它通过观察它能观察到的关于不同API资源的信息来应用机器学习,并将它们作为模板存储在一个专有的数据结构中。这个内部结构通过检查用户库中的其他测试用例来更新,以学习行使API时的不同类型的行为,例如,一个断言,或者在正确的位置添加一个特定的头。
AI在这里的目标是创建更高级的测试(而不是像简单的记录和回放测试那样,只是重复用户在做什么)。该工具可以识别流量内部的模式,创建观察到的参数的综合数据模型,生成自动化的API测试,并可以将学习到的模式应用到其他API测试中,以增强这些测试,帮助用户创建更高级的自动化测试场景。生成的自动化API测试更加完整可重用、可扩展、弹性变化。
自动验证UI层是你的测试策略的另一个关键组成部分,以确保产品在投入生产前得到充分验证。Selenium框架作为用户的明确选择,已经被广泛地应用于UI测试,但用户仍然从常见的Selenium测试挑战的可维护性和稳定性中挣扎。这就是人工智能技术,尤其是机器学习可以提供帮助的地方,在运行时提供自我修复功能,以解决与UI测试执行相关的常见可维护性问题。
Parasoft 通过Parasoft Selenic提供了这一功能,它可以在你定期执行Selenium测试的过程中“学习”你的内部数据结构。Selenic引擎可以监控每一次的运行,并捕捉关于被测应用程序的Web UI内容的详细信息。它提取DOM元素,它们的属性,定位器等,并将它们与UI驱动的测试所执行的动作相关联。Selenic采用了Parasoft专有的数据建模方法,将这些信息存储在其AI引擎内部,并且模型会不断更新,分析所有测试的历史执行情况,继续变得“更聪明”。
在网页的UI元素被移动或大幅修改,导致测试失败的情况下,这是一个关键的时间节省。通过Selenic,引擎使用的AI启发式方法可以将这些变化的元素与模型所代表的历史数据进行“匹配”,并自动生成抗变化的“智能定位器”,在运行时恢复Selenium测试的执行。这些变化的信息会自动在模型中传播,未来生成的新定位器也会根据这些变化进行调整。
成功采用静态分析工具的障碍之一是管理大量的警告和处理结果中的误报(不是真正错误的警告)。分析遗留或现有代码库的软件团队对使用静态分析得到的初始结果感到苦恼,并对这种体验感到反感,以至于不再继续努力。感到不知所措的部分原因是现代静态分析工具所能提供的标准、规则(检查器)、建议和指标的数量。
软件开发团队有独特的质量要求,检查器或编码标准没有一刀切的建议。每个团队都有自己对误报的定义,通常意味着“不在乎”,而不是“这在技术上是不正确的”。Parasoft对此的解决方案是应用人工智能和机器学习对静态分析报告的结果进行优先排序,以改善用户体验和此类工具的采用。
Parasoft使用一种方法,通过审查少量的发现,并根据与这些发现相关的元数据构建一个分类器,将静态分析工具输出中的发现快速分类为团队希望看到的东西或团队希望抑制的东西。这个分类器是基于之前人工对静态分析发现进行分类的结果,既包括历史上对不相关警告的抑制,也包括事先对代码库内部有意义的发现进行优先修复。
最终结果分为两种情况:
这极大地改善了用户体验,将开发人员引导到适用于其项目的可能性最高的警告上。通过这些创新,组织可以立即减少采用和使用静态分析的人工努力。
那么接下来会有什么发展呢?我们正在这个领域积极研发,继续寻找人工智能和机器学习的进一步应用来增强我们的软件测试工具套件。研究的路线有很多,但最终的目标是明确的:帮助团队更高效地开发和测试代码,以最快的速度创建更高质量的软件。