С какими распространенными типами ошибок в коде приходится сталкиваться и как их исправлять?

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

Ответ

В процессе тестирования и разработки часто встречаются следующие категории ошибок:

1. Ошибки времени выполнения (Runtime Exceptions)

  • NullPointerException (Java) / AttributeError (Python): Обращение к методу или полю объекта, который равен null/None.
    // Причина и исправление
    String name = user.getName(); // user может быть null
    // Исправление: Добавить проверку или использовать Optional
    String name = (user != null) ? user.getName() : "default";
  • ArrayIndexOutOfBoundsException / IndexError: Выход за пределы массива или списка.
    # Причина и исправление
    items = [1, 2, 3]
    value = items[5]  # IndexError
    # Исправление: Проверять длину перед доступом по индексу
    if index < len(items):
        value = items[index]

2. Логические ошибки (Logical Errors) Код выполняется без исключений, но выдает неверный результат из-за ошибки в алгоритме или условиях.

  • Исправление: Тщательный code review, добавление юнит-тестов, логирование промежуточных значений.

3. Проблемы многопоточности (Concurrency Issues)

  • Состояние гонки (Race Condition): Непредсказуемый результат из-за порядка выполнения потоков.
  • Взаимная блокировка (Deadlock): Два или более потока бесконечно ждут друг друга.
    • Исправление: Использование потокобезопасных коллекций, правильная синхронизация (synchronized, Lock), избегание циклических зависимостей блокировок.

4. Проблемы с памятью (Memory Issues)

  • Утечка памяти (Memory Leak): Объекты не освобождаются GC из-за оставшихся ссылок (например, в статических коллекциях).
    • Исправление: Профилирование памяти (Java VisualVM, YourKit), удаление ненужных ссылок, использование weak references.

5. Уязвимости безопасности (Security Vulnerabilities)

  • SQL-инъекция: Вставка пользовательского ввода напрямую в SQL-запрос.
    // Уязвимый код
    String query = "SELECT * FROM users WHERE name = '" + userName + "'";
    // Исправление: Использовать PreparedStatement
    PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE name = ?");
    stmt.setString(1, userName);

6. Проблемы интеграции и окружения

  • Ошибки кодировки, проблемы с путями, различия в ОС, недоступность внешних сервисов.
    • Исправление: Использование абсолютных путей или ресурсов класса, явное указание кодировок (UTF-8), конфигурация через environment variables, заглушки для внешних зависимостей.