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