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 @@ + +
+ ++ Generated on <%= now %> (<%= revision_link %>). + More information about this environment at redmine.org. +
+ +File | +% covered | +Lines | +Relevant | +Covered | +|
---|---|---|---|---|---|
<%= 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 %> | +