Integration тесты

Интеграционные тесты в контексте CesiumJS направлены на проверку взаимодействия компонентов системы: сцены, источников данных, визуализации тайлов, управления камерой и пользовательских сценариев. В отличие от модульных тестов, где изолируются отдельные функции или классы, интеграционное тестирование фиксирует поведение системы в условиях, близких к реальному окружению браузера с WebGL.


Особенности тестирования WebGL-приложений

CesiumJS опирается на WebGL и сложную графическую подсистему. Это формирует несколько ключевых особенностей:

  • невозможность стабильного сравнения пиксельного рендера без детерминированной среды
  • зависимость от GPU и драйверов
  • асинхронная загрузка тайлов и ресурсов
  • влияние временных факторов (анимации, clock, requestAnimationFrame)

В интеграционных тестах основное внимание смещается с визуальной идентичности на поведенческую корректность: корректность вызовов API, состояние сцены, загрузка сущностей, управление камерой и синхронизация данных.


Стратегия интеграционного тестирования

Интеграционные тесты в Cesium-проектах обычно строятся на нескольких уровнях:

1. Инициализация Viewer и сцены Проверяется корректность создания экземпляра Viewer, подключение базовых слоёв, настройка координатной системы и начального состояния камеры.

2. Работа с сущностями (Entities API) Тестируется добавление, обновление и удаление объектов через Entity API, включая корректность привязки координат и свойств.

3. Загрузка источников данных GeoJSON, KML, CZML и 3D Tiles проверяются на корректную интеграцию в сцену и появление соответствующих примитивов.

4. Камера и навигация Проверяется корректность переходов камеры, flyTo, setView и реакция сцены на изменение состояния.

5. Асинхронные процессы Загрузка тайлов и текстур проверяется через ожидание состояния tilesLoaded или аналогичных индикаторов.


Подготовка тестового окружения

Интеграционные тесты CesiumJS часто требуют браузерного окружения с поддержкой WebGL или его эмуляции.

Используются следующие подходы:

  • headless Chrome через Playwright или Puppeteer
  • jsdom (ограниченно, без WebGL)
  • headless-gl для эмуляции WebGL
  • тестовые раннеры Jest, Vitest или Mocha

Наиболее реалистичный сценарий обеспечивается браузерным запуском, поскольку Cesium активно использует GPU-ускорение.


Конфигурация Jest для CesiumJS

При использовании Jest требуется настройка среды выполнения:

  • установка testEnvironment: "jsdom" или кастомного окружения
  • мокирование window.requestAnimationFrame
  • замена WebGL контекста через shim
  • отключение реальных тайловых запросов

Типичная проблема — отсутствие WebGL контекста. Решается через:

  • jest-canvas-mock
  • headless-gl
  • кастомные фабрики контекста

Изоляция внешних зависимостей

CesiumJS активно использует сетевые запросы к тайлам и ресурсам. В интеграционных тестах такие зависимости изолируются:

  • подмена Resource.fetch
  • мокирование ImageryProvider
  • фиктивные 3D Tiles серверы
  • локальные HTTP-серверы с тестовыми данными

Это позволяет устранить нестабильность тестов, вызванную сетью.


Тестирование Viewer

Создание и базовая инициализация Viewer является частым интеграционным сценарием.

Проверяются следующие аспекты:

  • корректность создания DOM-элементов canvas
  • наличие сцены (Scene)
  • инициализация камеры
  • подключение стандартных контроллеров

Особое внимание уделяется состоянию сцены:

  • наличие scene.globe
  • корректная инициализация imageryLayers
  • отсутствие критических ошибок WebGL

Тестирование Entity API

Entity API является высокоуровневым слоем абстракции CesiumJS. Интеграционные тесты проверяют:

  • добавление сущности в viewer.entities
  • корректность привязки координат (Cartesian3, Cartographic)
  • обновление свойств во времени (availability, sampled properties)
  • удаление сущностей и очистка сцены

Особое значение имеет реактивность системы: изменение свойств должно приводить к обновлению сцены без ручного перерисовывания.


Тестирование 3D Tiles

3D Tiles представляют наиболее сложный аспект интеграционного тестирования.

Проверяются:

  • загрузка tileset из локального источника
  • корректность инициализации Cesium3DTileset
  • прогресс загрузки (tilesLoaded, allTilesLoaded)
  • traversal и refinement логика

Для стабильности используются упрощённые tileset-файлы, содержащие минимальную иерархию.


Асинхронность и тайминг

CesiumJS активно использует асинхронные обновления через render loop.

В тестах применяются стратегии:

  • ожидание через polling состояния сцены
  • использование fake timers
  • синхронизация с requestAnimationFrame
  • ожидание завершения загрузки тайлов

Критическим аспектом является контроль времени: тесты не должны зависеть от реальной скорости рендеринга.


Тестирование камеры

Камера является центральным элементом интеграционного поведения сцены.

Проверяются:

  • корректность позиции камеры после setView
  • выполнение flyTo
  • ориентация (heading, pitch, roll)
  • переходы между координатами

Важным аспектом является допущение погрешностей: сравнение координат выполняется с epsilon-допуском из-за особенностей floating-point и WebGL.


Мокирование WebGL

При отсутствии GPU-окружения используется имитация WebGL:

  • headless-gl как основной backend
  • Canvas WebGL context mock
  • отключение shader compilation

Это позволяет выполнять тесты в CI/CD средах без графического ускорения.


Интеграция с CI/CD

Интеграционные тесты CesiumJS встраиваются в pipeline:

  • запуск в headless Chrome
  • параллельное выполнение тестов
  • фиксация логов WebGL ошибок
  • сбор артефактов (скриншоты, состояния сцены)

Особое внимание уделяется стабильности: тесты не должны флапать из-за графических различий между окружениями.


Скриншотное тестирование

Хотя CesiumJS сложен для пиксельного сравнения, применяется подход:

  • фиксированная камера
  • отключённая анимация
  • статические тайлы
  • сравнение render target с эталоном

Используются пороги допуска, а не строгие совпадения пикселей.


Организация тестовых данных

Тестовые сцены формируются из:

  • локальных GeoJSON
  • минимальных CZML сценариев
  • упрощённых 3D Tiles наборов
  • статических изображений для imagery layers

Это обеспечивает воспроизводимость и исключает зависимость от внешних сервисов.


Типичные проблемы интеграционных тестов

В проектах с CesiumJS часто встречаются следующие проблемы:

  • нестабильность WebGL контекста в CI
  • асинхронные утечки тайловых загрузок
  • некорректное завершение render loop
  • зависание при ожидании tilesLoaded
  • различия поведения между GPU и headless окружением

Решение заключается в строгом контроле жизненного цикла Viewer и явной очистке сцены после теста.


Очистка и завершение тестов

Корректное завершение теста включает:

  • viewer.destroy()
  • удаление canvas из DOM
  • сброс глобальных ресурсов Cesium
  • остановку всех анимаций и clock

Игнорирование этих операций приводит к утечкам памяти и нестабильности последующих тестов.