Обложка канала

.NET Разработчик

Опытный разработчик не так давно зашёл в .Net и поставил цель получить сертификат Microsoft. Свой ежедневный прогресс он описывает на канале .Net Разработчик. Заметки об изученном материале, советы по повышению производительности и поддержке мотивации, ин

.NET Разработчик

4 года назад
Открыть в
День 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