Виды тестирования
Тестирование – это процесс проверки работоспособности программного обеспечения и, в результате, выявления его соответствия или несоответствия ожиданиям разработчика.
Тесты позволяют проверить правильность работы проекта во всевозможных ситуациях. Действительно эффективные тесты должны обладать следующими качествами:
- Достоверность;
- Независимость от окружения, на котором они выполняются;
- Быть простыми и доступными для понимания;
- Соответствовать единым правилам именования;
- Иметь возможность регулярно запускаться в автоматическом режиме.
Существует достаточно много разновидностей тестирования: системное, регрессионное, функциональное, стресс-тестирование, тестирование производительности, нагрузочное тестирование, тестирование безопасности, тестирование локализации, юзабилити тестирование.
Обыкновенно на практике для проверки кода созданных программ используется пирамида тестирования Майка Кона (представлена на рисунке).
Рисунок 1. Пирамида тестирования Майка Кона. Автор24 — интернет-биржа студенческих работ
В самом простом её варианте предполагается выполнение трёх типов тестов (по своему количеству они соотносятся подобно тому, как соответствующие слои в пирамиде):
- Модульные (Unit) – тесты, применяемые в различных слоях приложения, с помощью которых проверяются минимальные составляющие общей логики программы, например, класс, функция или метод. Это наиболее часто применяемый на практике вид тестов.
- Интеграционные (Integration) – тесты, позволяющие проверить более значительные по объёму части всей системы, такие как объединение сразу нескольких классов и методов. При этом может тестироваться либо собственно их совместная работа, либо их взаимодействие с внешними компонентами, например, с базой данных.
- Интерфейсные (UI) – тесты, обеспечивающие проверку работы пользовательского интерфейса приложения. В них задействуется логика на всех уровнях программы. Это самая тяжеловесная разновидность тестов, поэтому по количеству UI-тестов создаётся меньше всего, так, чтобы с помощью них проверять лишь самые необходимые ситуации, возникающие в ходе выполнения программы.
Примеры тестирования на C
С# – это объектно-ориентированный язык программирования с автоматическим управлением памятью, предназначенный для программирования на платформе .NET.
Ввиду этого C# – удобный язык программирования для решения достаточно сложных задач, так как программисту не нужно особо задумываться над выделением компьютерной памяти и процессом её очистки во время выполнения программы. Кроме того, платформа .NET предоставляет огромный выбор различных библиотек, упрощающих разработку приложений.
Поскольку unit-тесты являются наиболее распространёнными и востребованными из всех видов тестирования, то посмотрим, для решения каких задач на языке C# они могут быть применимы. Например, поиск ошибок в основных алгоритмах кода программы (с разделением его логических составляющих на отдельные модули), а также отладка backend-ной части web-приложения.
Такие тесты позволяют вовремя обнаружить ошибки в коде, освобождая, тем самым, программиста от самостоятельного их поиска. Это значительно экономит время, особенно, если алгоритм решаемой в программе задачи имеет много разветвлений.
Рассмотрим простой пример теста, написанного на языке C#:
Рисунок 2. Тест. Автор24 — интернет-биржа студенческих работ
Тесты создаются таким образом, чтобы проверять реакцию вызываемого метода при всех ветвлениях, которые в нём происходят. Так, в этом примере требуется два вызова функции isLowerVowel() для проверки, является ли буква гласной или согласной. И в одном случае на выходе получится 1, в другом – 0. Все остальные гласные здесь проверять не надо, так как достаточно протестировать каждый отдельный случай ветвления для того, чтобы убедиться в корректности работы программы.
Теперь другой пример:
Рисунок 3. Тест. Автор24 — интернет-биржа студенческих работ
Здесь выполняется сравнение двух чисел. Для тестирования данной процедуры потребуется 3 вызова функции compare() для трёх принципиально различных ситуаций, а именно сравнение чисел (1,0), (0,1) и (0,0). Тем самым, все возможные ветви алгоритма будут проверены.
И, наконец, несколько слов об автоматизации процесса тестирования.
Для того, чтобы каждый раз специально не приходилось проверять результаты теста, можно сразу же добавить к тесту предполагаемые результаты, которые должны получиться при успешном тестировании:
Рисунок 4. Тест и его предполагаемые результаты. Автор24 — интернет-биржа студенческих работ
Теперь можно вызывать функцию test() в любое время, и сразу увидеть результат прохождения тестирования. Так, мы увидим на экране либо 0, если все тесты были успешно пройдены, либо номер теста (1 или 2), в котором произошла ошибка.
Итак, тестирование придаёт коду программы стабильность и делает его более предсказуемым для разработчика и удобным для поддержки. Такой подход к тестированию позволяет оптимально добавлять в приложения новый функционал и в дальнейшем упрощает процесс рефакторинга кода.