Скриншотное тестирование со Storybook
Storybook — это инструмент для разработки пользовательских интерфейсов на основе компонентов. Он позволяет разработчикам независимо визуализировать компоненты в различных состояниях в изолированной от остальных компонентов среде. Такой "шоурум" идеально подходит для скриншотного тестирования ваших компонентов, т.к. за счет этой изолированной среды такие тесты получаются в разы стабильнее и быстрее, чем вариант с e2e.
С помощью плагина @testplane/storybook предоставляется возможность автоматически проверять изменения ваших компонентов с помощью скриншотного тестирования.
Вам достаточно описать ваш компонент в Storybook
, а testplane
при запуске автоматически сгенерит все необходимые тесты, прогонит их в нужных браузерах и предоставит визуальный отчет для обновления скриншотов.
Как использовать?
Шаг 1: Установка необходимых зависимостей
Если в Вашем проекте еще нет Testplane
, то рекомендуем ознакомиться с разделом quickstart или выполнить в директории Вашего проекта команду ниже:
npm init testplane@latest
Устанавливаем плагин для testplane
npm install @testplane/storybook --save-dev
Шаг 2: Настройка плагина
Для работы плагина достаточно минимальной настройки — нужно просто объявить его в конфиге testplane
без дополнительных опций:
export default {
plugins: {
"@testplane/storybook": {},
// other Testplane plugins...
},
// другие настройки Testplane...
};
Шаг 3: Запуск тестов
Для запуска storybook-тестов необходимо добавить опцию --storybook
. Опция --update-refs
позволяет сохранить/обновить эталонные изображения через CLI:
npx testplane --storybook --update-refs
С помощью GUI-режима вы можете визуально оценить изменения в скриншотах, обновить их или перезапустить тесты:
npx testplane gui --storybook
Если в Вашем проекте используется Storybook версии 6.x, то в настройках Storybook необходимо включить сохранение json-файла с Вашими историями:
export default {
// ...
features: {
// ...
buildStoriesJson: true,
},
};
Кастомные тесты
Некоторые компоненты перед скриншотом нужно привести в какое-либо состояние. Для этого у сторибука есть сущность под названием play-функция. Если она определен а, мы сначала выполним все action-ы из нее, и только после этого сделаем скриншот. Если вам не хватает выразительности Storybook, то вы можете в самой истории описать testplane-тест, который будет выполнен как дополнительный тест для компонента.
import type { StoryObj } from "@storybook/react";
import type { WithTestplane } from "@testplane/storybook";
export const Primary: WithTestplane<StoryObj> = {
args: {
primary: true,
label: "Button",
},
testplane: {
"my test": async ({ browser, expect }) => {
const element = await browser.$(".storybook-button");
await expect(element).toHaveText("Button");
},
},
};
Также для теста можно добавить дополнительные настройки:
import type { WithTestplane } from "@testplane/storybook";
import type { Meta, StoryObj } from "@storybook/react";
const meta: WithTestplane<Meta<typeof Button>> = {
title: "Example/Button",
component: Button,
testplane: {
skip: false, // if true, skips all Testplane tests from this story file
autoscreenshotSelector: ".my-selector", // Custom selector to auto-screenshot elements
browserIds: ["chrome"], // Testplane browsers to run tests from this story file
assertViewOpts: {
// override default assertView options for tests from this file
ignoreDiffPixelCount: 5,
},
},
};
export default meta;
При добавлении testplane-тестов расширение Ваших story-файлов должно быть .js
или .ts
.
Форматы jsx/tsx еще не поддержаны.