Visual regression тестирование в CesiumJS основано на сравнении эталонных изображений (golden images) с текущими рендерами сцены. В отличие от unit-тестов, проверяющих поведение функций, визуальные тесты фиксируют итоговый результат WebGL-рендеринга: положение камеры, отрисовку тайлов, освещение, стилизацию объектов и взаимодействие слоёв. Основная цель — выявление непреднамеренных изменений визуального вывода при обновлении кода, зависимостей или конфигурации сцены.
В 3D-графике регрессия проявляется не как логическая ошибка, а как изменение пикселей. Даже незначительное смещение камеры или различие в порядке отрисовки приводит к заметным артефактам. В контексте CesiumJS ключевыми источниками визуальной нестабильности становятся:
Из-за этого визуальные тесты требуют строгой фиксации состояния сцены перед созданием скриншота.
Типичный pipeline визуального регрессионного тестирования включает:
Основой служит headless-браузер (Puppeteer или Playwright), выполняющий рендеринг в контролируемой среде. Важно, чтобы окружение было максимально стабильным: одинаковые версии браузера, фиксированное разрешение, одинаковые GPU-параметры (или их эмуляция).
В CesiumJS сцена динамична по умолчанию: движется время, обновляются тайлы, пересчитывается освещение. Для тестов это необходимо отключить или стабилизировать.
Одним из ключевых источников нестабильности является система времени JulianDate. Для устранения флуктуаций:
Это позволяет гарантировать, что солнце, тени и атмосферные эффекты остаются неизменными.
Камера фиксируется вручную:
Любое отклонение на доли градуса может изменить набор видимых тайлов, поэтому камера должна задаваться численно и воспроизводимо.
CesiumJS по умолчанию работает в режиме непрерывного рендера. Для тестирования используется режим событийного обновления:
requestRenderMode = true снижает количество
перерисовок;maximumRenderTimeChange ограничивает скачки
времени;scene.render() обеспечивает контроль над
моментом захвата кадра.Это устраняет эффект «дрожания» изображения между кадрами.
3D Tiles и imagery layers являются асинхронными. В тестовой среде требуется:
tilesLoaded /
readyPromise);Особую проблему создают глобальные датасеты, где содержимое зависит от геометрии камеры. Даже небольшое смещение приводит к подгрузке других тайлов.
WebGL не гарантирует бит-в-бит одинаковый результат между системами. Поэтому применяются стратегии стабилизации:
devicePixelRatio;Некоторые тестовые окружения используют software rendering (SwiftShader), что повышает воспроизводимость ценой производительности.
Снимок выполняется через canvas API или средствами браузера:
page.screenshot() (Playwright/Puppeteer);toDataURL;На практике чаще используется браузерный screenshot, так как он включает финальную компоновку страницы.
Критически важно исключить:
После получения двух изображений применяется pixel diff алгоритм. Наиболее распространённые подходы:
Типичный стек включает pixelmatch или аналогичные библиотеки.
Результатом сравнения становится:
Визуальные тесты CesiumJS склонны к нестабильности. Основные методы стабилизации:
Особое внимание уделяется камере: даже микроскопические изменения матриц приводят к лавинообразным отличиям пикселей.
Golden images формируются вручную или автоматически при первичном запуске тестов. Практика включает:
При изменении визуального поведения обновление baseline происходит осознанно, с проверкой diff.
Наиболее распространённые категории визуальных тестов:
Проверяется корректность:
Ошибки здесь часто проявляются как «разрывы» поверхности.
Тестируется:
Проверка отрисовки:
Фиксируются:
Эти элементы особенно чувствительны к floating point изменениям.
В CI среде визуальные тесты требуют дополнительной стабилизации:
Результаты тестов сохраняются как артефакты сборки:
В CesiumJS наиболее типичные причины визуальных регрессий:
Даже обновление minor версии может вызвать визуальные сдвиги.
Для уменьшения false positives применяются:
Некоторые системы вводят multi-threshold модель: строгую для критических зон и мягкую для фоновых областей.
При росте проекта визуальные тесты начинают занимать значительное время. Оптимизации включают:
Также применяется стратегия «smoke visual tests» — небольшой набор критических сцен для быстрых проверок.
Даже при одинаковом коде разные GPU дают разные результаты рендеринга. Это особенно заметно в:
Для минимизации влияния используют:
В сложных сценах часто применяется маска стабильности:
Это позволяет тестировать сложные сцены без постоянных ложных падений.
При развитии проекта визуальные тесты начинают выполнять не только роль регрессии, но и:
В экосистеме CesiumJS визуальное тестирование становится частью инфраструктуры стабильности 3D-приложений, где корректность определяется не логикой, а визуальной идентичностью кадров.