Опишите серьезную техническую ошибку, с которой вы столкнулись, и как ее исправили.

«Опишите серьезную техническую ошибку, с которой вы столкнулись, и как ее исправили.» — вопрос из категории Практические задания, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Ошибка: Некорректная обработка невалидного JSON на сервере, приводящая к ложным успешным ответам (HTTP 200).

Проблема: Серверное API, обрабатывающее POST-запросы, при получении синтаксически неверного JSON (например, с незакрытой кавычкой или запятой) возвращало статус 200 OK с частично сохраненными или дефолтными данными, вместо 400 Bad Request.

  • Пример запроса с ошибкой:

    POST /api/v1/users HTTP/1.1
    Content-Type: application/json
    
    {"name": "John, "age": 30} // Незакрытая кавычка после John
  • Ожидаемый ответ: 400 Bad Request с описанием ошибки парсинга.
  • Фактический ответ: 200 OK с телом {"id": 123, "status": "created"}. Данные в БД сохранялись с name=null или обрывались, что вызывало проблемы в дальнейшей логике.

Причина: Промежуточное ПО (middleware) для парсинга JSON в стеке сервера (например, express.json() в Node.js) не было корректно настроено или его ошибки не обрабатывались глобальным обработчиком исключений.

Решение:

  1. Добавление явной валидации: Внедрение библиотеки валидации схем (например, Joi, Zod, class-validator) для проверки входящих DTO.
  2. Настройка глобального обработчика ошибок: Гарантия, что любые ошибки парсинга JSON преобразуются в соответствующие HTTP-ответы.
    // Пример для Express.js
    app.use(express.json()); // Должен возвращать 400 при невалидном JSON
    app.use((err, req, res, next) => {
        if (err instanceof SyntaxError && err.status === 400 && 'body' in err) {
            return res.status(400).json({ error: 'Invalid JSON format' });
        }
        next(err);
    });
  3. Написание тестов: Создание интеграционных тестов, специально проверяющих обработку невалидных входных данных.
    it('should return 400 for malformed JSON', async () => {
        const response = await request(app)
            .post('/api/v1/users')
            .set('Content-Type', 'application/json')
            .send('{"name": "test"'); // Невалидный JSON
        expect(response.status).toBe(400);
    });

Итог: Исправление устранило риск повреждения данных и улучшило отладку для клиентских разработчиков.