Приведи примеры ошибок (Error) с точки зрения тестирования

«Приведи примеры ошибок (Error) с точки зрения тестирования» — вопрос из категории Основы тестирования, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В тестировании мы классифицируем ошибки в зависимости от этапа их возникновения и природы.

1. Ошибка компиляции (Compile-time Error) Дефект в коде, который обнаруживает компилятор. Тестировщик с ним напрямую не работает, но он блокирует запуск.

String text = 123; // Ошибка: несовместимые типы. Нельзя int присвоить String.

2. Ошибка времени выполнения (Runtime Error / Exception) Дефект, проявляющийся при работе программы. Это основной объект поиска в тестировании.

// Пример для теста: деление на ноль
@Test
void testDivision() {
    Calculator calc = new Calculator();
    // Это вызовет ArithmeticException: / by zero
    assertThrows(ArithmeticException.class, () -> calc.divide(10, 0));
}

3. Логическая ошибка (Logical Error / Defect) Программа работает, но выдает некорректный результат. Самый коварный тип ошибок.

// Метод должен считать скидку 10%
public double calculateDiscount(double price) {
    // Ошибка: должно быть price * 0.1, а не 0.01
    return price * 0.01; // 1% вместо 10%
}

// Соответствующий тест, который этот дефект обнаружит:
@Test
void testDiscountCalculation() {
    double price = 1000.0;
    double expectedDiscount = 100.0; // 10%
    double actualDiscount = calculator.calculateDiscount(price);
    assertEquals(expectedDiscount, actualDiscount, 0.01); // Тест упадет
}

4. Ошибка в тесте (Test Failure / Assertion Error) Не дефект в продукте, а указание на то, что фактический результат не соответствует ожидаемому, прописанному в тесте.

@Test
void testUserLogin() {
    boolean loginResult = system.login("user", "password123");
    // AssertionError, если loginResult == false
    assertTrue("Логин должен быть успешным", loginResult);
}