系列:從鐵人賽到 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 上:
- 鐵人賽系列文章:https://ithelp.ithome.com.tw/users/20066083/ironman/8276
- 範例程式碼:https://github.com/kevintsengtw/30Days_in_Testing_Samples
從「人讀文章」到「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-setup | xUnit 測試專案建置與設定 |
test-output-logging | 測試輸出與記錄 |
斷言與驗證(3 個)
| Skill | 用途 |
|---|---|
awesome-assertions-guide | AwesomeAssertions 斷言庫使用指引 |
complex-object-comparison | 複雜物件圖比對策略 |
fluentvalidation-testing | FluentValidation 驗證器測試 |
Mock 與依賴隔離(2 個)
| Skill | 用途 |
|---|---|
nsubstitute-mocking | NSubstitute Mock 建立、設定回傳、驗證呼叫 |
autofixture-nsubstitute-integration | AutoFixture + NSubstitute 整合使用 |
測試資料產生(6 個)
| Skill | 用途 |
|---|---|
autofixture-basics | AutoFixture 自動產生測試資料 |
autofixture-customization | AutoFixture 客製化策略 |
autodata-xunit-integration | AutoData + xUnit 整合 |
bogus-fake-data | Bogus 假資料產生 |
autofixture-bogus-integration | AutoFixture + Bogus 整合 |
test-data-builder-pattern | Test Data Builder Pattern |
特定場景(2 個)
| Skill | 用途 |
|---|---|
datetime-testing-timeprovider | Microsoft.Bcl.TimeProvider + FakeTimeProvider 時間測試 |
filesystem-testing-abstractions | IFileSystem 檔案系統測試 |
輔助工具(2 個)
| Skill | 用途 |
|---|---|
code-coverage-analysis | 程式碼覆蓋率分析 |
private-internal-testing | 存取 internal / private 成員測試 |
進階 Skills(8 個)
涵蓋整合測試與進階主題:
| Skill | 用途 |
|---|---|
aspnet-integration-testing | ASP.NET Core 整合測試 |
webapi-integration-testing | WebAPI 整合測試 |
testcontainers-database | Testcontainers 資料庫測試(SQL Server、PostgreSQL) |
testcontainers-nosql | Testcontainers NoSQL 測試(Redis、MongoDB) |
aspire-testing | .NET Aspire 整合測試 |
tunit-fundamentals | TUnit 測試框架基礎 |
tunit-advanced | TUnit 進階功能(DI、平行執行) |
xunit-upgrade-guide | xUnit 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-mockingSkill 可用」,但沒有真正去讀取內容 - 啟用後:AI 會直接讀取
nsubstitute-mocking/SKILL.md的內容,並依照裡面的指引來撰寫測試
這個設定目前標示為「實驗性(Experimental)」,但對 Agent Skills 的實際觸發效果有明顯提升。如果你安裝了 Skills 卻發現 AI 似乎沒有使用它們,第一步就是確認這個設定是否已啟用。

跨平台支援
除了 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(本篇) | 背景與全覽 |
| 02 | Skills 的觸發困境與 Custom Prompts 的過渡方案 | 痛點與過渡 |
| 03 | VS Code v1.109 與 Agent Orchestration 的登場 | 技術突破 |
| 04 | dotnet-testing-orchestrator 架構解析 | 架構深入 |
| 05 | 四階段流程實戰 | 實戰與驗證 |
| 06 | Integration Test Orchestrator | 整合測試 |
| 07 | Aspire Testing Orchestrator | Aspire 測試 |
| 08 | TUnit Testing Orchestrator | TUnit 測試 |
| 09 | 使用指南 — 將 Agent 加入你的專案 | 操作指南 |
| 10 | 未來展望 — Claude Code Orchestrator 與多平台生態 | 展望與總結 |
下一篇會誠實面對 Agent Skills 目前的核心痛點 — AI 主動觸發 Skill 的機率偏低,以及 Custom Prompts 作為中間過渡方案的嘗試與局限。
參考資源
- 鐵人賽系列文章:https://ithelp.ithome.com.tw/users/20066083/ironman/8276
- 鐵人賽範例程式碼:https://github.com/kevintsengtw/30Days_in_Testing_Samples
- Use Agent Skills in VS Code:https://code.visualstudio.com/docs/copilot/customization/agent-skills
- dotnet-testing-agent-skills:https://github.com/kevintsengtw/dotnet-testing-agent-skills
- SKILLS_USAGE_GUIDE.md:https://github.com/kevintsengtw/dotnet-testing-agent-skills/blob/main/SKILLS_USAGE_GUIDE.md
- SKILLS_QUICK_REFERENCE.md:https://github.com/kevintsengtw/dotnet-testing-agent-skills/blob/main/SKILLS_QUICK_REFERENCE.md
- Anthropic — The Complete Guide to Building Skills for Claude:https://claude.com/blog/complete-guide-to-building-skills-for-claude
- 指南 PDF:https://resources.anthropic.com/hubfs/The-Complete-Guide-to-Building-Skill-for-Claude.pdf
- 指南繁中翻譯(Ian Chen):https://github.com/iangithub/translate/blob/main/The-Complete-Guide-to-Building-Skill-for-Claude_zh-TW.md
- 指南繁中翻譯(Will 保哥):https://drive.google.com/file/d/10llQ9I1JGboNsENEvhL42jc5GnHddcZ-/view
- agentskills.io 官方規範:https://agentskills.io
純粹是在寫興趣的,用寫程式、寫文章來抒解工作壓力