”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 使用早期 AI 生成单元测试

使用早期 AI 生成单元测试

发布于2024-11-08
浏览:583

加速单元测试生成并提高代码质量

最近,我有机会深入研究 Early,一个专为自动单元测试生成而设计的 AI 代理。作为经常使用 TypeScript 和 ExpressoTS Framework 的人,我很想知道 Early 如何简化我的工作流程。我决定测试他们在我正在开发的名为 @expressots/share 的新 NPM 库上构建的 vscode 扩展。

初步印象

Early 让我印象深刻的第一件事是它能够为我现有的代码库自动生成单元测试。我可以专注于改进生成的测试并提高代码的健壮性和可测试性,而不是从头开始编写测试。这种转变极大地加速了我的发展进程。我注意到的另一个有趣的方面是,我生成的 83% 的代码没有进行任何调整,它开箱即用,并增加了我的代码覆盖率。为我节省了很多时间。

节省时间并扩大覆盖范围

在短短 8.5 小时内,我设法:

  • 生成大约 3,000 行代码的单元测试。
  • 修复问题并增强代码可测试性。
  • 通过 96 次测试实现 88% 的总代码覆盖率。

我能在一天之内完成这一切,这一事实是了不起的。单元测试的理想场景是在实际开发功能时进行测试。我是在我已经有了一个库之后才这样做的,因此需要进行一些调整才能使代码可测试。

积极成果

自动生成边缘案例测试。例如,它为涉及空字符串的场景生成单元测试,即使需要参数:

export function printSuccess(message: string, component: string): void {
  stdout.write(chalk.green(`${message}:`, chalk.bold(chalk.white(`[${component}] ✔️\n`))));
}

最初,我不会在如此简单的函数中创建空字符串的测试。然而,Early 的方法促进了防御性编程实践,促使我处理我可能忽略的边缘情况。

检测潜在问题

在优化生成的测试时,我遇到了类型不匹配的问题:

问题:jest.fn() 返回 any,但 process.exit 从不返回,导致 TypeScript 中类型不匹配。
解决方案:修改mock以匹配process.exit签名,确保类型正确性。
这一发现促使我调整我的代码以获得更好的类型安全性,突出显示 Early 如何帮助识别否则可能会被忽视的微妙问题。

需要改进的地方

尽管总体体验积极,但我遇到了一些挑战,如果解决这些挑战,可以提高 Early 的可用性:

  • 库版本兼容性。在某些情况下,早期生成的测试使用已弃用的 Jest 方法,例如:

使用 Jest 29.7

expect(Compiler.loadConfig()).rejects.toThrowError("process.exit() was called with code 1");

//修正版本

expect(Compiler.loadConfig()).rejects.toThrow("process.exit() was called with code 1");
  • 测试生成的自定义选项 虽然为边缘情况生成测试是有益的,但在某些情况下,可能没有必要:

观察:为每个可能的输入(包括空字符串)生成测试有时可能有点过分。

建议:引入自定义测试生成级别的选项,允许开发人员根据需要选择防御性编程测试。

  • VSCODE 扩展中的用户界面增强功能 在 Early 和其他工具之间导航突出了一些 UI 限制:

测试结果可见性:我必须在 Early 和 Jest 之间切换才能查看哪些测试通过或失败。

文件树状态:从其他应用程序切换回来时,早期的项目层次结构会崩溃,需要我反复重新打开文件夹。
建议:改进 UI 以在 Early 中显示测试结果,反映 Jest 的结构。维护文件树的状态也将增强用户体验。

Unit Test Generation with Early AI

  • 模拟和类型安全 jest.fn() 返回 any 的问题表明需要更精确的模拟:

观察:在模拟中使用任何类型都可能导致类型不匹配并可能掩盖错误。
建议:改进模拟生成以使用准确的签名,促进更好的类型安全并减少手动更正的需要。

结论

总的来说,我在 Early 的经历非常积极。该工具显着加速了我的单元测试过程,使我能够专注于改进测试,而不是从头开始编写测试。它还鼓励我考虑边缘情况并提高代码的稳健性。

需要改进的领域相对较小,主要围绕增强可用性和定制化。解决这些问题将使该工具在软件开发中变得更加强大。

感谢早期团队的出色工作!我很高兴看到该工具如何发展,并很乐意继续提供反馈以帮助进一步完善它。

版本声明 本文转载于:https://dev.to/rsaz/unit-test-generation-with-early-ai-31co?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    从python import codecs import codecs import codecs 导入 text = codecs.decode('这狗\ u0001f602'.encode('utf-8'),'utf-8') 印刷(文字)#带有...
    编程 发布于2025-07-14
  • C++成员函数指针正确传递方法
    C++成员函数指针正确传递方法
    如何将成员函数置于c [&& && && && && && && && && && &&&&&&&&&&&&&&&&&&&&&&&华仪的函数时,在接受成员函数指针的函数时,要在函数上既要提供指针又可以提供指针和指针到函数的函数。需要具有一定签名的功能指针。要通过成员函数,您需要同时提供对象指针(此...
    编程 发布于2025-07-14
  • 为什么PYTZ最初显示出意外的时区偏移?
    为什么PYTZ最初显示出意外的时区偏移?
    与pytz 最初从pytz获得特定的偏移。例如,亚洲/hong_kong最初显示一个七个小时37分钟的偏移: 差异源利用本地化将时区分配给日期,使用了适当的时区名称和偏移量。但是,直接使用DateTime构造器分配时区不允许进行正确的调整。 example pytz.timezone(...
    编程 发布于2025-07-14
  • 如何在Java的全屏独家模式下处理用户输入?
    如何在Java的全屏独家模式下处理用户输入?
    Handling User Input in Full Screen Exclusive Mode in JavaIntroductionWhen running a Java application in full screen exclusive mode, the usual event ha...
    编程 发布于2025-07-14
  • 如何正确使用与PDO参数的查询一样?
    如何正确使用与PDO参数的查询一样?
    在pdo 中使用类似QUERIES在PDO中的Queries时,您可能会遇到类似疑问中描述的问题:此查询也可能不会返回结果,即使$ var1和$ var2包含有效的搜索词。错误在于不正确包含%符号。通过将变量包含在$ params数组中的%符号中,您确保将%字符正确替换到查询中。没有此修改,PDO...
    编程 发布于2025-07-14
  • 表单刷新后如何防止重复提交?
    表单刷新后如何防止重复提交?
    在Web开发中预防重复提交 在表格提交后刷新页面时,遇到重复提交的问题是常见的。要解决这个问题,请考虑以下方法: 想象一下具有这样的代码段,看起来像这样的代码段:)){ //数据库操作... 回声“操作完成”; 死(); } ?> ...
    编程 发布于2025-07-14
  • 为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    在Microsoft Visual C 中,Microsoft consions用户strate strate strate strate strate strate strate strate strate strate strate strate strate strate strate st...
    编程 发布于2025-07-14
  • Java数组中元素位置查找技巧
    Java数组中元素位置查找技巧
    在Java数组中检索元素的位置 利用Java的反射API将数组转换为列表中,允许您使用indexof方法。 (primitives)(链接到Mishax的解决方案) 用于排序阵列的数组此方法此方法返回元素的索引,如果发现了元素的索引,或一个负值,指示应放置元素的插入点。
    编程 发布于2025-07-14
  • 找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    如何在mySQL中使用mySql 检索最大计数,您可能会遇到一个问题,您可能会在尝试使用以下命令:理解错误正确找到由名称列分组的值的最大计数,请使用以下修改后的查询: 计数(*)为c 来自EMP1 按名称组 c desc订购 限制1 查询说明 select语句提取名称列和每个名称...
    编程 发布于2025-07-14
  • 如何限制动态大小的父元素中元素的滚动范围?
    如何限制动态大小的父元素中元素的滚动范围?
    在交互式接口中实现垂直滚动元素的CSS高度限制问题:考虑一个布局,其中我们具有与用户垂直滚动一起移动的可滚动地图div,同时与固定的固定sidebar保持一致。但是,地图的滚动无限期扩展,超过了视口的高度,阻止用户访问页面页脚。$("#map").css({ marginT...
    编程 发布于2025-07-14
  • \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    答案: 在大多数现代编译器中,while(1)和(1)和(;;)之间没有性能差异。编译器: perl: 1 输入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    编程 发布于2025-07-14
  • Python高效去除文本中HTML标签方法
    Python高效去除文本中HTML标签方法
    在Python中剥离HTML标签,以获取原始的文本表示Achieving Text-Only Extraction with Python's MLStripperTo streamline the stripping process, the Python standard librar...
    编程 发布于2025-07-14
  • 如何使用Python理解有效地创建字典?
    如何使用Python理解有效地创建字典?
    在python中,词典综合提供了一种生成新词典的简洁方法。尽管它们与列表综合相似,但存在一些显着差异。与问题所暗示的不同,您无法为钥匙创建字典理解。您必须明确指定键和值。 For example:d = {n: n**2 for n in range(5)}This creates a dicti...
    编程 发布于2025-07-14
  • 为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    查询模式实现缺失:解决“无法找到”错误在银光应用程序中,尝试使用LINQ建立错误的数据库连接的尝试,无法找到以查询模式的实现。”当省略LINQ名称空间或查询类型缺少IEnumerable 实现时,通常会发生此错误。 解决问题来验证该类型的质量是至关重要的。在此特定实例中,tblpersoon可能需...
    编程 发布于2025-07-14
  • 在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
    在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
    在C中的显式删除 在C中的动态内存分配时,开发人员通常会想知道是否有必要在heap-procal extrable exit exit上进行手动调用“ delete”操作员,但开发人员通常会想知道是否需要手动调用“ delete”操作员。本文深入研究了这个主题。 在C主函数中,使用了动态分配变量(H...
    编程 发布于2025-07-14

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3