Development

Пишите тесты для людей

(В оригинале – Write Tests for People)

Вы пишете автоматизированные тесты для своего кода? Мои поздравления! Вы их пишете до написания кода? Еще больше поздравлений! Это действие сразу выводит вас в сторонников самых передовых практик. Но насколько хорошие тесты вы пишете? Как вы можете это оценить? Один из способов – это спросить себя «Для кого я пишу тесты?». Если ответом будет «Для себя, чтобы уменьшить время на поиски ошибок», то скорее всего, ваши тесты – не так хороши, как могли бы быть. Так для кого нужно писать тесты? Для тех, кто будет пытаться разобраться в вашем коде.

Хорошие тесты работают как документация к коду, который они тестируют. Они описывают, как именно код работает. Для каждого тестового сценария они:

  1. Описывают контекст, стартовую точку или предусловия, которые должны быть выполнены.
  2. Демонстрируют, как программа должна вызываться.
  3. Описывают ожидаемые результаты или постусловия, которые должны быть проверены.

Различные сценарии будет слегка отличаться друг от друга. Тот, кто будет разбираться в коде, должен иметь возможность посмотреть на несколько тестов и, сравнив эти три части, увидеть, что именно заставляет программу работать по-другому. Каждый тест должен ясно показывать причины и эффект от взаимодействий этих трех частей. Это показывает, что непосредственно невидимое в тесте не менее важно того, что видно. Слишком много кода в тесте будет отвлекать читателя на неважные детали. Старайтесь скрывать такие детали где только можно при помощи, например, функций с понятными именами – рефакторинг Extract Method вам в этом поможет. Также убедитесь, что каждый тест имеет адекватное имя, описывающее используемый сценарий так, чтобы пользователю не пришлось копаться в коде, чтобы понять, что же этот тест делает. Кроме этого, имя тестового класса и его методов должны включать как минимум стартовую точку и то, как программа запускается. Это позволит оценить покрытие тестами простым просмотром имен методов класса. В принципе неплохо включить в имя и ожидаемый результат, но только если в результате имя не получится слишком длинным.

Хорошей идеей является протестировать ваши тесты. Вы можете проверить, что они действительно обнаруживают ошибки путем помещения такой ошибки в программе (конечно же, делать это надо только в своей локальной копии, которую вы сразу же выбросите после испытания!). Убедитесь, что сообщения об ошибках выдаются в понятном и значимом виде. А также проверьте, что выдаваемые тестами сообщения понятны тем, кто пытается понять ваш код. Единственный способ это проверить – найти кого-нибудь, кто не знает вашего кода, показать ему тесты, попросить их просмотреть и спросить, что он в результате понял. Внимательно выслушайте ответ. Если он что-то не сможет понять, то скорее всего это не потому, что он недостаточно старался, а потому, что вы это сделали недостаточно понятным.

Автор оригинала – Gerard Meszaros