Добавить в корзинуПозвонить
Найти в Дзене
Протестировал

Интересная статья про использование сравнительного тестирования для приложений с состоянием - "Vive la Différence: Practical Diff Testing of

Stateful Applications". При обновлении stateful-приложений работающих с БД часто возникают трудноуловимые ошибки и традиционные методы (канареечные релизы, роллинг-обновления, cине-зелёное развёртывание) плохо эти ошибки выявляют из-за разделяемого состояния. Стандартные тесты (юнит- и интеграционные) не проверяют взаимодействие разных версий во время обновления. В статье предлагается использование фреймворка для сравнительного тестирования двух версий приложения (v1​ - текущая, v2​ - новая) на идентичность поведения. Фреймворк работает поверх существующего Postgres без модификации кода СУБД, его работа разделяется на три этапа: - Ветвление - создание лёгких, изолированных веток исходной базы данных без её физического копирования. Ветвление реализовано для PostgreSQL с помощью вспомогательных таблиц вставки, удаления и представлений с триггерами. Создание ветки занимает <100 мс независимо от размера БД. - Воспроизведение - выполнение последовательностей клиентских запросов (а не отд

Интересная статья про использование сравнительного тестирования для приложений с состоянием - "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 секунд времени.