logo
Web
Максим Колмогоров
Максим Колмогоров
Разработка сайтов

Что такое тесты в программировании и зачем их пишут

Автор постарался рассказать и показать что такое тестирование в программировании используя самые доступные и простые примеры, дабы большая часть людей смогла понять содержание. Материал носит технический характер, некоторые аспекты не будут дотошно объясняться в связи с тем, что большая часть программистов должна знать о них. Но, если Вы не программист и чего-то не понимаете… просто расслабьтесь, общая картина все равно появится, автор гарантирует. Примеры кода, имеющиеся в статье, написаны на JavaScript.

Что такое тесты в программировании и зачем их пишут

Что такое тестирование

Все просто: тестирование – это процесс проверки работоспособности программы или ее отдельных модулей (оплата, регистрация). Тестирование можно проводить по разному: можно проверить все мануально (самому руками потыкаться), а можно писать код, который будет тестировать другой код (об этом позже с примерами).

Виды тестирования

Тестирований существует много, вот только часть из них:

  • Функциональное тестирование;
  • Нагрузочное тестирование;
  • Интеграционное тестирование;
  • Модульное тестирование;
  • И так далее…

В рамках статьи мы не будем касаться всех видов, потому что это статья в интернете, а не реферат. Вообще, есть целая наука (наверно можно так сказать) о тестировании, которая с 80-ых годов 20 века популяризируется такими авторами как Борис Бейзер и Майерс Гленфорд.

Для более детального погружения в материал давайте разберем парочку и кратко о них поговорим.

Стоит отметить, программисты бывают разные: кто-то делает мобильные приложения, кто-то занимается бэкендом, а кто-то фронтендом. И тестирование от сферы к сфере может отличаться. Например, на фронтенде редко проводят нагрузочное тестирование (что нагружать, браузер?), а на бекенде нет тестирования скриншотами (ибо дизайна на бекенде нет). А вот модульное тестирование проводят везде.

Функциональное тестирование

Самая доступная в понимании концепция тестирования, ибо для ее проведения специалист должен вручную проработать определенные сценарии работы с приложением. Грубо говоря просто руками потыкать и посмотреть все ли работает и ничего не ломается.

Естественно даже тут не все так просто, ибо надо иногда тестировщику очень сильно поизголяться и проявлять фантазию. Программисты часто за глаза называют пользователей настоящими животными, потому что те иногда умудряются сделать с их программой такое… о чем даже те подумать не могли. Поэтому, человек, занимающийся функциональным тестированием, должен стать самым настоящим пользователем и делать самые (только на первый взгляд) странные вещи. Например, при виде поля с просьбой ввести число от 1 до 5, тестировщик должен попробовать набрать там слово, слово со спецсимволами или даже попробовать туда добавить текст, а лучше реферат из пары тысяч знаков. Если программа после такого не “упала” – тест пройден.

Если удивляетесь, что программа может “упасть” из-за такой мелочи, то Вы просто никогда не программировали.

Нагрузочное тестирование

Тоже простая и доступная для понимания концепция. Суть нагрузочного тестирования – посмотреть какую возможную нагрузку сможет выдержать Ваше приложение. Обычно таким способом тестируют сервера.

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

Для таких задач программисты используют специальные инструменты по типу Яндекс Танка или Jmeter.

Интеграционное тестирование

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

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

Так вот, интеграционные тесты направлены на проверку связи одних сервисов (если это необходимо) с другими. Например, если в тестовой сборке приложение не видит сервер, или сервер не видит базу данных, то такой код не проходит тестирование. В случае с маленькими проектами такой тип тестирования часто не актуален, а вот в крупных компаниях где один продукт (например Яндекс Поиск) состоит из кучи сервисов и подсервисов, автор уверен, что интеграционное тестирование присутствует и хорошо развито.

Модульное тестирование

Модульное тестирование или, как его еще называют, unit-тестирование – это низкоуровневое тестирование, направленное на проверку каких-то конкретных маленьких (юнитов) участков программы. Тестирование происходит с помощью кода, то есть один программный код тестирует другой код.

Давайте посмотрим на пример, так будет намного проще. Например, у нас есть вот такой небольшой проект (представим, что это лишь часть, и он намного больше):

модульное тестирование часть 1

Есть функция, принимающая два числа и производящая сложение. Допустим, функция всегда должна возвращать число, иначе наша программа сломается. И вот что произойдет если вместо 10 и 20 числами мы передадим в функцию эти же значения, но в строках (‘10’ и ‘20’)?. Верно, произойдет конкатенация, и будет не 30, а 1020 строкой.

Понятно, если мы опытный программист, то сможем это предусмотреть еще на начальном этапе, но вот что будет если эта функция больше? Точнее ее тело (содержимое). Или что если таких функций много, штук 40. И что если эти функции находятся в файле utility.js, и они импортированы в разные участки одного огромного проекта на 300-400 тысяч строк кода.

А вот что может произойти: если неопытный программист отредактирует одну функцию в этом файле и, не дай бог, она может теоретически вернуть некорректное значение, значит какой-то модуль в нашей огромной программе может попросту сломаться в любой момент. Но как мы об этом узнаем? Через функциональный тест? А если тестировщик в торопях проверит не все? Или “злое” (жадное) руководство попросит отправить обновление в продакшен прямо сейчас и не минутой позже? Думаем, тут все предсказуемо, будет грустно.

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

модульное тестирование часть 2

Следовательно, мы можем сделать некоторые изменения в коде и получить хороший результат тестов повысив стрессоустойчивость приложения:

модульное тестирование часть 3
Просто привел результат к нужному типу данных.

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

Инструментов для подобной деятельности навалом, просто они отличаются от одного языка программирования к другому. Например, в статье в примере показан язык программирования JavaScript, а инструмент, с помощью которого проводятся тесты – Jest.js. Но так же есть Wallaby, Mocha и тьма других. А для языка программирования PHP будут уже другие инструменты, например, PHPUnit.

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

Оставьте комментарий

Нажимая на кнопку, вы даете согласие на обработку персональных данных и соглашаетесь c политикой конфиденциальности

Нет комментариев