ManagerConfig
Конфигурация для менеджера storyshots. Используется при запуске в режимах UI и CI.
devices
Описывает список устройств, в рамках которых запускаются истории.
Первый объект в списке devices становится устройством по умолчанию.
export default {
devices: [
{
name: 'desktop',
width: 1480,
height: 920,
},
{
name: 'mobile',
userAgent:
'Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1',
width: 414,
height: 896,
},
],
/* ... */
};
preview
Принимает сервер preview.
import { createExecPreview } from '@storyshots/exec-preview';
export default {
preview: createExecPreview(/* конфигурация */),
/* ... */
};
runner
Объект обработчик тестовых заданий. Чаще всего представляет собой кластер из нескольких экземпляров браузера. Реализация по умолчанию позволяет контролировать их количество:
export default {
runner: RUNNER.pool({ agentsCount: 4 }),
/* ... */
};
Нет чёткой формулы определяющей рекомендуемое количество агентов. Подходящее значение стоит определять опытным путём.
capture
Функция снятия снимка страницы в стабильном состоянии.
Страница считается стабильной, если её визуальное представление не изменяется, то есть она "замирает".
По умолчанию используются оптимальные настройки для алгоритма стабилизации, но их можно изменить:
export default {
/**
* Выполняет мнговенный снимок экрана, минуя стадию стабилизации.
* (Не рекомендуется для большинства сценариев)
*/
capture: CAPTURE.instantly,
/* ... */
};
paths
Содержит описание путей для артефактов storyshots.
export default {
paths: {
// Путь до папки с журналами
records: path.join(process.cwd(), 'records'),
// Путь до папки со снимками экрана
screenshots: path.join(process.cwd(), 'screenshots')
},
/* ... */
};
agentsCount
Задаёт количество экземпляров playwright, напрямую влияет на время выполнения историй:
export default {
agentsCount: 4,
/* ... */
};
Нет чёткой формулы определяющей рекомендуемое количество агентов. Подходящее значение стоит определять опытным путём.
compare
Описывает алгоритм сравнения двух изображений.
По умолчанию storyshots использует алгоритм, учитывающий особенности
человеческого цветовосприятия, что делает тесты менее хрупкими.
withPlaywright
Делегирует сравнение снимков playwright:
export default {
compare: Compare.withPlaywright(options),
/* ... */
};
comparator
Алгоритм сравнения пикселей:
- ssim-cie94 - https://en.wikipedia.org/wiki/Structural_similarity_index_measure
- pixelmatch - использует https://www.npmjs.com/package/pixelmatch
threshold
Погрешность при сравнении (от 0 до 1, где 0 это максимальная строгость). Работает только для pixelmatch
maxDiffPixels
Максимально допустимая разница в пикселях. 0 по умолчанию
maxDiffPixelRatio
Максимально допустимая разница в пикселях (отношение: от 0 до 1). 0 по умолчанию
withLooksSame
Использует looks-same.
export default {
compare: Compare.withLooksSame(options),
/* ... */
};
Доступны все основные опции за
исключением createDiffImage (diff создаётся всегда так как является обязательным для storyshots)
Оптимальный алгоритм
Не смотря на то, что библиотека поддерживает из коробки минимально необходимый набор алгоритмов, он может оказаться не подходящим под конкретные задачи проекта.
Подходящий алгоритм, это такой алгоритм который обеспечивает минимальное количество ложных срабатываний (хрупких тестов), но при этом не пропускает дефекты (обеспечивает высокую защиту от регресса)
Именно поэтому storyshots позволяет реализовать своё решение:
{
compare: (actual, expected, story) => Promise<ComparisonResult>;
/* ... */
}
- actual снимок актуального поведения
- expected снимок эталонного поведения
- story объект истории включая мета атрибуты
Результатом алгоритма является объект ComparisonResult в котором содержится:
- equal - признак равенства двух снимков
- explanation - если два снимка не равны, содержит дополнительную информацию
- diff - ссылается на итоговое diff изображение
Интерфейс сравнения является ассинхронным, что открывает дополнительные возможности по использованию более продвинутых техник сравнения, например с использованием online сервисов.