SimpleCov с несколькими приложениями - или вкратце, как работает Simplecov? - PullRequest
4 голосов
/ 29 февраля 2012

Я пытаюсь настроить SimpleCov для создания отчетов для 3 приложений, которые совместно используют большую часть своего кода (модели, контроллеры) из локального гема, но спецификации для кода, который использует каждое приложение, находятся внутри каждого ./spec, а не включены Сам камень.

Для более ясного примера. Когда я запускаю спецификацию bundle exec rspec внутри app_1, которая использует общие модели из локального гема, я хочу получить (точные) отчеты по всем спецификациям, которые есть у этого app_1 ./spec.

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

Я пытаюсь добиться этого с помощью следующего кода в app_1 / spec / spec_helper.

# This couple of lines are needed to generate report for the models, etc. inside the local gem.
SimpleCov.adapters.delete(:root_filter)
SimpleCov.filters.clear

SimpleCov.adapters.define 'my_filter' do
  root = SimpleCov.root.split("/")
  root.pop
  add_filter do |src|
    !(src.filename =~ /^#{root.join("/")}/)
  end

  add_filter "/app_2_namespace/"
end

if ENV["COVERAGE"] == "true"
  SimpleCov.start 'rails'
end

Это работает, пока не начнут возникать некоторые вопросы.

Почему я получаю 85% покрытия для модели, которая находится внутри драгоценного камня, но спецификация находится внутри app_2 (я запускаю спецификацию внутри app_1).

В первый раз это была проблема, когда я попытался улучшить эту модель, поэтому я нажал на отчет для нее и увидел, какие строки были обнаружены, и я попытался исправить их, написав тесты для них в app_2 / spec / namespace / my_model_spec.rb.

Но это не имело никакого значения, я попробовал более агрессивный тест и стер все содержимое спецификации, но почему-то я все еще получал 85% покрытия, так что my_model_spec.rb не связан с результаты покрытия my_model.rb. Вид неожиданный.

Но так как этот файл был в app_2, я решил добавить фильтр в блок SimpleCov.start в app_1 spec_helper, например:

add_filter "/app_2_name_space/"

Затем я перешел в папку app_2 и начал настраивать SimpleCov и посмотреть, какие результаты я получу здесь. И они оказались страннее.

Для той же модели я получил 100% -ое покрытие, я сделал тот же тест на опустошение файла my_model_spec.rb и все еще получил 100%. Так что это действительно офигительно, или я чего-то не понимаю.

Как это работает? ( с модулем Ruby 1.9 Coverage вы говорите, хорошо, когда я запускаю локально пример официальной документации, я получаю разные результаты, так что я думаю, что есть ошибка или устаревшая документация )

ruby-doc: {"foo.rb"=>[1, 1, 10, nil, nil, 1, 1, nil, 0, nil]} 
locally:  {"foo.rb"=>[1, 1, 10, nil, nil, 1, 0, nil, 1, nil]}

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

Я думаю, что ожидаемое поведение таково, что результаты для модели, например, связаны с ее спецификацией, то же самое для контроллеров и т. Д.

Это тот случай? Если так, то почему я получаю такие странные результаты.

Или, как вы думаете, структура моих приложений может испортиться из-за SimpleCov и Coverage?

Спасибо, что нашли время, чтобы прочитать это, если вам нужна более подробная информация, просто спросите.

1 Ответ

2 голосов
/ 07 марта 2012

Что касается вашей путаницы с моделью, охватываемой на 100%, поскольку я не уверен, что правильно понимаю: у Coverage (и, следовательно, у SimpleCov) нет возможности узнать, был ли ваш код выполнен из спецификации или «где-то еще». ». Скажем, у меня есть метод "foo" и метод "bar", который вызывает foo. Если я вызову bar в моих спецификациях, то, конечно, foo также будет показан как покрытый.

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

Две вещи в вашей базовой конфигурации: удаление базового адаптера (строка 2) не нужно, поскольку адаптеры в основном являются прославленными частями конфигурации, и на этом этапе вы уже выполнили его (поскольку он вызывается при загрузке Simplecov). Сброса фильтров должно быть достаточно.

Кроме того, пользовательский адаптер, который вы определяете, не используется. Пожалуйста, обратитесь к README, чтобы узнать, как правильно настроить адаптеры, но я думаю, что вам будет достаточно просто использовать это в блоке конфигурации SimpleCov, когда вы начнете запуск покрытия на данный момент:

SimpleCov.start 'rails' do
  your_custom_config
end

Хотя вам, вероятно, понадобится объединенный отчет о покрытии для всех ваших приложений. Для этого вам сначала нужно определить имя_команды для каждого из ваших наборов спецификаций, внутри блока конфигурации, например: command_name 'App1 Specs'.

Вам также потребуется определить центральный coverage_path, который будет хранить ваши отчеты о покрытии по всем наборам приложений. Скажем, у вас есть ~/projects/my_project/app[1-3], тогда может иметь смысл ввести это в my_project/coverage. Это приведет к тому, что результаты вашего набора тестов будут объединены в один отчет, как, например, при использовании SimpleCov с Cucumber & RSpec. По умолчанию время слияния составляет ~ 10 минут, поэтому вам может потребоваться установить более высокое значение, используя merge_timeout 3600 в вашей конфигурации (это секунды). Для ознакомления со спецификой этих параметров конфигурации, пожалуйста, снова ознакомьтесь с README и документацией SimpleCov :: Configuration. Эти вещи обрисованы в общих чертах там.

Итак, чтобы подвести итог, каждое из ваших приложений должно выглядеть примерно так:

require 'SimpleCov'
SimpleCov.start 'rails' do
  reset_filters!
  command_name 'App1 Spec'
  coverage_path File.dirname(__FILE__) + '../../coverage' # Assuming this is in my_project/app1/spec/spec_helper.rb
  merge_timeout 3600
end

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

...