使用GPT3 将测试从 Cypress 重写为 Playwright

2023-01-04   出处: contra  作/译者:Gajus Kuizinas/Yilia


  Cypress 和@playwright/test 是两个相互竞争的集成测试框架。 我们使用 Cypress 已经很长时间了,但最近决定将Cypress 测试迁移到 Playwright,全部 400 个。 为了提高速度和可靠性(未来的帖子),这绝对是值得的……但是,这意味着大量的手动工作!

左:Cypress,右: Playwright。 两种测试的编写方式在结构上有很多相似之处。

发现

  在手动重写测试和观察 GitHub 的 Copilot 建议时,我想到了使用 GPT3 重写测试的想法。
  如果不将旧的 Cypress 测试复制到同一个文件中,这些建议是非常随机的并且不是特别有用。 当我在开始编写测试之前将注释掉的 Cypress 代码复制到一个空的 Playwright 规范文件中时,Copilot 才开始提出明智的建议。那天我使用 Tab(完成建议)的次数比以往任何时候都多。 但是,使 Copilot 变得不那么有用的是:

  1. 它有时有效,有时无效
  2. 随着文件大小的增加,建议变得很糟糕
  3. 建议在新文件中丢失了以前代码的上下文
    旁注:知道 Copilot 是使用 GPT3+Codex 实现的,这让我开始思考……鉴于我们已经手动重写了一些测试,为 GPT3 编写自动化(或半自动化)的提示会有多难 完全重写测试?我决定尝试使用 OpenAI 的 Playground。

    OpenAI Playground

      如果不熟悉 OpenAI 的 Playground 界面,它基本上是带有几个切换按钮的文本输入。输入一条指令并观察 API 完成响应,尝试匹配你提供的上下文和模式,例如:

    常规文本是用户输入的提示。 突出显示的文本是响应。
    我所需要的只是一个提示和一些例子。 这是我整理的内容:

      为简洁起见,我跳过了代码示例,但你可以在此处找到完整的提示。值得注意的是,训练示例不是有效测试(如果执行它会失败),而是我们在所有测试中使用的模式集合。 此外,为了消除偏差,只使用了已经手动迁移的测试作为输入。以下是仅使用一个训练示例的结果,按照复杂性递增的顺序列出。
    一个简单的测试,没有新patterns:

      上述测试的输出正是我在代码库中编写的内容。一个好的开始!一个简单的测试,只介绍几个容易推导的概念:

示例输入/输出#2
这就是我们的代码库中已有的。

我们在使用 GPT3 之前编写的迁移。
上述示例的有趣之处在于,训练数据从未见过 toBeChecked 或 toBeDisabled。
带有一堆看不见的概念的更复杂的测试:

有一些错误,但总体上非常接近!
在我们的代码库中是:

手动迁移测试
  与紫色示例类似,GPT3 真正令人印象深刻的是它如何处理以前从未见过的场景。 整个 registerNewTestUser 回调在训练数据集中不可用。 上次测试的实现大不相同。 尽管如此,这主要是因为迁移测试的人在重写测试时做出了固执己见的选择(例如,用 has-text 来支持基于 nth 的选择器)。 否则,它们在功能上是等价的。
  总的来说,这真的很酷! 写这篇文章比训练 GPT3 做一些节省数百小时的事情花费的时间更长。 在实践中,我唯一一次观察到 GPT3 给出了意想不到的建议是在它之前没有看到那个模式/助手的时候。 在那些情况下,我只是用那个特定的用例示例扩展了训练示例。对我们来说,这是对工作流程的一个相当(令人愉快的)改变。 随着我们继续重写剩余的 300~ 个测试,工作流程主要是 [复制粘贴]、[评估]、[应用][为新案例扩展训练示例]。

观看 OpenAI Playground 键入响应永远不会过时!
  我们最初将主要按照 GPT3 的建议迁移所有测试,然后返回并寻找改进的机会。总而言之,这是 GPT3 的一个非常巧妙的应用,也为我们的团队节省了大量时间,我觉得我们只是触及了可能性的表面!

声明:本文为本站编辑转载,文章版权归原作者所有。文章内容为作者个人观点,本站只提供转载参考(依行业惯例严格标明出处和作译者),目的在于传递更多专业信息,普惠测试相关从业者,开源分享,推动行业交流和进步。 如涉及作品内容、版权和其它问题,请原作者及时与本站联系(QQ:1017718740),我们将第一时间进行处理。本站拥有对此声明的最终解释权!欢迎大家通过新浪微博(@测试窝)或微信公众号(测试窝)关注我们,与我们的编辑和其他窝友交流。
235° /2352 人阅读/0 条评论 发表评论

登录 后发表评论