ExportToFactory_FileExtensionIsZip_ThrowException • Легко найти все тесты на нужный метод • Даже моей бабушке понятно, почему и что происходит • По названиям методов можно быстро погрузиться в домен
• Arrange - устанавливаем входное состояние • Act - вызываем метод, который тестируем • Assert - проверяем выходные данные или ожидаемое поведение Структура теста становится более явной и понятной.
идеале - один • одна проверка - одна причина для падения • тесты более устойчивы к рефакторингу Если вам надо сделать несколько проверок, то сделайте несколько тестов с единственной проверкой!
coverlet) для моментальной обратной связи, в дополнение к проверке на CI • Не нужно дергать и ждать CI • Видно какие места, которые не покрыты и требуют тестов • Можно отдельно смотреть покрытие отдельных тестов, тестовых сессий
таблиц (добавление / удаление / изменение названия полей, изменение типа данных в поле, уникальности). В ходе разработки из него вынесли во вспомогательный класс метод для получения промежуточных данных (массивы данных о том, что и как менять), являвшихся деталями реализации. Стала ли эта несущественная для тестирования часть существенной?
использоваться далее в SUT (оно автоматически проверяется при проверке результата), а также неважные детали поведения (например, порядок вызова, если важно только то, что методы должны быть вызваны). Все важные детали поведения стоит покрывать тестами (например, проверка того, что SUT вызывает метод зависимости для всех элементов коллекции).
ошибки как в тест, так и в тестируемый код. Вероятность этого можно уменьшить программируя в паре или при наличии качественного code review. Как мне кажется, основная польза TDD не в механическом исполнении ритуалов, а в том, что при данном подходе начинает работать критическое мышление: перед тем, как написать тест (без готового кода), приходится отвечать на вопросы о том, что именно мы хотим протестировать, является ли сценарий важным и т. д.
поведение SUT / некорректность теста (если нет сетапа метода, или вызов с другими аргументами - сразу же увидим исключение). Минусы: • сетапы могут стать весьма громоздкими и непонятными с первого взгляда.
{if (progress > 2) throw ...; progress = 3;})... Для проверки, что метод был вызван для всех ожидаемых параметров: someMock .Setup(m => m.SomeMethod( It.Is<SomeType>(value => expectedCollection.Contains(value)))) .Callback<SomeType>((value) => { expectedCollection.Remove(value);})...