智能体刷屏的背后,是 AI 应用拐点的来临?AICon 北京站议程重磅公布,50+ 硬核分享不容错过 了解详情
写点什么

Slack 如何使用 AI 驱动的混合方法将 Enzyme 迁移到 React 测试库

作者: Ben Linders

  • 2024-12-27
    北京
  • 本文字数:2308 字

    阅读完需:约 8 分钟

Slack 如何使用 AI 驱动的混合方法将 Enzyme 迁移到 React 测试库

Sergii Gorbachov 在 旧金山 QCon 表示,Enzyme 缺乏对 React 18 的支持,导致其现有的单元测试无法使用,并危及了他们提供的基本信心。他展示了 Slack 如何将所有的 Enzyme 测试迁移到 React 测试库(React Testing Library,RTL),以确保其测试覆盖率的持续性。


React 测试库是业界公认的选择,React 18 并没有其他官方支持的替代品。Gorbachov 说道,这使得这个决策变得简单明了,并且符合最佳实践。


Enzyme 的方法强调了测试内部组件的细节,比如状态、属性和实现细节。Gorbachov 说,切换到 React 测试库引入了一种不同的方法,侧重于模拟用户在真实环境中如何与组件及其行为进行交互。


他们首先使用大语言模型(LLM)作为一个独立的工具,依靠它来生成完全转换和功能测试。Gorbachov 提到,虽然这种方法取得了部分成功,但其有效性因测试的复杂性而异。


接下来,他们将 LLM 集成到一个更大的管道中,将其与抽象语法树(AST)转换相结合,并结合验证、linting 和迭代反馈的步骤来修复第一次的尝试,正如 Gorbachov 所解释的那样:


这种混合方法兼具两种方法的优点,帮助我们实现了 80% 的转换成功率,在保持测试质量的同时显著提高了效率。


为了评估所生成代码的质量,他们创建了一个详细的质量标准,评估了 codemod 功能(可靠性和错误处理)、导入转换(用 RTL 等效替换 Enzyme 导入)、渲染(将 Enzyme 渲染转换为 RTL)、Enzyme 方法(替换 Enzym 方法或添加注释)、断言(更新为与 RTL 兼容的断言)以及 JS/TS 逻辑(保留测试功能):


我们从每个难度级别(简单、中等和复杂)中选择了三个 Enzyme 测试文件,并手动评估了它们以衡量我们的进度。难度是根据测试用例、导入、Enzyme 方法和断言的数量等特征确定的,测试用例的权重更大,平均复杂度评级以将文件置于其中一个难度级别为标准。


他们自动转换文件,并使用质量标准评估结果,以人工转换的文件为基准。Gorbachov 表示,他们的工具平均准确率为 80%,但在更复杂的情况需要手动调整。


Gorbachov 表示,将确定性方法与人工智能相结合有助于克服其局限性,例如缺乏实时反馈以及对预处理和后置处理的依赖。他补充道,通过集成基于 AST 的转换、注释和精心制作的提示,他们将转换成功率提高了 20-30%,超过了 LLM 的开箱即用功能,即在人工工作流程之后对上下文进行建模。


虽然 LLM 在处理高复杂性、非结构化任务方面表现出色,但对于确定性的任务,最好避免使用 LLM,但正如 Gorbachov 所解释的那样:


我们的方法包括生成代码的执行和验证,可以转移到像单元测试生成、代码现代化和可读性改进这样的项目中,从而实现完整的端到端流程。


为了重用这种方法并为其他类型的项目构建类似的管道,Gorbachov 引用了 Enzyme 到 RTL codemod、用于完整实现的 convert-test-files 工作流程,并在 Slack 上发表关于 AI 驱动的从 Enzyme 到 React 测试库转换的博客文章。


InfoQ 就他们迁移到 React 测试库的问题采访了 Sergii Gorbachov__

InfoQ:你们是如何调整自动化测试的?


Sergii Gorbachov:例如,考虑以下代码:


<div><button onClick={toggle}>Toggle</button>    <p>{isOn ? "Switch is ON" : "Switch is OFF"}</p ></div>
复制代码


使用 Enzyme,我们可以这样测试这种行为:


wrapper.setState({ isOn: false });expect(wrapper.find('p').text()).toBe('Switch is ON');
复制代码


这直接操纵组件的内部状态来断言结果。在 RTL 中,我们模拟用户交互:


userEvent.click(screen.getByText('Toggle'));expect(screen.getByText("Switch is ON")).toBeInTheDocument();
复制代码


这种方法侧重于验证用户操作的结果,并确保组件的行为符合用户的预期,而不是侧重组件的内部工作原理。

InfoQ:使用抽象语法树 codemod 和大语言模型有什么好处?


Gorbachov:使用抽象语法树(AST)codemod 和大语言模型(LLM)显著增强了测试转换过程。我们团队创建的 AST codemod 处理了简单的代码转换,并为规则过于模糊而无法通过编程定义的复杂场景添加了注释。


例如:


expect(component.find('div')).toHaveLength(2);
复制代码


将转换为:


// 转换建议:.find('div')-->使用组件渲染的 DOM 获取适当的选择器和方法:screen.getByRole('selector')或 screen.getByTestId('<dataid=......>')expect(component.find('div')).toHaveLength(2)
复制代码


该注释是专门为 LLM 创建的,并提供了详细且相关的指导,以帮助模型针对该特定的实例生成准确的转换。大多数此类实例都在原始文件中进行了注释,这些文件被用作转换的源代码。通过在 LLM 提示中包含部分转换的伪代码和注释以及定制的指令,我们减少了歧义,并最大限度地减少了仅依赖提示的 AI 方法中常见的幻觉。


作者介绍


Ben Linders 是一位来自荷兰的敏捷、精益、质量和持续改进方面的独立顾问。他著有《从敏捷回顾中获得价值(Getting Value out of Agile Retrospectives)》、《Waardevolle 敏捷回顾(Waardevolle Agile Retrospectives)》、《是什么推动了质量(What Drives Quality)》、《敏捷自我评估游戏(The Agile Self-assessment Game)》、《问题?什么问题?(Problem? What Problem?)》以及《持续改进(Continuous Improvement)》。并且是许多 敏捷辅导工具 的创建者,例如敏捷自我评估游戏。作为一名顾问、教练和培训师,他通过部署有效的软件开发和管理实践来帮助组织。他专注于持续改进、协作和沟通以及专业发展,为客户提供商业价值。Ben 是敏捷、精益和质量网络的活跃成员,也是一位经常演讲和写作的人。他在一个双语博客(荷兰语和英语) 中分享自己的经验,并在 InfoQ 担任敏捷方面的编辑。可以通过 @BenLinders 在推特上关注他。


原文链接:

https://www.infoq.com/news/2024/12/ai-enzyme-react-test-library/

2024-12-27 09:008251

评论

发布
暂无评论

算法有救了!GitHub 上神仙项目手把手带你刷算法,Star 数已破500k

Java 编程 程序员 面试 算法

2021 斩获 90K 月薪的 Spring 全家桶:文档 + 面试题 + 学习笔记 + 思维导图

编程 架构 微服务 IT 计算机

Apache之道在腾讯的探索与实践

腾源会

Apache 开源 腾源会 腾讯开源

Python代码阅读(第7篇):列表分组计数

Felix

Python 编程 Code Programing 阅读代码

Java测试框架九大法宝

FunTester

自动化测试 JUnit 测试框架 selenium testNG

高频面试题-请把Java垃圾回收器说清楚

Java 编程 架构 面试 JVM

孩子排斥写作业 VS 员工不接活儿——项目管理来帮忙

Ian哥

如何用Camtasia添加视频水印?

淋雨

视频剪辑 Camtasia 录屏软件

iPhone Shortcuts 使用与场景

TroyLiu

iphone 效率工具 快捷指令 shortcuts nfc

C++ Vector

若尘

c++ vector 8月日更

接口返回值一定不允许使用枚举类型吗?

skow

Java 面试 后端 开发规范

面试进阶齐飞!霸榜GitHub的 Java 全栈笔记太香了!

Java 编程 程序员 IT 计算机

TCP如何进行拥塞控制

W🌥

计算机网络 TCP/IP 8月日更

我看 JAVA 之 并发编程【三】java.util.concurrent.atomic

awen

Java 并发编程 Atomic 原子操作

这波性能优化,太炸裂了!

why技术

Java 性能优化 JVM

The Data Way Vol.1|风口下的开源市场:如何看待开源与商业的关系?

SphereEx

数据库 开源

台达AS228T_CanOpen_VFD_X

林建

台达 AS228T Canopen 功能块 E变址

MySQL中的DEFINER(定义者)是什么

Simon

MySQL

“助力金九银十”25 大Java后端面试指南,3000道面试题解析

Java 编程 程序员 面试 IT

万字长文讲透低代码

百度开发者中心

最佳实践 开发者 方法论 低代码 语言 & 开发

你真的懂语音特征吗?

华为云开发者联盟

语音 音频 声学 时域图 时域

收获颇丰!这份阿里架构师纯手敲JDK源码全彩小册可以打满分

Java架构追梦

Java 阿里巴巴 架构 面试 jdk源码

Java 程序性能优化“学习日记”

Java 编程 面试 IT 计算机

Tensor:Pytorch神经网络界的Numpy

华为云开发者联盟

神经网络 数组 PyTorch Numpy Tenso

为什么安全性在托管中变得越来越重要

九河云安全

xposed 入门之修改手机 IMEI

Qunar技术沙龙

android 程序员 App 经验分享 安卓

spring cloud 在国内中小型公司能用起微服务来吗?

Java 程序员 架构 面试 IT

简单的Postman,还能玩出花?

码农参上

8月日更

从技术到文案,还回技术么?

escray

学习 极客时间 朱赟的技术管理课 8月日更

Compose 编程思想

Changing Lin

8月日更

惠及百万用户 医保“上云”有了新思路

云计算

Slack 如何使用 AI 驱动的混合方法将 Enzyme 迁移到 React 测试库_AI&大模型_InfoQ精选文章