Существует большое количество типов тестов. Типа тесты могут иметь разное назначение:
- доказать, что код проекта работает корректно;
- указать на имеющуюся ошибку в коде программы;
- проверить правильность конфигурации системы в различных средах (демонстрационное, розробницьке, продакшн); • проверить безопасность программы;
- показать, что программа готова к соответствующим нагрузкам со стороны пользователей;
- проверить, что функционал аппликации является легким в использовании;
- помочь спроектировать структуру и дизайн проекта.
Таким образом, тест – это автоматизированная (тест выполняет код) или ручная (тест выполняет человек) действие, которое, используя соответствующий набор инструментов, выполняет одно из вышеуказанных задач. Наиболее распространенным задачей является проверка кода программы на корректность и отсутствие ошибок.
В данной главе мы сосредоточимся именно на автоматизированных тестах, которые проверяют корректность ранее написанного нами кода веб-аппликации. Все другие типы тестов мы затрагивать не будем, и они остаются вне данной главой.
Этого вам будет совершенно достаточно, чтобы пройти собеседование. Также, если вы уже программируете, но еще не знакомы с созданием автоматических тестов, именно эти тесты (на проверку корректности кода) являются основными тестами, с которых стоит начать знакомство с наукой тестирования для программиста.
Типы тестов
Существует большое количество критериев для распределения тестов на типы. Каждый из типов имеет свое идеальное время и причину для создания. Давайте вкратце пройдемся по категориям. В каждой категории приведем цель, время для написания в цикле проекта и причину создания данного типа теста.
По объекту тестирования:
- функциональное тестирование: тесты на функционал программы; создаются до, в течение или после написания кода программы; имеющие смысл в долговременных проектах для повышения качества кода и стабильности работы аппликации;
- тестирование производительности: сюда входят тесты по нагрузке программы, стресс-тестирование и тестирование стабильности программы; данные тесты необходимы для гарантии достаточной производительности работы программы при заданном количестве пользователей; данные тесты не стоит писать на начальном этапе жизни аппликации, когда пользователей мало; обычно данные тесты создаются позже, если количество пользователей резко увеличивается;
- конфигурационное тестирование: данные тесты помогают проверить правильность настройки системы в различных средах; актуальные при разработке программы, которая используется на различных платформах, средах и устройствах;
- юзабилити тестирование: с англ. usability – эргономичность, удобство, эти тесты проверяют функционал на удобство для пользователя; как правило, данные тесты проводятся с помощью привлечения реальных пользователей в качестве тестировщиков;
- тестирование интерфейса пользователя: тест, который проверяет пользовательский интерфейс имеет запланированный вид; например, в веб-разработке это будут тесты, которые будут проверять размеры и расположение элементов на веб-странице; так, на данный момент существуют инструменты, позволяющие тестировать даже верстку в вебе;
- тестирование безопасности: тесты для оценки уязвимости системы к различного рода атак; создаются в особо критических частях программ (платежная система, программа бэк-офис банка, и т.д.), а также при обнаружении дыры в безопасности;
- тестирование локализации: тесты, которые проверяют перевод программы на одном из языков; данные тесты целесообразно проводить в многоязычных программах при каждом обновлении переводов;
- тестирование совместимости: проверка отдельных компонент программы на совместимость между собой; также проверка внешнего программного обеспечения для корректной работы программы в их среде.
По доступа к системе:
- тестирование черного ящика: тестирование программы с точки зрения конечного пользователя, при котором не используются знания о внутреннем строении программы;
- тестирование белого ящика: тестирование самого кода с целью проверки корректности работы программы; обычно, методами того языка, на котором писалась сама программа; большинство тестов, которые мы будем создавать в данной главе будут именно тестами белого ящика;
- тестирование серого ящика: это тестирование черного ящика, при котором известная внутренняя сторона программы; такие знания помогают лучше организовать сами тесты и покрывать большую область возможных дефектов в программе.
По уровню автоматизации:
- ручное тестирование: тесты, которые проводят тестировщики без использования программных средств;
- автоматизированное тестирование: данные тесты создаются один раз и далее используются при каждой необходимости в процессе жизни программы; данные тесты используются программные средства для выполнения тестов и проверки результатов;
- полу-автоматизированное тестирование: в данном случае часть теста происходит вручную, а другая часть с помощью заранее подготовленного кода.
По уровню изолированности компонентов:
- модульное тестирование: также называется юнит-тестированием (с англ. unit – модуль, единица); тесты, позволяющие проверить на корректность отдельную единицу кода (функцию, класс и т.д.); при этом тесты пишутся так, чтобы предмет теста был максимально независимым от других компонентов системы;
- интеграционное тестирование: тестирование модулей, объединенных в группы; большинство тестов в данной главе будут именно интеграционными, ведь в фреймворке Django большинство компонентов завязаны на базу данных и целый ряд других аспектов, которые делают невозможным тестирование отдельных модулей кода;
- системное тестирование: тестирование программы как целостной системы, включая платформой, на которой ее запускают; цель такого тестирования – выявить все ошибки, которые касаются как функционала программы, так и конфликтов совместимости с конечной платформой запуска программы.
По периоду запуска тестов:
- альфа-тестирование: проводится на раннем этапе разработки программы; обычно проводят потенциальные пользователи или заказчики;
- бета-тестирование: проводится на конечном этапе разработки программы; обычно проводит небольшая группа реальных пользователей.
Много типов тестов пересекаются между собой в вышеприведенных категориях. Так, например, тестирование белого и черного ящика обычно являются функциональными тестами и системными тестами. Тест черного ящика можно проводить как вручную, так и с помощью кода.
В данной главе мы будем работать с автоматизированными тестами. Тестирование будет проводиться в основном в виде тестирования белого и серого ящиков. Будет лишь несколько юнит-тестов, а остальное будет принадлежать к интеграционных тестов в силу того, что мы работаем внутри фреймворка, а не пишем код с нуля. Все эти тесты можно назвать функциональными тестами. Также будут один-два тесты на безопасность, а именно на проверку доступа для анонима до нескольких в’юшок нашей аппликации. Других типов тестов (производительность, нагрузка, конфигурация и т.д.) мы не будем рассматривать в данной главе.