Если вы пишите тесты для вашего проекта и используете factory_bot для генерации тестовых данных, то представляю вам гем factory_trace, который поможет вам поддерживать ваши factories & traits в актуальном состоянии.

Что делает?


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

$ FB_TRACE=1 rspec
total number of unique used factories & traits: 3
total number of unique unused factories & traits: 2
unused global trait with_email
unused factory admin

Интеграция в проект


Для RSpec, достаточно установить гем и можно пользоваться, для любого другого тестера, достаточно сделать простые манипуляции:

# добавить до начала исполнения тестов
FactoryTrace.start

# добавить после завершения тестов
FactoryTrace.stop

Параллельное/кусочное исполнение


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

Это можно сделать, следующим образом:

# одна часть
FB_TRACE=trace_only FB_TRACE_FILE=fb_trace_result1.txt bundle exec rspec spec/first_spec.rb
# другая часть (их может быть сколько угодно)
FB_TRACE=trace_only FB_TRACE_FILE=fb_trace_result2.txt bundle exec rspec spec/second_spec.rb
# группировка и обработка данных
bundle exec factory_trace fb_trace_result1.txt fb_trace_result2.txt

Как это работает?


Благодаря реализации factory_bot с использованием ActiveSupports::Notifications легко добавить callback, когда фабрика используется:

ActiveSupport::Notifications.subscribe('factory_bot.run_factory') do |_name, _start, _finish, _id, payload|
  name = payload[:name]
  traits = payload[:traits]

  storage[name] ||= Set.new
  storage[name] |= traits
end

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

post scriptum


Попробуйте сами и поделитесь своим отзывом, буду признателен!

Спасибо за внимание.

Комментарии (0)