unit-test-generator:让 AI Agent 按规范自动生成单元测试

前言

写单元测试是开发流程里绕不开的一环,却也是很多人能拖就拖的事。函数边界没想清楚、异常分支漏测、框架选型不一致,补测试往往比写业务代码还费时间。更常见的情况是:代码已经合进主分支,覆盖率指标压下来,才开始对着 IDE 里空白的 test_*.py*.test.ts 发愁。

AI 编程助手能帮你「写几个测试」,但输出质量往往取决于当次对话里你怎么描述需求——有时只覆盖 happy path,有时框架和项目现有约定对不上。Agent Skill 的思路,是把「怎么分析代码、怎么选框架、怎么组织测试报告」写进一份可复用的 SKILL.md,让 Agent 每次触发时都走同一套流程。

本文介绍的 unit-test-generator,来自社区仓库 JackyST0/awesome-agent-skillsexamples/ 示例集。它是一个面向「根据源代码生成单元测试」的 Skill 模板:结构清晰、门槛不高,很适合作为你学习 Skill 写法、或在团队里快速落地的起点。Skill 采用 CC0-1.0 许可,可自由复制与改造。

这是什么

unit-test-generator 是一份 Agent Skill 指令包,核心文件是目录下的 SKILL.md。Agent 读取该文件后,会在用户提出「生成单元测试」「为函数/类写测试」「提高代码覆盖率」等需求时,按固定步骤分析源码并输出测试代码与覆盖说明。

它并不绑定某一家 AI 产品。同一套 Skill 目录可以放到 Cursor、Claude Code、GitHub Copilot、OpenAI Codex 等支持 Agent Skills 规范的工具中(各平台的安装路径见下文)。Skill 本身不包含独立的测试运行器或 CLI,价值在于把测试生成的分析流程标准化,减少每次对话里重复交代框架、边界和输出格式的时间。

核心功能与亮点

根据官方 SKILL.md,该 Skill 的工作流可以概括为五步:

  1. 识别代码 — 判断编程语言与代码结构(函数、类、模块)。
  2. 分析功能 — 理清输入、输出与核心行为。
  3. 确定边界 — 找出边界值与边缘情况(空值、零、越界等)。
  4. 选择框架 — 按语言匹配项目常用的测试框架。
  5. 生成测试 — 输出可运行的测试用例,并附覆盖说明。

支持的语言与测试框架

官方文档列出了以下对应关系:

语言 测试框架
Python pytest、unittest
JavaScript / TypeScript Jest、Mocha、Vitest
Java JUnit、TestNG
Go 标准库 testing
Rust cargo test(内置)

需要说明的是:Skill 通过指令引导 Agent 做选型与生成,并不会自动检测你仓库里已安装的依赖;若项目已有既定框架(例如全栈 monorepo 统一用 Vitest),在对话里点明框架名称,输出会更贴合现有工程。

覆盖的测试类型

生成时会按四类场景组织用例:

  • 正常路径测试 — 验证预期输入下的标准行为。
  • 边界条件测试 — 极值、临界状态。
  • 异常处理测试 — 错误分支、抛错类型与消息。
  • 空值 / 空输入测试nullundefined、空字符串、空集合等。

结构化输出报告

Skill 要求使用同目录下 templates/test-report.md 模板格式化结果。模板包含:分析概述、被测函数列表、生成的测试代码、按类别统计的用例数量,以及「如何运行」的命令占位。这样 Agent 的输出不只是零散代码块,而是一份可归档、可评审的测试生成报告。

对初学者而言,这份示例 Skill 还有两点实用价值:一是社区维护、可复制——目录里只有 SKILL.md 和模板,没有复杂脚本;二是贴近高频场景——补测试几乎是 AI 编程里被调用最多的任务之一,把它固化成 Skill,比每次手写长提示词更省事。

安装与启用

方式一:使用 awesome-agent-skills 一键安装脚本(推荐)

仓库提供了跨平台安装脚本,可将 unit-test-generator 连同 SKILL.mdtemplates/test-report.md 下载到对应平台目录。

macOS / Linux:

# 交互式选择平台与 Skill
curl -sL https://raw.githubusercontent.com/JackyST0/awesome-agent-skills/main/install.sh | bash

# 直接安装到 Cursor
curl -sL https://raw.githubusercontent.com/JackyST0/awesome-agent-skills/main/install.sh | bash -s -- -p cursor -s unit-test-generator

Windows(PowerShell):

irm https://raw.githubusercontent.com/JackyST0/awesome-agent-skills/main/install.ps1 | iex

安装完成后,Skill 会出现在目标平台的 skills 目录中,例如 Cursor 全局路径为 ~/.cursor/skills/unit-test-generator/

方式二:手动复制

git clone https://github.com/JackyST0/awesome-agent-skills.git
cp -r awesome-agent-skills/examples/unit-test-generator ~/.cursor/skills/

若只希望当前项目可用,可复制到项目根目录的 .cursor/skills/unit-test-generator/(或 .codex/skills/.claude/skills/ 等,视工具而定),便于随仓库与团队共享。

各 AI 编程工具中的目录位置

根据 awesome-agent-skills 官方 README使用指南

平台 全局目录 项目目录
Cursor ~/.cursor/skills/ .cursor/skills/
Claude Code ~/.claude/skills/ .claude/skills/
GitHub Copilot ~/.copilot/skills/ .github/skills/
Windsurf ~/.windsurf/skills/ .windsurf/skills/
OpenAI Codex ~/.codex/skills/ .codex/skills/

项目级 Skill 优先于全局同名 Skill。安装后可通过 ls ~/.cursor/skills/unit-test-generator/ 确认 SKILL.mdtemplates/test-report.md 是否存在;若 Agent 未自动识别,重启 IDE 或在对话中明确引用 Skill 名称即可。

典型用法示例

官方 SKILL.md 给出了一个最小可复现示例。假设待测 Python 函数如下:

def divide(a: float, b: float) -> float:
    if b == 0:
        raise ValueError("Cannot divide by zero")
    return a / b

在 Agent 对话中,你可以这样触发(自然语言即可,不必背固定咒语):

请为下面的 divide 函数生成单元测试,使用 pytest,并按 test-report 模板输出报告。

[paste 上面的源码]

Skill 引导下的典型输出结构如下(节选自官方示例):

import pytest
from your_module import divide

class TestDivide:
    """Tests for the divide function."""

    def test_divide_positive_numbers(self):
        assert divide(10, 2) == 5.0
        assert divide(7, 2) == 3.5

    def test_divide_negative_numbers(self):
        assert divide(-10, 2) == -5.0
        assert divide(10, -2) == -5.0
        assert divide(-10, -2) == 5.0

    def test_divide_by_zero_raises_error(self):
        with pytest.raises(ValueError, match="Cannot divide by zero"):
            divide(10, 0)

    def test_divide_zero_numerator(self):
        assert divide(0, 5) == 0.0

    def test_divide_float_precision(self):
        assert divide(1, 3) == pytest.approx(0.333333, rel=1e-5)

报告中的「测试覆盖说明」会逐项勾选:正常除法、负数、除零异常、分子为零、浮点精度等。把生成文件保存到项目测试目录后,按项目惯例执行,例如:

pytest tests/test_divide.py -v

对 JavaScript 项目,同样在提示里注明「使用 Jest / Vitest」,并附上待测模块路径,Agent 会按 Skill 中的语言—框架表生成对应语法。

适用场景与注意事项

适合谁、什么场景

  • 补遗留代码的测试:老模块缺少单测,需要快速铺一批边界与异常用例。
  • 新函数 TDD 辅助:实现函数后,让 Agent 按 Skill 流程生成初稿,再人工删减合并。
  • 统一团队输出格式:通过 test-report.md 模板,让不同同事、不同对话里的测试交付物结构一致。
  • 学习 Skill 写法:示例体量小、无外部依赖,适合 fork 后加上你们团队的命名规范、Mock 约定或覆盖率门槛。

使用时的限制与建议

  1. 生成结果需要人工审查。Skill 不能保证测试一定通过,也不能替代对业务语义的理解;合并前应在本地跑一遍测试套件。
  2. 导入路径与 Mock 需对齐项目结构。官方示例里的 from your_module import divide 只是占位,你要在对话里说明真实模块路径,或生成后手动改 import。
  3. 未列出的语言需自行扩展。当前 Skill 只写了 Python、JS/TS、Java、Go、Rust;若用 C#、Kotlin 等,可在 fork 的 SKILL.md 里追加框架行,或对话中直接指定。
  4. 与项目测试规范结合。若团队要求 Given-When-Then 命名、禁止真实网络请求等,建议把这些规则写进 Skill 的 Instructions 段,而不是每次口头重复。
  5. 一键安装脚本的范围install.sh 安装的是本仓库 examples/ 下 bundled 的几个示例 Skill,并非通用 Skill 包管理器;第三方 Skill 仍需手动复制或使用各平台自有安装方式。

小结

unit-test-generator 把「分析源码 → 选框架 → 覆盖边界与异常 → 输出结构化报告」这套单元测试生成流程,封装成一份可安装的 Agent Skill。它来自社区 curated 示例,轻量、可复制,适合作为 AI 编程工作流里补测试的标准化起点。

若你想进一步定制,可以直接 fork examples/unit-test-generator,在 SKILL.md 里加入你们项目的目录约定、覆盖率目标或 CI 命令;也可以浏览同仓库的 code-reviewdebug-helper 等示例,拼成一套团队专属的 Agent 能力集。

官方地址:https://github.com/JackyST0/awesome-agent-skills/tree/main/examples/unit-test-generator

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜