{"id":"aa046ff0-1160-4db2-982f-48e5375bb631","shortId":"VXUQyr","kind":"skill","title":"dotnet-testing-bogus-fake-data","tagline":"使用 Bogus 產生擬真假資料的專門技能。當需要產生真實感的姓名、地址、電話、Email、公司資訊等測試資料時使用。涵蓋 Faker 類別、多語言支援、自訂規則、大量資料產生等。\nMake sure to use this skill whenever the user mentions Bogus, Faker, fake data, realistic test data, generating names/addresses/emails, or seed data, even if they don't explicitly ask for f","description":"# Bogus 假資料產生器\n\n## 套件安裝與設定\n\n### 安裝 Bogus\n\n```bash\ndotnet add package Bogus\n```\n\n### NuGet 套件資訊\n\n| 套件名稱 | 用途             | NuGet 連結                                         |\n| -------- | ---------------- | -------------------------------------------------- |\n| `Bogus`  | 假資料產生函式庫 | [nuget.org](https://www.nuget.org/packages/Bogus/) |\n\n**GitHub 儲存庫**：[bchavez/Bogus](https://github.com/bchavez/Bogus)\n\n---\n\n## 核心概念\n\n### 基本語法結構\n\nBogus 的核心是 `Faker<T>` 類別，使用 `RuleFor` 方法定義屬性的產生規則：\n\n```csharp\nusing Bogus;\n\npublic class Product\n{\n    public int Id { get; set; }\n    public string Name { get; set; } = string.Empty;\n    public decimal Price { get; set; }\n    public string Description { get; set; } = string.Empty;\n    public DateTime CreatedDate { get; set; }\n}\n\n// 建立產品資料的 Faker\nvar productFaker = new Faker<Product>()\n    .RuleFor(p => p.Id, f => f.IndexFaker)\n    .RuleFor(p => p.Name, f => f.Commerce.ProductName())\n    .RuleFor(p => p.Price, f => f.Random.Decimal(10, 1000))\n    .RuleFor(p => p.Description, f => f.Lorem.Sentence())\n    .RuleFor(p => p.CreatedDate, f => f.Date.Past());\n\n// 產生單筆資料\nvar product = productFaker.Generate();\n\n// 產生多筆資料\nvar products = productFaker.Generate(10);\n```\n\n### 內建 DataSet 概覽\n\nBogus 提供豐富的內建 DataSet，每個都專注於特定領域的資料產生：\n\n#### 個人資訊 (Person DataSet)\n\n```csharp\nvar faker = new Faker();\n\nvar fullName = faker.Person.FullName;        // 完整姓名\nvar firstName = faker.Person.FirstName;      // 名字\nvar lastName = faker.Person.LastName;        // 姓氏\nvar email = faker.Person.Email;              // 電子郵件\nvar gender = faker.Person.Gender;            // 性別\nvar dateOfBirth = faker.Person.DateOfBirth;  // 生日\n```\n\n#### 地址資訊 (Address DataSet)\n\n```csharp\nvar fullAddress = faker.Address.FullAddress();    // 完整地址\nvar streetAddress = faker.Address.StreetAddress(); // 街道地址\nvar city = faker.Address.City();                   // 城市\nvar state = faker.Address.State();                 // 州/省\nvar zipCode = faker.Address.ZipCode();             // 郵遞區號\nvar country = faker.Address.Country();             // 國家\nvar latitude = faker.Address.Latitude();           // 緯度\nvar longitude = faker.Address.Longitude();         // 經度\n```\n\n#### 商業資訊 (Company & Commerce DataSet)\n\n```csharp\nvar companyName = faker.Company.CompanyName();     // 公司名稱\nvar catchPhrase = faker.Company.CatchPhrase();     // 標語\nvar department = faker.Commerce.Department();      // 部門\nvar productName = faker.Commerce.ProductName();    // 產品名稱\nvar price = faker.Commerce.Price(1, 1000, 2);      // 價格（字串格式）\nvar ean13 = faker.Commerce.Ean13();                // EAN-13 條碼\n```\n\n#### 網路資訊 (Internet DataSet)\n\n```csharp\nvar url = faker.Internet.Url();               // URL\nvar domainName = faker.Internet.DomainName(); // 網域名稱\nvar ipAddress = faker.Internet.Ip();          // IPv4 地址\nvar ipv6 = faker.Internet.Ipv6();             // IPv6 地址\nvar userName = faker.Internet.UserName();     // 使用者名稱\nvar password = faker.Internet.Password();     // 密碼\nvar email = faker.Internet.Email();           // 電子郵件\n```\n\n#### 金融資訊 (Finance DataSet)\n\n```csharp\nvar creditCardNumber = faker.Finance.CreditCardNumber();  // 信用卡號\nvar creditCardCvv = faker.Finance.CreditCardCvv();        // CVV\nvar account = faker.Finance.Account();                     // 帳戶號碼\nvar amount = faker.Finance.Amount(100, 10000, 2);          // 金額\nvar currency = faker.Finance.Currency();                   // 貨幣\nvar iban = faker.Finance.Iban();                          // IBAN\nvar bic = faker.Finance.Bic();                            // BIC/SWIFT\n```\n\n#### 時間資訊 (Date DataSet)\n\n```csharp\nvar pastDate = faker.Date.Past();                        // 過去日期\nvar futureDate = faker.Date.Future();                    // 未來日期\nvar recentDate = faker.Date.Recent();                    // 最近日期\nvar soonDate = faker.Date.Soon();                        // 即將到來的日期\nvar between = faker.Date.Between(start, end);            // 範圍內日期\nvar weekday = faker.Date.Weekday();                      // 星期幾\n```\n\n#### 隨機資料 (Random DataSet)\n\n```csharp\nvar randomInt = faker.Random.Int(1, 100);                  // 整數\nvar randomDecimal = faker.Random.Decimal(0, 1000);         // 小數\nvar randomBool = faker.Random.Bool();                      // 布林\nvar randomGuid = faker.Random.Guid();                      // GUID\nvar randomEnum = faker.Random.Enum<DayOfWeek>();           // 隨機列舉\nvar randomElement = faker.Random.ArrayElement(array);      // 陣列隨機元素\nvar shuffled = faker.Random.Shuffle(collection);           // 洗牌\n```\n\n#### 文字內容 (Lorem DataSet)\n\n```csharp\nvar word = faker.Lorem.Word();             // 單字\nvar words = faker.Lorem.Words(5);          // 多個單字\nvar sentence = faker.Lorem.Sentence();     // 句子\nvar paragraph = faker.Lorem.Paragraph();   // 段落\nvar text = faker.Lorem.Text();             // 文字區塊\n```\n\n---\n\n## 多語言支援\n\nBogus 的一大特色是支援多種語言和文化，讓產生的資料更符合當地習慣：\n\n```csharp\n// 繁體中文\nvar chineseFaker = new Faker<Person>(\"zh_TW\")\n    .RuleFor(p => p.Name, f => f.Person.FullName)\n    .RuleFor(p => p.Address, f => f.Address.FullAddress());\n\n// 日文\nvar japaneseFaker = new Faker<Person>(\"ja\")\n    .RuleFor(p => p.Name, f => f.Person.FullName)\n    .RuleFor(p => p.Phone, f => f.Phone.PhoneNumber());\n\n// 法文\nvar frenchFaker = new Faker<Person>(\"fr\")\n    .RuleFor(p => p.Name, f => f.Person.FullName)\n    .RuleFor(p => p.Company, f => f.Company.CompanyName());\n```\n\n### 支援的語言代碼\n\n| 語言         | 代碼    | 語言     | 代碼    |\n| ------------ | ------- | -------- | ------- |\n| 英文（美國） | `en_US` | 簡體中文 | `zh_CN` |\n| 繁體中文     | `zh_TW` | 日文     | `ja`    |\n| 韓文         | `ko`    | 法文     | `fr`    |\n| 德文         | `de`    | 西班牙文 | `es`    |\n| 俄文         | `ru`    | 葡萄牙文 | `pt_BR` |\n\n---\n\n## 進階功能\n\n涵蓋 Seed 可重現性控制、條件式產生與機率控制（`OrNull`、`PickRandomWeighted`）、關聯資料與巢狀物件、複雜業務邏輯約束，以及自訂 DataSet 擴充（如台灣在地資料產生器）。\n\n> 完整內容請參閱 [references/advanced-features.md](references/advanced-features.md)\n\n---\n\n## Bogus vs AutoFixture 比較\n\n### 設計理念差異\n\n| 項目         | AutoFixture               | Bogus                           |\n| ------------ | ------------------------- | ------------------------------- |\n| **核心理念** | 匿名測試 (Anonymous Test) | 真實模擬 (Realistic Simulation) |\n| **資料品質** | 隨機填充，專注測試邏輯    | 有意義資料，模擬真實情境        |\n| **學習成本** | 自動推斷，零配置          | 明確定義，需要學習 DataSet      |\n| **可讀性**   | 抽象化，減少資料噪音      | 具體化，資料有意義              |\n\n### 適用場景分析\n\n| 場景           | 建議工具    | 原因                           |\n| -------------- | ----------- | ------------------------------ |\n| **單元測試**   | AutoFixture | 專注於邏輯驗證，不關心資料內容 |\n| **整合測試**   | Bogus       | 需要真實感的資料進行端到端測試 |\n| **UI 原型**    | Bogus       | 展示用的擬真資料               |\n| **效能測試**   | Bogus       | 大量真實格式的資料             |\n| **資料庫種子** | Bogus       | 初始化開發/測試環境            |\n| **複雜相依性** | AutoFixture | 自動處理循環參考和巢狀物件     |\n\n### 程式碼比較\n\n```csharp\n// AutoFixture：簡單直接，自動推斷\nvar fixture = new Fixture();\nvar user = fixture.Create<User>(); // 一行搞定，但資料無意義\n\n// Bogus：需要設定，但資料有意義\nvar userFaker = new Faker<User>()\n    .RuleFor(u => u.Name, f => f.Person.FullName)    // 真實的姓名格式\n    .RuleFor(u => u.Email, f => f.Internet.Email()); // 真實的郵件格式\nvar user = userFaker.Generate();\n```\n\n---\n\n## 效能最佳化\n\n### 重用 Faker 實例\n\n```csharp\npublic class OptimizedDataGenerator\n{\n    // 預編譯 Faker 以提升效能（靜態欄位，只初始化一次）\n    private static readonly Faker<User> _userFaker = new Faker<User>()\n        .RuleFor(u => u.Id, f => f.Random.Guid())\n        .RuleFor(u => u.Name, f => f.Person.FullName)\n        .RuleFor(u => u.Email, f => f.Internet.Email());\n    \n    public static List<User> GenerateUsers(int count) \n        => _userFaker.Generate(count);\n}\n```\n\n### 批次產生\n\n```csharp\n// 批次產生以減少記憶體分配\npublic static IEnumerable<User> GenerateUsersBatch(int totalCount, int batchSize = 1000)\n{\n    var generated = 0;\n    while (generated < totalCount)\n    {\n        var currentBatchSize = Math.Min(batchSize, totalCount - generated);\n        var batch = _userFaker.Generate(currentBatchSize);\n        \n        foreach (var user in batch)\n        {\n            yield return user;\n        }\n        \n        generated += currentBatchSize;\n    }\n}\n```\n\n### Lazy 初始化\n\n```csharp\n// 使用 Lazy 延遲初始化複雜的 Faker\nprivate static readonly Lazy<Faker<ComplexEntity>> _complexFaker = \n    new(() => new Faker<ComplexEntity>()\n        .RuleFor(e => e.Id, f => f.Random.Guid())\n        .RuleFor(e => e.Data, f => GenerateComplexData(f)));\n\npublic static ComplexEntity Generate() => _complexFaker.Value.Generate();\n```\n\n---\n\n## 測試實作範例\n\n### 郵件服務測試\n\n```csharp\n[Fact]\npublic void EmailService_SendWelcomeEmail_ShouldFormatCorrectly()\n{\n    // Arrange - 需要真實的使用者資料來測試郵件格式\n    var userFaker = new Faker<User>()\n        .RuleFor(u => u.Name, f => f.Person.FullName)\n        .RuleFor(u => u.Email, f => f.Internet.Email());\n    \n    var user = userFaker.Generate();\n    var emailService = new EmailService();\n    \n    // Act\n    var emailContent = emailService.GenerateWelcomeEmail(user);\n    \n    // Assert\n    emailContent.Should().Contain(user.Name);\n    emailContent.Should().Contain(user.Email);\n}\n```\n\n### 資料庫種子\n\n```csharp\npublic static class DatabaseSeeder\n{\n    public static void SeedDatabase(AppDbContext context)\n    {\n        // 設定 seed 確保可重現\n        Randomizer.Seed = new Random(42);\n        \n        var customerFaker = new Faker<Customer>(\"zh_TW\")\n            .RuleFor(c => c.Name, f => f.Person.FullName)\n            .RuleFor(c => c.Email, f => f.Internet.Email())\n            .RuleFor(c => c.Phone, f => f.Phone.PhoneNumber())\n            .RuleFor(c => c.Address, f => f.Address.FullAddress());\n        \n        var customers = customerFaker.Generate(100);\n        context.Customers.AddRange(customers);\n        context.SaveChanges();\n    }\n}\n```\n\n---\n\n## 最佳實踐\n\n### 命名與組織\n\n1. **Faker 命名慣例**：使用 `{EntityName}Faker` 格式命名\n2. **集中管理**：將 Faker 定義集中在 `TestDataGenerators` 或 `Fakers` 資料夾\n3. **重用靜態實例**：避免重複建立 Faker 實例\n\n### 程式碼組織\n\n```text\nMyProject.Tests/\n├── Fakers/\n│   ├── CustomerFaker.cs\n│   ├── OrderFaker.cs\n│   └── TaiwanDataSetExtensions.cs\n├── Services/\n│   └── CustomerServiceTests.cs\n└── ...\n```\n\n### 常見陷阱\n\n1. **避免過度配置**：只設定測試需要的屬性\n2. **注意隨機性**：使用 seed 確保測試可重現\n3. **效能考量**：大量資料時使用批次產生\n\n---\n\n## 相關技能\n\n| 技能名稱                        | 關聯說明                                     |\n| ------------------------------- | -------------------------------------------- |\n| `autofixture-basics`            | AutoFixture 基礎使用，適合單元測試的匿名資料 |\n| `autofixture-bogus-integration` | AutoFixture 與 Bogus 混合使用策略            |\n| `test-data-builder-pattern`     | 手動 Builder Pattern，適合簡單場景           |\n\n---\n\n## 輸出格式\n\n- 產生 Faker<T> 設定類別（含 RuleFor 規則）\n- 提供多語言假資料產生範例\n- 包含 .csproj 套件參考（Bogus）\n- 產生大量資料產生與 Seed 控制程式碼\n\n## 參考資源\n\n### 原始文章\n\n本技能內容提煉自「老派軟體工程師的測試修練 - 30 天挑戰」系列文章：\n\n- **Day 14 - 使用 Bogus 產生假資料**\n  - 鐵人賽文章：https://ithelp.ithome.com.tw/articles/10375501\n  - 範例程式碼：https://github.com/kevintsengtw/30Days_in_Testing_Samples/tree/main/day14\n\n### 官方文件\n\n- [Bogus NuGet Package](https://www.nuget.org/packages/Bogus/)\n- [Bogus GitHub Repository](https://github.com/bchavez/Bogus)\n- [Bogus 官方文件](https://github.com/bchavez/Bogus#readme)\n\n### 延伸閱讀\n\n- [Bogus 與 AutoFixture 在測試中的應用 | mrkt的程式學習筆記](https://www.dotblogs.com.tw/mrkt/2024/09/29/191300)","tags":["dotnet","testing","bogus","fake","data","agent","skills","kevintsengtw","agent-skills","ai-assisted-development","copilot-skills","csharp"],"capabilities":["skill","source-kevintsengtw","skill-dotnet-testing-bogus-fake-data","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-bogus-fake-data","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 (10,997 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:26.539Z","embedding":null,"createdAt":"2026-04-18T23:04:27.202Z","updatedAt":"2026-04-24T13:02:26.539Z","lastSeenAt":"2026-04-24T13:02:26.539Z","tsv":"'-13':274 '/articles/10375501':940 '/bchavez/bogus#readme)':962 '/bchavez/bogus)':79,957 '/kevintsengtw/30days_in_testing_samples/tree/main/day14':944 '/mrkt/2024/09/29/191300)':971 '/packages/bogus/)':73,951 '0':389,688 '1':264,383,842,873 '10':143,163 '100':330,384,836 '1000':144,265,390,685 '10000':331 '14':933 '2':266,332,849,876 '3':858,881 '30':929 '42':806 '5':425 'account':324 'act':776 'add':59 'address':204 'amount':328 'anonym':549 'appdbcontext':798 'arrang':753 'array':407 'ask':49 'assert':781 'autofixtur':541,545,575,593,597,888,890,894,897,966 'autofixture-bas':887 'autofixture-bogus-integr':893 'bash':57 'basic':889 'batch':699,706 'batchsiz':684,695 'bchavez/bogus':76 'bic':343 'bic/swift':345 'bogus':4,8,31,52,56,61,68,82,91,167,440,539,546,579,583,586,589,609,895,899,921,935,946,952,958,964 'br':522 'builder':904,907 'c':814,819,824,829 'c.address':830 'c.email':820 'c.name':815 'c.phone':825 'catchphras':250 'chinesefak':446 'citi':216 'class':93,637,792 'cn':504 'collect':412 'commerc':242 'compani':241 'companynam':246 'complexent':741 'complexfak':724 'complexfaker.value.generate':743 'contain':783,786 'context':799 'context.customers.addrange':837 'context.savechanges':839 'count':671,673 'countri':229 'createdd':119 'creditcardcvv':320 'creditcardnumb':316 'csharp':89,174,206,244,279,314,349,379,417,443,596,635,675,714,746,789 'csproj':919 'currenc':335 'currentbatchs':693,701,711 'custom':834,838 'customerfak':808 'customerfaker.cs':867 'customerfaker.generate':835 'customerservicetests.cs':871 'cvv':322 'data':6,34,37,42,903 'databaseseed':793 'dataset':165,169,173,205,243,278,313,348,378,416,533,564 'date':347 'dateofbirth':200 'datetim':118 'day':932 'de':515 'decim':107 'depart':254 'descript':113 'domainnam':285 'dotnet':2,58 'dotnet-testing-bogus-fake-data':1 'e':729,734 'e.data':735 'e.id':730 'ean':273 'ean13':270,272 'email':13,192,308 'emailcont':778 'emailcontent.should':782,785 'emailservic':750,773,775 'emailservice.generatewelcomeemail':779 'en':500 'end':370 'entitynam':846 'es':517 'even':43 'explicit':48 'f':51,131,136,141,148,153,454,459,470,475,486,491,619,625,654,659,664,731,736,738,762,767,816,821,826,831 'f.address.fulladdress':460,832 'f.commerce.productname':137 'f.company.companyname':492 'f.date.past':154 'f.indexfaker':132 'f.internet.email':626,665,768,822 'f.lorem.sentence':149 'f.person.fullname':455,471,487,620,660,763,817 'f.phone.phonenumber':476,827 'f.random.decimal':142 'f.random.guid':655,732 'fact':747 'fake':5,33 'faker':16,32,84,123,127,176,178,448,465,481,615,633,640,647,650,718,723,727,758,810,843,847,852,856,861,866,912 'faker.address.city':217 'faker.address.country':230 'faker.address.fulladdress':209 'faker.address.latitude':234 'faker.address.longitude':238 'faker.address.state':221 'faker.address.streetaddress':213 'faker.address.zipcode':226 'faker.commerce':271 'faker.commerce.department':255 'faker.commerce.price':263 'faker.commerce.productname':259 'faker.company.catchphrase':251 'faker.company.companyname':247 'faker.date.between':368 'faker.date.future':356 'faker.date.past':352 'faker.date.recent':360 'faker.date.soon':364 'faker.date.weekday':374 'faker.finance.account':325 'faker.finance.amount':329 'faker.finance.bic':344 'faker.finance.creditcardcvv':321 'faker.finance.creditcardnumber':317 'faker.finance.currency':336 'faker.finance.iban':340 'faker.internet':295 'faker.internet.domainname':286 'faker.internet.email':309 'faker.internet.ip':290 'faker.internet.password':305 'faker.internet.url':282 'faker.internet.username':301 'faker.lorem.paragraph':433 'faker.lorem.sentence':429 'faker.lorem.text':437 'faker.lorem.word':420 'faker.lorem.words':424 'faker.person.dateofbirth':201 'faker.person.email':193 'faker.person.firstname':185 'faker.person.fullname':181 'faker.person.gender':197 'faker.person.lastname':189 'faker.random.arrayelement':406 'faker.random.bool':394 'faker.random.decimal':388 'faker.random.enum':402 'faker.random.guid':398 'faker.random.int':382 'faker.random.shuffle':411 'financ':312 'firstnam':184 'fixtur':601,603 'fixture.create':606 'foreach':702 'fr':482,513 'frenchfak':479 'fulladdress':208 'fullnam':180 'futured':355 'gender':196 'generat':38,687,690,697,710,742 'generatecomplexdata':737 'generateus':669 'generateusersbatch':680 'get':98,103,109,114,120 'github':74,953 'github.com':78,943,956,961 'github.com/bchavez/bogus#readme)':960 'github.com/bchavez/bogus)':77,955 'github.com/kevintsengtw/30days_in_testing_samples/tree/main/day14':942 'guid':399 'iban':339,341 'id':97 'ienumer':679 'int':96,670,681,683 'integr':896 'internet':277 'ipaddress':289 'ipv4':291 'ipv6':294,296,297 'ithelp.ithome.com.tw':939 'ithelp.ithome.com.tw/articles/10375501':938 'ja':466,509 'japanesefak':463 'ko':511 'lastnam':188 'latitud':233 'lazi':712,716,722 'list':668 'longitud':237 'lorem':415 'make':21 'math.min':694 'mention':30 'mrkt的程式學習筆記':968 'myproject.tests':865 'name':102 'names/addresses/emails':39 'new':126,177,447,464,480,602,614,649,725,726,757,774,804,809 'nuget':62,66,947 'nuget.org':70 'optimizeddatagener':638 'orderfaker.cs':868 'ornul':528 'p':129,134,139,146,151,452,457,468,473,484,489 'p.address':458 'p.company':490 'p.createddate':152 'p.description':147 'p.id':130 'p.name':135,453,469,485 'p.phone':474 'p.price':140 'packag':60,948 'paragraph':432 'password':304 'pastdat':351 'pattern':905,908 'person':172 'pickrandomweight':529 'price':108,262 'privat':644,719 'product':94,157,161 'productfak':125 'productfaker.generate':158,162 'productnam':258 'pt':521 'public':92,95,100,106,111,117,636,666,677,739,748,790,794 'random':377,805 'randombool':393 'randomdecim':387 'randomel':405 'randomenum':401 'randomguid':397 'randomint':381 'randomizer.seed':803 'readon':646,721 'realist':35,552 'recentd':359 'references/advanced-features.md':537,538 'repositori':954 'return':708 'ru':519 'rulefor':87,128,133,138,145,150,451,456,467,472,483,488,616,622,651,656,661,728,733,759,764,813,818,823,828,915 'seed':41,525,801,879,923 'seeddatabas':797 'sendwelcomeemail':751 'sentenc':428 'servic':870 'set':99,104,110,115,121 'shouldformatcorrect':752 'shuffl':410 'simul':553 'skill':26 'skill-dotnet-testing-bogus-fake-data' 'soondat':363 'source-kevintsengtw' 'start':369 'state':220 'static':645,667,678,720,740,791,795 'streetaddress':212 'string':101,112 'string.empty':105,116 'sure':22 'taiwandatasetextensions.cs':869 'test':3,36,550,902 'test-data-builder-pattern':901 'testdatagener':854 'text':436,864 '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' 'totalcount':682,691,696 'tw':450,507,812 'u':617,623,652,657,662,760,765 'u.email':624,663,766 'u.id':653 'u.name':618,658,761 'ui':581 'url':281,283 'us':501 'use':24,90 'user':29,605,629,704,709,770,780 'user.email':787 'user.name':784 'userfak':613,648,756 'userfaker.generate':630,672,700,771 'usernam':300 'var':124,156,160,175,179,183,187,191,195,199,207,211,215,219,224,228,232,236,245,249,253,257,261,269,280,284,288,293,299,303,307,315,319,323,327,334,338,342,350,354,358,362,366,372,380,386,392,396,400,404,409,418,422,427,431,435,445,462,478,600,604,612,628,686,692,698,703,755,769,772,777,807,833 'void':749,796 'vs':540 'weekday':373 'whenev':27 'word':419,423 'www.dotblogs.com.tw':970 'www.dotblogs.com.tw/mrkt/2024/09/29/191300)':969 'www.nuget.org':72,950 'www.nuget.org/packages/bogus/)':71,949 'yield':707 'zh':449,503,506,811 'zipcod':225 '一行搞定':607 '不關心資料內容':577 '代碼':495,497 '以及自訂':532 '以提升效能':641 '但資料有意義':611 '但資料無意義':608 '使用':7,86,715,845,878,934 '使用者名稱':302 '俄文':518 '信用卡號':318 '個人資訊':171 '假資料產生函式庫':69 '假資料產生器':53 '價格':267 '儲存庫':75 '內建':164 '公司名稱':248 '公司資訊等測試資料時使用':14 '具體化':568 '初始化':713 '初始化開發':590 '包含':918 '匿名測試':548 '即將到來的日期':365 '原因':573 '原型':582 '原始文章':926 '參考資源':925 '句子':430 '只初始化一次':643 '只設定測試需要的屬性':875 '可讀性':565 '可重現性控制':526 '名字':186 '含':914 '命名慣例':844 '命名與組織':841 '商業資訊':240 '單元測試':574 '單字':421 '國家':231 '在測試中的應用':967 '地址':11,292,298 '地址資訊':203 '城市':218 '基本語法結構':81 '基礎使用':891 '場景':571 '多個單字':426 '多語言支援':18,439 '大量真實格式的資料':587 '大量資料時使用批次產生':883 '大量資料產生等':20 '天挑戰':930 '套件參考':920 '套件名稱':64 '套件安裝與設定':54 '套件資訊':63 '如台灣在地資料產生器':535 '姓氏':190 '字串格式':268 '學習成本':559 '安裝':55 '完整內容請參閱':536 '完整地址':210 '完整姓名':182 '官方文件':945,959 '定義集中在':853 '密碼':306 '實例':634,862 '將':851 '專注於邏輯驗證':576 '專注測試邏輯':556 '小數':391 '展示用的擬真資料':584 '州':222 '布林':395 '帳戶號碼':326 '常見陷阱':872 '延伸閱讀':963 '延遲初始化複雜的':717 '建立產品資料的':122 '建議工具':572 '德文':514 '性別':198 '或':855 '手動':906 '批次產生':674 '批次產生以減少記憶體分配':676 '技能名稱':885 '抽象化':566 '控制程式碼':924 '提供多語言假資料產生範例':917 '提供豐富的內建':168 '擴充':534 '支援的語言代碼':493 '效能最佳化':631 '效能測試':585 '效能考量':882 '整合測試':578 '整數':385 '文字內容':414 '文字區塊':438 '方法定義屬性的產生規則':88 '日文':461,508 '明確定義':562 '星期幾':375 '時間資訊':346 '最佳實踐':840 '最近日期':361 '有意義資料':557 '未來日期':357 '本技能內容提煉自':927 '核心概念':80 '核心理念':547 '格式命名':848 '條件式產生與機率控制':527 '條碼':275 '概覽':166 '標語':252 '模擬真實情境':558 '段落':434 '每個都專注於特定領域的資料產生':170 '比較':542 '法文':477,512 '注意隨機性':877 '洗牌':413 '涵蓋':15,524 '混合使用策略':900 '減少資料噪音':567 '測試實作範例':744 '測試環境':591 '生日':202 '產品名稱':260 '產生':911 '產生假資料':936 '產生單筆資料':155 '產生多筆資料':159 '產生大量資料產生與':922 '產生擬真假資料的專門技能':9 '用途':65 '當需要產生真實感的姓名':10 '的一大特色是支援多種語言和文化':441 '的核心是':83 '相關技能':884 '省':223 '真實模擬':551 '真實的姓名格式':621 '真實的郵件格式':627 '確保可重現':802 '確保測試可重現':880 '程式碼比較':595 '程式碼組織':863 '範例程式碼':941 '範圍內日期':371 '簡單直接':598 '簡體中文':502 '系列文章':931 '經度':239 '網域名稱':287 '網路資訊':276 '緯度':235 '繁體中文':444,505 '美國':499 '老派軟體工程師的測試修練':928 '自動推斷':560,599 '自動處理循環參考和巢狀物件':594 '自訂規則':19 '與':898,965 '英文':498 '葡萄牙文':520 '街道地址':214 '複雜業務邏輯約束':531 '複雜相依性':592 '西班牙文':516 '規則':916 '設定':800 '設定類別':913 '設計理念差異':543 '語言':494,496 '讓產生的資料更符合當地習慣':442 '貨幣':337 '資料品質':554 '資料夾':857 '資料庫種子':588,788 '資料有意義':569 '輸出格式':910 '連結':67 '進階功能':523 '過去日期':353 '適合單元測試的匿名資料':892 '適合簡單場景':909 '適用場景分析':570 '避免過度配置':874 '避免重複建立':860 '部門':256 '郵件服務測試':745 '郵遞區號':227 '重用':632 '重用靜態實例':859 '金融資訊':311 '金額':333 '鐵人賽文章':937 '關聯說明':886 '關聯資料與巢狀物件':530 '陣列隨機元素':408 '隨機列舉':403 '隨機填充':555 '隨機資料':376 '集中管理':850 '零配置':561 '電子郵件':194,310 '電話':12 '需要學習':563 '需要真實感的資料進行端到端測試':580 '需要真實的使用者資料來測試郵件格式':754 '需要設定':610 '靜態欄位':642 '韓文':510 '項目':544 '預編譯':639 '類別':17,85","prices":[{"id":"726d476a-268e-4f4b-ac0d-082c9b7d3b36","listingId":"aa046ff0-1160-4db2-982f-48e5375bb631","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:27.202Z"}],"sources":[{"listingId":"aa046ff0-1160-4db2-982f-48e5375bb631","source":"github","sourceId":"kevintsengtw/dotnet-testing-agent-skills/dotnet-testing-bogus-fake-data","sourceUrl":"https://github.com/kevintsengtw/dotnet-testing-agent-skills/tree/main/skills/dotnet-testing-bogus-fake-data","isPrimary":false,"firstSeenAt":"2026-04-18T23:04:27.202Z","lastSeenAt":"2026-04-24T13:02:26.539Z"}],"details":{"listingId":"aa046ff0-1160-4db2-982f-48e5375bb631","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"kevintsengtw","slug":"dotnet-testing-bogus-fake-data","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":"f3e1778a879c46366c130881e227165bbe96ab13","skill_md_path":"skills/dotnet-testing-bogus-fake-data/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/kevintsengtw/dotnet-testing-agent-skills/tree/main/skills/dotnet-testing-bogus-fake-data"},"layout":"multi","source":"github","category":"dotnet-testing-agent-skills","frontmatter":{"name":"dotnet-testing-bogus-fake-data","description":"使用 Bogus 產生擬真假資料的專門技能。當需要產生真實感的姓名、地址、電話、Email、公司資訊等測試資料時使用。涵蓋 Faker 類別、多語言支援、自訂規則、大量資料產生等。\nMake sure to use this skill whenever the user mentions Bogus, Faker, fake data, realistic test data, generating names/addresses/emails, or seed data, even if they don't explicitly ask for fake data guidance.\nKeywords: bogus, faker, fake data, 假資料, 擬真資料, realistic data, fake name, fake address, fake email, Faker<T>, RuleFor, Generate, faker.Name, faker.Address, faker.Internet, 產生假資料, generate fake data, seed data"},"skills_sh_url":"https://skills.sh/kevintsengtw/dotnet-testing-agent-skills/dotnet-testing-bogus-fake-data"},"updatedAt":"2026-04-24T13:02:26.539Z"}}