Birim testlerini oluşturmak için VS kullandığımda, oluşturulan test yöntemleri için Assert.Inclusive'ı aldım ve genellikle bunları çalıştırdığımda başka bir şeyi de değiştiriyorum. Test sonucundaki Assert.Inconclusive soru işaretlerini, henüz hangi testleri henüz tamamlamadığımı hızlı bir şekilde belirtmek için işaretleyiciler olarak kullanıyorum.
Eh, sadece kullanma şeklim. Adından "Sonuçsuz", sanırım ne anlama geldiğini belgelediğiniz sürece belirsiz durumunuzu belirtmek için kullanabilirsiniz. Bununla birlikte, Average()
yönteminizin açıklamasından dolayı, belki de birim testinizin sadece bir "birim", belirli bir senaryoyu kapsayacak kadar atomik olmadığını düşünüyorum. Bazen tek bir yöntem için 2 veya 3 birim test metodu yazarım. Veya, Average()
yönteminizi tek sorumlulukları kapsayan daha küçük yöntemlere ayırabilirsiniz. Bu şekilde, birim test etmeden önce Average()
bir tanesini bu küçük yöntemleri test edebilirsiniz.
Johannes,
Bu benim Sum()
ve Average()
yöntemlerini uygulamak şekli şöyledir.
public static class MyMath
{
private static void ValidateInput(ICollection<int> numbers)
{
if (numbers == null)
throw new ArgumentNullException("numbers", "Null input. Nothing to compute!");
if (numbers.Count == 0)
throw new ArgumentException("Input is empty. Nothing to compute!");
}
public static int Sum(int[] numbers)
{
ValidateInput(numbers);
var total = 0;
foreach (var number in numbers)
total += number;
return total;
}
public static double Average(int[] numbers)
{
ValidateInput(numbers);
return Sum(numbers)/numbers.Length;
}
}
Kolaylık olması açısından, sadece ValidateInput(ICollection<int>)
yönteminden ArgumentException
istisna atar. Ayrıca ValidateInput(ICollection<int>)
yönteminde taşma olasılığını kontrol edebilir ve OverflowException
kodunu atabilirsiniz.
Bu, Average(int[])
işlevini nasıl test edeceğimi söyledi.
[TestMethod]
public void AverageTest_GoodInput()
{
int[] numbers = {1, 2, 3};
const double expected = 2.0;
var actual = MyMath.Average(numbers);
Assert.AreEqual(expected, actual);
}
[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void AverageTest_NullInput()
{
int[] numbers = null;
MyMath.Average(numbers);
}
[TestMethod]
[ExpectedException(typeof(ArgumentException))]
public void AverageTest_EmptyInput()
{
var numbers = new int[0];
MyMath.Average(numbers);
}
Bu sınamalar kurulumunda, tüm sınamalar geçtiğinde, işlevimin doğru olduğundan emin olabilirim. Peki, taşma durumu hariç. Şimdi taşma olup olmadığını kontrol etmek için mantık eklemek için ValidateInput(ICollection<int>)
yöntemine geri dönebilirim, ardından taşmaya neden olan girişler için OverflowException
'un atılmasını beklemek üzere bir tane daha test daha ekleyebilirim. Ya da TDD'yi kullanarak yaklaşmayı seviyorsanız bunu ters sırayla yapın.
Umarım bu, fikri açıklığa kavuşturmaya yardımcı olur.
Henüz testi yazmadım, ben sadece test yöntemini -veya-
Testim bağımlılığı ve bu bağımlılığı var
oluşturduk:
görünüm kutusundan kontrol etmeliyim, lütfen bu çok özel durumda –
bu konuya nasıl yaklaşacağınızı ayrıntılı olarak açıklayabilirsiniz. Yani özünde Sum() için açık bir test yazmaya gerek olmadığını, ancak bunu Average() ile test ettiğinizi söylüyorsunuz. Kod kapsamı perspektifinden, bu yine de aynı sonucu üretir. –
Ayrıca Sum() için testler de yazarım. Uykucu anımda kim bilir, '/' yerine '-' yazabilirim. :) Sum() için yapılan sınamalarda, Sum() geçişi için tüm sınamaları aldım, ancak Average() için bazı sınamalar başarısız olursa, Ortalama() uygulamasının yanlış olduğundan emin olabilirim. Total() 'ın yanlış olması için Sum()' i suçlayamayacağım. :) – tranmq