Если вы пишите тесты для вашего проекта и используете 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
Попробуйте сами и поделитесь своим отзывом, буду признателен!
Спасибо за внимание.
Автор: djezzzl