Как ответить
Тестирование — это проверка соответствия между реальным поведением программы и ожидаемым результатом. На позиции разработчика важно понимать, что это не просто поиск багов, а способ убедиться, что код выполняет бизнес-задачу и не ломает существующие функции при изменениях.
Процесс тестирования обычно делят на пять этапов, которые встроены в цикл разработки (SDLC):
- Анализ требований. На этом этапе разработчик или QA выясняет, как именно должна работать функция. Если в ТЗ написано «система должна быстро загружать отчет», это плохое требование. Хорошее требование: «отчет объемом до 1000 строк генерируется в формате PDF менее чем за 3 секунды».
- Планирование и проектирование тестов. Здесь определяются сценарии (Test Cases). Для разработчика это чаще всего написание спецификаций для Unit-тестов. Мы решаем, какие граничные значения проверить (например, 0, отрицательное число и максимально допустимое значение для поля ввода).
- Подготовка окружения. Настройка тестовой базы данных, моков (заглушек) для внешних API и конфигурация CI/CD пайплайна. Важно, чтобы среда тестирования была максимально изолирована от локальной разработки и идентична продакшену.
- Выполнение тестов. Запуск автотестов или ручная проверка. На этом этапе мы получаем отчеты о прохождении. В современной разработке это происходит автоматически при каждом Push в репозиторий.
- Завершение и отчетность. Фиксация найденных дефектов в баг-трекере (например, Jira) и проверка исправлений (Regression testing). Процесс заканчивается, когда критерии приемки (Acceptance Criteria) выполнены.
Для Junior-разработчика критически важно различать уровни тестирования: Unit (проверка отдельной функции в изоляции), Integration (проверка взаимодействия двух модулей) и E2E (проверка всего пути пользователя в браузере или приложении).
Пример простого Unit-теста на Jest для функции расчета скидки:
function calculateDiscount(price, percent) {
if (percent < 0 || percent > 100) return price;
return price - (price * percent / 100);
}
test('правильно считает скидку 20%', () => {
expect(calculateDiscount(1000, 20)).toBe(800);
});
test('возвращает исходную цену при некорректном проценте', () => {
expect(calculateDiscount(1000, -5)).toBe(1000);
});Такой подход позволяет находить ошибки на ранних этапах, когда их исправление стоит дешевле всего.