Допустим, вы пишете в стиле ЯХДЗИ в стиле TDD. Вы хотите проверить часть кода, которая определяет, является ли набор из пяти бросков кубика фулл-хаусом. Насколько я знаю, при выполнении TDD вы следуете следующим принципам:
- Сначала напишите тесты
- Напишите простейшую вещь, которая работает
- Уточнение и рефакторинг
Таким образом, первоначальный тест может выглядеть примерно так:
public void Returns_true_when_roll_is_full_house()
{
FullHouseTester sut = new FullHouseTester();
var actual = sut.IsFullHouse(1, 1, 1, 2, 2);
Assert.IsTrue(actual);
}
Следуя инструкциям «Напишите самую простую вещь, которая работает», вы должны написать следующий IsFullHouse
метод:
public bool IsFullHouse(int roll1, int roll2, int roll3, int roll4, int roll5)
{
if (roll1 == 1 && roll2 == 1 && roll3 == 1 && roll4 == 2 && roll5 == 2)
{
return true;
}
return false;
}
Это приводит к зеленому тесту, но реализация не завершена.
Следует ли вам проводить модульное тестирование каждой возможной действительной комбинации (как значений, так и позиций) для фулл-хауса? Это выглядит как единственный способ быть абсолютно уверенным в том, что ваш IsFullHouse
код полностью протестирован и исправлен, но это также звучит совершенно безумно.
Как бы вы протестировали что-то подобное?
Обновить
Эрик и Килиан отмечают, что использование литералов в начальной реализации для получения зеленого теста может быть не самой лучшей идеей. Я хотел бы объяснить, почему я это сделал, и это объяснение не помещается в комментарии.
Мой практический опыт с модульным тестированием (особенно с использованием подхода TDD) очень ограничен. Я помню, как смотрел запись мастер-класса Роя Ошерова TDD на Tekpub. В одном из эпизодов он создает стиль String Calculator TDD. Полная спецификация калькулятора строк может быть найдена здесь: http://osherove.com/tdd-kata-1/
Он начинает с такого теста:
public void Add_with_empty_string_should_return_zero()
{
StringCalculator sut = new StringCalculator();
int result = sut.Add("");
Assert.AreEqual(0, result);
}
Это приводит к этой первой реализации Add
метода:
public int Add(string input)
{
return 0;
}
Затем этот тест добавляется:
public void Add_with_one_number_string_should_return_number()
{
StringCalculator sut = new StringCalculator();
int result = sut.Add("1");
Assert.AreEqual(1, result);
}
И Add
метод подвергается рефакторингу:
public int Add(string input)
{
if (input.Length == 0)
{
return 0;
}
return 1;
}
После каждого шага Рой говорит: «Напиши самую простую вещь, которая будет работать».
Поэтому я подумал, что попробую этот подход, когда попытаюсь сделать игру Yahtzee в стиле TDD.
if (roll1 == 1 && roll2 == 1 && roll3 == 1 && roll4 == 2 && roll5 == 2)