> For the complete documentation index, see [llms.txt](https://sallyit.gitbook.io/akademiait/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://sallyit.gitbook.io/akademiait/obuchenie/den-9/lekcii/testirovanie.md).

# Тестирование

<mark style="color:orange;">**Тестирование**</mark> — это процесс оценки программного обеспечения для выявления дефектов и ошибок, а также проверки соответствия требованиям и ожиданиям пользователей. Цель тестирования — убедиться, что система работает корректно, надежно и безопасно, и что ее функциональность соответствует спецификациям.

#### <mark style="color:orange;">Основные виды тестирования</mark>

1. **Функциональное тестирование**
   * **Описание**: Проверяет, соответствует ли программное обеспечение функциональным требованиям. Оно направлено на то, чтобы убедиться, что система выполняет свои функции так, как задумано.
   * **Примеры**:
     * Проверка работы кнопки "Добавить в корзину" в интернет-магазине.
     * Тестирование процесса регистрации и входа в систему.
   * **Типы функционального тестирования**:
     * **Smoke testing**: Краткая проверка основных функций системы после нового релиза.
     * **Sanity testing**: Проверка исправлений и небольших изменений в системе.
     * **Регрессионное тестирование**: Проверка того, что изменения в коде не вызвали новых ошибок в существующем функционале.
     * **Тестирование на основе требований**: Проверка функций, описанных в ТЗ.
2. **Нефункциональное тестирование**
   * **Описание**: Оценивает качество системы и её поведение при различных условиях эксплуатации, включая производительность, безопасность, удобство использования и другие характеристики.
   * **Типы нефункционального тестирования**:
     * **Тестирование производительности**: Проверяет, как система работает при различных уровнях нагрузки, например, стресс-тесты или тесты с большим количеством пользователей.
     * **Тестирование безопасности**: Оценивает защищенность системы от атак, проверяет на уязвимости, утечки данных.
     * **Тестирование удобства использования (Usability Testing)**: Проверяет, насколько система удобна и понятна пользователям.
     * **Тестирование на отказоустойчивость**: Оценивает способность системы восстанавливаться после сбоев или работы в критических условиях.
     * **Масштабируемость**: Проверяет, как система работает при увеличении количества пользователей или объема данных.
3. **Модульное тестирование (Unit Testing)**
   * **Описание**: Тестирование отдельных модулей или компонентов программы на предмет их корректного выполнения. Это обычно самый низкий уровень тестирования.
   * **Пример**: Проверка работы отдельной функции или метода, например, проверки формата электронного адреса в процессе регистрации.
   * **Инструменты**: JUnit для Java, pytest для Python, NUnit для .NET.
4. **Интеграционное тестирование**
   * **Описание**: Проверяет взаимодействие между различными модулями или компонентами системы. Важно убедиться, что они корректно работают вместе.
   * **Пример**: Проверка того, как форма регистрации взаимодействует с базой данных для сохранения нового пользователя.
   * **Типы интеграционного тестирования**:
     * **Big Bang Testing**: Тестирование всех компонентов системы одновременно.
     * **Incremental Testing**: Постепенное тестирование интеграции новых компонентов с уже существующими.
5. **Системное тестирование**
   * **Описание**: Тестирование всей системы как единого целого для проверки её работы в условиях, близких к реальным. Это включает тестирование всех аспектов системы: функциональные, нефункциональные, безопасность, производительность и т.д.
   * **Пример**: Полное тестирование интернет-магазина от момента добавления товаров в корзину до оплаты и получения уведомления о доставке.
   * **Особенности**: Обычно проводится на финальном этапе разработки перед релизом.
6. **Приемочное тестирование (Acceptance Testing)**
   * **Описание**: Это финальное тестирование системы перед ее запуском. Оно проводится для того, чтобы убедиться, что система соответствует требованиям заказчика и готова к эксплуатации.
   * **Типы**:
     * **Alpha Testing**: Внутреннее тестирование на стороне разработчиков или команды тестировщиков.
     * **Beta Testing**: Тестирование на стороне конечных пользователей перед официальным запуском продукта.
     * **UAT (User Acceptance Testing)**: Тестирование, проводимое непосредственно пользователями или заказчиками для проверки, удовлетворяет ли продукт их потребностям.
7. **Регрессионное тестирование**
   * **Описание**: Проверка того, что изменения в системе (например, исправление ошибок или добавление нового функционала) не вызвали проблем в других частях системы. Это критично после каждого обновления кода.
   * **Пример**: После добавления нового функционала проверяется, что все существующие функции работают корректно.
8. **Тестирование черного ящика (Black Box Testing)**
   * **Описание**: Тестирование, при котором тестировщик не знает внутренней структуры или кода системы. Основное внимание уделяется входным данным и ожидаемым результатам.
   * **Пример**: Тестировщик проверяет, что система правильно обрабатывает введенные данные, но не заботится о том, как эти данные обрабатываются внутри.
9. **Тестирование белого ящика (White Box Testing)**
   * **Описание**: Тестирование, при котором тестировщик знает внутреннюю структуру и код системы. Проверяются внутренние алгоритмы, логика, работа циклов и условий.
   * **Пример**: Тестирование, при котором проверяется, что каждая ветвь и цикл в коде работают корректно.

#### <mark style="color:orange;">Автоматизированное и ручное тестирование</mark>

1. **Ручное тестирование**
   * **Описание**: Процесс тестирования системы вручную без использования каких-либо автоматизированных инструментов. Тестировщик вручную выполняет все сценарии тестирования, вводит данные и проверяет результаты.
   * **Преимущества**:
     * Более гибкий и интуитивный процесс, который позволяет обнаруживать неожиданные ошибки.
     * Легче применять к нестандартным случаям, где автоматизация может быть сложной.
   * **Недостатки**:
     * Долгое время выполнения тестов, особенно при необходимости повторного тестирования.
     * Возможность человеческих ошибок.
2. **Автоматизированное тестирование**
   * **Описание**: Использование программных инструментов для автоматического выполнения тестов. Автоматизация тестирования особенно полезна для повторяющихся тестов, таких как регрессионное тестирование, и для тестов производительности.
   * **Инструменты**: Selenium, JUnit, pytest, TestNG, Katalon Studio.
   * **Преимущества**:
     * Быстрое выполнение тестов, особенно при большом объеме тестов.
     * Легкость повторного тестирования после изменений в системе.
   * **Недостатки**:
     * Высокие начальные затраты на создание автоматических тестов.
     * Автоматизированные тесты не всегда способны выявить нестандартные ошибки, которые могут быть заметны при ручном тестировании.

#### <mark style="color:orange;">Инструменты для тестирования</mark>

1. **Selenium**
   * Один из самых популярных инструментов для автоматизированного тестирования веб-приложений. Позволяет записывать и воспроизводить тестовые сценарии на различных браузерах.
2. **JUnit**
   * Инструмент для модульного тестирования приложений на языке Java. Позволяет тестировать отдельные методы и функции приложения.
3. **Postman**
   * Инструмент для тестирования API. Поддерживает как ручное тестирование API, так и автоматизацию тестов.
4. **JIRA**
   * Популярная система управления проектами, которая также широко используется для отслеживания ошибок и задач тестирования.
5. **LoadRunner**
   * Инструмент для тестирования производительности и нагрузки. Используется для оценки производительности приложений под высокой нагрузкой.
6. **Apache JMeter**
   * Инструмент для нагрузочного тестирования веб-приложений. Позволяет симулировать множество пользователей и проверять, как приложение работает под нагрузкой.

#### <mark style="color:orange;">Этапы тестирования</mark>

1. **Анализ требований**
   * Тестировщик изучает функциональные и нефункциональные требования к системе, чтобы составить список всех функций, которые нужно протестировать.
2. **Планирование тестирования**
   * Разрабатывается план тестирования, который включает в себя типы тестов, которые будут проводиться, сроки выполнения и список необходимых ресурсов.
3. **Разработка тест-кейсов**
   * Создаются тестовые сценарии (тест-кейсы), описывающие шаги, которые должен выполнить тестировщик, а также ожидаемые результаты. Тест-кейсы могут быть как ручными, так и автоматическими.
4. **Выполнение тестов**
   * Тестировщики запускают тесты и собирают результаты. Если тест не проходит, обнаруженная ошибка фиксируется в системе отслеживания багов.
5. **Отчетность**
   * После завершения тестирования составляется отчет о проведенных тестах, обнаруженных ошибках и их статусе (исправлены или нет).
6. **Регрессионное тестирование**
   * После внесения исправлений или добавления нового функционала проводится повторное тестирование для проверки корректной работы всей системы.
7. **Закрытие тестирования**
   * После того, как все выявленные баги исправлены, и система проходит все тесты, процесс тестирования завершается.

#### <mark style="color:orange;">Заключение</mark>

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