{"id":"a6abb7a9-d400-467f-9c9e-d692605ca443","shortId":"6q9L2b","kind":"skill","title":"dotnet-testing-xunit-project-setup","tagline":"xUnit 測試專案建立與設定的專門技能。當需要建立測試專案、設定專案結構、配置 NuGet 套件、組織測試資料夾時使用。涵蓋 csproj 設定、套件管理、專案結構、xunit.runner.json 配置等。\nMake sure to use this skill whenever the user mentions creating a test project, xUnit setup, project structure for tests, NuGet test packages, or csproj configuration for te","description":"# xUnit 測試專案設定指南\n\n## 專案結構最佳實踐\n\n### 建議的解決方案結構\n\n```text\nMyProject/\n├── src/                          # 主程式碼目錄\n│   └── MyProject.Core/\n│       ├── MyProject.Core.csproj\n│       ├── Calculator.cs\n│       ├── Services/\n│       └── Models/\n├── tests/                        # 測試程式碼目錄\n│   └── MyProject.Core.Tests/\n│       ├── MyProject.Core.Tests.csproj\n│       ├── CalculatorTests.cs\n│       ├── Services/\n│       └── Models/\n└── MyProject.sln\n```\n\n**結構原則：**\n\n1. **src 與 tests 分離**：清楚區分生產程式碼與測試程式碼\n2. **命名慣例**：測試專案名稱為 `{主專案名稱}.Tests`\n3. **目錄對應**：測試專案的資料夾結構應對應主專案的結構\n4. **一對一映射**：每個主專案應有對應的測試專案\n\n## 建立 xUnit 測試專案\n\n### 方法一：使用 .NET CLI（推薦）\n\n#### 步驟 1：建立解決方案與專案\n\n```powershell\n# 建立解決方案\ndotnet new sln -n MyProject\n\n# 建立主專案（類別庫）\ndotnet new classlib -n MyProject.Core -o src/MyProject.Core\n\n# 建立測試專案（xUnit 範本）\ndotnet new xunit -n MyProject.Core.Tests -o tests/MyProject.Core.Tests\n\n# 將專案加入解決方案\ndotnet sln add src/MyProject.Core/MyProject.Core.csproj\ndotnet sln add tests/MyProject.Core.Tests/MyProject.Core.Tests.csproj\n\n# 建立專案參考（測試專案參考主專案）\ndotnet add tests/MyProject.Core.Tests/MyProject.Core.Tests.csproj reference src/MyProject.Core/MyProject.Core.csproj\n```\n\n#### 步驟 2：安裝程式碼覆蓋率工具\n\n```powershell\n# 切換到測試專案目錄\ncd tests/MyProject.Core.Tests\n\n# 安裝 coverlet.collector（用於收集程式碼覆蓋率）\ndotnet add package coverlet.collector\n```\n\n### 方法二：使用 Visual Studio\n\n1. **建立解決方案**\n   - File → New → Project\n   - 選擇「Blank Solution」\n   - 命名為專案名稱\n\n2. **加入主專案**\n   - 右鍵解決方案 → Add → New Project\n   - 選擇「Class Library」\n   - 命名為 `MyProject.Core`\n\n3. **加入測試專案**\n   - 右鍵解決方案 → Add → New Project\n   - 搜尋並選擇「xUnit Test Project」\n   - 命名為 `MyProject.Core.Tests`\n\n4. **設定專案參考**\n   - 右鍵測試專案 → Add → Project Reference\n   - 勾選主專案\n\n## xUnit 測試專案的 csproj 設定\n\n### 標準 xUnit 測試專案 csproj\n\n請參考同目錄下的 `templates/xunit-test-project.csproj` 範本檔案。\n\n**核心相依套件說明：**\n\n1. **xunit**（2.9.3+）\n   - xUnit 測試框架的核心套件\n   - 提供 `[Fact]`、`[Theory]` 等測試屬性\n   - 包含 `Assert` 類別與斷言方法\n\n2. **xunit.runner.visualstudio**（3.0.0+）\n   - Visual Studio Test Explorer 整合\n   - 讓測試能在 VS Code、Visual Studio、Rider 中被探索與執行\n   - 支援測試結果的即時顯示\n\n3. **Microsoft.NET.Test.Sdk**（18.3.0+）\n   - .NET 測試平台的 SDK\n   - 讓 `dotnet test` 指令能夠執行測試\n   - 支援測試結果報告與測試探索\n\n4. **coverlet.collector**（8.0.0+）\n   - 程式碼覆蓋率收集工具\n   - 與 `dotnet test` 整合\n   - 產生覆蓋率報告（支援 Cobertura、OpenCover 等格式）\n\n### 重要 csproj 設定項目\n\n```xml\n<PropertyGroup>\n  <TargetFramework>net9.0</TargetFramework>\n  <ImplicitUsings>enable</ImplicitUsings>\n  <Nullable>enable</Nullable>\n  <IsPackable>false</IsPackable>\n  <IsTestProject>true</IsTestProject>\n</PropertyGroup>\n```\n\n**設定說明：**\n\n- `IsPackable=false`：測試專案不應被打包成 NuGet 套件\n- `IsTestProject=true`：明確標記為測試專案，讓工具識別\n- `Nullable=enable`：啟用可為 Null 的參考型別檢查\n\n## 測試類別基本結構\n\n### 標準測試類別範本\n\n```csharp\nnamespace MyProject.Core.Tests;\n\npublic class CalculatorTests\n{\n    private readonly Calculator _calculator;\n\n    // 建構函式：每個測試執行前都會被呼叫\n    public CalculatorTests()\n    {\n        _calculator = new Calculator();\n    }\n}\n```\n\n### 測試生命週期（重要概念）\n\nxUnit 的測試隔離機制：\n\n1. **每個測試方法都會創建新的測試類別實例**\n2. **建構函式**：在每個測試方法執行前被呼叫\n3. **測試方法**：執行測試邏輯\n4. **Dispose()**：如果實作 `IDisposable`，在每個測試方法執行後被呼叫\n\n**執行順序範例：**\n\n```text\n執行 Test1：\n  → 建構函式 → Test1 方法 → Dispose()\n\n執行 Test2：\n  → 建構函式 → Test2 方法 → Dispose()\n```\n\n這確保了 **測試隔離**，符合 FIRST 原則的 **I (Independent)**。\n\n## 執行測試\n\n### 使用 .NET CLI\n\n```powershell\n# 建置專案\ndotnet build\n\n# 執行所有測試\ndotnet test\n\n# 執行測試並收集程式碼覆蓋率\ndotnet test --collect:\"XPlat Code Coverage\"\n\n# 執行特定測試專案\ndotnet test tests/MyProject.Core.Tests/MyProject.Core.Tests.csproj\n\n# 執行測試並產生詳細輸出\ndotnet test --verbosity detailed\n```\n\n### 在 IDE 中執行\n\n#### VS Code（需安裝 C# Dev Kit）\n\n1. 安裝 [C# Dev Kit](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csdevkit)\n2. 開啟 Test Explorer（測試總管）\n3. 點擊測試旁的播放按鈕執行\n\n#### Visual Studio\n\n1. 開啟 Test Explorer（測試 → Test Explorer）\n2. 點擊「Run All」執行所有測試\n3. 可以右鍵單一測試執行或偵錯\n\n#### JetBrains Rider\n\n1. 測試方法旁會出現綠色執行圖示\n2. 點擊執行或偵錯測試\n3. 使用 Unit Tests 視窗管理測試\n\n## 專案參考設定原則\n\n### 參考方向規則\n\n```text\n測試專案 → 主專案   （正確）\n主專案 → 測試專案   （錯誤）\n```\n\n**測試專案應該參考主專案，但主專案絕對不應參考測試專案。**\n\n### 設定專案參考\n\n```powershell\n# 讓測試專案參考主專案\ndotnet add tests/MyProject.Core.Tests/MyProject.Core.Tests.csproj reference src/MyProject.Core/MyProject.Core.csproj\n```\n\n在 csproj 中會產生：\n\n```xml\n<ItemGroup>\n  <ProjectReference Include=\"..\\..\\src\\MyProject.Core\\MyProject.Core.csproj\" />\n</ItemGroup>\n```\n\n## 進階：多個測試專案的組織\n\n當專案變大時，可能需要多個測試專案：\n\n```text\nMyProject/\n├── src/\n│   ├── MyProject.Core/\n│   ├── MyProject.Web/\n│   └── MyProject.Infrastructure/\n├── tests/\n│   ├── MyProject.Core.Tests/           # 單元測試\n│   ├── MyProject.Web.Tests/            # Web 層測試\n│   ├── MyProject.Infrastructure.Tests/ # 基礎設施測試\n│   └── MyProject.Integration.Tests/    # 整合測試\n└── MyProject.sln\n```\n\n**命名慣例建議：**\n\n- `*.Tests` - 單元測試\n- `*.Integration.Tests` - 整合測試\n- `*.Acceptance.Tests` - 驗收測試\n- `*.Performance.Tests` - 效能測試\n\n### 實際工作專案的命名規範\n\n在實際的工作專案中，建議使用更明確的命名格式來區分測試類型：\n\n**推薦的命名格式：**\n\n```text\nMyProject/\n├── src/\n│   ├── MyProject.Core/\n│   └── MyProject.WebApi/\n├── tests/\n│   ├── MyProject.Core.Test.Unit/              # 單元測試（明確標示）\n│   ├── MyProject.WebApi.Test.Unit/            # WebApi 單元測試\n│   └── MyProject.WebApi.Test.Integration/     # WebApi 整合測試\n└── MyProject.sln\n```\n\n**命名規則：**\n\n- **單元測試**：`{專案名稱}.Test.Unit`\n  - 範例：`MyProject.Core.Test.Unit`\n  - 特性：不依賴外部資源（資料庫、API、檔案系統等）\n  - 執行速度：快速（毫秒級）\n\n- **整合測試**：`{專案名稱}.Test.Integration`\n  - 範例：`MyProject.WebApi.Test.Integration`\n  - 特性：測試多個元件的整合，可能依賴外部資源\n  - 執行速度：較慢（秒級）\n\n**這種命名的優勢：**\n\n1. **清晰度**：一眼就能分辨測試類型\n2. **執行策略**：可以在 CI/CD 中分階段執行\n\n   ```powershell\n   # 快速回饋：只執行單元測試\n   dotnet test --filter \"FullyQualifiedName~.Test.Unit\"\n\n   # 完整驗證：執行整合測試\n   dotnet test --filter \"FullyQualifiedName~.Test.Integration\"\n   ```\n\n3. **相依性管理**：整合測試可以有不同的套件相依（如 Testcontainers）\n4. **團隊協作**：新成員能快速理解專案結構\n\n**CLI 建立範例：**\n\n```powershell\n# 建立單元測試專案\ndotnet new xunit -n MyProject.Core.Test.Unit -o tests/MyProject.Core.Test.Unit\ndotnet add tests/MyProject.Core.Test.Unit reference src/MyProject.Core\n\n# 建立整合測試專案\ndotnet new xunit -n MyProject.WebApi.Test.Integration -o tests/MyProject.WebApi.Test.Integration\ndotnet add tests/MyProject.WebApi.Test.Integration reference src/MyProject.WebApi\n```\n\n> **提示**：雖然本範例中為了簡化說明使用 `.Tests` 格式，但在實際專案中強烈建議使用 `.Test.Unit` 和 `.Test.Integration` 這種更明確的格式。\n\n## 常見問題與解決方案\n\n### Q1: 測試探索失敗，Test Explorer 看不到測試？\n\n**檢查清單：**\n\n1. 確認已安裝 `xunit.runner.visualstudio` 套件\n2. 確認已安裝 `Microsoft.NET.Test.Sdk` 套件\n3. 執行 `dotnet build` 重新建置\n4. 重啟 IDE 或重新載入 Test Explorer\n\n### Q2: 測試可以在 CLI 執行但在 IDE 中無法執行？\n\n**解決方案：**\n\n- 確認 IDE 已安裝相關擴充套件（VS Code 需要 C# Dev Kit）\n- 清除快取：刪除 `bin/` 和 `obj/` 資料夾後重新建置\n- 檢查 `.csproj` 中的 `IsTestProject` 屬性是否為 `true`\n\n### Q3: 如何在測試專案中使用 Internal 類別？\n\n在主專案的 `.csproj` 或 `AssemblyInfo.cs` 中加入：\n\n```csharp\n[assembly: InternalsVisibleTo(\"MyProject.Core.Tests\")]\n```\n\n或在 csproj 中：\n\n```xml\n<ItemGroup>\n  <InternalsVisibleTo Include=\"MyProject.Core.Tests\" />\n</ItemGroup>\n```\n\n## 範本檔案\n\n請參考同目錄下的範本檔案以快速建立專案：\n\n- `templates/project-structure.md` - 完整的專案結構範例\n- `templates/xunit-test-project.csproj` - xUnit 測試專案的 csproj 範本\n\n## 檢查清單\n\n建立 xUnit 測試專案時，請確認以下項目：\n\n- [ ] 測試專案命名為 `{主專案名稱}.Tests`\n- [ ] 測試專案位於 `tests/` 目錄下\n- [ ] 已安裝 `xunit`、`xunit.runner.visualstudio`、`Microsoft.NET.Test.Sdk` 套件\n- [ ] 已安裝 `coverlet.collector` 用於程式碼覆蓋率\n- [ ] 測試專案已參考主專案\n- [ ] `IsPackable` 設為 `false`\n- [ ] `IsTestProject` 設為 `true`\n- [ ] 可以執行 `dotnet test` 成功\n- [ ] IDE 的 Test Explorer 可以探索到測試\n\n## 輸出格式\n\n- 產生完整的 xUnit 測試專案結構（src/ 與 tests/ 分離）\n- 產生測試專案 csproj 檔案（含必要套件參考）\n- 提供 dotnet CLI 建立指令序列\n- 包含專案參考設定與 xunit.runner.json 配置（如需要）\n- 產生基本測試類別範本（.cs 檔案）\n\n## 參考資源\n\n### 原始文章\n\n本技能內容提煉自「老派軟體工程師的測試修練 - 30 天挑戰」系列文章：\n\n- **Day 02 - xUnit 框架深度解析**\n  - 鐵人賽文章：https://ithelp.ithome.com.tw/articles/10373952\n  - 範例程式碼：https://github.com/kevintsengtw/30Days_in_Testing_Samples/tree/main/day02\n\n- **Day 03 - xUnit 進階功能與測試資料管理**\n  - 鐵人賽文章：https://ithelp.ithome.com.tw/articles/10374064\n  - 範例程式碼：https://github.com/kevintsengtw/30Days_in_Testing_Samples/tree/main/day03\n\n### 官方文件\n\n- [xUnit 官方文件](https://xunit.net/)\n- [.NET 測試最佳實踐](https://learn.microsoft.com/dotnet/core/testing/)\n\n### 相關技能\n\n- `unit-test-fundamentals` - 單元測試基礎與 FIRST 原則\n- `test-naming-conventions` - 測試命名規範\n- `code-coverage-analysis` - 程式碼覆蓋率分析","tags":["dotnet","testing","xunit","project","setup","agent","skills","kevintsengtw","agent-skills","ai-assisted-development","copilot-skills","csharp"],"capabilities":["skill","source-kevintsengtw","skill-dotnet-testing-xunit-project-setup","topic-agent-skills","topic-ai-assisted-development","topic-copilot-skills","topic-csharp","topic-dotnet","topic-dotnet-testing","topic-github-copilot","topic-integration-testing","topic-testing","topic-unit-testing","topic-xunit"],"categories":["dotnet-testing-agent-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/kevintsengtw/dotnet-testing-agent-skills/dotnet-testing-xunit-project-setup","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add kevintsengtw/dotnet-testing-agent-skills","source_repo":"https://github.com/kevintsengtw/dotnet-testing-agent-skills","install_from":"skills.sh"}},"qualityScore":"0.461","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 23 github stars · SKILL.md body (8,080 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-24T13:02:27.628Z","embedding":null,"createdAt":"2026-04-18T23:04:36.489Z","updatedAt":"2026-04-24T13:02:27.628Z","lastSeenAt":"2026-04-24T13:02:27.628Z","tsv":"'/)':764 '/articles/10373952':742 '/articles/10374064':754 '/dotnet/core/testing/)':769 '/items?itemname=ms-dotnettools.csdevkit)':387 '/kevintsengtw/30days_in_testing_samples/tree/main/day02':746 '/kevintsengtw/30days_in_testing_samples/tree/main/day03':758 '02':736 '03':748 '1':72,98,160,211,310,380,397,413,521,597 '18.3.0':241 '2':78,143,169,223,312,388,404,415,524,601 '2.9.3':213 '3':83,180,239,315,393,409,417,544,605 '3.0.0':225 '30':732 '4':86,192,250,318,549,610 '8.0.0':252 'acceptance.tests':471 'add':129,133,138,153,172,183,195,437,564,577 'analysi':786 'api':504 'assembl':654 'assemblyinfo.cs':651 'assert':221 'bin':634 'blank':166 'build':351,608 'c':377,382,629 'calcul':297,298,303,305 'calculator.cs':60 'calculatortest':294,302 'calculatortests.cs':67 'cd':147 'ci/cd':527 'class':176,293 'classlib':111 'cli':95,347,552,618,719 'cobertura':260 'code':233,360,375,627,784 'code-coverage-analysi':783 'collect':358 'configur':47 'convent':781 'coverag':361,785 'coverlet.collector':150,155,251,687 'creat':32 'cs':726 'csharp':289,653 'csproj':16,46,201,206,264,442,639,649,658,668,714 'day':735,747 'detail':370 'dev':378,383,630 'dispos':319,330,336 'dotnet':2,102,109,119,127,131,137,152,246,255,350,353,356,363,367,436,532,539,556,563,569,576,607,697,718 'dotnet-testing-xunit-project-setup':1 'enabl':268,269,283 'explor':229,391,400,403,594,615,703 'fact':217 'fals':270,274,692 'file':162 'filter':534,541 'first':340,776 'fullyqualifiednam':535,542 'fundament':774 'github.com':745,757 'github.com/kevintsengtw/30days_in_testing_samples/tree/main/day02':744 'github.com/kevintsengtw/30days_in_testing_samples/tree/main/day03':756 'ide':372,612,620,624,700 'idispos':321 'independ':343 'integration.tests':469 'intern':646 'internalsvisibleto':655 'ispack':273,690 'istestproject':278,641,693 'ithelp.ithome.com.tw':741,753 'ithelp.ithome.com.tw/articles/10373952':740 'ithelp.ithome.com.tw/articles/10374064':752 'jetbrain':411 'kit':379,384,631 'learn.microsoft.com':768 'learn.microsoft.com/dotnet/core/testing/)':767 'librari':177 'make':22 'marketplace.visualstudio.com':386 'marketplace.visualstudio.com/items?itemname=ms-dotnettools.csdevkit)':385 'mention':31 'microsoft.net.test.sdk':240,603,684 'model':62,69 'myproject':55,106,450,480 'myproject.core':58,113,179,452,482 'myproject.core.csproj':59 'myproject.core.test.unit':485,500,560 'myproject.core.tests':65,123,191,291,456,656 'myproject.core.tests.csproj':66 'myproject.infrastructure':454 'myproject.infrastructure.tests':461 'myproject.integration.tests':463 'myproject.sln':70,465,494 'myproject.web':453 'myproject.web.tests':458 'myproject.webapi':483 'myproject.webapi.test.integration':491,513,573 'myproject.webapi.test.unit':488 'n':105,112,122,559,572 'name':780 'namespac':290 'net':94,242,346,765 'net9.0':267 'new':103,110,120,163,173,184,304,557,570 'nuget':12,42,276 'null':285 'nullabl':282 'o':114,124,561,574 'obj':636 'opencov':261 'packag':44,154 'performance.tests':473 'powershel':100,145,348,434,529,554 'privat':295 'project':5,35,38,164,174,185,189,196 'public':292,301 'q1':591 'q2':616 'q3':644 'readon':296 'refer':140,197,439,566,579 'rider':236,412 'run':406 'sdk':244 'servic':61,68 'setup':6,37 'skill':27 'skill-dotnet-testing-xunit-project-setup' 'sln':104,128,132 'solut':167 'source-kevintsengtw' 'src':56,73,451,481,709 'src/myproject.core':115,567 'src/myproject.core/myproject.core.csproj':130,141,440 'src/myproject.webapi':580 'structur':39 'studio':159,227,235,396 'sure':23 'te':49 'templates/project-structure.md':663 'templates/xunit-test-project.csproj':208,665 'test':3,34,41,43,63,75,82,188,228,247,256,354,357,364,368,390,399,402,420,455,467,484,533,540,583,593,614,677,679,698,702,711,773,779 'test-naming-convent':778 'test.integration':511,543,588 'test.unit':498,536,586 'test1':326,328 'test2':332,334 'testcontain':548 'tests/myproject.core.test.unit':562,565 'tests/myproject.core.tests':125,148 'tests/myproject.core.tests/myproject.core.tests.csproj':134,139,365,438 'tests/myproject.webapi.test.integration':575,578 'text':54,324,424,449,479 'theori':218 'topic-agent-skills' 'topic-ai-assisted-development' 'topic-copilot-skills' 'topic-csharp' 'topic-dotnet' 'topic-dotnet-testing' 'topic-github-copilot' 'topic-integration-testing' 'topic-testing' 'topic-unit-testing' 'topic-xunit' 'true':271,279,643,695 'unit':419,772 'unit-test-fundament':771 'use':25 'user':30 'verbos':369 'visual':158,226,234,395 'vs':232,374,626 'web':459 'webapi':489,492 'whenev':28 'xml':266,444,660 'xplat':359 'xunit':4,7,36,50,90,117,121,187,199,204,212,214,308,558,571,666,672,682,707,737,749,760 'xunit.net':763 'xunit.net/)':762 'xunit.runner.json':20,722 'xunit.runner.visualstudio':224,599,683 '一對一映射':87 '一眼就能分辨測試類型':523 '不依賴外部資源':502 '中':659 '中分階段執行':528 '中加入':652 '中執行':373 '中會產生':443 '中無法執行':621 '中的':640 '中被探索與執行':237 '主專案':426,428 '主專案名稱':81,676 '主程式碼目錄':57 '但主專案絕對不應參考測試專案':432 '但在實際專案中強烈建議使用':585 '使用':93,157,345,418 '分離':76,712 '切換到測試專案目錄':146 '刪除':633 '加入主專案':170 '加入測試專案':181 '勾選主專案':198 '包含':220 '包含專案參考設定與':721 '原則':777 '原則的':341 '原始文章':729 '參考方向規則':423 '參考資源':728 '只執行單元測試':531 '可以右鍵單一測試執行或偵錯':410 '可以在':526 '可以執行':696 '可以探索到測試':704 '可能依賴外部資源':516 '可能需要多個測試專案':448 '右鍵測試專案':194 '右鍵解決方案':171,182 '含必要套件參考':716 '命名慣例':79 '命名慣例建議':466 '命名為':178,190 '命名為專案名稱':168 '命名規則':495 '和':587,635 '啟用可為':284 '單元測試':457,468,486,490,496 '單元測試基礎與':775 '團隊協作':550 '在':371,441 '在主專案的':648 '在實際的工作專案中':476 '在每個測試方法執行前被呼叫':314 '在每個測試方法執行後被呼叫':322 '執行':325,331,606 '執行但在':619 '執行所有測試':352,408 '執行整合測試':538 '執行測試':344 '執行測試並收集程式碼覆蓋率':355 '執行測試並產生詳細輸出':366 '執行測試邏輯':317 '執行特定測試專案':362 '執行策略':525 '執行速度':506,517 '執行順序範例':323 '基礎設施測試':462 '多個測試專案的組織':446 '天挑戰':733 '套件':13,277,600,604,685 '套件管理':18 '如':547 '如何在測試專案中使用':645 '如果實作':320 '如需要':724 '安裝':149,381 '安裝程式碼覆蓋率工具':144 '完整的專案結構範例':664 '完整驗證':537 '官方文件':759,761 '實際工作專案的命名規範':475 '將專案加入解決方案':126 '專案參考設定原則':422 '專案名稱':497,510 '專案結構':19 '專案結構最佳實踐':52 '層測試':460 '屬性是否為':642 '已安裝':681,686 '已安裝相關擴充套件':625 '常見問題與解決方案':590 '建構函式':299,313,327,333 '建立':89,671 '建立主專案':107 '建立單元測試專案':555 '建立專案參考':135 '建立指令序列':720 '建立整合測試專案':568 '建立測試專案':116 '建立範例':553 '建立解決方案':101,161 '建立解決方案與專案':99 '建置專案':349 '建議使用更明確的命名格式來區分測試類型':477 '建議的解決方案結構':53 '快速':507 '快速回饋':530 '成功':699 '或':650 '或在':657 '或重新載入':613 '指令能夠執行測試':248 '推薦':96 '推薦的命名格式':478 '提供':216,717 '提示':581 '搜尋並選擇':186 '支援':259 '支援測試結果報告與測試探索':249 '支援測試結果的即時顯示':238 '效能測試':474 '整合':230,257 '整合測試':464,470,493,509 '整合測試可以有不同的套件相依':546 '新成員能快速理解專案結構':551 '方法':329,335 '方法一':92 '方法二':156 '明確標示':487 '明確標記為測試專案':280 '本技能內容提煉自':730 '核心相依套件說明':210 '格式':584 '框架深度解析':738 '標準':203 '標準測試類別範本':288 '檔案':715,727 '檔案系統等':505 '檢查':638 '檢查清單':596,670 '正確':427 '步驟':97,142 '每個主專案應有對應的測試專案':88 '每個測試執行前都會被呼叫':300 '每個測試方法都會創建新的測試類別實例':311 '毫秒級':508 '涵蓋':15 '清晰度':522 '清楚區分生產程式碼與測試程式碼':77 '清除快取':632 '測試':401 '測試可以在':617 '測試命名規範':782 '測試多個元件的整合':515 '測試專案':91,205,425,429 '測試專案不應被打包成':275 '測試專案位於':678 '測試專案參考主專案':136 '測試專案名稱為':80 '測試專案命名為':675 '測試專案已參考主專案':689 '測試專案建立與設定的專門技能':8 '測試專案應該參考主專案':431 '測試專案時':673 '測試專案的':200,667 '測試專案的資料夾結構應對應主專案的結構':85 '測試專案結構':708 '測試專案設定指南':51 '測試平台的':243 '測試探索失敗':592 '測試方法':316 '測試方法旁會出現綠色執行圖示':414 '測試最佳實踐':766 '測試框架的核心套件':215 '測試生命週期':306 '測試程式碼目錄':64 '測試總管':392 '測試隔離':338 '測試類別基本結構':287 '特性':501,514 '產生基本測試類別範本':725 '產生完整的':706 '產生測試專案':713 '產生覆蓋率報告':258 '用於收集程式碼覆蓋率':151 '用於程式碼覆蓋率':688 '當專案變大時':447 '當需要建立測試專案':9 '的':701 '的參考型別檢查':286 '的測試隔離機制':309 '目錄下':680 '目錄對應':84 '相依性管理':545 '相關技能':770 '看不到測試':595 '確認':623 '確認已安裝':598,602 '秒級':519 '程式碼覆蓋率分析':787 '程式碼覆蓋率收集工具':253 '符合':339 '等格式':262 '等測試屬性':219 '範例':499,512 '範例程式碼':743,755 '範本':118,669 '範本檔案':209,661 '系列文章':734 '組織測試資料夾時使用':14 '結構原則':71 '老派軟體工程師的測試修練':731 '與':74,254,710 '視窗管理測試':421 '解決方案':622 '設定':17,202 '設定專案參考':193,433 '設定專案結構':10 '設定說明':272 '設定項目':265 '設為':691,694 '請參考同目錄下的':207 '請參考同目錄下的範本檔案以快速建立專案':662 '請確認以下項目':674 '讓':245 '讓工具識別':281 '讓測試專案參考主專案':435 '讓測試能在':231 '資料夾後重新建置':637 '資料庫':503 '較慢':518 '輸出格式':705 '這確保了':337 '這種命名的優勢':520 '這種更明確的格式':589 '進階':445 '進階功能與測試資料管理':750 '選擇':165,175 '配置':11,723 '配置等':21 '重啟':611 '重新建置':609 '重要':263 '重要概念':307 '錯誤':430 '鐵人賽文章':739,751 '開啟':389,398 '雖然本範例中為了簡化說明使用':582 '需安裝':376 '需要':628 '類別':647 '類別庫':108 '類別與斷言方法':222 '驗收測試':472 '點擊':405 '點擊執行或偵錯測試':416 '點擊測試旁的播放按鈕執行':394","prices":[{"id":"7ab32cb8-4c80-4137-814a-77fb82b89aa3","listingId":"a6abb7a9-d400-467f-9c9e-d692605ca443","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"kevintsengtw","category":"dotnet-testing-agent-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T23:04:36.489Z"}],"sources":[{"listingId":"a6abb7a9-d400-467f-9c9e-d692605ca443","source":"github","sourceId":"kevintsengtw/dotnet-testing-agent-skills/dotnet-testing-xunit-project-setup","sourceUrl":"https://github.com/kevintsengtw/dotnet-testing-agent-skills/tree/main/skills/dotnet-testing-xunit-project-setup","isPrimary":false,"firstSeenAt":"2026-04-18T23:04:36.489Z","lastSeenAt":"2026-04-24T13:02:27.628Z"}],"details":{"listingId":"a6abb7a9-d400-467f-9c9e-d692605ca443","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"kevintsengtw","slug":"dotnet-testing-xunit-project-setup","github":{"repo":"kevintsengtw/dotnet-testing-agent-skills","stars":23,"topics":["agent-skills","ai-assisted-development","copilot-skills","csharp","dotnet","dotnet-testing","github-copilot","integration-testing","testing","unit-testing","xunit"],"license":"mit","html_url":"https://github.com/kevintsengtw/dotnet-testing-agent-skills","pushed_at":"2026-03-31T07:28:56Z","description":"AI Agent Skills for .NET Testing - Based on 30-Day Testing Challenge (iThome Ironman 2025 Winner)","skill_md_sha":"fe6e1d0cc0837537fd893d589ad78dfeab982a4b","skill_md_path":"skills/dotnet-testing-xunit-project-setup/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/kevintsengtw/dotnet-testing-agent-skills/tree/main/skills/dotnet-testing-xunit-project-setup"},"layout":"multi","source":"github","category":"dotnet-testing-agent-skills","frontmatter":{"name":"dotnet-testing-xunit-project-setup","description":"xUnit 測試專案建立與設定的專門技能。當需要建立測試專案、設定專案結構、配置 NuGet 套件、組織測試資料夾時使用。涵蓋 csproj 設定、套件管理、專案結構、xunit.runner.json 配置等。\nMake sure to use this skill whenever the user mentions creating a test project, xUnit setup, project structure for tests, NuGet test packages, or csproj configuration for testing, even if they don't explicitly ask for project setup guidance.\nKeywords: xunit project, xunit setup, 測試專案建立, test project setup, 建立測試專案, project structure, 專案結構, folder structure, xunit package, nuget packages, 測試套件, 如何建立測試專案, xunit configuration"},"skills_sh_url":"https://skills.sh/kevintsengtw/dotnet-testing-agent-skills/dotnet-testing-xunit-project-setup"},"updatedAt":"2026-04-24T13:02:27.628Z"}}