当我使用 VS 生成单元测试时,我得到了 Assert.Inclusive 用于生成的测试方法,并且通常我在工作时更改了断言等等。我使用测试结果中 Assert.Inconclusive 的问号作为标记来快速告诉我哪些测试我还没有完成。
嗯,这就是我使用它的方式。从它的名字“不确定”来看,我猜你可以用它来表示你的不确定状态,只要你记录它的含义。
但是,从您的Average()
方法的描述来看,我认为您的单元测试可能不够原子,无法仅涵盖一个“单元”,一个特定场景。有时,我会为一个方法编写 2 或 3 个单元测试方法。或者您可以将您的Average()
方法分解为涵盖单一职责的较小方法。这样,您可以在对您进行单元测试之前对这些较小的方法进行单元测试Average()
。
约翰内斯,
这就是我将如何实现Sum()
andAverage()
方法。
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
抛出导致溢出的输入类型。或者,如果您喜欢使用 TDD,请按相反的顺序进行操作。
我希望这有助于澄清这个想法。