1.1研究背景
软件测试是一种用来描述、促进和鉴定软件的正确性、完整性、安全性和质量的过程,它是一种将实际输出与期望输出进行审核或者比较的过程,因此通过软件测试可以更快速的发现软件开发过程中的各种问题,帮助人们更加高效率的对软件进行完善,使得软件的性能逐步提高。现今社会,随着大数据和云计算的飞速发展,传统的软件测试技术很难支撑现代软件的发展,软件测试技术如今面对着新的挑战。
1.2研究意义机器学习、深度学习、NLP等
AI领域被认为是我们身边大多数技术的前沿。如今,随着人工智能技术的发展,人工智能技术也开始逐步成熟,人工智能技术逐步渗透到工业和生活中的各个领域,作为与程序密切相关的软件测试,也深受人工智能技术的影响。
2软件测试发展史
2.1程序员和测试人员的时代
在程序员和测试人员的时代,开发和测试被视为相互独立的活动,软件准备就绪后,将其传递给测试团队进行验证。测试人员在需求分析阶段的参与不是很积极,与业务涉众的互动也很有限。他们在很大程度上依赖于通过设计和开发过程中完成的文档或从编写代码的开发人员那里收集的知识来获取信息。因此在这个时代,测试人员缺乏对客户需求和期望的洞察力,进而导致软件测试策略的有限性。
2.2探索和手动测试的时代
90年代末期,各种软件测试方法的问世,例如探索性测试、敏捷测试等。在这个阶段,软件测试人员使用详细的测试用例和测试计划手动进行测试。探索性测试通过在测试章程范围内探索软件,从而使测试人员可以自由地以本机方式测试软件。并且在这个时期,软件开发工程量逐步增加,软件开发过程的广泛而密集的增长需要更全面的测试方法,敏捷测试采用的增量和迭代方法有助于实现此目标。
2.3自动化时代
随着21世纪的到来,更多的新方法浮出水面,从而彻底改造了软件测试。在软件开发各个阶段的质量保证和控制都变得越来越重要,测试都被视为软件开发过程中不可或缺的一部分。自动化使测试达到了完全不同的水平,通过大量的自动化测试框架,使得测试人员能够以更高的效率执行其任务。云测试的出现可以帮助企业以更快的速度和更少的资金管理产品的测试。
2.4持续测试的时代
持续测试时期业务动态开始发生变化,客户期望看到最终产品的模型,因此测试需求逐步增加。现阶段出现的改进网络基础架构为开发和测试提供了高连接性,并提高了跨多个平台的部署和测试的速度。DevOps和CI/CD的兴起导致软件整个开发周期缩短,实时进行仔细的风险评估成为了当务之急。同时,在软件开发生命周期的所有阶段都必须进行风险评估和处理,进而降低软件开发的风险。为了跟上这些需求,需要不断进行测试以提高效率,人们开始尝试应用人工智能技术进行测试。
2.5人工智能时代
简而言之,人工智能是机器通过感知,理解和学习模仿人类行为的能力。人工智能的算法是基于数据的预测分析,这也意味着AI测试在很大程度上取决于数据。当今有许多可用AI驱动的测试工具,可帮助进行单元测试、API测试、UI测试等,其中最经典的示例是可视化测试。
3人工智能技术在软件测试中的应用及挑战
3.1AI系统的测试
随着人工智能技术的发展,目前出现了各类有关人工智能技术的应用,然而由于人工智能技术是一个新兴技术,传统的软件测试无法与人工智能技术相匹配,因此在人工智能时代软件测试技术的更新成为一件重要的事情。由于人工智能技术所开发的系统其功能具有动态性,并且开发出来的系统拥有自我学习的能力,因此在对人工智能系统进行测试时,应当充分考虑时间范围。人工智能系统的学习能力应该是不断增强、动态性的,因此,针对此类测试过程,需要大规模、长时间的进行测试。例如,Google的AlphaGo存在所使用的黑盒测试规模庞大、测试周期长,并且有自动化测试难的问题。然而AlphaGo是一种功能相对简单的系统,人工智能技术所开发的智能语音响应系统在测试时会更加困难。智能语音响应系统需要模拟不同的场景进行测试,因此小规模的测试数据集,很难判断系统的反应能力,也无法对系统提出具有重大意义的改善。深度神经网络学习算法通常被认为是黑盒模型,但是随着训练的数据集不同,其测试结果具有不稳定的特性。因此针对深度神经网络测试需要大规模的数据集,这种测试方法与传统的测试方法相差甚远。在传统的测试过程中可以使用等价类划分和其他方法来减小所需测试的样本规模,但是对于人工智能系统来说,必须依赖于大量的数据才可以达到测试的效果。
3.2大数据的测试
大数据的测试并不比人工智能系统测试容易,其很难确定判断其测试预测测试结果的标准,因为无法对数据处理结果的大小进行判定。在数据收集、存储、检索和分析之后,软件测试人员需要开发适当的工具以从大容量、多样性、快速变化和实时表征方面对数据的一致性和完整性进行校验。
3.3云服务测试
现阶段云服务主要包括私有云、公共云、混合云和各种其他形式的云,云服务的测试面临着复杂的系统架构、复杂的配置、复杂的计算和存储节点,尽管可以通过使用两个或三个的组合来减少组合的数量,但是这种方法覆盖率相对较低,并且在云服务的测试中存在着较高的风险。同时,云服务的性能测试也非常困难,主要包括云质量压力模拟需要承担较高的成本,甚至花费大量的资金也无法对测试进行模拟。而且,云服务作为新兴的技术,传统的测试工具很难与计算机平台的云性能测试相匹配。
3.4区块链测试
区块链主要包括公共网络、私有链和联盟网络等不同类型的网络,这些网络在许多方面都大有不同,例如在区块链的管理、使用者的用户身份验证、区块链的节点数、网络的共识机制和智能合约等方面。因此,不同的区块链面临的测试挑战也是不同的。同时区块链也存在一些共性的的挑战,如安全测试非常困难。安全始终是矛与盾的问题,现阶段不存在绝对受保护的技术、系统或平台,因此对于区块链来说,很难对其安全质量进行测试。同时区块链还包括基础结构安全性、加密算法保护、网络协议保护、共识机制安全性和合同安全性等合同安全性又包括身份验证和身份验证。而且区块链拥有众多的网络节点,对于区块链的测试不仅仅只是某个区块链节点。
3.5物联网测试
在工业4.0和5G时代,网络成为人们生活中不可缺少的东西。物联网是指万物互联,它不仅仅只是将计算机相连接,还包括工业设备、家用电器等,物联网旨在让每一个物品等能够连接到网络。然而网络的融合需要创建一个更大的系统,因此这也给软件测试带来新的挑战。同时物联网需要更多的物理设备才可以进行测试,这会耗费大量的时间和精力。其次物联网系统需要具有实时性,物联网设备对时间十分的敏感,它需要实时数据收集,并且需要实同步数据的传输。此外,物联网测试还面临着检查系统规模、可伸缩性、协作感知、大数据处理性能和智能特性等挑战。
4应用人工智能技术的软件测试
4.1测试规范和测试套件细化
在开源开发或软件进化的背景下,开发人员经常面对开发时没有明显理由的测试套件,这些测试套件可能需要增加或改进以确保足够的可靠性,甚至需要减少以满足紧迫的截止日期,我们称这个过程为测试规范和测试套件的重新设计。同时在实践中,测试规范可能一开始就不存在,尤其是如果没有使用黑盒策略来识别测试用例的情况。在这种情况下,测试规范必须被逆向工程或者从高级系统规范创建。因此,软件测试重要的是提供方法和工具支持,帮助人们理解测试套件的局限性及其可能的冗余,以便能够以经济高效的方式对其进行改进。因此,基于机器学习的方法可以解决黑盒测试中的这个问题。
4.2调试、故障定位
使用机器学习来识别可疑语句,如测试期间观察到的相关故障,这可在调试期间帮助故障定位。RUBAR技术解决了软件测试的主要缺陷,但该方法难以处理多个故障的存在,因为它隐含地假设失败的测试用例执行相同的故障。同时使用C4.5决策树来学习各种基于测试用例输入和输出信息的故障条件,在相似条件下执行的失败测试用例被认为是由于相同的错误而失败,如果语句被在相似条件下执行的大量失败测试用例覆盖,那么它们就被认为是需要重点关注的。同时,由C4.5决策树建模的故障条件可以准确预测故障,因此可以用于帮助调试,由该树建模的故障条件总体上准确描述了实际故障条件。
4.3风险驱动测试
无论采用何种测试策略,实际上很少有足够的人力资源和时间来彻底测试系统的每个部分,达到令人满意的程度。测试团队必须集中精力并优先考虑他们的测试工作,通常这是通过分析与功能或系统组件相关的“风险”来完成的,这取决于测试级别。风险通常被定义为故障概率和它们可能造成损害的组合,目前软件测试中有各种各样的方法来解决这个问题,构建预测文件或类中错误位置的模型是一个可行的方案。在许多利用机器学习算法训练的模型中,通常不需要与统计模型相关联的严格假设类型,对于实践者来说更容易解释和理解。人们也越来越认识到要获得合理准确的预测模型,还需要考虑其他因素。尽管在软件测试中输入使用的数据各不相同,但它通常包括组件的结构复杂性度量、来自最近发布的组件变更信息、与组件相关联的历史数据,以及开发人员关于例如他们对被变更的系统的体验的信息。因此一旦开发了故障预测模型,就可以根据系统组件包含故障的可能性对它们进行排序,结果也可以用树形图更容易地可视化。并且从经济的角度出发,建立和利用故障预测模型也具有很高的经济效应。
4.4测试预言
测试预言的自动化可能是软件测试中最困难的问题之一,虽然没有普遍适用的自动化测试预言的解决方案,但是在很多情况下机器学习可以提供帮助。例如,在图像和语音处理领域有许多这样的情况。图像分割是从图像中提取感兴趣的特定结构的行为,为了评估图像分割算法花费了大量的时间和精力,却并不能提供足够准确的结果,技术专家需要修改算法并重新运行整个测试套件来验证它。该过程大多是手工完成的,因此非常耗时,也需要可靠的专家在场。在初始学习阶段,使用机器学习算法来学习一个模型,一旦学习了有效的机器学习模型,由测试中图像分割算法的任何新版本产生的分割将自动认定其正确地性,此时也不需要任何人工专家的干预,所以在分割的重新测试期间可以获得大量时间和人工的节省。在人工智能时代,作为软件工程师所面临问题的工程特性,例如部分定义和不明确的应用领域,具有多个相互竞争、相互冲突和不断变化的目标,正把我们从完美的乌托邦拖向更现实的工程世界。当代的软件性质变化迫使我们改变开发和部署测试技术。人工智能技术被证明非常适合这个不断变化的是时代。本文通过研究人工智能时代下软件测试的发展与应用,对人工智能技术对软件测试的影响进行深入的研究,通过对人工智能时代下软件测试得研究现状、软件测试发展史、人工智能技术在软件测试中的应用及挑战、应用人工智能技术的软件测试以及软件测试的未来发展等进行论述,更加深刻的理解人工智能技术对软件测试的发展的重大影响。
作者:胡中奇 植赐佳