E2E-тестирование карт на базе OpenLayers требует учета специфики рендеринга, асинхронной загрузки тайлов, работы canvas и нестабильности сетевых источников. Поведение карты отличается от классических DOM-интерфейсов: результат формируется не только HTML-деревом, но и графическим буфером, который обновляется в ответ на события источников данных и слоя отрисовки.
Сценарии end-to-end тестирования карт обычно строятся вокруг следующих слоев:
Ключевое отличие от UI-тестирования форм заключается в том, что карта является высокоасинхронной системой, где итоговое состояние формируется постепенно.
Для E2E тестов карт чаще всего используются:
Playwright обеспечивает более предсказуемую работу с асинхронными графическими состояниями, особенно при тестировании WebGL и canvas-рендеринга, характерного для картографических библиотек.
Карты в OpenLayers не имеют мгновенного состояния «готово». Даже
после события load слоя возможны:
Поэтому ключевой задачей тестов становится определение стабильного состояния карты.
Типичные стратегии ожидания:
rendercompletesource.getState())Карты используют tile-based рендеринг, где изображение формируется из множества HTTP-запросов. Это делает E2E нестабильными без контроля сети.
Основной подход — перехват запросов:
В Playwright это реализуется через route:
/tile/{z}/{x}/{y}Такой подход устраняет флаки-тесты, вызванные сетевой вариативностью.
Карта считается стабилизированной, когда:
rendercompleteДополнительно применяются проверки:
postrendergetCenter,
getZoom)В OpenLayers события рендеринга имеют циклический характер, поэтому важно избегать ожиданий фиксированного тайминга.
Основной рендер карты происходит в <canvas>, что
делает невозможным стандартные DOM-assertions.
Используются следующие подходы:
Playwright предоставляет механизм toHaveScreenshot,
который подходит для контроля регрессии визуального слоя.
При этом стабильность зависит от:
OpenLayers использует анимации для:
Для тестов они должны быть отключены:
view.setAnimate(false) (логически)Без этого визуальные проверки становятся недетерминированными.
import { test, expect } from '@playwright/test';
test('карта загружается и отображает слой', async ({ page }) => {
await page.route('**/tile/**', route => {
route.fulfill({
contentType: 'image/png',
body: fakeTileBuffer
});
});
await page.goto('http://localhost:3000/map');
const canvas = page.locator('canvas');
await expect.poll(async () => {
return await page.evaluate(() => {
return window.map?.getLayers().getLength();
});
}).toBeGreaterThan(0);
await expect(canvas).toHaveScreenshot('map-initial.png');
});
Основные сценарии взаимодействий:
Для canvas взаимодействий важно учитывать координаты:
Playwright позволяет точно воспроизводить pointer sequence:
mouse.downmouse.movemouse.upПосле каждого действия требуется ожидание стабилизации рендера карты.
OpenLayers использует Source объекты:
Состояние источника критично для тестов:
source.getState() === 'ready'tileLoadFunction завершенТесты часто опираются на проверку количества фич:
await page.waitForFunction(() => {
return window.map.getLayers().item(0)
.getSource()
.getFeatures().length > 0;
});
Для детерминированных E2E тестов необходимо:
Особенно важно при работе с vector layers, где порядок и содержимое данных влияет на визуальный результат.
Основные причины флаки-тестов:
Устранение достигается через:
rendercompleteКритические проверки включают:
fromLonLatТесты часто сравнивают:
Ошибки в проекциях проявляются только на визуальном уровне, что делает E2E единственным надежным способом проверки.
Порядок слоев в OpenLayers влияет на итоговый рендер:
Проверка:
map.getLayers()Изменение порядка часто используется как регрессионный тест визуальной консистентности.
Карты требуют контроля производительности:
Инструменты:
performance.markperformance.measureПри перегрузке слоев тесты фиксируют деградацию рендеринга.
Pixel-level проверки применяются для:
Важно учитывать:
Поэтому допустимая стратегия — частичное сравнение областей вместо полного canvas diff.
Для E2E тестируемого приложения обычно вводится режим:
Это позволяет стабилизировать поведение карты без изменения бизнес-логики библиотеки OpenLayers.