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

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

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

小夜