День 1114. #UnitTesting
Вы Неправильно Называете Тесты! Продолжение
Начало
Для примера попробуем улучшить название теста, используя приведённые выше рекомендации. Вот тест, проверяющий, что доставка с истекшей датой недействительна. Название теста написано с использованием жёсткой политики именования, что не способствует читабельности теста:
[Fact]
public void IsDeliveryValid_InvalidDate_ReturnsFalse()
{
var sut = new DeliveryService();
var pastDate = DateTime.Now.AddDays(-1);
Delivery delivery = new Delivery
{
Date = pastDate
};
var valid = sut.IsDeliveryValid(delivery);
Assert.False(valid);
}
Тест проверяет, правильно ли DeliveryService идентифицирует доставку с неправильной датой как недействительную. Выразим название на простом языке:
Delivery_with_invalid_date_should_be_considered_invalid()
Обратите внимание на две вещи в новой версии:
1. Имя теперь имеет смысл для непрограммиста. Это означает, что и программистам будет легче понять его.
2. Имя метода IsDeliveryValid больше не является частью имени теста.
Не включайте название метода в название теста. Вы не тестируете код, вы тестируете поведение приложения. Поэтому не имеет значения, как называется тестируемый метод. Вы можете решить переименовать тестируемый метод, скажем, в IsDeliveryCorrect, и это не повлияет на поведение тестируемой системы. А если вы следуете исходному соглашению об именах, вам придётся переименовать и тест. Это связывает тесты с деталями реализации кода, что негативно влияет на удобство сопровождения набора тестов.
Единственным исключением из этого правила является работа над служебным кодом. Он не содержит бизнес-логики — его поведение не выходит за рамки простого вспомогательного функционала и здесь можно использовать имена методов.
Вернёмся к нашему примеру. Имя теста всё ещё можно улучшить. Что именно означает, что дата доставки недействительна? Глядя на тест, мы видим, что недействительной датой является любая дата в прошлом. То есть должно быть разрешено выбирать дату доставки только в будущем. Отразим это в имени теста:
Delivery_with_past_date_should_be_considered_invalid()
Слишком длинно. Уберём лишние слова без потери смысла. Кроме того, формулировка should_be - ещё один распространённый анти-паттерн. Тест проверяет поведение: правильное оно или нет. Здесь нет места желаниям или стремлениям:
Delivery_with_past_date_is_invalid()
Готово. Окончательная версия представляет собой прямое изложение факта, который описывает один из аспектов поведения тестируемого приложения. В данном случае аспект определения того, может ли быть осуществлена доставка.
Окончание следует…
Источник: enterprisecraftsmanship.com/posts/y…ts-wrong