Как настроить Cucumber / Aruba для использования SimpleCov?
Ruby-2.0.0p247 ActiveRecord-4.0.1 Огурец 1.3.10 Aruba-0.5.3 SimpleCove-0.8.2
Мы используем Cucumber с Aruba в проекте NIL-RAILS, который, тем не менее, использует ActiveRecord. Наши функции огурца обрабатывают код как в процессе, так и вне процесса. Код вне процесса выполняется с использованием тех же последовательностей загрузчика, что и в рабочей среде, через заглушку запуска в bin:
#!/usr/bin/env ruby
require 'bundler/setup'
Bundler.require
require 'pathname'
my_dir = Pathname.new(
File.join( File.dirname(
__FILE__ ), '../', 'lib/' ) ).realpath.to_s + '/'
require my_dir + File.basename( __FILE__ )
HllThForexRssFetch::Main.new( ARGV ).execute
#EOF
Наш файл functions/support/env.rb содержит:
$ cat features/support/env.rb
# Must load and start simplecov before any application code
require 'simplecov'
SimpleCov.start do
add_filter "/features/"
add_filter "/libexec"
add_filter "/lib/hll_active_record/"
add_filter "/test/"
add_filter "/tmp/"
end
SimpleCov.command_name( "Cucumber Features" )
# Do not use cucumber/rails in standalone projects
#require 'cucumber/rails'
,,,
Когда наши определения шагов вызывают внешний bin/ файл с помощью команды запуска aruba, определения шагов работают должным образом, и тесты завершаются, как и ожидалось, но покрытие кода не объединяется с остальной частью цикла. То, что я ищу, - это инструкции о том, как настроить simple cov, чтобы сообщать о покрытии кода внепроцессных тестов вместе с частями, которые выполняются непосредственно огурцом.
Как это сделать?
2 ответа
У меня есть среда, похожая на вашу, вот как я получил это работает:
Предполагая, что дерево каталогов выглядит так:
project
|- bin
| |- binary
|- lib
| |- ...
|- spec
| |- ...
|- features
| |- support
| | |- env.rb
| |- ...
Сначала проверьте эту проблему https://github.com/colszowka/simplecov/issues/234
Он описывает, что бинарный файл должен запускаться из simplecov. Это смешно, но я добавил этот заголовок в свой бинарный файл (project/bin/binary):
if ENV['COVERAGE']
require 'simplecov'
# As described in the issue, every process must have an unique name:
SimpleCov.command_name "binary #{Process.pid}"
# When running with aruba simplecov was using /tmp/aruba as the root folder.
# This is to force using the project folder
SimpleCov.root(File.join(File.expand_path(File.dirname(__FILE__)), '..'))
SimpleCov.start do
filters.clear
# Because simplecov filters everything outside of the SimpleCov.root
# This should be added, cf.
# https://github.com/colszowka/simplecov#default-root-filter-and-coverage-for-things-outside-of-it
add_filter do |src|
!(src.filename =~ /^#{SimpleCov.root}/) unless src.filename =~ /project/
end
# Ignoring test folders and tmp for Aruba
add_filter '/spec/'
add_filter '/test/'
add_filter '/features/'
add_filter '/tmp/'
end
end
Затем при вызове двоичного кода внутри огурца должна быть установлена переменная окружения COVERAGE. В файле feature/support/env.rb в предложении before:
require 'simplecov'
SimpleCov.command_name 'Cucumber'
Before do
# This is using the aruba helper,
# cf. https://github.com/cucumber/aruba/blob/master/lib/aruba/api.rb
set_env('COVERAGE', 'true')
# This could also be accomplished with the "I set the environment variables to:" step
end
Если в вашей среде у вас есть два фреймворка (например, RSpec и Cucumber в этом примере), не забудьте https://github.com/colszowka/simplecov
Используя вышеизложенное, установка имени_команды на основе PID процесса aruba заставляет SimpleCov накапливать очень большой набор результатов и загрязняет результаты при старых запусках.
Мне повезло, установив имя команды следующим образом:
# As described in the issue, every process must have an unique name:
SimpleCov.command_name ARGV.join(' ')
Что приводит к тому, что в результаты включается только последний запуск с теми же аргументами.