Тестирование UI: Testing Library

Урок знакомит с подходом Testing Library к тестированию интерфейсов поверх Jest.

Философия Testing Library: тестируйте компонент так, как с ним работает пользователь, а не через детали внутренней разметки.

Где здесь Jest

Testing Library — не замена Jest, а дополнение. Jest остаётся раннером и даёт expect; Testing Library предоставляет инструменты для рендера компонента и поиска элементов «по-человечески». Версии есть для React (@testing-library/react), Vue, Angular и других.

Главная идея: как пользователь

Пользователь не знает про CSS-классы и id. Он видит текст, кнопки, поля с подписями. Поэтому Testing Library ищет элементы по тому, что видно: по тексту, по роли (button, heading), по подписи поля. Тесты, написанные так, не ломаются при смене вёрстки.

Пример теста компонента

Код использует React и Testing Library, исполняется в Node, поэтому показан как иллюстрация:

import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import Counter from './Counter';

test('увеличивает счётчик по клику', async () => {
  render(<Counter />);

  // ищем по тому, что видит пользователь
  expect(screen.getByText('Счёт: 0')).toBeInTheDocument();

  const button = screen.getByRole('button', { name: 'Добавить' });
  await userEvent.click(button);

  expect(screen.getByText('Счёт: 1')).toBeInTheDocument();
});

Запросы по приоритету

ЗапросКогда использовать
getByRoleсамый предпочтительный: кнопки, заголовки, ссылки
getByLabelTextполя форм с подписью
getByTextвидимый текст
getByTestIdкрайний случай, когда иначе никак

Чего избегать

Не ищите элементы по CSS-классу или структуре DOM (div > span:nth-child(2)) — это деталь реализации. Поменяете вёрстку, не меняя поведения, — тест сломается зря. Это та же мысль, что в прошлом уроке: тестируем контракт, а не внутренности.

matchers от jest-dom

Пакет @testing-library/jest-dom добавляет к Jest удобные матчеры для DOM: toBeInTheDocument(), toBeVisible(), toBeDisabled(), toHaveTextContent().

Итог

  • Testing Library работает поверх Jest и тестирует UI «как пользователь».
  • Элементы ищут по тексту, роли и подписям, а не по классам/структуре.
  • Приоритет запросов: getByRolegetByLabelTextgetByTextgetByTestId.
  • jest-dom добавляет матчеры вроде toBeInTheDocument.
Проверьте себя
1. В чём главная философия Testing Library?
AТестировать приватные методы компонента
BТестировать компонент так, как с ним взаимодействует пользователь
CЗаменить Jest полностью
DПроверять CSS-классы
2. Какой запрос Testing Library наиболее предпочтителен?
AgetByTestId
BgetByRole
Cпоиск по CSS-классу
Dпоиск по id
3. Как соотносятся Jest и Testing Library?
AЭто конкуренты, выбирают один
BTesting Library дополняет Jest: Jest — раннер и expect, TL — рендер и поиск элементов
CTesting Library заменяет expect
DJest является частью Testing Library
Поддержать проект