Код без тестов — это бомба с неизвестным таймером
Каждая строка кода может содержать ошибку. Тестирование — систематический поиск этих ошибок до того, как их найдут пользователи. Тестирование программного обеспечения — процесс проверки соответствия ПО требованиям и выявления дефектов.
Пирамида тестирования
Снизу вверх по стоимости и скорости: Unit-тесты (модульные) — тестируют отдельную функцию или класс в изоляции. Быстрые, дешёвые, их должно быть больше всего. Интеграционные тесты — проверяют взаимодействие модулей (API + БД, сервис + сервис). E2E-тесты (end-to-end) — имитируют действия пользователя в браузере (Cypress, Playwright). Медленные и дорогие, их меньше. Ручное тестирование — находит нестандартные баги, но не масштабируется.
Типы тестирования
Функциональное: «работает ли фича как задумано?» Нагрузочное (performance): как ведёт себя система под нагрузкой? (k6, Apache JMeter, Locust). Безопасности: SQL-инъекции, XSS, OWASP Top 10. Регрессионное: не сломали ли новые изменения старое? Приёмочное (UAT): пользователи проверяют, соответствует ли продукт их ожиданиям. Smoke-тест: базовая проверка перед полным тестированием.
TDD и BDD
TDD (Test-Driven Development): пиши тест → видишь красный → пиши код → видишь зелёный → рефакторинг. Цикл «красный-зелёный-рефакторинг». Тесты становятся спецификацией. BDD (Behavior-Driven Development): тесты пишутся в формате «Given-When-Then» на понятном языке (Gherkin, Cucumber). Помогает выстроить общий язык между разработчиками и бизнесом.
Инструменты
Unit: Jest (JavaScript), pytest (Python), JUnit (Java), RSpec (Ruby). E2E: Playwright, Cypress, Selenium. API: Postman, Newman, REST Assured. Покрытие кода: Istanbul, nyc. Багтрекинг: Jira, Linear, YouTrack, GitHub Issues. Метрика покрытия кода (code coverage) — процент строк, выполненных тестами. 80% — хороший ориентир, но 100% не гарантирует отсутствие багов.
Роль QA-инженера
QA (Quality Assurance) — шире, чем тестирование: это культура качества во всей команде. Современный QA: тест-анализ требований, разработка тест-планов и тест-кейсов, автоматизация, участие в ревью кода, мониторинг в продакшне. Ручное тестирование остаётся важным для юзабилити, доступности (accessibility) и исследовательского тестирования.
