最近,我有机会深入研究 Early,一个专为自动单元测试生成而设计的 AI 代理。作为经常使用 TypeScript 和 ExpressoTS Framework 的人,我很想知道 Early 如何简化我的工作流程。我决定测试他们在我正在开发的名为 @expressots/share 的新 NPM 库上构建的 vscode 扩展。
Early 让我印象深刻的第一件事是它能够为我现有的代码库自动生成单元测试。我可以专注于改进生成的测试并提高代码的健壮性和可测试性,而不是从头开始编写测试。这种转变极大地加快了我的发展进程。我注意到的另一个有趣的方面是,我生成的 83% 的代码没有进行任何调整,它开箱即用,并增加了我的代码覆盖率。为我节省了很多时间。
在短短 8.5 小时内,我成功:
我能在一天之内完成这一切,真是太了不起了。单元测试的理想场景是在实际开发功能时进行测试。我是在我已经有了一个库之后才这样做的,因此需要进行一些调整以使代码可测试。
自动生成边缘案例测试。例如,它为涉及空字符串的场景生成单元测试,即使需要参数:
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 29.7
expect(Compiler.loadConfig()).rejects.toThrowError("process.exit() was called with code 1");
// 修正版本
export function printSuccess(message: string, component: string): void { stdout.write(chalk.green(`${message}:`, chalk.bold(chalk.white(`[${component}] ✔️\n`)))); }
观察:为每个可能的输入(包括空字符串)生成测试有时可能有点过头了。
建议:引入自定义测试生成级别的选项,允许开发人员根据需要选择加入防御性编程测试。
测试结果可见性:我必须在 Early 和 Jest 之间切换才能查看哪些测试通过或失败。
文件树状态:从其他应用程序切换回来时,Early 中的项目层次结构会崩溃,需要我反复重新打开文件夹。
建议:改进 UI 以在 Early 中显示测试结果,反映 Jest 的结构。维护文件树的状态也可以增强用户体验。
观察:在模拟中使用任何类型都可能导致类型不匹配并可能掩盖错误。
建议:改进模拟生成以使用准确的签名,促进更好的类型安全并减少手动更正的需要。
总的来说,我在 Early 的经历非常积极。该工具显着加速了我的单元测试过程,使我能够专注于改进测试,而不是从头开始编写测试。它还鼓励我考虑边缘情况并提高代码的稳健性。
需要改进的领域相对较小,主要围绕增强可用性和定制化。解决这些问题将使该工具在软件开发中变得更加强大。
感谢早期团队的出色工作!我很高兴看到该工具如何发展,并很乐意继续提供反馈以帮助进一步完善它。
以上是使用早期 AI 生成单元测试的详细内容。更多信息请关注PHP中文网其他相关文章!