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

Различные подходы к управлению тестовыми данными

Существует множество различных способов управления тестовыми данными для ваших приложений. Самый простой способ — использовать статический тестовый объект в файле json и импортировать его в свои тестовые примеры. Это отлично работает для небольших приложений, которым не нужно тестировать логику на основе разных значений в ваших тестовых объектах. Но по мере роста вашего приложения или увеличения сложности ваших тестов вы можете очень быстро перерасти этот подход. Если вы не будете осторожны, вы можете создать несколько копий своих тестовых объектов в разных тестах, что приведет к проблемам с обслуживанием или тестам, которые не точно отражают реальность. Вы также должны быть осторожны при создании новых ссылок на свои тестовые данные для каждого теста, иначе вы получите изменения в своем приборе из предыдущих тестов. Клонировать тестовые приборы может быть сложно, особенно если у вас есть вложенные объекты.

Efate: простой построитель динамических тестовых данных

Несколько лет назад я написал пакет npm для решения этой проблемы под названием autofixture.js. Сейчас его переписали с нуля, и теперь он называется efate. Теперь он более модульный и расширяемый. Он позволяет централизованно определять тестовые приборы и предоставлять переопределения для определенных полей в тесте. Вот краткий пример определения тестовой оснастки и ее использования в тесте. Полная документация и спецификации доступны в репозитории.

Создание тестовой оснастки

Вы определяете тестовую фикстуру, указывая поля для вашего объекта и тип данных, которым он должен быть (тип по умолчанию — String).

Const userFixture = new Fixture(
'id'.asNumber(),
'firstName',
'lastName',
'dateOfBirth'.asDate(),
'roles'.asArray());
module.exports = { userFixture }

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

// in your tests
const userFixture = require('../fixtures');
const adminUser = userFixture.create({roles: ['admin']});

Пользователь с правами администратора будет иметь такую ​​форму:

{
  id: 1,
  firstName: 'firstName1',
  lastName: 'lastName1',
  dateOfBirth: <Date object>,
  roles: ['admin']
}

Теперь по мере роста вашего приложения ваши тестовые приборы можно обновлять из одного места, и все тесты будут иметь новые поля.