Ответ 1
Когда я использую VS для создания модульных тестов, я получил Assert.Inclusive для сгенерированных тестовых методов, и обычно я изменяю это утверждение так, чтобы что-то еще, когда я их работаю. Я использую вопросительные знаки Assert.Inconclusive в результатах теста в качестве маркеров, чтобы быстро сказать, какие тесты я еще не выполнил.
Хорошо, это так, как я его использую. Из его названия "Неконкретный", я думаю, вы можете использовать, чтобы указать свое неопределенное состояние, пока вы документируете, что это значит.
Однако, из описания вашего метода Average()
, я думаю, что, возможно, ваш unit test не достаточно атомный, чтобы охватить только один "блок", один конкретный сценарий. Иногда я пишу 2 или 3 метода unit test для одного метода. Или вы можете разбить свой метод Average()
на более мелкие методы, охватывающие отдельные обязанности. Таким образом, вы можете unit test те более мелкие методы перед тестированием устройства Average()
one.
Йоханнес,
Вот как я мог бы реализовать методы 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
для типов входов, которые вызывают переполнение. Или делать это в обратном порядке, если вам нравится подход с использованием TDD.
Надеюсь, это поможет прояснить эту идею.