Test naming conventions

Test naming conventions

Правильное именование тестов имеет решающее значение для обеспечения читаемости и поддержки тестового набора. Когда имена тестов ясны и понятны, становится проще понять, что именно проверяется в тесте, а также помогает другим разработчикам быстро ориентироваться в коде.

Имена тестов в Jasmine должны быть как можно более информативными. В идеале, название должно чётко отражать то, что тест проверяет, и какие ожидаемые результаты. Jasmine предоставляет два основных способа для написания тестов:

  • describe — группа тестов, объединённых общей темой.
  • it — конкретный тест, который проверяет определённую функциональность.

Имена должны чётко отражать эти два уровня.

Форматирование имени теста

Часто используется следующая структура для именования тестов:

describe('функциональность', () => {
    it('должен делать ожидаемое действие', () => {
        // код теста
    });
});
  • describe: описывает сущность, функциональность или компонент, который тестируется.
  • it: описывает конкретное поведение или результат, который должен быть проверен.

Использование глаголов в имени

Имена тестов в Jasmine часто начинаются с глаголов, чтобы чётко указать, что именно проверяется. Это позволяет лучше понять, что должно происходить в тестируемом коде.

Примеры:

  • it('должен добавлять элемент в массив')
  • it('должен возвращать корректную сумму чисел')
  • it('должен выводить ошибку при неверных данных')

Использование глаголов помогает создать активные и чёткие тесты, которые ясно объясняют их назначение.

Ясность и подробность

Название теста должно быть достаточно подробным, чтобы без необходимости заглядывать в тело теста можно было понять его цель. Слишком общие имена, такие как “test” или “should work”, не дают полезной информации о том, что именно проверяется.

Пример неудачного имени:

it('должен работать', () => { ... });

Такое имя не даёт понимания, что конкретно проверяется. Лучше указать, какой именно функционал тестируется:

it('должен корректно считать возраст пользователя на основе даты рождения', () => { ... });

Использование контекста

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

Пример:

describe('Функция добавления элемента в корзину', () => {
    it('должна добавлять элемент в корзину, если товар доступен', () => { ... });
    it('не должна добавлять элемент в корзину, если товар отсутствует на складе', () => { ... });
});

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

Использование сценариев и примеров

Когда тестов слишком много, можно использовать сценарные подходы с примерами входных данных, чтобы сделать имена ещё более конкретными и понятными.

Пример:

describe('Функция сортировки массива', () => {
    it('должна отсортировать массив по возрастанию', () => { ... });
    it('должна отсортировать массив по убыванию', () => { ... });
    it('не должна изменять массив, если он уже отсортирован', () => { ... });
});

Такие примеры чётко указывают, какие конкретно случаи тестируются.

Учет отрицательных случаев

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

Пример:

describe('Функция удаления элемента из массива', () => {
    it('не должна удалять элемент, если его нет в массиве', () => { ... });
    it('должна генерировать ошибку, если индекс выходит за пределы массива', () => { ... });
});

Такие тесты подтверждают, что приложение или библиотека надёжно обрабатывает исключительные ситуации.

Чтение и поддержка тестов

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

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

Стандарты именования

Для повышения единообразия рекомендуется придерживаться общепринятых стандартов именования. В таких стандартах часто включены правила по использованию:

  • Пробелов и дефисов: в именах тестов обычно используются пробелы или дефисы для разделения слов, чтобы улучшить читаемость.
  • CamelCase и snake_case: избегать использования стиля написания, который может привести к путанице. CamelCase часто используется в JavaScript для именования переменных и функций, однако для тестов рекомендуется использовать более привычный стиль с пробелами.

Пример:

it('должен правильно обрабатывать большие числа', () => { ... });

Имена и контекст

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

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

it('должен возвращать true, если строка является палиндромом', () => { ... });

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

it('должен возвращать true для строки, если она равна "abba"', () => { ... });

Во втором примере тест проверяет слишком конкретную реализацию и не является универсальным.

Заключение

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