如何让AI生成项目的单元测试,propmt技巧详解

比如你的项目是一个典型的 Java (Spring Boot) + Vue3 的前后端分离项目。

为了让 AI(无论是我、ChatGPT 还是其他代码模型)生成高质量的测试代码,你需要提供具体的上下文。AI 不能凭空猜你的数据库字段或接口参数。

以下是为你定制的 Prompt 模板 ,你可以直接复制使用。为了获得最佳效果,建议你分模块、分文件地向 AI 提问,而不是一次性丢给它整个项目。


🚀 通用 Prompt 结构(万能公式)

无论你让 AI 写哪种测试,Prompt 最好包含以下 4 个要素:

  1. 角色设定:告诉 AI 它是谁。
  2. 上下文:提供代码或文档片段(你已经上传了文档,这很好)。
  3. 具体任务:明确要生成什么。
  4. 输出要求:指定格式(如 JUnit 5、Mockito、JSON 等)。

🧪 场景一:生成后端单元测试 (Java)

适用对象 :你的 Service 层逻辑,比如 CertificateTimeRangeFilterService(时间筛选逻辑)或 CertificateGradeService(等级比较逻辑)。

你的输入 :复制粘贴具体的 Java 类或方法代码。

使用的 Prompt:

角色:你是一个资深的 Java 架构师,擅长编写高质量的单元测试。

上下文 :

这是一个 Spring Boot 项目中的证书管理模块。这是 CertificateGradeService 的代码(或者粘贴具体的代码片段):
java

编辑

复制代码
1// 在这里粘贴你的 Java 代码,例如:
2public enum CertificateGrade { ... }
3public int compareCertificateGrades(String grade1, String grade2) { ... }

任务 :

请为这个类/方法生成 JUnit 5 单元测试用例。

要求:

  1. 使用 @ExtendWith(MockitoExtension.class)。
  2. 覆盖所有分支逻辑(例如:grade1 为空、grade2 为空、正常比较)。
  3. 使用 @ParameterizedTest 和 @ValueSource / @CsvSource 来测试多种输入组合。
  4. 对于枚举类,测试所有枚举值的优先级排序是否正确。
  5. 断言要具体(使用 assertEquals, assertTrue 等)。

🐞 场景二:生成后端接口测试用例 (API Testing)

适用对象 :你的 Controller 层接口,比如 /project/certificate/list。

你的输入 :提供 API 的定义或文档描述。

使用的 Prompt:

角色:你是一个专业的后端测试工程师。

上下文 :

这是一个证书管理系统的 API 接口文档:

  • 接口 :GET /project/certificate/list
  • 功能:分页查询证书列表,支持按名称、类型、等级、时间范围筛选。
  • 参数 :pageNum, pageSize, certificateName (模糊查询), certificateType, dateFilterType (GENERAL/PATENT), validStartDate, validEndDate。

任务 :

请设计一份详细的接口测试用例表,并生成对应的 JSON 格式的请求示例。

要求:

  1. 正常场景:参数完整,查询有效数据。
  2. 边界值分析 :
    • pageNum = 0 或负数(预期:默认为1)
    • pageSize = 1(最小页)或 1000(最大页)
    • 时间范围:开始时间等于结束时间。
  3. 异常场景 :
    • 必填参数缺失(如不传 pageNum)。
    • 参数类型错误(如传字符串给 pageNum)。
    • 时间格式错误。
  4. 输出格式:Markdown 表格,包含"用例描述"、"请求参数"、"预期状态码"、"预期响应"。

🦋 场景三:生成前端单元测试 (Vue.js)

适用对象 :你的 Vue 组件逻辑,比如 index.vue 中的 calculateTableHeight 或 getDateFieldValue 方法。

你的输入 :复制粘贴 <script setup> 中的关键逻辑。

使用的 Prompt:

角色:你是一个前端测试专家,精通 Vue Test Utils 和 Jest。

上下文 :

这是一个 Vue3 + Element Plus 的证书管理页面组件。这是 <script setup> 中的逻辑片段:
javascript

编辑

复制代码
1// 在这里粘贴你的 JS 逻辑,例如:
2const getDateFieldValue = (row) => { ... }
3const calculateTableHeight = () => { ... }

任务 :

请为这些函数/组件逻辑生成单元测试。

要求:

  1. 使用 Jest 框架。
  2. 模拟 window.innerHeight 的不同值(例如 800px, 600px),测试 calculateTableHeight 是否正确计算了减去预留高度后的值。
  3. 测试 getDateFieldValue 在不同 queryParams.value.dateFilterType(PATENT, SOFTWARE_COPYRIGHT, GENERAL)下的返回值是否正确。
  4. 使用 describe 和 test 块组织代码。

💡 给你的特别建议(基于你的文档)

根据你的《证书管理模块开发方案》,有几个逻辑复杂点特别适合让 AI 帮你写测试,因为这些地方容易出 Bug:

  1. 时间字段的动态筛选逻辑:

    • 代码位置:CertificateTimeRangeFilterService 中的 getEffectiveDateField。
    • 提示词重点 :请生成测试用例,验证当 dateFilterType 为 PATENT 时,SQL 条件是否正确指向 authorization_announce_date 字段;当为 GENERAL 时是否指向 expiry_date。
  2. 证书等级的智能匹配:

    • 代码位置:CertificateGradeService 中的 intelligentMatchGrade。
    • 提示词重点 :请生成测试数据,输入包含"国家"、"national"、"国"、"省"、"市"等关键词的字符串,验证是否能正确匹配到 NATIONAL 或 PROVINCIAL 枚举。
  3. 文件类型验证:

    • 代码位置:validateCertificateFile。
    • 提示词重点 :请生成边界测试用例,例如上传 .exe 文件(预期拒绝)、超大尺寸文件(预期拒绝)、以及正常的 .pdf 和 .jpg(预期通过)。
相关推荐
从琳开始989几秒前
从Socket到UDP回显服务器:Java网络编程完整指南
java·网络·网络协议·udp·java-ee
晓天衡宇•评测社区2 分钟前
当需求具体到图片尺寸,Nano Banana 2.1 交出了什么答案?
人工智能·计算机视觉
fruge9 分钟前
没有独显也想做AI配音?我用MOSS-TTS-Nano在CPU电脑上跑通了本地语音生成
人工智能·电脑
天树星智源10 分钟前
静态物理满分、交互 11.54%:3D 场景生成系统的幻觉
论文阅读·人工智能·3d·机器人
七牛云行业应用12 分钟前
DeepSeek Harness 插件架构 vs MCP:Cordis 的「Everything is a Plugin」到底解决什么
ai·github·ai编程
OpenAnolis小助手14 分钟前
多租户公有云共享 CXL 内存池场景下的内存卸载研究
人工智能·操作系统·龙蜥社区·risc-v·agentic os
sg_knight17 分钟前
Bug 定位实战:把报错丢给 Codex,它是怎么修的
chatgpt·llm·bug·openai·agent·ai编程·codex
xsd2024111826 分钟前
OCEC 24×40 开闭眼脑电分类:从 α 波节律到实时 BCI 落地方案
人工智能·1024程序员节
king王一帅26 分钟前
AI 时代少有人类阅读,我开始建自己的独立站,但真的是 49 年入国军吗
开源·ai编程·markdown
Ivanqhz27 分钟前
MoE + LLM 应用
数据库·人工智能·pytorch·python·深度学习·算法·1024程序员节