Snapshot тестирование является важным инструментом в разработке интерфейсов, позволяя фиксировать текущее состояние компонентов и проверять их на изменения в будущем. Этот подход особенно актуален в Preact, где компоненты часто небольшие, но взаимодействие между ними может быть сложным.
Snapshot тестирование заключается в создании “снимка” (snapshot) DOM-дерева компонента в момент теста. Этот снимок сохраняется в виде файла и сравнивается с результатами последующих запусков тестов. Если компонент изменился, тест покажет расхождение, что позволяет быстро выявить неожиданные изменения в интерфейсе.
В Preact для snapshot тестирования обычно используется комбинация Jest и @testing-library/preact. Jest предоставляет встроенную поддержку snapshot тестов, а Testing Library упрощает рендеринг компонентов и доступ к их элементам.
Пример базового snapshot теста для Preact-компонента:
import { h } from 'preact';
import { render } from '@testing-library/preact';
import MyComponent from './MyComponent';
test('MyComponent matches snapshot', () => {
const { container } = render(<MyComponent />);
expect(container).toMatchSnapshot();
});
В этом примере container содержит DOM-структуру
компонента, которая сравнивается с ранее сохраненным snapshot. При
первом запуске теста Jest создаст файл snapshot в папке
__snapshots__.
Snapshot-файлы хранятся отдельно от исходного кода и имеют расширение
.snap. Они содержат сериализованное представление
DOM-дерева компонента. Пример содержимого snapshot-файла:
// Jest Snapshot v1
exports[`MyComponent matches snapshot 1`] = `
<div>
<h1>Hello World</h1>
<button>Click me</button>
</div>
`;
Каждая запись снапшота соответствует одному тесту и автоматически обновляется при необходимости.
Иногда изменения в компоненте являются ожидаемыми, и snapshot необходимо обновить. Jest предоставляет команду для пересоздания snapshot:
jest -u
Важно обновлять snapshot только после внимательного анализа изменений, чтобы не пропустить нежелательные модификации интерфейса.
Preact поддерживает snapshot тестирование с props и контекстом, что позволяет тестировать компоненты в различных состояниях.
Пример теста с props:
test('MyComponent renders correctly with props', () => {
const { container } = render(<MyComponent title="Welcome" />);
expect(container).toMatchSnapshot();
});
Пример теста с контекстом:
import { h } from 'preact';
import { render } from '@testing-library/preact';
import { ThemeContext } from './ThemeContext';
import ThemedComponent from './ThemedComponent';
test('ThemedComponent renders with dark theme', () => {
const { container } = render(
<ThemeContext.Provider value={{ theme: 'dark' }}>
<ThemedComponent />
</ThemeContext.Provider>
);
expect(container).toMatchSnapshot();
});
Snapshot тесты фиксируют текущее состояние DOM, но не отслеживают:
Для этих случаев необходимы дополнительные unit- и integration-тесты.
Snapshot тесты удобно включать в процесс непрерывной интеграции, чтобы каждый пулл-реквест проверял изменения интерфейса. Любое расхождение между текущим состоянием и сохраненными snapshot вызывает падение теста, предотвращая случайные визуальные регрессии.
Snapshot тестирование в Preact обеспечивает надежный контроль над внешним видом компонентов, позволяя быстро обнаруживать нежелательные изменения в интерфейсе. Его сочетание с Testing Library и Jest делает процесс простым и интегрируемым в любой проект.