Как стать автором
Обновить

Проектируем приложения, которые легко тестировать

Время на прочтение4 мин
Количество просмотров1.8K
Для того чтобы создавать качественное ПО очень важно качественно его тестировать. Но тестирование может оказаться довольно непростой задачей, если в вашем проекте не предусмотрены специальные средства, облегчающие тестирование. О них я хочу подробнее поговорить в этой статье.


Юнит-тестирование


Юнит-тестирование позволит контролировать качество ПО на всех стадиях разработки, вы сможете избежать множества ошибок на ранних этапах разработки, когда еще невозможно тестировать код извне.
Если вы хотите использовать юнит-тестирование в своем проекте, то подумать о том, как вы будете это делать, необходимо еще на этапе проектирования. Сначала нужно разработать ядро приложения и написать сквозные тесты, которые будут проверять его работоспособность.

Когда ядро готово и первые тесты заработали, можно добавлять новые компоненты. Первым делом определите, как должен работать новый код, какими будут входные и выходные данные. Затем напишите приемочные тесты для нового компонента. Приемочные тесты проверяют работоспособность компонента в целом. Вначале они не будут работать и даже компилироваться. Начинайте шаг за шагом реализовывать необходимую функциональность, до тех пор, пока все тесты не заработают.

На каждом шаге разработки пишите юнит-тесты прежде, чем реализовать какую-либо функциональность. Если вдруг после изменений в коде перестали работать некоторые тесты, то не приступайте к следующим изменениям, пока не почините тесты.

Взаимодействие компонентов друг с другом тестируйте с помощью интеграционных тестов.
Если ваш код трудно тестировать при помощи юнит-тестов, значит, в нем слишком много зависимостей и нет удобных интерфейсов. Такой код сложно будет сопровождать в дальнейшем, необходимо провести рефакторинг.

Unit testing scheme


Юнит-тестирование дает множество преимуществ. Вы заметите, что качество кода станет гораздо лучше. Задачи будут хорошо декомпозированы, компоненты не будут сильно связаны между собой. Ваш код будет легко сопровождать и расширять. Вам не нужно будет часами дебажить код, чтобы найти ошибку – юнит-тест сразу укажет в нужное место. Запуская юнит-тесты после любых изменений в коде, вы всегда будете уверены, что ничего не поломали. Особенно полезным будет юнит-тестирование если у вас в команде нет тестировщиков.

Интерфейсы для автоматизации тестирования


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

Если у вас небольшой проект, программа выполняет одно или несколько действий над данными, то возможно, что вам достаточно будет ограничиться командной строкой. На вход программа будет принимать файл с входными данными и выдавать результат выполнения в выходной поток, например в файл. Для больших проектов с разнообразной функциональностью можно добавить парсер консольных команд. Каждая команда будет предназначена для тестирования отдельного компонента или поведения. Тестировщик сможет легко автоматизировать тесты, запуская программу при помощи скрипта с различными наборами входных данных и сравнивая полученный результат с требуемым.

Давайте разберемся с консолью подробнее.

Вы начинаете разработку нового компонента. Обговорите заранее с тестировщиком как лучше его тестировать. Допустим, это новая кнопка, по нажатию которой будут выполнены некоторые действия над данными. Вам нужно протестировать правильность выполнения действий и проверить работает ли кнопка. Не нужно смешивать эти два теста. Для проверки функциональности добавьте новую консольную команду, она должна дублировать действия, происходящие по нажатию кнопки. Для проверки работы кнопки напишите GUI тест.

Договоритесь с тестировщиком о том, как будет выглядеть команда, и о формате входных и выходных данных. Данные, полученные через графический интерфейс и консольную команду, должны быть приведены к единому виду, который подается на вход тестируемого компонента. Затем результат преобразуется в графический вид для вывода на экран или в текстовый для вывода в поток.

Testing interface


Таким образом, вам понадобится небольшое количество сложных тестов для GUI, а тестирование функциональности можно обеспечить большим количеством простых текстовых тестов. При изменениях в графическом интерфейсе вам не потребуется менять тесты на функциональность.

Ассерты


Ассерты – это проверки, выдающие значение об ошибке в режиме дебага. Используйте ассерты для проверки правильности входных данных и возвращаемых значений. В норме ассерты никогда не должны срабатывать. Самые распространенные случаи, когда необходимо добавить ассерт – это проверка правильности индекса, проверка на NULL или пустое значение, непредусмотренное значение для свича.

Дампы и логи


Пишите дампы для проверки промежуточных состояний структур данных и логи для контроля правильности хода выполнения программы. Они позволят вам быстрее определить на каком этапе произошла ошибка. Предусмотрите режимы запуска, которые будут включать лог или дамп тестируемого модуля, например, это так же могут быть консольные команды.

Обсуждайте все моменты с тестировщиком


Самое важное – обсуждать все, что вы делаете, с тестировщиком. Вместе решайте, как должна работать программа, чтобы не возникало неоднозначностей. Продумайте, как вы будете тестировать ваше приложение до того, как начнете писать код. Средства для тестирования должны быть изначально заложены в архитектуру. Обсудите, какие именно средства необходимо реализовать. Не ленитесь делать это, тогда работа тестировщика станет более эффективной, а продукт более качественным.

Успешной разработки.
Теги:
Хабы:
Всего голосов 43: ↑37 и ↓6+31
Комментарии6

Публикации