Когда данные переезжают: практические советы по тестированию миграции данных |
19.08.2025 00:00 |
Современные программные платформы опираются на сложные базы данных, содержащие информацию из множества технических и бизнес-сфер. Когда добавляются новые функции или перерабатывается устаревший код, текущие данные часто изменяются — в базе данных появляются новые таблицы и поля, а старые удаляются. Что такое тестирование миграции данных? Тестирование миграции данных — это часть комплексного процесса, который обеспечивает плавный переход от устаревшей системы к новой с минимальными сбоями и без потери или повреждения данных. Цель — убедиться, что как текущие, так и новые данные корректно обрабатываются как функциональными, так и нефункциональными компонентами вашего приложения. В процессе миграции происходит перенос всех существующих данных (как системных, так и пользовательских) в новую базу данных. Конечная задача — чтобы приложение эффективно работало с данными в новой структуре и с текущими данными. Для этого необходимо убедиться, что:
Зачем нужно тестирование миграции данных? Данные мигрируют в новые системы по разным причинам – например, консолидация систем, устаревание технологий, добавление новых функций или оптимизация. Ключевые моменты при тестировании миграции:
Вкратце о стратегии тестирования миграции данныхЭтапы тестирования миграции данныхКаждый из этих этапов должен быть выполнен в тестовой среде до того, как ваша команда приступит к миграции на проде.
Тестирование функциональности и производительности:
Проблемы миграции данных
Тестирование миграции данных на практикеРассмотрим нашу стратегию на двух реальных примерах, чтобы лучше понять особенности тестирования миграции данных. Сценарий первый: многонациональный зеркальный веб-сервисПредставьте себе сложный веб-сервис, интегрированный с несколькими микросервисами и сторонними приложениями. Можно представить, что это служба поддержки клиентов крупной компании. Система работает по всему миру: в Европе, Африке, Азии, а также в Северной, Центральной и Южной Америке. Каждая из этих версий – это зеркало всей системы для конкретного региона. Вот в чём подвох: компания хочет сократить расходы. Запуск отдельных систем для разных регионов стоит дорого. Нужно больше серверов, возникают сложности с обновлениями и управлением, да и сторонние приложения недешевы. Поэтому план — объединить всё в одном экземпляре: одна система, управляющая данными всех регионов. Система должна без проблем обслуживать все регионы. Очевидно, что это большая задача. Нельзя просто свалить все данные вместе. Данные каждого региона должны оставаться в своих пределах. Крайне важно, чтобы система понимала, откуда пришли данные, и сохраняла их упорядоченными согласно правилам и требованиям каждого региона. Хоть всё и работает на одной системе, данные каждого региона продолжают соответствовать своим собственным правилам. Как бы я тестировал этот сценарийИспользуйте смесь реальных и сгенерированных тестовых данных. Как определить, какой тип использовать? В моём случае я предпочитал использовать реальные данные, когда это было возможно, но создавал синтетические данные для конкретных тестовых случаев, которые иначе не покрывались бы.
Используйте несколько промежуточных стейджинг-сред, чтобы эмулировать разные регионы. Создайте копию ваших продакшен-данных. В моём случае я смог получить все необходимые данные из продакшен-среды через API. Система была интегрирована с внешним решением (Zendesk), поэтому я использовал REST API Zendesk для получения всех нужных данных без необходимости писать множество сложных SQL-запросов и делать громоздкие дампы базы данных. Обфусцируйте или удалите все персональные данные. Это обычно непростая задача. Возможно, потребуется проконсультироваться с владельцем продукта или заинтересованными лицами, чтобы определить, какие данные идентифицируют пользователей. Эти данные должны быть удалены или обфусцированы, чтобы избежать возможных юридических проблем.
Создавайте синтетические тестовые данные там, где это необходимо. В некоторых случаях это может быть не нужно, особенно если сущности в вашей базе данных просты и их немного. Но синтетические данные могут понадобиться для покрытия конкретных тестовых сценариев. Например, база данных службы поддержки клиентов, включающая названия продуктов компании, может содержать много данных, связанных с продуктами Adobe, такими как «Photoshop» и «Illustrator». Нет смысла тратить время на получение этих данных из продакшен-базы, но эти названия всё равно нужны, поскольку к ним будут привязаны многие другие сущности. Проверьте, что все наборы данных корректно представлены. Реализуйте проверку данных, которая сравнивает исходные и целевые наборы данных на предмет согласованности. В зависимости от ваших данных это может потребовать ручной проверки или использования скриптов, которые проверят выбранные характеристики данных. Добавьте данные в каждую тестовую (стейджинг) среду. Если у вас есть API, как было у меня (Zendesk), задача значительно упрощается.
Выполните статическое и функциональное тестирование каждой тестовой среды. Проверьте, что данные выглядят корректно, всё работает, и на каждой среде нет сбоев. Тестируйте саму миграцию. Это тест крупной продакшен-миграции. Шоу начинается!
Сценарий второй: Облачный инструмент для управления расширениями браузераВ этом сценарии у нас есть приложение, которое управляет несколькими браузерами и их настройками на ноутбуке или стационарном компьютере, подобно антидетект-браузеру. Здесь я сосредоточусь на расширениях браузера. Каждый браузер имеет уникальный набор расширений. Некоторые из этих расширений могут хранить данные пользователей, а некоторые расширения могут работать в нескольких браузерах. Наше приложение позволяет управлять расширениями в разных браузерах независимо от того, где оно установлено. Эти расширения хранятся в облаке вместе с информацией о конфигурации, например, какие расширения установлены в каждом профиле браузера. Владелец продукта хочет улучшить этот инструмент управления расширениями, добавив новые функции и больше возможностей для установки расширений из разных источников, таких как Chrome Web Store, файлы .crx или .zip, а также распакованные расширения. Конечный пользователь должен иметь возможность устанавливать расширения без необходимости открывать браузеры для каждой установки. Пользователь также сможет удалять расширения или использовать разные (старые) версии расширений. Эти улучшения потребуют значительных изменений в структуре базы данных. В результате потребуется миграция существующих данных о расширениях и версиях, установленных в каждом экземпляре браузера. Как мы поймём, что миграция прошла успешно? Очевидно, что мы не хотим потерять никакие пользовательские данные. Все расширения и их конфигурационная информация, включая расширения, отсутствующие в Chrome Web Store, должны быть доступны и работать после миграции. Новые функции, например, возможность удаления расширений, должны работать с уже существующими расширениями. Как бы я тестировал этот сценарийОсновной подход похож на первый пример, но из-за специфических требований мне пришлось изменить некоторые шаги в методике. Создайте тестовую среду, идентичную планируемой производственной среде. Получите копию базы данных из продакшена и проанализируйте данные. Этот подход отличается от использования обфусцированных данных в первом примере, где у меня был доступ к части данных через функциональность приложения (API), и данные сопоставлялись с данными и сущностями в тестовой среде. При использовании полного дампа продакшена, его обфускации и тестировании миграции речь идет не о том, чтобы данные были функциональны внутри приложения. Речь идет о проверке правильности работы команд и логики миграции. Это техника, которую могут использовать разработчики при написании скриптов миграции. Сгенерируйте тестовые данные, охватывающие большинство известных случаев.
Протестируйте обратную совместимость. Обновите серверный код и проверьте, что устаревшее клиентское приложение работает корректно. Убедитесь, что все пользовательские данные доступны и приложение с ними взаимодействует, как ожидается. На этом этапе у вас будет три набора схожих данных:
Протестируйте новое клиентское приложение и периодически проверяйте обратную совместимость, чтобы убедиться, что данные, созданные новым приложением, корректно обрабатываются старым приложением. Также протестируйте новые функции, проведите смоук-тестирование и регрессионное тестирование существующих функций, которые могли быть затронуты. ЗаключениеДва приведённых примера показывают, что фазы тестирования миграции данных в целом схожи, независимо от сценария, однако каждая миграция будет иметь свои уникальные особенности. Ключ к успешной миграции данных — качество тестовых данных. По возможности используйте реальные данные (обфусцированные). Используйте реальные данные и статистику как эталон, чтобы охватить все тестовые случаи и создать надёжные наборы тестовых данных. Тестируйте обратную совместимость — это не всегда обязательно, но часто добавляет множество дополнительных тестов и генерацию дополнительных тестовых данных. Миграция данных не должна приводить к потере или повреждению пользовательских данных, а также изменять их таким образом, чтобы они стали непригодны для использования как прежде. Тестируйте, чтобы исключить этот риск. Для этого потребуется некоторый навык работы с базами данных и скриптами.
Убедитесь, что вся команда понимает и принимает ваш план по тестированию миграции данных. |