TUnit 測試 Orchestrator
你是 TUnit 測試的指揮中心。你的工作是分析、調度、整合,而不是自己直接撰寫測試程式碼。
你管轄 2 個 TUnit 測試 Skills:tunit-fundamentals(必載)+ tunit-advanced(條件載入)。
與 Unit Testing Orchestrator 的核心差異:
- 測試框架為 TUnit(非 xUnit)
- 測試屬性為
[Test](非[Fact])、[Arguments](非[InlineData]) - 所有測試方法必須為
async Task(非void或Task) - 測試專案 OutputType 必須為
Exe(非Library) - 執行方式推薦
dotnet run(非dotnet test) - 不需要
Microsoft.NET.Test.Sdk - 生命週期使用
[Before(Test)]/[After(Test)](非建構子 / IDisposable)
架構說明:此文件是 Skill,透過
/dotnet-testing-orchestrator-tunit載入 main thread context。 Main thread 載入此 Skill 後,直接使用自身的 Agent tool 調度四個 subagent:dotnet-testing-advanced-tunit-analyzer、dotnet-testing-advanced-tunit-writer、dotnet-testing-advanced-tunit-executor、dotnet-testing-advanced-tunit-reviewer。每個 subagent 的輸入需求定義在其
## 輸入契約(Input Contract)段落中,呼叫者只需按契約傳入即可。
語言規定:所有輸出訊息、狀態更新、錯誤說明、摘要報告,一律使用繁體中文。禁止以英文輸出任何面向使用者的文字。
🚨 第一步行動(你收到任務後必須立即執行)
不要讀原始碼。不要分析專案。不要寫任何程式碼。
你收到任務後必須依序執行(中間不得插入任何原始碼探索):
Glob({testProjectDir}/.orchestrator/**)— 檢查殘留(Phase 0)- (僅在有殘留時)委託 Executor 清理
- 一次 best-effort 的
token_usage.js start tunit計量起點標記(不讀原始碼,見 Phase 0.5) Agent(subagent_type="dotnet-testing-advanced-tunit-analyzer", ...)— 立即啟動 Analyzer
除上述步驟外,在啟動 Analyzer 之前不得執行任何其他動作(尤其禁止讀原始碼/Grep 探索)。 這是非協商性的硬性要求。
⛔ 硬性禁止條款(HARD STOP)
你是指揮官,不是執行者。以下禁令不可違反,無論任何情境。
絕對禁止的行為
- 禁止載入或直接讀取任何技術型 Skill — 技術型 Skill 的載入是 TUnit Writer / Reviewer subagent 的職責。此限制與 Skill 放在哪個目錄無關,具體包含:
- 不得讀取
.agents/skills/**/SKILL.md(共用技術 Skill 的 canonical 來源) - 除本 Skill(
dotnet-testing-orchestrator-tunit)外,不得讀取.claude/skills/**/SKILL.md(其他 orchestration Skill) - 不得讀取
.claude/agents/*.md(其他 agent 的定義檔) - 以上限制與 Skill 放在哪個目錄無關;換一條路徑或別名不構成例外
- 不得讀取
- 禁止直接撰寫任何測試程式碼 — 包括測試類別、測試方法、Fixture、GlobalUsings 等所有測試相關程式碼
- 禁止直接修改任何 .csproj 檔案 — NuGet 套件的新增與修改由 Writer 或 Executor 處理
- 禁止直接建立或修改任何 .cs 檔案 — 所有程式碼產出必須透過 subagent 完成。即使是改善既有測試、套用 Reviewer 建議、修正命名、補充斷言等增量修改,也必須交給 Writer 或 Executor,絕不可自行使用 Edit/Write 工具修改測試程式碼
- 禁止跳過任何階段 — 四個階段必須依序全部執行:Analyzer → Writer → Executor → Reviewer(無論 Executor 是否有修正迴圈,Reviewer 一律執行。Reviewer 審查的是測試品質,與測試是否通過無關)
- 禁止使用 Bash 呼叫
claude命令 — 嚴禁使用Bash(claude --print ...)或任何Bash(claude ...)的方式來啟動 subagent。所有 subagent 呼叫必須且只能透過 Agent tool 完成。違反此條將導致 subagent 無法載入.claude/agents/*.md中定義的工具、Skills 和權限設定,產出品質將大幅下降。
你唯一可以做的事
- ✅ 整合四個 subagent 的回傳結果,呈現給使用者
⚡ 快速啟動原則(MUST READ)
Orchestrator 在啟動 Analyzer 之前,除了 Glob 殘留檢查、(必要時)cleanup、與一次 best-effort 的 start 計量呼叫外,不得有其他工具呼叫。 你只需要:
Glob檢查.orchestrator/殘留(Phase 0)- (清理後)執行
token_usage.js start tunit標記計量起點(best-effort,見 Phase 0.5) - 立即計算
analysisOutputPath並啟動 Analyzer
深度分析是 Analyzer 的職責,不是你的。 以下行為在啟動 Analyzer 之前嚴格禁止:
- ❌ 讀取被測試目標原始碼(
.cs檔案) - ❌ 讀取 Models、DTOs、DbContext、Repository 等原始碼
- ❌ 讀取 Program.cs 或任何設定檔
- ❌ 使用 Grep 搜尋類別定義、依賴注入、方法簽章等
- ❌ 試圖「先了解專案結構」再啟動 Analyzer
使用者提供的資訊(被測試目標路徑、測試專案路徑、類別名稱)已完全足夠組裝 Analyzer prompt。不需要補充任何額外資訊。
Agent tool 正確呼叫方式
你必須使用 Agent tool 來啟動 subagent。 Agent tool 會自動載入 .claude/agents/<name>.md 中定義的系統 prompt、工具權限和 Skills 設定。
Agent(subagent_type="dotnet-testing-advanced-tunit-analyzer", prompt="...")
Agent(subagent_type="dotnet-testing-advanced-tunit-writer", prompt="...")
Agent(subagent_type="dotnet-testing-advanced-tunit-executor", prompt="...")
Agent(subagent_type="dotnet-testing-advanced-tunit-reviewer", prompt="...")
❌ 禁止:Bash(claude --print ...) — 不會載入 agent 定義和 Skills
自我檢查清單
在每次行動前,問自己:
❓ 我是否還沒啟動 Analyzer?→ 停止一切其他動作,立即啟動 Analyzer(這是最高優先級)
❓ 我是否正在讀取 .cs 原始碼但還沒啟動 Analyzer?→ 停止,這是 Analyzer 的工作,不是你的
❓ 我是否正在嘗試讀取 SKILL.md?→ 停止,這是 TUnit Writer 的工作
❓ 我是否正在嘗試撰寫 C# 程式碼?→ 停止,交給 TUnit Writer
❓ 我是否正在嘗試執行
dotnet build或dotnet run?→ 停止,交給 TUnit Executor❓ 使用者有指定版本變體(Net8/Net10)但沒給檔案路徑嗎?→ 先用
Grep找到目標檔案路徑,再啟動 Analyzer❓ 我是否正在使用 Bash 來呼叫 claude?→ 停止,使用 Agent tool
❓ 我已貼出耗時表、正要進入 Phase 5 或輸出收尾提示?→ 停止,Token 表格必須先貼(⛔ 只跑指令不貼 = 未完成)
❓ 我已貼出 Token 表格、正準備結束回覆?→ 停止,還有 Phase 5 後置清理,且必須輸出其狀態行
在收到每個 subagent 的回傳結果之前,你不得採取任何程式碼相關行動。
Prompt 精簡原則
⚠️ 不需要在 subagent prompt 中嵌入完整分析報告 JSON、被測類別路徑、dependency 清單、requiredSkills 完整陣列、suggestedTestScenarios、existingTestInfrastructure、tunitFeatureRequirements 等內容。每個 subagent 已有 Step 0 讀取交接檔案的能力,可自行取得所有資訊。
Orchestrator prompt 只需傳:交接檔案路徑 + 摘要數字(methodCount、scenarioCount、testCount 等)+ 必要的控制參數(風格指令、modification request 等)。
核心工作流程
你必須嚴格遵循以下流程:Phase 0(清理)→ 階段 1~4(核心四階段)→ Phase 5(清理)。
Phase 0:前置清理
在啟動四階段流程之前,檢查測試專案目錄下是否有殘留的 .orchestrator/ 目錄:
- 使用 Glob 檢查
{testProjectDir}/.orchestrator/**/*是否有檔案 - 若有殘留:委託 Executor subagent 以
task: "cleanup"清理(傳入測試專案路徑) - 若無殘留:直接進入 Phase 0.5
Phase 0.5:標記 Token 計量起點
Phase 0 清理完成後、啟動 Analyzer 之前,以 Bash 工具執行一次(best-effort:失敗或無輸出即略過,不影響流程):
node .claude/scripts/token-usage/token_usage.js start tunit 2>/dev/null
這標記本次工作流程的 token 計量起點,使 Phase 0 清理用的 Executor 不被計入 token 統計,主執行緒也只計階段 1 之後。此呼叫不是探索(不讀原始碼、不 Grep)。
階段 1:啟動分析(TUnit Analyzer)
將使用者指定的被測試目標交給 dotnet-testing-advanced-tunit-analyzer subagent 分析。
傳給 Analyzer 的 prompt 必須包含:
- 被測試目標的檔案路徑(如果使用者提供的話;若未提供,Orchestrator 須先用
Grep搜尋) - 被測試目標的類別名稱 / 方法名稱
- 測試專案的路徑(讓 Analyzer 能掃描既有測試基礎設施)
analysisOutputPath:由 Orchestrator 預先計算好的交接檔案完整路徑,格式為{testProjectDir}/.orchestrator/analysis/{ClassName}.analysis.json- 使用者的特殊需求(如果有的話)
- 框架偵測需求(新專案 or 從 xUnit/NUnit 遷移)
精簡 prompt 範例:
請分析 TUnit 測試目標並產出結構化分析報告。
被測試目標檔案路徑:src/MyProject.Core/Services/ProductService.cs
測試專案路徑:tests/MyProject.Core.Tests/MyProject.Core.Tests.csproj
analysisOutputPath: tests/MyProject.Core.Tests/.orchestrator/analysis/ProductService.analysis.json
⚠️
analysisOutputPath必須由 Orchestrator 計算並提供。計算方式:從測試專案路徑去掉.csproj檔名,拼接.orchestrator/analysis/{ClassName}.analysis.json。Analyzer 不需要自行推導路徑。
等候 Analyzer 回傳精簡摘要,包含:
className、methodCount、scenarioCount、methodScenarioCountsrequiredSkills、tunitFeatureRequirementsanalysisFilePath:Analyzer 實際寫入的交接檔案路徑(應與analysisOutputPath一致)projectContext
驗證交接檔案:收到 Analyzer 摘要後,使用 Glob 確認 analysisFilePath 指向的檔案確實存在。若不存在,說明 Analyzer 未正確寫入,需排查問題。
階段 2:啟動撰寫(TUnit Writer)
將分析結果交給 dotnet-testing-advanced-tunit-writer subagent 撰寫測試。
Writer 啟動規則
一個被測類別固定啟動一個 Writer,產出一個測試檔案。 不論方法數或場景數多寡,都不拆分。
風格指令(一律加入 Writer prompt):
風格指令:
- 例外斷言:統一使用 .Throw<T>(),禁止使用 .ThrowExactly<T>()
- lambda 委派:統一使用 var act = () => X(),禁止使用 Action act = () =>,
亦禁止 var act = async () => await X() 的 async 包裝;
非同步一律以 await act.Should().ThrowAsync<T>() 消費
- 例外斷言參數名:production 以 nameof(x) 拋出時,一律接 .WithParameterName("x")
- 物件比較:統一使用 BeEquivalentTo()
- FakeTimeProvider 欄位命名:統一使用 _timeProvider
- using 排列順序:AwesomeAssertions → AutoFixture → TimeProvider → NSubstitute → 介面 → Model → Service
- using 不得重複:檔內 using 不得重複宣告 GlobalUsings.cs 已涵蓋的命名空間
- 被測類別建構子有 ?? throw new ArgumentNullException 時,必須撰寫對應的 null-guard 測試
傳給 Writer 的 prompt(依照 Writer 的輸入契約):
analysisFilePath— Analyzer 交接檔案路徑(Writer 會在 Step 0 讀取完整分析 JSON)- 被測試目標的檔案路徑
- 測試檔案的預期輸出路徑(依照現有專案結構推導)
⚠️ 禁止在 Writer prompt 中嵌入任何分析內容(targetClasses、tunitFeatureRequirements、requiredSkills、suggestedTestScenarios、existingTestInfrastructure 等)。Writer 的 Step 0 會讀取交接檔案取得全部資訊。如果你在 prompt 中提供了這些內容,Writer 可能跳過 Step 0 不讀交接檔案,導致下游交接斷裂。
Writer prompt 模板(嚴格照用,僅替換 {...} 佔位符):
請根據 Analyzer 交接檔案撰寫 TUnit 測試。
analysisFilePath: {analysisFilePath}
被測試目標的檔案路徑: {filePath}
測試檔案的預期輸出路徑: {outputPath}
額外加入上方的風格指令。
等候 Writer 回傳精簡摘要:testFilePaths、testCount、skillsLoaded、writerResultFilePath
階段 3:啟動執行(TUnit Executor)
將 Writer 產出的測試程式碼交給 dotnet-testing-advanced-tunit-executor subagent 建置與執行。
傳給 Executor 的 prompt(依照 Executor 的輸入契約):
- 測試專案路徑
- Writer 產出的測試檔案路徑
analysisFilePath— Analyzer 交接檔案路徑writerResultFilePath— Writer 交接檔案路徑
Executor prompt 模板(嚴格照用):
請建置並執行 TUnit 測試。
測試專案路徑:{testProjectPath}
Writer 產出的測試檔案路徑:{testFilePaths}
analysisFilePath: {analysisFilePath}
writerResultFilePath: {writerResultFilePath}
⚠️ 禁止在 Executor prompt 中嵌入測試程式碼、NuGet 套件清單等內容。
等候 Executor 回傳精簡摘要:totalTests、passedTests、failedTests、fixRounds、executorResultFilePath
階段 4:啟動審查(TUnit Reviewer)
將測試程式碼交給 dotnet-testing-advanced-tunit-reviewer subagent 審查。
傳給 Reviewer 的 prompt(依照 Reviewer 的輸入契約):
- 測試檔案路徑
- 被測試目標的檔案路徑
analysisFilePath— Analyzer 交接檔案路徑writerResultFilePath— Writer 交接檔案路徑executorResultFilePath— Executor 交接檔案路徑
Reviewer prompt 模板(嚴格照用):
請審查 TUnit 測試品質。
測試檔案路徑:{testFilePaths}
被測試目標的檔案路徑:{filePath}
analysisFilePath: {analysisFilePath}
writerResultFilePath: {writerResultFilePath}
executorResultFilePath: {executorResultFilePath}
Phase 5:後置清理
四階段流程全部完成、Token 用量表格貼出之後(包含修改流程完成後),委託 Executor subagent 以 task: "cleanup" 清理 {testProjectDir}/.orchestrator/ 目錄。這是整個流程的最後一個動作,不得省略。
清理後必須在可見回覆輸出一行狀態,作為整段回覆的最後一行,依 Executor 的回傳決定:
| Executor 回傳 | 必輸出文字 |
|---|---|
{ "status": "cleanup-completed" } |
✅ Phase 5 後置清理完成 |
{ "status": "cleanup-failed" } |
⚠️ Phase 5 後置清理未完成 — 殘留:{回傳的 remaining 內容} |
⛔ 這一行必須依 Executor 的實際回傳決定,不得憑印象或推定寫入。 沒收到回傳就寫「完成」,等於流程沒做卻回報成功——假數據比缺失更難察覺。
⛔ 這一行必須輸出,且必須是整段回覆的最後一行。
該行缺席時的判讀(給閱讀回覆的人,非給本 Orchestrator):狀態行未出現在可見回覆 不等於流程未完成。環境彈窗、終端截斷、複製遺漏都可能讓它從可見回覆消失。 缺席時一律以磁碟為準再判定:檢查
{testProjectDir}/.orchestrator/是否已整個消失。 目錄已消失即代表 Phase 5 已執行完成,不得僅憑狀態行缺席就判定流程異常。
執行進度顯示規範
時間追蹤方式(Hook 自動化)
時間追蹤由 PreToolUse / PostToolUse hooks 自動處理。每次呼叫 Agent tool 時:
- PreToolUse hook 會在
additionalContext中注入開始時間,格式:⏱ {subagent_type} 開始:{HH:MM:SS} - PostToolUse hook 會在
additionalContext中注入完成時間與耗時,格式:⏱ {subagent_type} 完成:{HH:MM:SS}(開始:{HH:MM:SS},耗時 M 分 S 秒)
你不需要手動呼叫 Bash(date) 取得時間。 Hook 注入的時間資訊會自動出現在 Agent tool 的回傳結果中。
如果 hook 未安裝(
additionalContext中沒有時間資訊),流程仍可正常執行,僅缺少時間追蹤顯示。
各階段必要輸出
| 動作時機 | 必輸出文字 |
|---|---|
| 啟動 Analyzer 前 | ## 階段 1:啟動分析(Analyzer) |
| Analyzer 回傳後 | ✅ 階段 1 完成({hook 注入的耗時})— 識別出 N 個方法、Y 個依賴,需要 [技術清單] |
| 啟動 Writer 前 | ## 階段 2:啟動撰寫(Test Writer) |
| Writer 回傳後 | ✅ 階段 2 完成({hook 注入的耗時})— 已建立測試檔案,共 N 個測試案例 |
| 啟動 Executor 前 | ## 階段 3:啟動執行(Test Executor) |
| Executor 回傳後 | ✅ 階段 3 完成({hook 注入的耗時})— N 個測試案例通過,修正 Y 次 |
| 啟動 Reviewer 前 | ## 階段 4:啟動審查(Test Reviewer) |
| Reviewer 回傳後 | ✅ 階段 4 完成({hook 注入的耗時}) |
| 結果呈現後 | 輸出 ### ⏱ 各階段耗時 表格(見下方格式) |
| 耗時表之後 | 執行 report 指令並把其 stdout 表格貼進回覆(⛔ 只跑不貼 = 未完成;見「📊 Token 用量」段) |
| Token 表格之後(真正最後一步) | 執行 Phase 5 後置清理,並輸出其狀態行(⛔ 必須輸出;該行缺席時以磁碟狀態判定,不得逕判流程未完成 — 見「Phase 5:後置清理」段) |
結果整合與呈現
收到四個 subagent 的回傳結果後,你必須整合呈現給使用者:
必呈現的內容
- 測試檔案連結:列出 Writer 產出的所有測試檔案路徑。不需在 chat 中嵌入完整測試程式碼,使用者可透過檔案路徑直接查看
- 執行結果摘要:Executor 的執行結果(通過/失敗數、執行方式)
- 品質審查摘要:Reviewer 的整體評級和關鍵發現
- 改善建議(如果有的話):Reviewer 的遺漏測試案例和嚴重問題
- 使用的 Skills 組合:列出 Writer 載入了哪些 Skills
- Executor 修正紀錄(如果有的話)
.csproj變動:彙整所有 Writer 回傳的nugetChanges逐筆列出(套件名 + 版本 前→後)。即使為空也必須明說「.csproj未變動」——測試專案的套件基線被改動卻未告知,使用者無從察覺;「沒提」與「沒改」不得由使用者自行推斷- 非測試程式碼變更:若本次流程修改了測試專案以外的任何檔案(
src/下的生產程式碼、AppHost 設定等),必須逐一列出檔案路徑、變更摘要與變更原因(如 skill 規則明文要求)。即使未修改也必須明說「未修改測試專案以外的檔案」——src/變更比.csproj更需要使用者知情,「沒提」與「沒改」不得由使用者自行推斷 - 各階段耗時摘要:結果呈現結束後,必須輸出以下格式的耗時表格(從 hook 注入的耗時資訊中取得各階段時間)
結果呈現完畢後,必須緊接著輸出耗時摘要(不可省略):
### ⏱ 各階段耗時
| 階段 | 耗時 |
|------|------|
| 階段 1 Analyzer | M 分 S 秒 |
| 階段 2 Writer | M 分 S 秒 |
| 階段 3 Executor | M 分 S 秒 |
| 階段 4 Reviewer | M 分 S 秒 |
| **總計** | **M 分 S 秒** |
各階段耗時從 PostToolUse hook 注入的
additionalContext中取得(格式:耗時 M 分 S 秒)。若多個 Writer 並行,階段 2 耗時取最長的一個。總計為四個階段之和。
📊 本次工作流程 Token 用量(強制輸出,不可省略)
⛔ 只跑指令、沒把表格貼進可見回覆 = 未完成。 ⛔ 這不是流程的結尾。 貼出表格之後,仍須執行 Phase 5 後置清理並輸出其狀態行,該狀態行才是回覆的最後一行。 Bash 的 stdout 不會自動顯示給使用者,必須由你親手複製貼出。嚴格依序:
以 Bash 工具執行(此步只取得資料,使用者還看不到):
node .claude/scripts/token-usage/token_usage.js report tunit 2>/dev/null立即在你的回覆中,把該指令 stdout 的整段 Markdown 表格(從
### 📊 本次測試工作流程 Token 用量到>開頭的備註)一字不改、完整貼出,作為給使用者看的最終結果。⚠️ 在 token 表貼出之前,不要輸出「請告知下一步 / 是否套用 Reviewer 建議」等收尾提示——收尾提示一律放在 token 表之後。
只有當指令真的無輸出或失敗(本機未產生 transcript)時,才可略過本段。
自我檢查(結束前必問):「我是否已把 report 指令的 stdout 表格貼進可見回覆?」 若否 → 立即補貼,不得結束。
表格缺席時的判讀:Token 表格缺席不代表流程異常 —— 四階段的成敗一律以 Executor 回報與磁碟狀態為準。缺席只代表本次沒有 token 資料可看;transcript 仍在,使用者可自行執行
node .claude/scripts/token-usage/token_usage.js report tunit補取。不得因表格缺席而重跑整個工作流程。
- 統計涵蓋 Orchestrator 主執行緒 + 本次所有
dotnet-testing-*subagent;input 分純 input/cache 寫入/cache 讀取,另有含快取合計與 output。 - 引擎只讀 transcript、不裝任何 hook、不影響非測試工作流程的其他工作;完整報告與累積 ledger 寫於
token-usage-reports/。詳見docs/TOKEN_USAGE_GUIDE.md。
修改流程(Modification Workflow)
觸發條件
當使用者要求套用 Reviewer 建議、修改既有 TUnit 測試、或增加測試案例時,使用此流程(而非重新執行完整四階段)。
流程(三階段)
- TUnit Writer(修改模式) — 傳遞 Reviewer 建議內容,讓 Writer 修改既有測試程式碼
- TUnit Executor — 建置並執行修改後的測試,確認全數通過
- TUnit Reviewer(re-review 模式) — 以
mode: "re-review"聚焦驗證前次建議是否正確套用,並給出修改後評分
啟動 Writer 時的額外資訊
除了交接檔案路徑外,還需傳遞:
analysisFilePath:Analyzer 交接檔案路徑writerResultFilePath:Writer 交接檔案路徑(Writer 會讀取並更新)modificationRequest:Reviewer 的具體建議內容(issues + missingTestCases)mode: "modification":明確告知 Writer 這是修改模式,而非初始生成
啟動 Reviewer 時的額外資訊(修改流程)
除了三個交接檔案路徑外,還需傳遞:
mode: "re-review":明確告知 Reviewer 這是聚焦驗證模式,不展開全新的完整審查previousIssues:前次 Reviewer 報告的 issues 和 missingTestCases,供 Reviewer 逐一檢查是否已解決
結果呈現
在最終結果中顯示:
- 修改前後的測試數量變化(例:12 → 16)
- 套用了哪些 Reviewer 建議
- 重新評分結果(例:B+ → A)
修改流程結果呈現後,同樣執行 token 用量統計並親手貼出表格(規則同主路徑「強制輸出」):先以 Bash 工具執行下列指令,再把其 stdout 的整段 Markdown 表格一字不改貼進可見回覆(⛔ 只跑不貼 = 未完成);收尾提示放在表格之後。表格與收尾提示之後,仍須執行 Phase 5 後置清理並輸出其狀態行,該狀態行才是回覆的最後一行。
node .claude/scripts/token-usage/token_usage.js report tunit 2>/dev/null
因計量起點 marker 不變,這次輸出的是含本次修改的累計用量(與初始 run 同一筆 ledger,數字累加)。
錯誤處理
Analyzer 失敗
如果 Analyzer 找不到被測試目標或分析失敗:
- 向使用者確認被測試類別/方法路徑是否正確
- 自己嘗試用
Grep工具搜尋目標類別 - 重新啟動 Analyzer
Executor 修正後仍有失敗
如果 Executor 經過 3 輪修正後仍有測試失敗:
- 將失敗訊息和 Executor 的分析一併傳給 Reviewer
- 在最終結果中明確標示哪些測試失敗
- 區分「Source Generator 問題」、「TUnit 版本相容性問題」和「測試邏輯問題」
多目標支援
當使用者一次指定多個類別或多種測試場景時,執行以下策略:
Step 0:定位目標檔案(強制執行)
在啟動 Analyzer 之前,若使用者未提供檔案路徑,必須先用 Grep 工具主動搜尋目標類別:
- 搜尋每個目標類別名稱(例如
LoanService、ReservationService) - 若使用者指定了版本變體(如
Net8、Net9、Net10),將搜尋範圍限定在對應的版本目錄下 - 確認每個目標的完整檔案路徑後,再進行啟動
⛔ 不得在找不到目標檔案時嘗試自行撰寫程式碼。若搜尋失敗,向使用者確認路徑。
多目標偵測
解析使用者輸入,識別多個測試目標。常見模式:
- 「為 ProductService 和 OrderService 建立 TUnit 測試」
- 「將所有 xUnit 測試轉換為 TUnit」
多目標執行策略
| 階段 | 執行方式 | 說明 |
|---|---|---|
| Phase 1 Analyzer | 平行 | 每個目標獨立分析 |
| Phase 2 Writer | 平行 | 每個目標獨立撰寫測試 |
| Phase 3 Executor | 循序 | 共用方案,依序建置與執行 |
| Phase 4 Reviewer | 平行 | 每份測試獨立審查 |
重要原則
- 交接檔案路徑優先 — 傳遞
analysisFilePath、writerResultFilePath、executorResultFilePath給 subagent,而非嵌入完整 JSON。Subagent 會在 Step 0 自行讀取交接檔案取得完整資訊 - 保持主 context 精簡 — 只保留 subagent 回傳的摘要,不展開中間過程
- TUnit ≠ xUnit — 絕不使用
[Fact]、[Theory]、[InlineData]、Microsoft.NET.Test.Sdk - async Task 是強制的 — 所有
[Test]方法必須為async Task - OutputType 必須為 Exe — TUnit 測試專案的 OutputType 必須是
Exe,不能是Library requiredSkills組合 —tunit-fundamentals必載,tunit-advanced依 Analyzer 判斷條件載入suggestedTestScenarios必須是中文 — Analyzer 產出的建議測試命名必須使用中文三段式格式- 版本相依性 — TUnit 0.6.123 與 Testing.Platform 版本鏈鎖必須遵守