Идемпотентность — это свойство операции или функции, означающее, что многократное применение этой операции приводит к тому же результату, что и однократное. Состояние системы после повторного выполнения идемпотентной операции не меняется по сравнению с состоянием после первого выполнения.
В контексте программирования:
Примеры идемпотентных операций:
- Чтение данных из базы (GET-запрос), если оно не меняет состояние данных.
- Обновление записи в базе данных с заданным значением (PUT-запрос к конкретному ресурсу с полным состоянием).
- Удаление ресурса (DELETE-запрос). Повторное удаление уже удаленного ресурса приводит к тому же состоянию (ресурс отсутствует).
- Инициализация переменной определенным значением.
Примеры неидемпотентных операций:
- Добавление новой записи в базу данных (POST-запрос). Повторное выполнение добавит новую запись.
- Увеличение счетчика на единицу.
- Отправка email.
В контексте тестирования:
Тестирование идемпотентности важно для систем, где возможны повторные вызовы операций, например, при работе с API, распределенными системами или системами сообщений.
- Цель тестирования: Убедиться, что повторное выполнение идемпотентной операции не вызывает нежелательных побочных эффектов или изменения состояния системы, кроме того, которое ожидается после первого выполнения.
- Методы тестирования:
- Выполнение операции N раз (N > 1) и проверка состояния системы и результата после каждого выполнения.
- Сравнение состояния системы до и после повторных выполнений операции (после первого успешного).
- Проверка логов и метрик на отсутствие аномалий при повторных вызовах.
- Примеры тест-кейсов:
- Выполнить GET-запрос к ресурсу 5 раз. Убедиться, что данные в ответе идентичны, а состояние ресурса на сервере не изменилось.
- Выполнить PUT-запрос на обновление записи. Повторить запрос. Убедиться, что запись в базе данных остается в том же состоянии после второго запроса, что и после первого.
- Выполнить DELETE-запрос на удаление ресурса. Повторить запрос. Убедиться, что ресурс отсутствует после первого запроса, и второй запрос возвращает ожидаемый статус (например, 404 Not Found).
Идемпотентность упрощает обработку ошибок и повторных попыток, делая системы более надежными и предсказуемыми, что является ключевым аспектом качества.