From c3ba302f0de630d9872efb3eeb1b9437f56b5448 2014-12-02 19:59:38 From: Jean-Philippe Lang Date: 2014-12-02 19:59:38 Subject: [PATCH] Use simplecov for code coverage, rcov does not support ruby>=1.9. git-svn-id: http://svn.redmine.org/redmine/trunk@13691 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- diff --git a/Gemfile b/Gemfile index 75d4f70..867f35c 100644 --- a/Gemfile +++ b/Gemfile @@ -87,6 +87,7 @@ end group :test do gem "minitest" gem "mocha", "~> 1.0.0", :require => 'mocha/api' + gem "simplecov", "~> 0.9.1", :require => false # For running UI tests gem "capybara", "~> 2.1.0" gem "selenium-webdriver" diff --git a/lib/tasks/testing.rake b/lib/tasks/testing.rake index 274b868..e267d08 100644 --- a/lib/tasks/testing.rake +++ b/lib/tasks/testing.rake @@ -1,13 +1,9 @@ -### From http://svn.geekdaily.org/public/rails/plugins/generally_useful/tasks/coverage_via_rcov.rake - namespace :test do desc 'Measures test coverage' task :coverage do rm_f "coverage" - rm_f "coverage.data" - rcov = "rcov --rails --aggregate coverage.data --text-summary -Ilib --html --exclude gems/" - files = %w(unit functional integration).map {|dir| Dir.glob("test/#{dir}/**/*_test.rb")}.flatten.join(" ") - system("#{rcov} #{files}") + ENV["COVERAGE"] = "1" + Rake::Task["test"].invoke end desc 'Run unit and functional scm tests' diff --git a/test/coverage/html_formatter.rb b/test/coverage/html_formatter.rb new file mode 100644 index 0000000..4f86d70 --- /dev/null +++ b/test/coverage/html_formatter.rb @@ -0,0 +1,70 @@ +# Redmine - project management software +# Copyright (C) 2006-2014 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require 'erb' +require 'cgi' + +# A simple formatter for SimpleCov +module Redmine + module Coverage + class HtmlFormatter + def format(result) + File.open(File.join(output_path, "index.html"), "w") do |file| + file.puts template('index').result(binding) + end + result.source_files.each do |source_file| + File.open(File.join(output_path, source_file_result(source_file)), "w") do |file| + file.puts template('source').result(binding) + end + end + end + + private + + def now + @now = Time.now.utc + end + + def output_path + SimpleCov.coverage_path + end + + def shortened_filename(source_file) + source_file.filename.gsub(SimpleCov.root, '.').gsub(/^\.\//, '') + end + + def link_to_source_file(source_file) + %(#{shortened_filename source_file}) + end + + def source_file_result(source_file) + shortened_filename(source_file).gsub('/', '__')+'.html' + end + + def revision_link + if revision = Redmine::VERSION.revision + %(r#{revision}) + end + end + + # Returns the an erb instance for the template of given name + def template(name) + ERB.new(File.read(File.join(File.dirname(__FILE__), 'views', "#{name}.erb"))) + end + end + end +end diff --git a/test/coverage/views/index.erb b/test/coverage/views/index.erb new file mode 100644 index 0000000..f20aa6c --- /dev/null +++ b/test/coverage/views/index.erb @@ -0,0 +1,60 @@ + + + +Redmine code coverage + + + +

Redmine code coverage

+

+ Generated on <%= now %> (<%= revision_link %>). + More information about this environment at redmine.org. +

+ + + + + + + + + + + + + <% result.source_files.each do |source_file| %> + + + + + + + + + <% end %> + +
File% coveredLinesRelevantCovered
<%= link_to_source_file(source_file) %><%= "%.1f" % source_file.covered_percent %> % +
+
+
+
+
<%= source_file.lines.count %><%= source_file.covered_lines.count + source_file.missed_lines.count %><%= source_file.covered_lines.count %>
+ + diff --git a/test/coverage/views/source.erb b/test/coverage/views/source.erb new file mode 100644 index 0000000..adef172 --- /dev/null +++ b/test/coverage/views/source.erb @@ -0,0 +1,41 @@ + + + +Redmine code coverage + + + +

Redmine code coverage

+

+ Generated on <%= now %> (<%= revision_link %>). + More information about this environment at redmine.org. +

+

<%= shortened_filename source_file %> (<%= "%.1f" % source_file.covered_percent %> %)

+ +
+<% source_file.lines.each_with_index do |line, i| %> +
<%= i.to_s.rjust 4 %> <%= CGI.escapeHTML(line.src.chomp) %>
+<% end %> +
diff --git a/test/test_helper.rb b/test/test_helper.rb index 1eb2c7a..72c0643 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -15,6 +15,13 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +if ENV["COVERAGE"] + require 'simplecov' + require File.expand_path(File.dirname(__FILE__) + "/coverage/html_formatter") + SimpleCov.formatter = Redmine::Coverage::HtmlFormatter + SimpleCov.start 'rails' +end + ENV["RAILS_ENV"] = "test" require File.expand_path(File.dirname(__FILE__) + "/../config/environment") require 'rails/test_help'