🚀 构建 AI 驱动的 Jest 测试用例生成器(适用于 TypeScript)
I’m happy to translate the article for you, but I need the full text of the post (the content that follows the source line). Could you please provide the article’s body so I can translate it while preserving the formatting and code blocks?
编写单元测试是最佳实践,但对许多开发者来说,这是一项重复、耗时的工作,且随着项目规模扩大,容易被搁置。
在 TypeScript 后端项目中,保持 Jest 测试覆盖率高往往意味着要花大量时间编写样板代码,而不是专注于实际业务逻辑。
解决方案
我构建了 ts-genai-test,一个基于 AI 的 Jest 测试用例生成器,适用于 TypeScript(Node.js),它可以使用可配置的生成式 AI 提供商自动创建有意义的单元测试。
- GitHub:
- npm:
🧠 The Problem
大多数开发者在编写单元测试时都会遇到相同的挑战:
- 编写重复的 Jest 样板代码
- 由于时间紧迫而遗漏边缘情况
- 重构后测试变得过时
- 花在测试上的时间比写代码的时间还多
传统的测试生成器可以搭建文件结构,但它们并不了解函数的意图。生成式 AI 能够推理函数签名和预期行为,使其非常适合用于单元测试生成。让我们对此保持好奇!
🤖 什么是 ts-genai-test?
ts-genai-test 是一个开发者工具,具备以下功能:
- 自动生成 Jest 单元测试用例
- 适用于 TypeScript(Node.js)项目
- 支持多种 AI 提供商
- 可配置模型名称和 API 密钥
- 生成可直接运行的
.test.ts文件 - 旨在无缝集成到 CI/CD 工作流中
项目使用 TypeScript 编写,使用 pnpm 打包,注重简洁、可扩展和开发者友好。
✨ 关键特性
✅ AI 生成的 Jest 测试用例
将工具指向一个 TypeScript 文件或函数,它会自动生成 Jest 测试用例。
import path from "path";
import { generateTests, functionalTypes } from "ts-genai-test";
const inputPrompt: functionalTypes.PromptInput[] = [
{
outputTestDir: path.resolve(__dirname, "../__tests__"), // optional, defaults to 'tests' folder
folderPath: path.resolve(__dirname, "../src"), // source folder
filePath: path.resolve(__dirname, "../src/index"), // source file
functionName: "add", // function to generate tests for
testFileName: "", // optional custom test file name
rootPath: "" // required if outputTestDir not provided
}
];
await generateTests(inputPrompt);
生成的输出干净、可读,并且可以直接执行——无需手动清理。
🧩 覆盖已有测试用例(基于标志的控制)
默认情况下,ts-genai-test 会保留已有的测试文件,以避免意外覆盖。当启用 override 标志时:
- 现有的
.test.ts文件会被显式覆盖 - 之前生成的或手动编写的测试可以被新生成的测试替代
- 开发者完全掌控何时允许重新生成
这种有意且明确的做法降低了意外更改的风险,同时仍然支持重新生成的工作流。
⚙️ 广泛且灵活的 AI 配置
配置模型细节(建议通过环境变量):
| 变量 | 描述 |
|---|---|
AI_PROVIDER | AI 提供商(例如 openai、gemini、groq) |
AI_MODEL_NAME | 模型代码或名称(例如 gemini-2.5-flash) |
AI_API_KEY | 提供商 API 密钥 |
AI_RETRY_COUNT | AI 调用失败的重试次数 |
这种灵活性使团队能够切换提供商、控制成本,并为工作流的未来发展做好准备。
🔄 内置重试机制
AI 调用可能因网络问题或响应不完整而失败。ts-genai-test 包含一次性重试机制,在失败前尝试重新生成——这使得在 CI 流水线等自动化环境中更安全。
🗂 自动测试目录处理
如果目标测试目录不存在,工具会自动创建,降低了设置的阻力。
🧪 示例
给定一个简单的工具函数:
export function add(a: number, b: number): number {
return a + b;
}
工具会生成类似以下的 Jest 测试:
test("adds two numbers", () => {
expect(add(2, 3)).toBe(5);
});
简洁、可读,并且可以立即执行。
⚠️ 限制
- 需要审查: 生成的测试应在投入生产前进行审查。AI 输出可帮助开发者,但不能替代人工判断。
- 复杂逻辑: 具有复杂业务逻辑的函数可能需要手动调整以确保正确性和覆盖率。
- 范围: 目前仅支持功能(单元级)测试用例。REST API 测试、基于 Swagger/OpenAPI 的生成以及端到端场景尚未提供。
这些限制定义了当前的范围,并凸显了未来改进的机会。
🤝 开源与协作
ts-genai-test 完全开源。欢迎贡献、提交问题和功能请求!
祝测试愉快!
欢迎贡献
我们正在寻找在以下几个方面的帮助:
- 支持更多 AI 提供商
- 改进提示质量
- 添加对其他测试框架的支持
- 探索基于 REST 或 Swagger 的测试生成
- 处理不受支持的语言和错误代码
- 支持非 TypeScript 文件
文档与示例
🔗 GitHub: testcase-gen-ai-ts
📦 npm: ts-genai-test
🧰 技术栈
- TypeScript
- Node.js
- pnpm (v10.24.0)
- Jest
- 生成式 AI (基于 LLM 的测试生成)
📦 安装
使用 pnpm(推荐):
pnpm install ts-genai-test
或使用 npm:
npm install ts-genai-test
📌 最后思考
本项目探讨了生成式 AI 如何帮助开发者以更少的工作量编写更好的单元测试。虽然它并不能取代深思熟虑的测试设计,但它显著减少了样板代码并加快了开发速度。
如果你正在使用 TypeScript 后端并且花费太多时间编写 Jest 测试,这个工具可能会有所帮助。欢迎随时贡献!