Test naming conventions
Правильное именование тестов имеет решающее значение для обеспечения читаемости и поддержки тестового набора. Когда имена тестов ясны и понятны, становится проще понять, что именно проверяется в тесте, а также помогает другим разработчикам быстро ориентироваться в коде.
Имена тестов в Jasmine должны быть как можно более информативными. В идеале, название должно чётко отражать то, что тест проверяет, и какие ожидаемые результаты. Jasmine предоставляет два основных способа для написания тестов:
Имена должны чётко отражать эти два уровня.
Часто используется следующая структура для именования тестов:
describe('функциональность', () => {
it('должен делать ожидаемое действие', () => {
// код теста
});
});
Имена тестов в Jasmine часто начинаются с глаголов, чтобы чётко указать, что именно проверяется. Это позволяет лучше понять, что должно происходить в тестируемом коде.
Примеры:
it('должен добавлять элемент в массив')it('должен возвращать корректную сумму чисел')it('должен выводить ошибку при неверных данных')Использование глаголов помогает создать активные и чёткие тесты, которые ясно объясняют их назначение.
Название теста должно быть достаточно подробным, чтобы без необходимости заглядывать в тело теста можно было понять его цель. Слишком общие имена, такие как “test” или “should work”, не дают полезной информации о том, что именно проверяется.
Пример неудачного имени:
it('должен работать', () => { ... });
Такое имя не даёт понимания, что конкретно проверяется. Лучше указать, какой именно функционал тестируется:
it('должен корректно считать возраст пользователя на основе даты рождения', () => { ... });
В некоторых случаях полезно добавить контекст, в котором тест будет выполнен. Это особенно важно, если функция или компонент имеет несколько состояний или вариантов использования. В таких случаях можно добавить дополнительные описания для каждого случая.
Пример:
describe('Функция добавления элемента в корзину', () => {
it('должна добавлять элемент в корзину, если товар доступен', () => { ... });
it('не должна добавлять элемент в корзину, если товар отсутствует на складе', () => { ... });
});
Такой подход помогает уточнить, какие именно случаи рассматриваются, и упрощает поиск ошибок в случае их возникновения.
Когда тестов слишком много, можно использовать сценарные подходы с примерами входных данных, чтобы сделать имена ещё более конкретными и понятными.
Пример:
describe('Функция сортировки массива', () => {
it('должна отсортировать массив по возрастанию', () => { ... });
it('должна отсортировать массив по убыванию', () => { ... });
it('не должна изменять массив, если он уже отсортирован', () => { ... });
});
Такие примеры чётко указывают, какие конкретно случаи тестируются.
Не менее важны и тесты, которые проверяют, что код не работает в невалидных или ошибочных ситуациях. Для таких тестов также стоит использовать ясные и информативные имена, показывающие, что именно должно произойти при ошибке.
Пример:
describe('Функция удаления элемента из массива', () => {
it('не должна удалять элемент, если его нет в массиве', () => { ... });
it('должна генерировать ошибку, если индекс выходит за пределы массива', () => { ... });
});
Такие тесты подтверждают, что приложение или библиотека надёжно обрабатывает исключительные ситуации.
Имена тестов также должны быть удобочитаемыми и совместимыми с командной работой. Понимание теста на первом взгляде — важный аспект для командной разработки, особенно когда тесты перепроверяются другими разработчиками или при добавлении новых функциональных возможностей.
Тесты с ясными именами могут быть использованы для автоматической генерации документации, если такой процесс предусмотрен в рамках проекта. В таком случае чёткие и стандартизированные имена тестов значительно улучшат процесс генерации документации.
Для повышения единообразия рекомендуется придерживаться общепринятых стандартов именования. В таких стандартах часто включены правила по использованию:
Пример:
it('должен правильно обрабатывать большие числа', () => { ... });
Кроме структурированного имени важно правильно выбрать контекст. Контекст должен быть выбран таким образом, чтобы тест был универсальным и не зависел от деталей реализации. Это помогает избежать излишней привязки теста к конкретной реализации и повышает гибкость тестов в долгосрочной перспективе.
Пример правильного теста:
it('должен возвращать true, если строка является палиндромом', () => { ... });
Пример неправильного теста:
it('должен возвращать true для строки, если она равна "abba"', () => { ... });
Во втором примере тест проверяет слишком конкретную реализацию и не является универсальным.
Правильное именование тестов в Jasmine помогает улучшить читаемость и поддержку кода, ускоряет процесс нахождения и устранения ошибок, а также способствует созданию более гибких и эффективных тестов.