Тестовое покрытие 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 с. В зависимости от используемой машины и размера отчета о покрытии вам может потребоваться его дальнейшее увеличение.

Другие вопросы по тегам