Snapshot-тестирование в контексте WebGL-рендеринга применяется для фиксации визуального состояния сцены или структурного представления графического слоя в конкретный момент времени. В экосистеме Deck.gl этот подход используется для контроля регрессий при изменениях в слоях, вычислении координат, трансформациях и логике отрисовки.
Ключевая особенность WebGL-сцен — высокая чувствительность к окружению выполнения: драйверы GPU, различия в плавающей точке, порядок операций рендеринга. Snapshot-тестирование в таких условиях требует строгой стабилизации входных данных и окружения.
Первый уровень snapshot-тестирования связан не с пикселями, а с сериализацией состояния слоя. В тестах фиксируются:
viewStateТакой подход позволяет отслеживать логические изменения в графе рендеринга без необходимости работы с изображениями.
Пример структуры:
{
viewState: {
longitude: 37.62,
latitude: 55.75,
zoom: 12,
pitch: 45,
bearing: 0
},
layers: [
{
id: "hex-layer",
type: "HexagonLayer",
opacity: 0.8
}
]
}
Snapshot фиксирует не визуальный результат, а декларативное описание сцены.
Более строгая форма контроля — сравнение итогового изображения. В этом случае рендеринг выполняется в headless-окружении, после чего полученный буфер кадра сравнивается с эталонным изображением.
Часто используется связка:
headless-gl@deck.gl/test-utilsjest-image-snapshotРендер сцены выполняется в offscreen canvas, результат сериализуется в PNG или raw buffer.
viewStategl.readPixelsSnapshot-тестирование в WebGL сталкивается с рядом факторов нестабильности:
Даже минимальные изменения могут привести к pixel diff, который формально считается ошибкой snapshot.
Ключевым фактором детерминированности является
viewState. Любая вариативность камеры приводит к изменению
проекции и, как следствие, изображения.
Фиксируются параметры:
Анимационные переходы создают промежуточные состояния сцены. Для snapshot-тестов используется:
transitionDuration: 0Данные должны быть:
Пример устранения случайности:
const data = rawData
.map(d => ({ ...d }))
.sort((a, b) => a.id - b.id);
В Deck.gl каждый слой представляет собой изолированную единицу рендеринга. Snapshot-тестирование может применяться на уровне:
При тестировании слоя важно учитывать жизненный цикл:
Любое изменение в одном из этапов отражается в snapshot.
Пакет @deck.gl/test-utils предоставляет утилиты для:
Типовой сценарий:
import { testRenderLayers } from '@deck.gl/test-utils';
test('HexagonLayer snapshot', async () => {
const image = await testRenderLayers({
layers: [hexLayer],
viewState
});
expect(image).toMatchImageSnapshot();
});
Snapshot-тесты в WebGL часто запускаются в CI окружении с ограничениями GPU. Для этого используются:
Важный аспект — стабильность окружения:
Любое отклонение окружения приводит к массовым diff-ошибкам.
При расхождении snapshot’ов используются методы визуального сравнения:
В большинстве тестовых систем допускается небольшой порог различий:
Tile-based слои создают дополнительную сложность:
Для snapshot тестов применяется:
Snapshot тесты в Deck.gl обычно разделяются на уровни:
Такое разделение позволяет локализовать изменения: от логики атрибутов до финального рендера.
Для воспроизводимости используется:
Это снижает влияние аппаратных различий и делает snapshot сравнимым между машинами.
Обновление эталонов происходит только при осознанных изменениях визуальной логики:
Любое автоматическое обновление без анализа приводит к накоплению визуальных регрессий.