Профилирование тестов со RubyProf
TestProf интегрируется с ruby-prof для удобного профилирования тестов.
Инструкция
Установите гем ruby-prof (версии >=0.17):
# Gemfile
group :development, :test do
gem "ruby-prof", ">= 0.17.0", require: false
endTestProf позволяет запускать RubyProf в двух режимах: для всего запуска тестов (global) или для индивидуальных тестов (per-example).
Для профилирования выполнения всех тестов (от загрузки до завершения) укажите переменную окружения TEST_RUBY_PROF:
TEST_RUBY_PROF=1 bundle exec rake test
# or for RSpec
TEST_RUBY_PROF=1 rspec ...Либо программно в коде:
TestProf::RubyProf.runTestProf также предоставляет специальный контекст (shared context) для RSpec для профилирования конкретных тестов. Подключить его можно с помощью тега rprof:
it "is doing heavy stuff", :rprof do
# ...
endПримечание: индивидуальное профилирование не работает, если уже активировано глобальное.
Настройки
Наиболее часто используемая настройка — printer – позволяет выбирать способ вывода (printer) для RubyProf (см. Printers).
Вы можете указать способ вывода с помощью переменной окружения TEST_RUBY_PROF:
TEST_RUBY_PROF=call_stack bundle exec rake testЛибо в коде:
TestProf::RubyProf.configure do |config|
config.printer = :call_stack
endПо умолчанию используется FlatPrinter.
Примечания: для указания способа вывода при индивидуальном профилировании используйте переменную окружения TEST_RUBY_PROF_PRINTER (использование TEST_RUBY_PROF невозможно, так как оно активирует глобальное профилирование).
Также вы можете указать режим RubyProf (wall, cpu и т.д.) с помощью переменной окружения TEST_RUBY_PROF_MODE.
Все настройки доступны в ruby_prof.rb.
Фильтрация методов
Иногда бывает полезно исключить некоторые методы из финального отчёта («почистить шум»).
TestProf автоматически включает базовую фильтрацию из RubyProf (exclude_common_methods!, можно отключить с помощью опции config.exclude_common_methods = false).
Кроме того, мы так же добавляем в исключения некоторые другие популярные методы стандартных библиотек и популярных фреймворков (например, RSpec). Для отключения данной фильтрации укажите в настройках config.test_prof_exclusions_enabled = false.
Наконец, вы можете добавить собственные исключения используя опцию config.custom_exclusions, например:
TestProf::RubyProf.configure do |config|
config.custom_exclusions = {User => %i[save save!]}
end