Какая разница между ошибкой (error) и дефектом (defect/bug) в контексте тестирования ПО?

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

Ответ

Ошибка (Mistake/Error) — это действие человека (разработчика, аналитика), которое приводит к некорректному состоянию системы. Дефект (Defect/Bug) — это конкретное проявление этой ошибки в артефакте или работе программы, когда её поведение отклоняется от требований или ожиданий.

Простая аналогия: Опечатка в рецепте — это ошибка. Испорченное блюдо, приготовленное по этому рецепту, — это дефект.

Жизненный цикл проблемы в разработке ПО:

  1. Человек допускает Ошибку (например, неверно понял требование, опечатался в коде).
  2. Ошибка приводит к появлению Дефекта в коде, документации или другом артефакте.
  3. При выполнении программы дефект может привести к Сбою (Failure) — наблюдаемому отклонению в работе.

Пример из кода:

# Требование: функция должна возвращать сумму двух чисел.
def add(a, b):
    return a - b  # <-- ОШИБКА программиста (использован '-' вместо '+')

# В коде теперь содержится ДЕФЕКТ (логическая ошибка).
# СБОЙ произойдёт при вызове функции и проверке результата:
result = add(5, 3)
print(result)  # Выведет 2, а не 8. Это наблюдаемый сбой.

Ключевые различия:

Критерий Ошибка (Error) Дефект (Defect/Bug)
Природа Действие или бездействие человека. Следствие ошибки, зафиксированное в артефакте (коде, дизайне, документе).
Когда возникает На этапах разработки, проектирования, написания требований. Существует в системе с момента внесения ошибки до её исправления.
Обнаружение Может быть найдена при проверке кода (code review), статическом анализе. Обнаруживается в процессе тестирования (динамический анализ) или использования системы.
Связь со сбоем Ошибка может не привести к дефекту (если код не используется). Дефект может не привести к сбою (если условие его проявления не выполняется). Дефект — это потенциальная причина сбоя. Сбой — это актуализация дефекта во время выполнения.

Практический вывод для тестировщика: Ваша задача — находить дефекты (баги) и описывать их так, чтобы разработчик мог понять и исправить лежащую в их основе ошибку.