2011-04-14 160 views
9

我在c#中有一些簡單的擴展方法我正在寫單元測試。其中一種擴展方法超載,所以我很難爲單元測試提出一個合理的命名約定。c#單元測試 - 重載方法測試的命名約定

public static class StringExtensions 
{ 
    public static List<string> ToList(this string value, char delimiter) 
    { 
     return ToList(value, new[] { delimiter }); 
    } 

    public static List<string> ToList(this string value, char[] delimiterSet) { .. } 
} 

如果我想寫兩個單元測試,一個用於您將如何命名測試每一種方法:

例重載方法?通常我會簡單地使用:

[TestMethod, TestCategory("Single Method Tests")] 
public void ToListTest 

但具有相同名稱的兩個方法,我在努力尋找一個好習慣..

[TestMethod, TestCategory("Single Method Tests")] 
public void ToListTest 

[TestMethod, TestCategory("Single Method Tests")] 
public void ToListTestOverload 

是可怕的。

[TestMethod, TestCategory("Single Method Tests")] 
public void ToListTestWithChar 

[TestMethod, TestCategory("Single Method Tests")] 
public void ToListTestWithCharArray 

基於參數類型更好但仍然非常可怕。

有些人可能會建議編寫一個針對兩種重載的測試方法,但我理想情況下希望與單元測試和方法具有1:1的關係,即使重載目前是鏈接的。我不希望在測試中做出任何關於過載被鏈接和傳遞的假設。

你會如何處理這個問題?

回答

14

Roy Osherove在他的書「單元測試的藝術」中建議根據您要測試的行爲命名約定,而不必在生產方法和測試方法之間進行一對一映射。所以,作爲一個簡單的例子,假設我有一個Stack類,像這樣:編寫測試

public class Stack 
{ 
    public void Push(int value); 
    public int Pop(); 
    public bool IsEmpty(); 
} 

的方法之一是具有三種測試方法:

[TestMethod] 
public void PushTest 

[TestMethod] 
public void PopTest 

[TestMethod] 
public void IsEmptyTest 

然而,有一種更好的方式來測試它指定了Stack類的行爲。然後這個想法是,你有行爲和測試方法之間的一對一映射。所以,一個行爲是空棧上的IsEmpty返回true。另一個是推動一個元素使棧不爲空。根據這些簡單的英語句子的形式指定這些行爲在Arrange/Act/Assert格式我會接着寫測試:

MethodName_StateOfTheObject_ExpectedResult 

因此,對於上述行爲:我會鼓勵你去思考

[TestMethod] 
IsEmpty_OnEmptyStack_ReturnsTrue 

[TestMethod] 
Push_OnEmptyStack_MakesStackNotEmpty 

瞭解您正在嘗試測試上述方法的行爲,然後將這些行爲映射到測試。例如:

[TestMethod] 
ToList_OnEmptyString_ReturnsEmptyList 

[TestMethod] 
ToList_OnStringWithDelimiters_ReturnsListWithTokensSeparatedByDelemiter 

[TestMethod] 
ToList_OnStringWithoutDelimiters_ReturnsListWithOneString 

更多信息here

+1

謝謝我事後認爲這種方法,並提供了一個很好的鏈接。 +1並回答。 – 2011-04-19 19:03:13

4

我傾向於選擇後者,儘管基於傳入的參數以及更多關於正在測試的實際功能的更少。

所以沒有:

  • TestFunctionWithListOfNumbers
  • TestFunctionWithListOfStrings

但也許是:

  • TestFunctionWithStudentIDs
  • TestFunctionWithStudentNames
+0

我會傾向於使用Test_Function_WithStudentIDs,這我在方法名稱把「_」唯一一次 – 2011-04-14 16:01:05

+0

我喜歡這個想法 - 問題是這些方法都是通用的擴展方法和可以與任何信息一起使用。基於功能的命名將是一個挑戰。 – 2011-04-14 16:08:09

+1

@KP:在這種情況下,參數之間的語義差異只是它們的類型,所以我猜這種類型會是最好的。 – 2011-04-14 16:18:08

2

我傾向於更考慮到,當,然後方式來寫測試名稱。這使測試名稱變得冗長,但它告訴我正在測試的功能正打算做什麼。所以你的情況我將不得不測試,

[TestMethod] 
public void GivenSingleCharDelimeter_ToList_Returnsxxx() 
[TestMethod] 
public void GivenCharArrayDelimeter_ToList_Returnsxxx() 
+1

謝謝。我對這種方法變得溫暖起來。 +1。 Brian的上述評價僅僅是因爲他在1分鐘內擊敗了你,並且包含了更多細節。 – 2011-04-19 19:02:23