Названия тестов должны быть понятны

Одним из важнейших аспектов при написании тестов является ясность и читаемость их названий. Название теста должно не только четко передавать его суть, но и давать представление о том, что именно проверяется в рамках этого теста. Хорошо выбранное имя делает код более понятным и облегчает поддержку, что особенно важно в крупных проектах с множеством тестов.

Принципы выбора имен для тестов

  1. Конкретность и четкость Название теста должно быть достаточно специфичным, чтобы было понятно, что именно проверяется. Общие формулировки вроде “works correctly” или “does the thing” не дают представления о том, что именно происходит в тестируемом компоненте. Вместо этого следует использовать более точные формулировки.

    Пример:

    • Плохо: testLoginFunction()
    • Хорошо: should display error message when login fails
  2. Использование глаголов в настоящем времени Описание того, что должно происходить, обычно начинается с глагола в настоящем времени. Это помогает сделать название теста активным и четким. Важно также избегать использования избыточных слов, таких как «должен» или «проверка», так как глагол сам по себе может достаточно ясно выразить суть.

    Пример:

    • Плохо: test if submit button works
    • Хорошо: disables submit button when form is invalid
  3. Согласованность Важно придерживаться единого стиля на протяжении всех тестов. Это особенно актуально для крупных командных проектов. Например, если вы выбрали структуру “should” + “verb”, то стоит использовать её во всех тестах, чтобы они имели одинаковую форму.

    Пример:

    • Плохо: should render button и is form disabled?
    • Хорошо: should render button и should disable form when invalid
  4. Описание контекста Тесты часто зависят от состояния приложения или компонентов. Указание этого контекста в названии теста поможет понять, при каких условиях выполняется проверка. Это особенно важно, когда тесты затрагивают множество состояний или взаимодействий, где контекст играет ключевую роль.

    Пример:

    • Плохо: should show modal
    • Хорошо: should show modal when user clicks on 'add item' button
  5. Использование описательных имен функций В тестах с несколькими шагами часто используются вспомогательные функции для имитации действий пользователя, например, кликов или ввода текста. Их названия должны также быть описательными и чёткими, чтобы другие разработчики могли легко понять, что именно делает каждая функция.

    Пример:

    • Плохо: clickBtn()
    • Хорошо: clickAddItemButton()
  6. Указание на возможные ошибки или исключения Названия тестов должны также учитывать возможные исключения и ошибки, которые могут возникнуть при выполнении действия. Это важно для случаев, когда компонент должен корректно обрабатывать не только стандартные сценарии, но и неожиданные.

    Пример:

    • Плохо: should show notification
    • Хорошо: should show error notification when network request fails
  7. Учет асинхронности При работе с асинхронными операциями тесты должны чётко указывать, что проверка будет происходить в асинхронном контексте. Например, если тестируетесь запросы к серверу или анимации, следует добавить указание на асинхронность в описание теста.

    Пример:

    • Плохо: should fetch data from API
    • Хорошо: should fetch data from API when component mounts

Структура имени теста

Типичная структура имени теста включает в себя несколько ключевых частей:

  • Действие (что происходит в тестируемом компоненте)
  • Ожидаемый результат (что должно произойти в результате этого действия)
  • Контекст или условие (если необходимо указать дополнительные условия, при которых происходит тестирование)

Каждая часть может быть представлена фразой или коротким описанием, что позволяет легко понять логику теста, не углубляясь в код. Например:

should disable submit button when form is invalid

Здесь видно, что:

  • Ожидаемое действие — это «disable submit button».
  • Условие — «when form is invalid».

Как избежать неясности в именах

Несмотря на то, что можно создать довольно подробные и полные имена для тестов, важно не увлекаться излишними подробностями, которые усложняют восприятие. Названия должны быть короткими, но при этом информативными. Избегайте слишком длинных фраз и слишком сложных конструкций. Имена тестов должны оставаться читаемыми.

Пример плохого имени: should throw error in case of missing parameter when user tries to submit a form with invalid data and the server response indicates a 500 error

Такое имя слишком длинное и тяжёлое для восприятия. Лучше разбить такие тесты на несколько более мелких, каждый из которых будет проверять отдельный аспект ошибки.

Использование фреймворков и тестовых библиотек

Для улучшения структуры и ясности в названии тестов, полезно следовать лучшим практикам, рекомендуемым используемыми тестовыми библиотеками и фреймворками, такими как Jest и React Testing Library. Эти инструменты предоставляют собственные методы и рекомендации, чтобы поддерживать тесты на высоком уровне качества и улучшать их читаемость.

Например, в React Testing Library часто используется паттерн “выводить, что должно быть на экране” для проверки интерфейса. В этом контексте название теста будет сфокусировано на поведении компонента и его взаимодействии с пользователем, а не на внутренних деталях реализации.

Пример правильного и неправильного теста

Неправильно:

test('test button click', () => {
  const { getByText } = render(<MyComponent />);
  fireEvent.click(getByText('Submit'));
  expect(getByText('Loading...')).toBeInTheDocument();
});

Это название не дает представления о том, что именно происходит в тесте. Оно очень общее и не отражает, чего ожидается от компонента.

Правильно:

test('should show loading state when submit button is clicked', () => {
  const { getByText } = render(<MyComponent />);
  fireEvent.click(getByText('Submit'));
  expect(getByText('Loading...')).toBeInTheDocument();
});

Здесь уже понятно, что именно проверяется — переход компонента в состояние загрузки при клике на кнопку.

Таким образом, создание понятных, лаконичных и точных названий для тестов — это важный шаг на пути к улучшению качества кода и его удобства для чтения. Хорошо написанные тесты легко поддерживать и интегрировать в большой проект, особенно когда работают несколько разработчиков и требуется четкость в коммуникации.