Что такое краш (аварийное завершение) приложения?

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

Ответ

Краш приложения — это неожиданное и немедленное прекращение его работы из-за необработанной критической ошибки в коде или системе. Операционная система принудительно завершает процесс приложения.

Основные причины:

  1. Исключения времени выполнения (Runtime Exceptions):
    • NullPointerException (Java/Kotlin) / TypeError (JS) / доступ к None (Python).
    • ArrayIndexOutOfBoundsException / IndexError.
    • ArithmeticException (деление на ноль).
  2. Ошибки ресурсов:
    • OutOfMemoryError (исчерпание доступной памяти).
    • StackOverflowError (бесконечная рекурсия).
  3. Системные/платформенные ошибки:
    • Нарушение прав доступа.
    • Конфликт нативных библиотек.
    • Проблемы с оборудованием.

Примеры кода, ведущего к крашу:

// Java: NullPointerException
String text = null;
int length = text.length(); // Краш!
# Python: IndexError
my_list = [1, 2, 3]
value = my_list[5] # Краш! Индекс за пределами списка
// JavaScript: TypeError
const obj = null;
console.log(obj.property); // Краш! Чтение свойства null

Как тестировать на устойчивость к крашам:

  • Юнит-тесты: Проверка обработки крайних случаев и невалидных входных данных.
  • Инструменты мониторинга: Использование Crashlytics (Firebase), Sentry, AppCenter для сбора отчетов о крашах в продакшене.
  • Тестирование на разных устройствах и ОС: Учет фрагментации платформ.
  • Нагрузочное тестирование: Проверка на утечки памяти и исчерпание ресурсов.
  • Fuzz-тестирование: Подача случайных или некорректных данных на вход.

Профилактика: Обработка исключений (try-catch), валидация входных данных, использование статического анализа кода.