Я всегда знал, что выполнение максимального охвата кода с помощью модульных тестов является хорошим. Я также слышал, как разработчики из крупных компаний, таких как Microsoft, заявили, что они пишут больше строк кода тестирования, чем сам исполняемый код.
Теперь, , это действительно здорово? Не кажется ли иногда, что это полная потеря времени, которая имеет единственный эффект для облегчения обслуживания?
Например, скажем, у меня есть метод DisplayBooks()
, который заполняет список книг из базы данных. Требования к продукту говорят, что если в магазине хранится более ста книг, должно отображаться только сто.
Итак, с TDD,
- Я начну с создания unit test
BooksLimit()
, который сохранит две сотни книг в базе данных, вызоветDisplayBooks()
и сделаетAssert.AreEqual(100, DisplayedBooks.Count)
. - Затем я буду проверять, не сработает ли он,
- Затем я изменю
DisplayBooks()
, установив предел результатов на 100 и - Наконец, я повторю тест, чтобы убедиться, что он преуспел.
Ну, не намного ли проще перейти на третий шаг и вообще не сделать BooksLimit()
unit test? И не более ли это Agile, когда требования будут меняться от 100 до 200 ограничений книг, чтобы изменить только один символ, вместо того, чтобы менять тесты, запускать тесты, чтобы проверить, не сработает ли он, изменить код и выполнить тесты еще раз, чтобы проверить, удалось ли это?
Примечание. Предположим, что код полностью задокументирован. В противном случае некоторые могут сказать, и они будут правы, что выполнение полных модульных тестов поможет понять код, в котором отсутствует документация. Фактически, наличие BooksLimit()
unit test будет очень четко показывать, что для отображения будет максимальное количество книг и что это максимальное число равно 100. Переход на код не-unit-тестов будет намного сложнее, поскольку такой предел может быть реализован, хотя for (int bookIndex = 0; bookIndex < 100; ...
или foreach ... if (count >= 100) break;
.