dotnet-testing-test-naming-conventions
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
Chinese.NET 測試命名規範指南
.NET Test Naming Convention Guide
適用情境
Applicable Scenarios
當被要求執行以下任務時,請使用此技能:
- 為測試方法或測試類別命名
- 檢視並改進現有測試的命名
- 確保測試報告的可讀性
- 建立團隊一致的測試命名標準
Use this skill when you are asked to perform the following tasks:
- Name test methods or test classes
- Review and improve existing test names
- Ensure test report readability
- Establish consistent test naming standards for the team
測試方法命名規範
Test Method Naming Conventions
標準格式
Standard Format
使用底線分隔的三段式命名法:
text
[被測試方法名稱]_[測試情境/輸入條件]_[預期行為/結果]Use the underscore-separated three-part naming method:
text
[TestedMethodName]_[TestScenario/InputCondition]_[ExpectedBehavior/Result]各段說明
Section Explanations
| 區段 | 說明 | 範例 |
|---|---|---|
| 被測試方法名稱 | 正在測試的方法名稱 | |
| 測試情境/輸入條件 | 描述測試的前置條件或輸入 | |
| 預期行為/結果 | 描述預期的輸出或行為 | |
| Section | Description | Example |
|---|---|---|
| Tested Method Name | Name of the method being tested | |
| Test Scenario/Input Condition | Describes test preconditions or inputs | |
| Expected Behavior/Result | Describes expected output or behavior | |
命名範例對照表
Naming Example Comparison Table
✅ 好的命名 vs ❌ 不好的命名
✅ Good Names vs ❌ Bad Names
| ❌ 不好的命名 | ✅ 好的命名 | 原因 |
|---|---|---|
| | 清楚說明測試情境與預期結果 |
| | 有意義的描述 |
| | 完整的三段式命名 |
| | 明確的例外情境 |
| ❌ Bad Name | ✅ Good Name | Reason |
|---|---|---|
| | Clearly states test scenario and expected result |
| | Meaningful description |
| | Complete three-part naming |
| | Clear exception scenario |
實際範例
Practical Examples
基本運算測試
Basic Arithmetic Tests
csharp
// ✅ 正常路徑測試
[Fact]
public void Add_輸入1和2_應回傳3()
// ✅ 邊界條件測試
[Fact]
public void Add_輸入0和0_應回傳0()
// ✅ 負數測試
[Fact]
public void Add_輸入負數和正數_應回傳正確結果()csharp
// ✅ 正常路徑測試
[Fact]
public void Add_輸入1和2_應回傳3()
// ✅ 邊界條件測試
[Fact]
public void Add_輸入0和0_應回傳0()
// ✅ 負數測試
[Fact]
public void Add_輸入負數和正數_應回傳正確結果()驗證邏輯測試
Validation Logic Tests
csharp
// ✅ 有效輸入測試
[Fact]
public void IsValidEmail_輸入有效Email_應回傳True()
// ✅ 無效輸入 - null
[Fact]
public void IsValidEmail_輸入null值_應回傳False()
// ✅ 無效輸入 - 空字串
[Fact]
public void IsValidEmail_輸入空字串_應回傳False()
// ✅ 無效輸入 - 格式錯誤
[Fact]
public void IsValidEmail_輸入無效Email格式_應回傳False()csharp
// ✅ 有效輸入測試
[Fact]
public void IsValidEmail_輸入有效Email_應回傳True()
// ✅ 無效輸入 - null
[Fact]
public void IsValidEmail_輸入null值_應回傳False()
// ✅ 無效輸入 - 空字串
[Fact]
public void IsValidEmail_輸入空字串_應回傳False()
// ✅ 無效輸入 - 格式錯誤
[Fact]
public void IsValidEmail_輸入無效Email格式_應回傳False()業務邏輯測試
Business Logic Tests
csharp
// ✅ 處理流程測試
[Fact]
public void ProcessOrder_輸入有效訂單_應回傳處理後訂單()
// ✅ 例外處理測試
[Fact]
public void ProcessOrder_輸入null_應拋出ArgumentNullException()
// ✅ 格式化測試
[Fact]
public void GetOrderNumber_輸入有效訂單_應回傳格式化訂單號碼()csharp
// ✅ 處理流程測試
[Fact]
public void ProcessOrder_輸入有效訂單_應回傳處理後訂單()
// ✅ 例外處理測試
[Fact]
public void ProcessOrder_輸入null_應拋出ArgumentNullException()
// ✅ 格式化測試
[Fact]
public void GetOrderNumber_輸入有效訂單_應回傳格式化訂單號碼()計算邏輯測試
Calculation Logic Tests
csharp
// ✅ 正常計算
[Fact]
public void Calculate_輸入100元和10Percent折扣_應回傳90元()
// ✅ 無效輸入 - 負數
[Fact]
public void Calculate_輸入負數價格_應拋出ArgumentException()
// ✅ 邊界值測試
[Fact]
public void Calculate_輸入0元價格_應正常處理()
// ✅ 含稅計算
[Fact]
public void CalculateWithTax_輸入100元和5Percent稅率_應回傳105元()csharp
// ✅ 正常計算
[Fact]
public void Calculate_輸入100元和10Percent折扣_應回傳90元()
// ✅ 無效輸入 - 負數
[Fact]
public void Calculate_輸入負數價格_應拋出ArgumentException()
// ✅ 邊界值測試
[Fact]
public void Calculate_輸入0元價格_應正常處理()
// ✅ 含稅計算
[Fact]
public void CalculateWithTax_輸入100元和5Percent稅率_應回傳105元()狀態變化測試
State Change Tests
csharp
// ✅ 初始狀態測試
[Fact]
public void Increment_從0開始_應回傳1()
// ✅ 連續操作測試
[Fact]
public void Increment_從0開始連續兩次_應回傳2()
// ✅ 重設測試
[Fact]
public void Reset_從任意值_應回傳0()csharp
// ✅ 初始狀態測試
[Fact]
public void Increment_從0開始_應回傳1()
// ✅ 連續操作測試
[Fact]
public void Increment_從0開始連續兩次_應回傳2()
// ✅ 重設測試
[Fact]
public void Reset_從任意值_應回傳0()測試類別命名規範
Test Class Naming Conventions
標準格式
Standard Format
text
[被測試類別名稱]Teststext
[TestedClassName]Tests範例
Examples
| 被測試類別 | 測試類別名稱 |
|---|---|
| |
| |
| |
| |
| Tested Class | Test Class Name |
|---|---|
| |
| |
| |
| |
類別結構範本
Class Structure Template
csharp
namespace MyProject.Tests;
/// <summary>
/// class CalculatorTests - Calculator 測試類別
/// </summary>
public class CalculatorTests
{
private readonly Calculator _calculator;
public CalculatorTests()
{
_calculator = new Calculator();
}
//---------------------------------------------------------------------------------------------
// Add 方法測試
[Fact]
public void Add_輸入1和2_應回傳3()
{
// ...
}
//---------------------------------------------------------------------------------------------
// Divide 方法測試
[Fact]
public void Divide_輸入10和2_應回傳5()
{
// ...
}
}csharp
namespace MyProject.Tests;
/// <summary>
/// class CalculatorTests - Calculator 測試類別
/// </summary>
public class CalculatorTests
{
private readonly Calculator _calculator;
public CalculatorTests()
{
_calculator = new Calculator();
}
//---------------------------------------------------------------------------------------------
// Add 方法測試
[Fact]
public void Add_輸入1和2_應回傳3()
{
// ...
}
//---------------------------------------------------------------------------------------------
// Divide 方法測試
[Fact]
public void Divide_輸入10和2_應回傳5()
{
// ...
}
}參數化測試命名
Parameterized Test Naming
使用 時的命名規範:
[Theory]csharp
// ✅ 使用「各種」表示多組測試資料
[Theory]
[InlineData(1, 2, 3)]
[InlineData(-1, 1, 0)]
[InlineData(0, 0, 0)]
public void Add_輸入各種數值組合_應回傳正確結果(int a, int b, int expected)
// ✅ 使用「有效」表示正向測試
[Theory]
[InlineData("test@example.com")]
[InlineData("user.name@domain.org")]
public void IsValidEmail_輸入有效Email格式_應回傳True(string validEmail)
// ✅ 使用「無效」表示負向測試
[Theory]
[InlineData("invalid-email")]
[InlineData("@example.com")]
public void IsValidEmail_輸入無效Email格式_應回傳False(string invalidEmail)Naming conventions when using :
[Theory]csharp
// ✅ 使用「各種」表示多組測試資料
[Theory]
[InlineData(1, 2, 3)]
[InlineData(-1, 1, 0)]
[InlineData(0, 0, 0)]
public void Add_輸入各種數值組合_應回傳正確結果(int a, int b, int expected)
// ✅ 使用「有效」表示正向測試
[Theory]
[InlineData("test@example.com")]
[InlineData("user.name@domain.org")]
public void IsValidEmail_輸入有效Email格式_應回傳True(string validEmail)
// ✅ 使用「無效」表示負向測試
[Theory]
[InlineData("invalid-email")]
[InlineData("@example.com")]
public void IsValidEmail_輸入無效Email格式_應回傳False(string invalidEmail)常用情境詞彙
Common Scenario Vocabulary
輸入條件詞彙
Input Condition Vocabulary
| 詞彙 | 使用情境 |
|---|---|
| 一般輸入參數 |
| Given-When-Then 風格 |
| 事件觸發 |
| 初始狀態描述 |
| Vocabulary | Usage Scenario |
|---|---|
| General input parameters |
| Given-When-Then style |
| Event trigger |
| Initial state description |
預期結果詞彙
Expected Result Vocabulary
| 詞彙 | 使用情境 |
|---|---|
| 有回傳值 |
| 預期例外 |
| 狀態驗證 |
| 集合驗證 |
| 邊界條件 |
| Vocabulary | Usage Scenario |
|---|---|
| Has return value |
| Expected exception |
| State verification |
| Collection verification |
| Boundary conditions |
命名檢查清單
Naming Checklist
為測試方法命名時,請確認:
- 使用三段式命名
方法_情境_預期 - 情境描述清楚明確
- 預期結果具體可驗證
- 使用中文增加可讀性
- 避免模糊詞彙如 、
Test1TestMethod - 參數化測試使用「各種」、「有效」、「無效」等詞彙
When naming test methods, please confirm:
- Use the three-part naming format
Method_Scenario_Expected - Scenario description is clear and specific
- Expected result is concrete and verifiable
- Use Chinese to increase readability (Note: This is retained as per original context for target audience)
- Avoid vague terms like ,
Test1TestMethod - Use terms like "Various", "Valid", "Invalid" for parameterized tests
測試報告可讀性
Test Report Readability
好的命名會讓測試報告更易讀:
text
✅ CalculatorTests
✅ Add_輸入1和2_應回傳3
✅ Add_輸入負數和正數_應回傳正確結果
❌ Divide_輸入10和0_應拋出DivideByZeroException
✅ EmailHelperTests
✅ IsValidEmail_輸入有效Email_應回傳True
✅ IsValidEmail_輸入null值_應回傳FalseGood naming makes test reports more readable:
text
✅ CalculatorTests
✅ Add_輸入1和2_應回傳3
✅ Add_輸入負數和正數_應回傳正確結果
❌ Divide_輸入10和0_應拋出DivideByZeroException
✅ EmailHelperTests
✅ IsValidEmail_輸入有效Email_應回傳True
✅ IsValidEmail_輸入null值_應回傳False參考資源
Reference Resources
請參考同目錄下的範例檔案:
- templates/naming-convention-examples.cs - 命名規範完整範例
Please refer to the sample files in the same directory:
- templates/naming-convention-examples.cs - Complete naming convention examples
原始文章
Original Articles
本技能內容提煉自「老派軟體工程師的測試修練 - 30 天挑戰」系列文章:
- Day 01 - 老派工程師的測試啟蒙
This skill content is extracted from the "Old-School Software Engineer's Test Training - 30-Day Challenge" series:
- Day 01 - Old-School Engineer's Test Enlightenment
- Ironman Challenge Article: https://ithelp.ithome.com.tw/articles/10373888
- Sample Code: https://github.com/kevintsengtw/30Days_in_Testing_Samples/tree/main/day01