2011-04-14 10 views
9

Bazı basit uzantı yöntemleri var C# karşı birim testleri yazıyorum. Uzatma yöntemlerinden biri aşırı yüklenmiştir, bu yüzden ünite testleri için makul bir adlandırma kuralı gelmekte zorlanıyorum.C# birim testi - aşırı yüklenmiş yöntem testleri için adlandırma kuralı

Örnek aşırı yöntemi:

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) { .. } 
} 

İki ünite testleri, nasıl testler isim olacağını her yöntem için bir tane yazmak istiyorsanız

? Normalde ben sadece kullanırsınız:
[TestMethod, TestCategory("Single Method Tests")] 
public void ToListTest 

Ama aynı adlı iki yöntem ile

, ben iyi bir kongre bulmak için mücadele ediyorum ..

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

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

korkunç. Parametre türüne bağlı olarak daha iyi ancak yine de oldukça korkunç olan . Bazıları her iki aşırı yüklemeyi hedefleyen bir test yöntemi yazmayı önerebilir; ancak, aşırı yükler halen zincirlenmiş olsa bile, birim testler ve yöntemlerle 1: 1 ilişkisine sahip olmak isterim. Testlerde yapılan aşırı yüklenmelerin zincirlendiğini ve geçtiği varsayımlarını istemiyorum.

Buna nasıl yaklaşırsınız?

cevap

14

Roy Osherove kitabında, Birim Testinin Sanatı, test etmeye çalıştığınız davranışa dayalı adlandırma kurallarını ve üretim yöntemleri ile test yöntemleri arasında bire bir eşleşmeye sahip olmamasını önerir. Yani, basit bir örnek olarak, bir Stack sınıfı şöyle olduğunu varsayalım:

[TestMethod] 
public void PushTest 

[TestMethod] 
public void PopTest 

[TestMethod] 
public void IsEmptyTest 

Ancak, test etmek daha iyi bir yol var: testler yazmak için

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

Tek yön üç test yöntemleri sahip olmaktır Stack sınıfının davranışlarını belirtir. Buradaki fikir, davranışları ve test yöntemleri arasında bire bir eşleştirmeye sahip olmanızdır. Yani, bir davranış boş bir yığında IsEmpty doğru döner. Bir diğeri ise, bir elemanın itilmesinin yığının boş kalmamasıdır.Sonra formatında bu davranışları belirterek bu düz İngilizce cümlelere göre Arrange/Act/Assert formatında testleri yazmak istiyorum: Bence için teşvik edecek

[TestMethod] 
IsEmpty_OnEmptyStack_ReturnsTrue 

[TestMethod] 
Push_OnEmptyStack_MakesStackNotEmpty 

: Yukarıda belirtilen davranışları için Yani

MethodName_StateOfTheObject_ExpectedResult 

Yukarıdaki yöntemlerde test etmeye çalıştığınız davranışları ve ardından bu davranışları testlerle eşleştirin. Örneğin:

[TestMethod] 
ToList_OnEmptyString_ReturnsEmptyList 

[TestMethod] 
ToList_OnStringWithDelimiters_ReturnsListWithTokensSeparatedByDelemiter 

[TestMethod] 
ToList_OnStringWithoutDelimiters_ReturnsListWithOneString 

fazla bilgi here

+1

Teşekkürler Bu yaklaşımı arka planda ve harika bir bağlantı sağladı. +1 ve cevap. –

4

Geçilen parametrelere ve test edilen gerçek işlevselliklere göre daha az olmasına rağmen, ikincisini kullanmaya eğilimliyim.

Yani değil:

  • TestFunctionWithListOfNumbers
  • ve TestFunctionWithListOfStrings

ama belki:

  • TestFunctionWithStudentIDs
  • ve TestFunctionWithStudentNames
+0

olarak testler olurdu, ben yöntemi adlarında "_" koymak sadece zaman –

+0

Bu fikri sevdim - Sorun yöntemleri jenerik uzatma yöntemleri ve nasıl olduğunu herhangi bir bilgi ile kullanılabilir. İşlevselliğe dayalı adlandırma, bir sorun olacaktır .. –

+1

@KP: Bu durumda, argümanlar arasındaki semantik fark sadece türdür, bu yüzden türün en iyi olacağını tahmin ediyorum. –

2

Ben daha Verilen zaman sonra bir şekilde deney adlarını yazma eğilimindedir. Bu, test ismini ayrıntılı hale getirir, fakat test edilmek istenen işlevin ne olduğunu anlatır. Yani sizin durumda i Test_Function_WithStudentIDs kullanma eğiliminde olacaktır

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

Teşekkürler. Bu yaklaşıma ısınıyorum. +1. Brian'ın sadece cevap olarak işaretlediği, sadece sizi 1 dakika boyunca dövdüğü ve daha fazla ayrıntı içerdiği için. –