Интересная статья про использование сравнительного тестирования для приложений с состоянием - "Vive la Différence: Practical Diff Testing of Stateful Applications".
При обновлении stateful-приложений работающих с БД часто возникают трудноуловимые ошибки и традиционные методы (канареечные релизы, роллинг-обновления, cине-зелёное развёртывание) плохо эти ошибки выявляют из-за разделяемого состояния. Стандартные тесты (юнит- и интеграционные) не проверяют взаимодействие разных версий во время обновления.
В статье предлагается использование фреймворка для сравнительного тестирования двух версий приложения (v1 - текущая, v2 - новая) на идентичность поведения. Фреймворк работает поверх существующего Postgres без модификации кода СУБД, его работа разделяется на три этапа:
- Ветвление - создание лёгких, изолированных веток исходной базы данных без её физического копирования. Ветвление реализовано для PostgreSQL с помощью вспомогательных таблиц вставки, удаления и представлений с триггерами. Создание ветки занимает <100 мс независимо от размера БД.
- Воспроизведение - выполнение последовательностей клиентских запросов (а не отдельных запросов) с чередованием между версиями v1 и v2. Это позволяет обнаружить ошибки совместимости (обратной и прямой).
- Сравнение - вычисление различий в ответах сервера и в состояниях базы данных. Введены трёхстороннее сравнение (исходное состояние, состояния после v1 и v2), которые нагляднее двухстороннего. Алгоритм работает за время, пропорциональное размеру изменений (а не всей БД).
Типы выявляемых ошибок:
- Повреждение данных (data corruption) - например, усечение сериализованных protobuf.
- Несовместимость данных (data incompatibility) - разная интерпретация одних и тех же данных разными версиями.
- Ложные предположения о данных (false data assumptions) - например, жёстко заданный лимит на размер таблицы, который превышен в продакшене.
Результаты экспериментов:
- Фреймворк успешно находит все три категории ошибок в приложении Bank of Anthos.
- Ветвление в 10-100 раз быстрее физического копирования базы данных
- Сравнение до 1000 раз быстрее наивных SQL-запросов на Postgres, время не растёт с размером БД.
- Чтение/запись: небольшое накладное время (до 3 раз по сравнению с обычным Postgres).
- Для обнаружения ошибок потребовалось 2-4 перемежения запросов и 55-110 секунд времени.
Post #474
1.23K
- 👍 5
- 🔥 4
- 🤝 1