当前位置: 首页 > 质量专栏 > 用于软件测试的生成式人工智能示例
用于软件测试的生成式人工智能示例
2023-08-24 浏览次数2426

  大约十年前,某大型科技公司挂着巨大的横幅,宣布他们的“未来主义者”。我记得加拿大多伦多的一个大广告牌,详细描述了未来的愿景,在那里你可以用言语将软件变为现实,甚至可能将其想象为现实。鉴于英语与其他人类非科学语言一样,是一种模糊且模棱两可的语言,我对此表示怀疑。尽管人工智能很难像人类一样有效地将文字转化为符号,但即使团队合作编写书面描述,他们对应该创建的内容也往往有着截然不同的理解。

  然后,大型语言模型出现了,它承诺将模糊的自然语言作为输入并生成代码。然而,这存在典型的工程问题。OS/360 是世界上第一个结构化软件工程项目之一,拥有数百名员工,其首席经理 Fred Brooks 表示,从逻辑上讲,不可能有单一灵丹妙药来扼杀软件开发。布鲁克斯提出,软件通过不同的活动来工作——需求(什么)、设计(如何)、编码(构建)和测试。由于没有一项活动需要花费超过 25% 的时间,因此任何使一项活动变得即时且免费的灵丹妙药也只会减少 25% 的时间。布鲁克的解决方案是一系列青铜子弹,每一颗都让事情变得更好一点。

  尽管布鲁克斯逻辑的言辞似乎在今天仍然适用,但发送到人工智能的软件的简单英语描述确实不够。更重要的是,我们甚至无法通过“人工智能”摆脱测试过程。不过,我们可能能够实现的是在利用人工智能进行测试方面取得一系列小而快速的胜利。正如我们之前讨论的,站在这一努力的最前沿是值得的。

  在本文中,我们将探讨测试中的一些人工智能用例。我们已经在工作中或公共领域的示例代码中尝试过这些技术,并有一些评论可以分享。以下想法寻找在所有软件中使用人工智能的青铜子弹,但重点关注测试和质量。

  一、要求

  1、根据给定的需求生成 UNIT 测试涉及处理简单的英语描述,可能还包括特定编程语言或 API 中的函数签名。大型语言模型软件(LLM)可以分析几个段落以生成测试想法。如果代码纯粹由业务逻辑组成,没有“脚手架”代码或其他业务逻辑,则测试可以运行。然而,由于大多数软件项目对大量代码库的广泛依赖,出现了重大挑战。目前的 AI 工具(例如 ChatGPT、Bard 和 Copilot)常常难以适应内存中的整个上下文,以生成复杂生产软件中存在的隐含子类和依赖项的设置。对于“单元”测试尤其如此,尽管它们的名称如此,但它们依赖于数据库、文件、API 等。此外,一个反复出现的问题是基于云的工具利用它们的输入来自我改进。许多公司和商业保密协议禁止与谷歌和微软共享代码和要求。

  2、从给定代码生成 UNIT 测试与需求场景类似,使用现有代码来生成单元测试。挑战在于确定在此背景下的预期测试范围。通常我们会检查以确保软件能够执行其应该执行的操作。在没有任何要求的情况下,我们希望生成的单元测试能够检查以确保软件能够……它能做什么。如果更改改变了其行为,那么在维护期间可能没有什么价值,但否则就是循环引用。也许,生成的测试充其量可以发现崩溃和未处理的异常。尽管如此,我们仍然不希望人工智能在未经告知的情况下识别代码的正确行为。因此,我们也不希望它生成在软件偏差时暴露并导致故障的单元测试。我们要求 ChatGPT 为罗马数字到十进制计算器创建测试。(需求 代码 生成的 测试)ChatGPT 3.5 生成的初始测试要求输入单个数字、1 到 3、加法数字以及涉及减法的示例,例如 IX 或 XL。当第一轮单元测试之后,我们试图要求更多的测试来“破坏”或“强调”软件时,这是一个惊喜。这些可以找到有趣的用例和意想不到的组合。罗马数字到十进制计算器的压力测试,这是 ChatGPT 3.5 产生的结果:

  哈里·罗宾逊(Harry Robinson)在回顾这篇文章时指出,断言和价值观是一个神谕,是一种发现问题的程序化方式。他提出了一个有趣的问题:最初是人类创建了 ChatGPT 随后扩展的原始测试吗?可以想象,ChatGPT 可能与 Github 上存在的某些示例一致,尽管我们一开始并没有提供任何此类示例。值得注意的是,尽管对 GitHub 和更广泛的互联网进行了彻底的搜索,但我们无法发现与这一特定策略的任何相似之处。就此而言,连续超过三个“I”可以说是无效的罗马数字 -我们需要要求。这同样适用于含有无效字母、特殊字符和小数的罗马数字;我们需要知道软件应该做什么。

  3、根据给定的需求生成示例规范代码。这将简单的需求转换为“Given … When … Then”,或 GWT 格式。通过建立清晰而精确的术语,可以实现这些 GWT 文档的自动化,将它们转换为可执行的示例。总的来说,BDD 的历史是混乱的。人们在用简单的英语就能完成的情况下生成大量非常厚的 GWT,但却无法实现文档的自动化,这是很常见的情况。其中许多文件都没有自动化,导致其要求类似于 15 世纪古老的英国法律公告。如果没有合适的工具的帮助,这使得它们很难理解。人工智能工具有潜力更有效地自动化和维护“Given-When-Then”场景。通过利用人工智能,可以获取函数签名并生成相应的代码,增加成功自动化的可能性。我们的审稿人 Wouter Lagerweij 报告了使用生成式 AI 工具为 BDD 制作“粘合代码”或样板文件的可喜成果,我们将在即将发表的文章中更广泛地深入探讨这个主题。

  4、发现需求中的问题。许多要求不一致、模糊或有多种解释。为了说明这一点,我们向 ChatGPT 提出了一组反映组织环境中经常遇到的质量的要求。仔细考虑一下。

  我们希望该工具能够发现 21 岁和 30 岁是重叠的年龄。确实如此,而且 40 岁的重叠也确实如此。但是,该工具在提供有关 100 岁驾驶员的指导方面存在不足。同样,当面对涉及负责任的 22 岁学生司机的场景时,该工具也无法提供明确的解决方案。我们应该从 500 美元中扣除 10% 还是连续两次将 500 美元乘以 95%?生成式人工智能工具缺乏就此事向我们提供建议的能力。请记住,LLM 工具不像人类那样具有洞察力——它们找到了如何将单词串在一起的数学模型。如果有足够的培训和一致的领域(例如税法),它可能会更有帮助。到目前为止,这将受到大量的人工监督。

  二、测试设计

  1、产生测试想法特殊情况作为清单。我们中的一些人可以快速说出测试想法。注入大数据、尝试小数据、使用特殊字符、小数、在软件需要数字时使用字符串、将字段留空等。其他人只是手头有一张备忘单。如果有一个足够智能的工具来找出其中哪些适用于不同的领域,那就太好了。继续提出您自己的测试想法,甚至进行您自己的测试 - 然后向工具询问其想法。初级测试人员和想要更深入的测试人员可以期望在那里找到一两颗宝石,而且价格便宜。

  2、生成测试想法- 组合测试用例。给定一组可能的输入,all-single、 all-pairs和all-triples是将执行的测试减少到一些最强大的示例的方法。当组合少于35个测试用例时,ChatGPT生成测试用例。更大的是,它推荐了一个工具,比如微软的PICT,实际上把我们输入的数据转换成了PICT的参数。

  3、生成综合测试数据。如果有一个足够智能的工具来回答如下问题不是很好吗:

  有了 ChatGPT,现在您就可以了!尽管 ChatGPT 一直在尝试生成小样本。需要哄骗它制造更多,最多大约 50 行。巴德做得更糟,创建了十行然后产生了空行。Lambdatest 博客的另一篇文章中有更多关于测试数据生成的信息。当然,还有大量的开源测试数据生成器;他们只是无法像生成人工智能那样处理自然英语。

  三、测试

  1、生成测试代码(样板)。通常测试代码需要连接到库,或者访问 API 端点,或者驱动浏览器,单击按钮。这些事情应该很容易,但由于某种原因却并非如此。我们陷入困境。因为它们在网络上寻找示例并创建内存中标记化的查找表,所以大型语言模型可能能够生成代码来为我们完成这些事情。当我们开始研究时,我们预计会陷入困境,因为 selenium IDE、webdriver、webdriver 2.0 等使用了很多不同的设置/安装/代码。然而,我们使用谷歌和亚马逊等经典网站的开源样板示例几乎是开箱即用的。Google 的 Bard 可以访问当今的互联网,因此理论上您可以为自己的网站生成样板。在实践中我们发现,从今天开始,巴德不看网站——它只能看经典网站和搜索结果。对于少数最大的公共网站之外的网站,巴德似乎会“伪造”,建议使用不起作用的代码。例如,它建议 FireFox 使用 select_element_by_xpath(目前尚未实现),并且建议应用程序连接到“search_button”的 :name 属性——这不是 Excelon 开发主页上搜索按钮的正确定位器。

  2、生成给定需求的模型(测试预言机)。软件通常必须执行复杂的计算。获得它的一种策略是模型驱动它。也就是说,创建另一个软件,它采用相同的变量并给出答案。然后在给定相同输入的情况下将两者一起运行,并比较答案。第二个软件称为“Oracle”,可能要粗糙得多。软件生成的模型总是有错误的,但是配备 for 循环的程序员可以编写代码来找出两者之间的差异,这可以成为良好对话的源泉。请注意,这并没有取代传统测试,而是增强了传统测试。

  3、查找可访问性问题。虽然 Bard 不直接访问网页,但我们发现我们可以粘贴 HTML 部分,只要它足够短并且没有复杂的 javascript 来操纵网页结构。ChatGPT4 生成的建议混合了一般建议和一些具体建议,列出了来自该网页的实际表单字段的示例。巴德的建议相对通用,但确实包含网页存在的可访问性缺陷。(我们使用 php bb 的登录表单,例如apachefriends.org)

  四、总结/结论

  俄亥俄州克利夫兰的软件测试员 Andy Hird(目前正在竞选软件测试协会的董事会成员)指出,使用 AI 生成测试想法和数据与依靠 AI 来生成测试想法和数据之间存在差异。产生预期结果。换句话说,如果您为这些工具提供代码,返回测试,剪切/粘贴,保存并运行,您应该得到您可能得到的结果。另一位咨询界的朋友 Wouter Lagerweij 认为,很少有技术人员能够在测试驱动开发 (TDD) 和 BDD 所要求的严格的测试-代码-重构反馈循环中轻松工作。生成式人工智能,尤其是开发环境中的人工智能,例如 Github 的 CoPilot,可以填补这一空白 - 但你必须仔细检查它。,

  使用这些工具进行存根代码的巨大好处是,它们可以帮助我们克服“卡住”点,即我们无法弄清楚为什么几行代码不起作用,例如启动浏览器或单击按钮。这个“卡住”点可能会改变两行代码并花费一到四个小时。具有讽刺意味的是,当我尝试让这些工具为罗马数字 kata 生成简单代码时,该代码包含一个离一索引错误,访问超出范围的数组并导致崩溃。调试和修复它大约需要两个小时和两行代码,大约是从头开始编写所需时间的一半。Excelon Development的开发人员 Blake Link报告称“样板”代码生成减少了 90%。

  我们意识到上面的两个数据点相互矛盾。然而,我们到了。我们的目标既不是告诉您人工智能是一个令人惊叹的解决方案,也不是“揭穿”任何东西。相反,我们希望对生成式人工智能进行广泛、详细的分析以进行测试,以推动该领域的对话、研究和应用向前推进半英寸。

  目前,最好寻找这些工具作为测试想法的来源并生成模板代码来驱动事件。已经存在用于生成综合测试数据、可访问性测试和组合想法的工具。法学硕士的力量不在于完成这项工作,而在于使非结构化自然语言具有程序意义。

        卓码软件测评是一家[ 具备CMA、CNAS双重资质 ]的专业做软件测试的第三方软件测试服务机构, 可根据您的需求提供各类软件测试服务,并出具合格有效的软件测试报告。点击→→可了解测试报价

        部分文字、图片来自网络,如涉及侵权,请及时与我们联系,我们会在第一时间删除或处理侵权内容。负责人:曾菲       电话:4006070568


文章标签: 软件测试 软件测评
咨询软件测试