從鐵人賽 30 天到 29 個 Agent Skills — 背景、願景與知識體系

系列:從鐵人賽到 Agent Orchestration — AI 自動建立 .NET 測試的完整方案(1/10)

前言

2025 年參加 iThome 鐵人賽,以「重啟挑戰:老派軟體工程師的測試修練」為題完成了 30 天的挑戰,內容涵蓋了從 xUnit 基礎、Mock、測試資料產生、到 Testcontainers, .NET Aspire 整合測試以及 TUnit 的完整範疇。

完賽之後,我一直在想辦法讓這些知識能被 AI 直接使用。直到 2025 年 12 月初,Anthropic 釋出了 Agent Skills 的技術規範,讓 AI Agent 能以結構化的方式載入領域知識 — 這就是我一直在期待的解決方案。於是我把鐵人賽 30 天的知識進行提煉,在 2026 年 1 月 20 日釋出了 dotnet-testing-agent-skills v1.0.0 — 29 個 Agent Skills,讓 AI 擁有 .NET 測試的領域專業技能。而專案也在持續演進中,截至目前已來到 v2.2.0

這篇文章是系列的第一篇,先介紹整個專案的背景、29 個 Skills 的全貌,以及如何安裝到你的專案中使用。


鐵人賽 30 天 — 涵蓋了哪些測試技術

「重啟挑戰:老派軟體工程師的測試修練」是 2025 年 iThome 鐵人賽的系列文章,30 天的內容覆蓋了 .NET 測試的相關技術:

  • xUnit 基礎:專案建置、測試命名規範、輸出記錄
  • 斷言與驗證:AwesomeAssertions(FluentAssertions 的開源替代方案)、複雜物件比對、FluentValidation 測試
  • Mock 與依賴隔離:NSubstitute、AutoFixture + NSubstitute 整合
  • 測試資料產生:AutoFixture、Bogus、Test Data Builder Pattern
  • 特定場景處理:TimeProvider 時間測試、IFileSystem 檔案系統抽象
  • 程式碼覆蓋率:Fine Code Coverage 分析
  • 整合測試:ASP.NET Core Integration Test、WebAPI 整合測試
  • 容器化測試:Testcontainers(SQL Server、Redis、MongoDB)
  • .NET Aspire 測試:Aspire Testing Support
  • 新世代框架:TUnit、xUnit v2 → v3 升級

30 天的範例程式碼都放在 GitHub 上:


從「人讀文章」到「AI 讀技能」

鐵人賽完賽後,我在專案開發過程中與 AI 對話時,每次需要用到某個測試技術,就會手動把對應的文章連結和範例專案連結貼到對話裡。例如需要用到 TimeProvider 的時候,我就會貼上:

測試日期與時間:Microsoft.Bcl.TimeProvider 取代 DateTime
- https://ithelp.ithome.com.tw/articles/10375821

範例專案
- https://github.com/kevintsengtw/30Days_in_Testing_Samples/blob/main/day16

讓 AI 去查看文章內容和範例程式碼,再依此產出測試。

但一整個專案開發下來,這樣的動作會來來回回重複非常多次 — 同一組連結可能貼了十幾次,每次開新對話又要重來。

直到 2025 年 12 月,Anthropic 釋出了 Agent Skills 的概念並將其定義為一個標準,接著 GitHub Copilot 也在同月以實驗性質開始支援。我看到就覺得 — 這不就是能取代過往那些重複又費力的做法嗎?

鐵人賽的文章是寫給「人」看的,但 AI Agent 需要的是結構化的指令,告訴它在什麼情境下、該用什麼技術、怎麼用才正確。Agent Skills 就是這樣的解決方案。

 

什麼是 Agent Skills

Agent Skills 是存放在專案目錄中的 SKILL.md 檔案,每個 Skill 就是一個資料夾,裡面包含了讓 AI 理解特定技術的完整指引。檔案結構如下:

.github/skills/
├── dotnet-testing/           # 入口型 Skill(導航中心)
│   └── SKILL.md
├── unit-test-fundamentals/   # 單元測試基礎
│   └── SKILL.md
├── nsubstitute-mocking/      # NSubstitute Mock 技術
│   └── SKILL.md
├── autofixture-basics/       # AutoFixture 基礎
│   └── SKILL.md
└── ...(共 29 個)

每個 SKILL.md 都有 YAML frontmatter 定義名稱與描述,讓 AI Agent 知道這個 Skill 是做什麼的、什麼時候該使用它:

---
name: nsubstitute-mocking
description: >-
  NSubstitute mocking and dependency isolation for .NET unit tests.
  Use when creating mock objects, setting up method returns, or
  verifying method calls with NSubstitute in xUnit test projects.
---

與其他概念的差異

在 AI 輔助開發的生態系中,有幾個容易混淆的概念,這裡做個簡單的區分:

概念用途粒度
Custom Instructions全域行為指引(語言、風格)
Prompt Files單次任務的提示模板
MCP (Model Context Protocol)工具呼叫(API、資料庫)工具層
Agent Skills領域專業知識(技術指引、最佳實踐)

Agent Skills 填補的是「領域知識」這個缺口 — AI 知道怎麼寫程式,但不一定知道你的團隊用 NSubstitute 而不是 Moq、用 AwesomeAssertions 而不是原生 Assert 更不是要付費的 FluentAssertions、測試命名要用中文三段式格式。

Skills 就是把這些「團隊的最佳實踐」交給 AI。


29 個 Skills 總覽

把鐵人賽 30 天的知識提煉後,整理出 29 個 Agent Skills,可以分為以下幾個類別:

基礎 Skills(19 個)

測試基礎(4 個)

Skill用途
unit-test-fundamentals單元測試核心概念、AAA Pattern、測試結構
test-naming-conventions中文三段式命名規範(方法_情境_預期結果)
xunit-project-setupxUnit 測試專案建置與設定
test-output-logging測試輸出與記錄

斷言與驗證(3 個)

Skill用途
awesome-assertions-guideAwesomeAssertions 斷言庫使用指引
complex-object-comparison複雜物件圖比對策略
fluentvalidation-testingFluentValidation 驗證器測試

Mock 與依賴隔離(2 個)

Skill用途
nsubstitute-mockingNSubstitute Mock 建立、設定回傳、驗證呼叫
autofixture-nsubstitute-integrationAutoFixture + NSubstitute 整合使用

測試資料產生(6 個)

Skill用途
autofixture-basicsAutoFixture 自動產生測試資料
autofixture-customizationAutoFixture 客製化策略
autodata-xunit-integrationAutoData + xUnit 整合
bogus-fake-dataBogus 假資料產生
autofixture-bogus-integrationAutoFixture + Bogus 整合
test-data-builder-patternTest Data Builder Pattern

特定場景(2 個)

Skill用途
datetime-testing-timeproviderMicrosoft.Bcl.TimeProvider + FakeTimeProvider 時間測試
filesystem-testing-abstractionsIFileSystem 檔案系統測試

輔助工具(2 個)

Skill用途
code-coverage-analysis程式碼覆蓋率分析
private-internal-testing存取 internal / private 成員測試

進階 Skills(8 個)

涵蓋整合測試與進階主題:

Skill用途
aspnet-integration-testingASP.NET Core 整合測試
webapi-integration-testingWebAPI 整合測試
testcontainers-databaseTestcontainers 資料庫測試(SQL Server、PostgreSQL)
testcontainers-nosqlTestcontainers NoSQL 測試(Redis、MongoDB)
aspire-testing.NET Aspire 整合測試
tunit-fundamentalsTUnit 測試框架基礎
tunit-advancedTUnit 進階功能(DI、平行執行)
xunit-upgrade-guidexUnit v2 → v3 升級指引

入口型 Skills(2 個)

Skill用途
dotnet-testing基礎測試的導航中心,引導 AI 找到正確的基礎子技能
dotnet-testing-advanced進階測試的導航中心,引導 AI 找到正確的進階子技能

主要使用技術

這 29 個 Skills 使用的核心技術:

  • 測試框架:xUnit 2.9.2
  • 斷言庫:AwesomeAssertions(FluentAssertions 的 Apache 2.0 開源 fork)
  • Mock 框架:NSubstitute
  • 測試資料:AutoFixture + Bogus
  • 時間測試:Microsoft.Bcl.TimeProvider + FakeTimeProvider
  • 檔案測試:System.IO.Abstractions (IFileSystem)
  • 命名規範:中文三段式(方法_情境_預期結果)

最終成果預覽 — Before vs After

在深入安裝與使用之前,先看一下這個系列最終要達成的目標:

Before(純靠 AI 通用能力)

  • 需要在 Prompt 中手動描述所有技術要求
  • AI 可能用 Moq 而不是 NSubstitute、用原生 Assert 而不是 AwesomeAssertions
  • 測試命名不一致、缺少最佳實踐

After(這個系列的最終目標)

  • 輸入一句話:「為 OrderService 建立完整的單元測試」
  • AI 自動完成:分析程式碼 → 載入對應 Skills → 撰寫測試 → 執行驗證 → 審查品質

從 29 個 Skills 出發,怎麼一步步走到這個結果?這就是接下來這個系列要聊的事。


安裝與快速使用

安裝方式

方法一:npx skills install(推薦)

最簡單的方式,一個指令安裝所有 Skills:

npx skills install kevintsengtw/dotnet-testing-agent-skills

方法二:直接複製

從 GitHub Repository 複製 .github/skills/ 目錄到你的專案中:

git clone https://github.com/kevintsengtw/dotnet-testing-agent-skills.git
cp -r dotnet-testing-agent-skills/.github/skills/ your-project/.github/skills/

方法三:Git Submodule

git submodule add https://github.com/kevintsengtw/dotnet-testing-agent-skills.git .github/skills-source

 

GitHub Copilot 使用者設定

如果你使用 GitHub Copilot,需要確認以下三項 VS Code 設定。開啟 VS Code Settings(Ctrl + ,),搜尋 skills

1. Chat: Use Agent Skills

{
  "chat.useAgentSkills": true
}

這是 Agent Skills 的主開關,控制是否將 Skills 作為專業能力提供給 Chat 使用。啟用後,Language Model 會在 read 工具可用時,根據對話情境按需載入對應的 Skills。Skills 的來源由下方的 chat.agentSkillsLocations 決定。

如果沒有啟用這個設定,即使你在專案中放了 Skills 檔案,AI 也完全不會去讀取它們。

2. Chat: Agent Skills Locations

{
  "chat.agentSkillsLocations": [
    ".github/skills",
    ".claude/skills",
    ".agents/skills",
    "~/.copilot/skills",
    "~/.agents/skills",
    "~/.claude/skills"
  ]
}

指定 VS Code 搜尋 Agent Skills(SKILL.md)的目錄位置。每個路徑下應包含以 Skill 名稱命名的子資料夾,裡面放 SKILL.md 檔案(例如 my-skills/skillA/SKILL.md)。路徑是相對於 Workspace 根目錄解析的。

Skills 不一定只能放在 .github/skills/ 裡,你可以根據團隊需求自訂搜尋路徑。

這些目錄分為兩個層級:

專案層級(Project Skills)— 存放在 Repository 中,團隊共享:

目錄說明
.github/skills/GitHub Copilot 預設目錄
.claude/skills/Claude Code 預設目錄
.agents/skills/Cursor 預設目錄

個人層級(Personal Skills)— 存放在使用者家目錄,個人專屬:

目錄說明
~/.copilot/skills/GitHub Copilot 個人 Skills
~/.claude/skills/Claude Code 個人 Skills
~/.agents/skills/通用個人 Skills

3. Chat > Experimental: Use Skill Adherence Prompt

{
  "chat.experimental.useSkillAdherencePrompt": true
}

這個設定非常關鍵,強烈建議啟用

預設情況下,AI 在偵測到相關的 Skill 時,可能只是「提到」有這個 Skill 存在,而不會真正去讀取並遵循 Skill 裡的指引。啟用這個設定後,VS Code 會注入一段更強的 Adherence Prompt,促使 AI 在偵測到相關 Skill 時立即載入並套用,而不是只宣告它的存在。

簡單來說:

  • 未啟用:AI 可能回應「我看到有 nsubstitute-mocking Skill 可用」,但沒有真正去讀取內容
  • 啟用後:AI 會直接讀取 nsubstitute-mocking/SKILL.md 的內容,並依照裡面的指引來撰寫測試

這個設定目前標示為「實驗性(Experimental)」,但對 Agent Skills 的實際觸發效果有明顯提升。如果你安裝了 Skills 卻發現 AI 似乎沒有使用它們,第一步就是確認這個設定是否已啟用。

參考文件:Use Agent Skills in VS Code

跨平台支援

除了 GitHub Copilot,這些 Skills 也支援其他 AI 開發工具。使用 npx skills install 安裝時會自動同步到多個目錄:

目錄支援的工具
.github/skills/GitHub Copilot
.claude/skills/Claude Code
.agents/skills/Cursor
.codex/skills/OpenAI Codex
.gemini/skills/Google Gemini

安裝後的自然對話

安裝完成、設定確認後,你可以直接在 VS Code Agent Mode 中用自然語言要求 AI 建立測試:

幫我為 OrderService 建立單元測試

AI 會根據你的程式碼特徵,嘗試載入對應的 Skills,運用正確的技術來建立測試。

不過這裡要誠實地說 — AI 主動觸發 Skill 的機率並不是 100%。這個問題是真實存在的,也是我在後續版本演進中持續努力解決的痛點,第二篇文章會詳細說明這件事。


系列文章導覽

這個系列共 10 篇文章,會帶你走過從 Agent Skills 到 Agent Orchestration 的完整旅程:

#文章標題核心主題
01從鐵人賽 30 天到 29 個 Agent Skills(本篇)背景與全覽
02Skills 的觸發困境與 Custom Prompts 的過渡方案痛點與過渡
03VS Code v1.109 與 Agent Orchestration 的登場技術突破
04dotnet-testing-orchestrator 架構解析架構深入
05四階段流程實戰實戰與驗證
06Integration Test Orchestrator整合測試
07Aspire Testing OrchestratorAspire 測試
08TUnit Testing OrchestratorTUnit 測試
09使用指南 — 將 Agent 加入你的專案操作指南
10未來展望 — Claude Code Orchestrator 與多平台生態展望與總結

下一篇會誠實面對 Agent Skills 目前的核心痛點 — AI 主動觸發 Skill 的機率偏低,以及 Custom Prompts 作為中間過渡方案的嘗試與局限。


參考資源

純粹是在寫興趣的,用寫程式、寫文章來抒解工作壓力