VSを使用して単体テストを生成すると、生成されたテストメソッドにAssert.Inclusiveを取得しました。通常、アサーションを変更して、それらを操作するときに何か別のものにします。テスト結果のAssert.Inconclusiveの疑問符をマーカーとして使用して、まだ完了していないテストをすばやく教えてくれます。
まあ、それは私がそれを使う方法です。その名前から「決定的ではない」ということから、それが何を意味するのかを文書化する限り、あなたはあなたの非決定的な状態を示すために使うことができると思います。
ただし、Average()
メソッドの説明から、ユニットテストは1つの「ユニット」、1つの特定のシナリオだけをカバーするのに十分なアトミックではないと思います。時々、私は単一のメソッドに対して2つまたは3つの単体テストメソッドを記述します。Average()
または、メソッドを単一の責任をカバーするより小さなメソッドに分割することもできます。そうすれば、ユニットテストを行う前に、これらの小さなメソッドをユニットテストできますAverage()
。
ヨハネス、
これは私がSum()
とAverage()
メソッドを実装する方法です。
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;
}
}
簡単にするために、メソッドArgumentException
から例外をスローするだけです。また、オーバーフローしてメソッドValidateInput(ICollection<int>)
をスローする可能性を確認することもできます。OverflowException
ValidateInput(ICollection<int>)
そうは言っても、これが私がAverage(int[])
関数をテストする方法です。
[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);
}
これらのテストのセットアップにより、すべてのテストに合格したときに、私の機能が正しいことを確信できます。まあ、オーバーフローの場合を除いて。これで、メソッドに戻ってValidateInput(ICollection<int>)
オーバーフローをチェックするロジックを追加してから、OverflowException
オーバーフローの原因となる種類の入力に対してがスローされることを期待するテストをもう1つ追加できます。または、TDDを使用してアプローチする場合は、逆の順序で実行します。
これがアイデアを明確にするのに役立つことを願っています。