Тестовое покрытие Ruby on Rails с simplecov
Я хочу проанализировать тестовое покрытие нашего кода, и поэтому установил гем simplecov.
Наша среда тестирования имеет 2 отдельных проекта: тест REST API (Java+Rest-Assured) и тестирование веб-интерфейса (Java-Selenium).
Как видите, у нас нет модульного тестирования в приложении rails, и мы тестируем с использованием внешних проектов.
Я настроил гем simplecov, как описано в руководстве, и поместил его в скрипт rails:
require 'simplecov'
SimpleCov.start 'rails'
puts "require simplecov"
При загрузке приложения я вижу напечатанную строку.
Я запустил оба проекта автоматизации тестирования, увидел их распечатки в журнале рельсов, но я не вижу никакого охвата контроллеров / моделей, я вижу лишь небольшой процент файлов инициализации некоторых драгоценных камней и рельсов.
Я искал в сети и попытался поместить кодовую фразу в boot.rb или даже в puma.rb, и он дал те же результаты.
Есть идеи?
РЕДАКТИРОВАТЬ
Ничего не помогло со всеми комментариями, но я выяснил кое-что очень интересное, во всех случаях я вижу только название методов, помеченных как проверенные, а не содержимое (в контроллерах).
Я пытался поместить стартовую фразу simplecov в bin/rails, puma.rb, config.ru, environment.rb, но все это не дало желаемых результатов покрытия кода.
4 ответа
Я не уверен, что simplecov может измерить весь охват приложения rails... Но я прибегнул к тому, что вы можете прикрепить в качестве промежуточного программного обеспечения для стойки:
https://github.com/danmayer/coverband
И его вывод совместим с simplecov. Похоже, что это может быть полезно в вашем случае.
Как вы упомянули в своем вопросе, вы используете пуму. Я подозреваю, что, поскольку он многопоточный, он порождает несколько рельсовых приложений, и их вывод simplecov перезаписывает результаты друг друга. Я бы попробовал использовать однопоточный сервер, такой как webrick, но это может замедлить ваши тесты (в зависимости от того, как тесты запускаются на самом деле) или попробовать coverband
драгоценный камень.
Также - даже если сервер однопоточный - я не уверен, что каждый запрос не будет перезаписан simplecov
выходной.
Может быть, вы должны указать пути
require 'simplecov'
SimpleCov.start do
# add_filter '/admin/'
add_group "Models", "app/models"
add_group "Controllers", "app/controllers"
add_group "Lib", "lib/"
add_group "Helpers", "app/helpers"
end
Вам нужно запустить SimpleCov перед загрузкой любого из ваших файлов, поэтому поместите эти строки как можно раньше в вашу точку входа ruby:
require 'simplecov'
SimpleCov.start
Вы можете увидеть пример в одном из моих репозиториев здесь: https://github.com/tareksamni/DockUp/blob/master/spec/spec_helper.rb
я делаю autoload
мой рубиновый код после запуска SimpleCov
, Тебе тоже самое нужно
require 'simplecov'
SimpleCov.start
require './autoload'
У меня была такая же проблема, когда я пытался получить освещение для драматургических тестов e2e. Между тем в 2020 году в SimpleCov была добавлена обработка подпроцессов, поэтому я создал конфигурацию единорога для CI.
timeout 60
worker_processes 1
preload_app true
listen 3000
app_path = File.expand_path('../', __dir__)
stderr_path "#{app_path}/log/unicorn.stderr.log"
if ENV['CI']
require File.expand_path('../lib/tutuf/simplecov', __dir__)
SimpleCov.command_name 'End-to-End Tests'
SimpleCov.enable_for_subprocesses true
SimpleCov.at_fork do |pid|
# This needs a unique name so it won't be overwritten
SimpleCov.command_name "#{SimpleCov.command_name} (subprocess: #{pid})"
SimpleCov.formatter SimpleCov::Formatter::LcovFormatter
SimpleCov.minimum_coverage 0
SimpleCov.start
end
end
Затем запустил сервер единорога с помощью
bundle exec unicorn_rails --config-file config/unicorn_test.rb --env test --daemonize
и провел тесты с помощью
npx playwright test e2e --workers=1
Покрытие записывается на диск при выключении сервера. Чтобы иметь возможность опубликовать это в codacy, я добавил в конфигурацию CI
kill -QUIT `cat tmp/pids/unicorn.pid`
while [ -s tmp/pids/unicorn.pid ]; do
sleep 2
done
чтобы дать SimpleCov некоторое время для записи отчета на диск перед попыткой его отправки. Изначально я начал с времени ожидания 0,2 с, но этого оказалось недостаточно, и я увеличил его до 2 с. В зависимости от используемой машины и размера отчета о покрытии вам может потребоваться его дальнейшее увеличение.