Пишите тесты для людей
(В оригинале - Write Tests for People)
Вы пишете автоматизированные тесты для своего кода? Мои поздравления! Вы их пишете до написания кода? Еще больше поздравлений! Это действие сразу выводит вас в сторонников самых передовых практик. Но насколько хорошие тесты вы пишете? Как вы можете это оценить? Один из способов – это спросить себя «Для кого я пишу тесты?». Если ответом будет «Для себя, чтобы уменьшить время на поиски ошибок», то скорее всего, ваши тесты – не так хороши, как могли бы быть. Так для кого нужно писать тесты? Для тех, кто будет пытаться разобраться в вашем коде.
Хорошие тесты работают как документация к коду, который они тестируют. Они описывают, как именно код работает. Для каждого тестового сценария они:
- Описывают контекст, стартовую точку или предусловия, которые должны быть выполнены.
- Демонстрируют, как программа должна вызываться.
- Описывают ожидаемые результаты или постусловия, которые должны быть проверены.
Различные сценарии будет слегка отличаться друг от друга. Тот, кто будет разбираться в коде, должен иметь возможность посмотреть на несколько тестов и, сравнив эти три части, увидеть, что именно заставляет программу работать по-другому. Каждый тест должен ясно показывать причины и эффект от взаимодействий этих трех частей. Это показывает, что непосредственно невидимое в тесте не менее важно того, что видно. Слишком много кода в тесте будет отвлекать читателя на неважные детали. Старайтесь скрывать такие детали где только можно при помощи, например, функций с понятными именами – рефакторинг Extract Method вам в этом поможет. Также убедитесь, что каждый тест имеет адекватное имя, описывающее используемый сценарий так, чтобы пользователю не пришлось копаться в коде, чтобы понять, что же этот тест делает. Кроме этого, имя тестового класса и его методов должны включать как минимум стартовую точку и то, как программа запускается. Это позволит оценить покрытие тестами простым просмотром имен методов класса. В принципе неплохо включить в имя и ожидаемый результат, но только если в результате имя не получится слишком длинным.
Хорошей идеей является протестировать ваши тесты. Вы можете проверить, что они действительно обнаруживают ошибки путем помещения такой ошибки в программе (конечно же, делать это надо только в своей локальной копии, которую вы сразу же выбросите после испытания!). Убедитесь, что сообщения об ошибках выдаются в понятном и значимом виде. А также проверьте, что выдаваемые тестами сообщения понятны тем, кто пытается понять ваш код. Единственный способ это проверить – найти кого-нибудь, кто не знает вашего кода, показать ему тесты, попросить их просмотреть и спросить, что он в результате понял. Внимательно выслушайте ответ. Если он что-то не сможет понять, то скорее всего это не потому, что он недостаточно старался, а потому, что вы это сделали недостаточно понятным.
Автор оригинала - Gerard Meszaros