finnlabs-ci_reporter 1.6.5
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +136 -0
- data/LICENSE.txt +21 -0
- data/Manifest.txt +29 -0
- data/README.txt +65 -0
- data/Rakefile +101 -0
- data/lib/ci/reporter/core.rb +6 -0
- data/lib/ci/reporter/cucumber.rb +120 -0
- data/lib/ci/reporter/rake/cucumber.rb +19 -0
- data/lib/ci/reporter/rake/cucumber_loader.rb +6 -0
- data/lib/ci/reporter/rake/rspec.rb +25 -0
- data/lib/ci/reporter/rake/rspec_loader.rb +6 -0
- data/lib/ci/reporter/rake/test_unit.rb +15 -0
- data/lib/ci/reporter/rake/test_unit_loader.rb +21 -0
- data/lib/ci/reporter/rake/utils.rb +14 -0
- data/lib/ci/reporter/report_manager.rb +34 -0
- data/lib/ci/reporter/rspec.rb +189 -0
- data/lib/ci/reporter/test_suite.rb +151 -0
- data/lib/ci/reporter/test_unit.rb +132 -0
- data/lib/ci/reporter/version.rb +5 -0
- data/spec/ci/reporter/cucumber_spec.rb +230 -0
- data/spec/ci/reporter/output_capture_spec.rb +57 -0
- data/spec/ci/reporter/rake/rake_tasks_spec.rb +100 -0
- data/spec/ci/reporter/report_manager_spec.rb +51 -0
- data/spec/ci/reporter/rspec_spec.rb +146 -0
- data/spec/ci/reporter/test_suite_spec.rb +151 -0
- data/spec/ci/reporter/test_unit_spec.rb +152 -0
- data/spec/spec_helper.rb +21 -0
- data/stub.rake +14 -0
- data/tasks/ci_reporter.rake +18 -0
- metadata +124 -0
data/History.txt
ADDED
@@ -0,0 +1,136 @@
|
|
1
|
+
== 1.6.4 (12/21/10)
|
2
|
+
|
3
|
+
- RSpec 2.2+ support (thanks emi)
|
4
|
+
|
5
|
+
== 1.6.3
|
6
|
+
|
7
|
+
- Thanks to yairgo and tylerkovacs for their assistance and prodding
|
8
|
+
for RSpec 2 support this release.
|
9
|
+
- GH #4: Updated for modern Cucumber (0.9.2 as of this writing)
|
10
|
+
- GH #6: Capture dynamically-named RSpec examples
|
11
|
+
- GH #7: RSpec 2.0.0 compatibility
|
12
|
+
|
13
|
+
== 1.6.2
|
14
|
+
|
15
|
+
- GH #1: Properly escape text in system-out and system-err tags (Matt Kanwisher)
|
16
|
+
- GH #2: Report rspec before(:all) failures (Edgars Beigarts)
|
17
|
+
- GH #3: Support for Omissions and Pending Tests from Test::Unit 2.0.x (Sam Hendley)
|
18
|
+
|
19
|
+
== 1.6.1
|
20
|
+
|
21
|
+
- Add 'skipped' flag for pending RSpec examples (Aaron Unger)
|
22
|
+
|
23
|
+
== 1.6.0
|
24
|
+
|
25
|
+
- Add support for Cucumber (tested against 0.3.0 - 0.3.2); (Graeme Mathieson)
|
26
|
+
|
27
|
+
== 1.5.3
|
28
|
+
|
29
|
+
- Compatibility with latest RSpec (1.2.4); (Paul Boone)
|
30
|
+
|
31
|
+
== 1.5.2
|
32
|
+
|
33
|
+
- Compatibility with latest RSpec (1.1.11 or so); use example
|
34
|
+
description method if available
|
35
|
+
- Remove dependency on rubygems when requiring builder (rescue
|
36
|
+
LoadError) (Jari Bakken)
|
37
|
+
- Source repository moved to github/git.caldersphere.net
|
38
|
+
|
39
|
+
== 1.5.1
|
40
|
+
|
41
|
+
- Fix silly load-path error that some had been seeing
|
42
|
+
|
43
|
+
== 1.5
|
44
|
+
|
45
|
+
- Support for RSpec 1.1.1 example groups (which broke ci_reporter 1.4)
|
46
|
+
- Change internal model to delegation instead of inheritance, allowing
|
47
|
+
ci_reporter to wrap different output formatters
|
48
|
+
- Add 'ci:setup:rspecdoc' task to output specdoc format instead of
|
49
|
+
progress
|
50
|
+
- Add support for pending examples; they will be listed in the report
|
51
|
+
XML as successful, but the name will have a '(PENDING)' tag appended
|
52
|
+
- Support for RSpec < 0.9 removed as promised; use 1.4 if you still
|
53
|
+
need to use an older version of RSpec
|
54
|
+
|
55
|
+
== 1.4
|
56
|
+
|
57
|
+
- Test::Unit tests that fail in multiple places (setup, test method,
|
58
|
+
and teardown) are now tracked (marcog)
|
59
|
+
- Explicit dependency requirement on Builder (>= 2.1.2)
|
60
|
+
- Use of RSpec < 0.9 is now deprecated; support will probably
|
61
|
+
disappear in the next version
|
62
|
+
|
63
|
+
== 1.3.5
|
64
|
+
|
65
|
+
- Change way we append to environment variables to appease windows
|
66
|
+
(Tracker #13998, Adam Anderson)
|
67
|
+
|
68
|
+
== 1.3.4
|
69
|
+
|
70
|
+
- Call #to_s on the object passed in as the test suite name;
|
71
|
+
compatibility fix for RSpec trunk which passes a
|
72
|
+
Spec::DSL::Description instead of a string
|
73
|
+
- Fix broken spec due to pending feature introduced in recent RSpec
|
74
|
+
- Fix compatibility for JRuby
|
75
|
+
- Add stub.rake file as another way to wrap existing Rakefile, with
|
76
|
+
note in README
|
77
|
+
|
78
|
+
== 1.3.3
|
79
|
+
|
80
|
+
- Use SPEC_OPTS instead of RSPECOPTS (Aslak Hellesøy)
|
81
|
+
- Add assertions attribute to individual test cases (Tracker #11563,
|
82
|
+
Andy Sipe)
|
83
|
+
|
84
|
+
== 1.3.2
|
85
|
+
|
86
|
+
- Fix bug trying to modify frozen environment strings
|
87
|
+
- Upgrade all specs to RSpec 1.0 style
|
88
|
+
- Add specs for rake tasks
|
89
|
+
|
90
|
+
== 1.3.1
|
91
|
+
|
92
|
+
- Fixed to be compatible with RSpec 1.0.x (added fourth parameter to
|
93
|
+
Formatter#dump_summary)
|
94
|
+
|
95
|
+
== 1.3
|
96
|
+
|
97
|
+
- Fixed to be compatible with RSpec 0.9
|
98
|
+
- Failure location text now contains both the exception message and
|
99
|
+
class name (in case the type and message attributes were truncated)
|
100
|
+
|
101
|
+
== 1.2.4
|
102
|
+
|
103
|
+
- Allow to report on RSpec specs when working with non-gem RSpec
|
104
|
+
- Note: CI::Reporter is only compatible with RSpec up to 0.8.2
|
105
|
+
|
106
|
+
== 1.2.3
|
107
|
+
|
108
|
+
- Append to TESTOPTS and RSPECOPTS environment variables (Bret
|
109
|
+
Pettichord) so that other apps can put values in them as well
|
110
|
+
|
111
|
+
== 1.2.2
|
112
|
+
|
113
|
+
- Responds to environment variable CI_CAPTURE: if set to "off",
|
114
|
+
stdout/stderr capture will be disabled.
|
115
|
+
|
116
|
+
== 1.2.1
|
117
|
+
|
118
|
+
- Add license and copyright information (finally)
|
119
|
+
|
120
|
+
== 1.2
|
121
|
+
|
122
|
+
- Capture standard output and standard error during each individual
|
123
|
+
test suite and include in the XML file in system-out and system-err
|
124
|
+
elements, respectively
|
125
|
+
(Tracker#9054[http://rubyforge.org/tracker/index.php?func=detail&aid=9054&group_id=2857&atid=11007])
|
126
|
+
|
127
|
+
== 1.1
|
128
|
+
|
129
|
+
- Add +assertions+ attribute to the +testsuite+ element that will
|
130
|
+
contain per-suite assertion counts when used with Test::Unit. Not
|
131
|
+
useful with applications that read Ant/JUnit XML, but custom
|
132
|
+
applications may wish to access it.
|
133
|
+
|
134
|
+
== 1.0
|
135
|
+
|
136
|
+
- Initial Release.
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# Copyright (c) 2006-2010 Nick Sieger <nicksieger@gmail.com>
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person
|
4
|
+
# obtaining a copy of this software and associated documentation files
|
5
|
+
# (the "Software"), to deal in the Software without restriction,
|
6
|
+
# including without limitation the rights to use, copy, modify, merge,
|
7
|
+
# publish, distribute, sublicense, and/or sell copies of the Software,
|
8
|
+
# and to permit persons to whom the Software is furnished to do so,
|
9
|
+
# subject to the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be
|
12
|
+
# included in all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
18
|
+
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
19
|
+
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
20
|
+
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
# SOFTWARE.
|
data/Manifest.txt
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
History.txt
|
2
|
+
Manifest.txt
|
3
|
+
README.txt
|
4
|
+
LICENSE.txt
|
5
|
+
Rakefile
|
6
|
+
stub.rake
|
7
|
+
lib/ci/reporter/core.rb
|
8
|
+
lib/ci/reporter/cucumber.rb
|
9
|
+
lib/ci/reporter/rake/cucumber.rb
|
10
|
+
lib/ci/reporter/rake/cucumber_loader.rb
|
11
|
+
lib/ci/reporter/rake/rspec.rb
|
12
|
+
lib/ci/reporter/rake/rspec_loader.rb
|
13
|
+
lib/ci/reporter/rake/test_unit.rb
|
14
|
+
lib/ci/reporter/rake/test_unit_loader.rb
|
15
|
+
lib/ci/reporter/rake/utils.rb
|
16
|
+
lib/ci/reporter/report_manager.rb
|
17
|
+
lib/ci/reporter/rspec.rb
|
18
|
+
lib/ci/reporter/test_suite.rb
|
19
|
+
lib/ci/reporter/test_unit.rb
|
20
|
+
lib/ci/reporter/version.rb
|
21
|
+
spec/ci/reporter/cucumber_spec.rb
|
22
|
+
spec/ci/reporter/output_capture_spec.rb
|
23
|
+
spec/ci/reporter/rake/rake_tasks_spec.rb
|
24
|
+
spec/ci/reporter/report_manager_spec.rb
|
25
|
+
spec/ci/reporter/rspec_spec.rb
|
26
|
+
spec/ci/reporter/test_suite_spec.rb
|
27
|
+
spec/ci/reporter/test_unit_spec.rb
|
28
|
+
spec/spec_helper.rb
|
29
|
+
tasks/ci_reporter.rake
|
data/README.txt
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
CI::Reporter is an add-on to Test::Unit, RSpec and Cucumber that allows you to generate XML reports of your test, spec and/or feature runs. The resulting files can be read by a continuous integration system that understands Ant's JUnit report XML format, thus allowing your CI system to track test/spec successes and failures.
|
2
|
+
|
3
|
+
== Installation
|
4
|
+
|
5
|
+
CI::Reporter is available as a gem. To install the gem, use the usual gem command:
|
6
|
+
|
7
|
+
gem install ci_reporter
|
8
|
+
|
9
|
+
== Usage
|
10
|
+
|
11
|
+
CI::Reporter works best with projects that use a +Rakefile+ along with the standard <code>Rake::TestTask</code> or <code>Spec::Rake::SpecTask/RSpec::Core::RakeTask</code> tasks for running tests or examples, respectively. In this fashion, it hooks into <code>Test::Unit</code> or +RSpec+ using environment variables recognized by these custom tasks to inject the CI::Reporter code into the test or spec runs. If you're using the Rails plugin, step 1 is unnecessary; skip to step 2.
|
12
|
+
|
13
|
+
1. To use CI::Reporter, simply add the following lines to your Rakefile:
|
14
|
+
|
15
|
+
require 'rubygems'
|
16
|
+
require 'ci/reporter/rake/rspec' # use this if you're using RSpec
|
17
|
+
require 'ci/reporter/rake/cucumber' # use this if you're using Cucumber
|
18
|
+
require 'ci/reporter/rake/test_unit' # use this if you're using Test::Unit
|
19
|
+
|
20
|
+
2. Next, either modify your Rakefile to make the <code>ci:setup:rspec</code>, <code>ci:setup:cucumber</code> or <code>ci:setup:testunit</code> task a dependency of your test tasks, or include them on the Rake command-line before the name of the task that runs the tests or specs.
|
21
|
+
|
22
|
+
rake ci:setup:testunit test
|
23
|
+
|
24
|
+
Report files are written, by default, to the <code>test/reports</code>, <code>features/reports</code> or <code>spec/reports</code> subdirectory of your project. If you wish to customize the location, simply set the environment variable CI_REPORTS (either in the environment, on the Rake command line, or in your Rakefile) to the location where they should go.
|
25
|
+
|
26
|
+
== Advanced Usage
|
27
|
+
|
28
|
+
If you don't have control over the Rakefile or don't want to modify it, CI::Reporter has a substitute rake file that you can specify on the command-line. It assumes that the main project rake file is called +Rakefile+ and lives in the current directory. Run like so:
|
29
|
+
|
30
|
+
rake -f GEM_PATH/stub.rake ci:setup:testunit test
|
31
|
+
rake -f GEM_PATH/stub.rake ci:setup:rspec spec
|
32
|
+
rake -f GEM_PATH/stub.rake ci:setup:cucumber features
|
33
|
+
|
34
|
+
If for some reason you can't use the above technique to inject CI::Reporter (e.g., you're not using Rake), you'll have to do one of these:
|
35
|
+
|
36
|
+
1. If you're using <code>Test::Unit</code>, ensure the <code>ci/reporter/rake/test_unit_loader.rb</code> file is loaded or required at some point before the tests are run.
|
37
|
+
|
38
|
+
2. If you're using +RSpec+, you'll need to pass the following arguments to the +spec+ command:
|
39
|
+
|
40
|
+
--require GEM_PATH/lib/ci/reporter/rake/rspec_loader
|
41
|
+
--format CI::Reporter::RSpec
|
42
|
+
|
43
|
+
3. If you're using Cucumber, you'll need to cheat slightly so that Cucumber's step definition autoloading will still work. Instead of calling the +cucumber+ script directly, run:
|
44
|
+
|
45
|
+
ruby -r GEM_PATH/lib/ci/reporter/rake/cucumber_loader -S cucumber --format CI::Reporter::Cucumber
|
46
|
+
|
47
|
+
There's a bit of a chicken and egg problem because rubygems needs to be loaded before you can require any CI::Reporter files. If you cringe hard-coding a full path to a specific version of the gem, you can also copy the +cucumber_loader+ file into your project and require it directly -- the contents are version-agnostic and are not likely to change in future releases.
|
48
|
+
|
49
|
+
== Environment Variables
|
50
|
+
|
51
|
+
* +CI_REPORTS+: if set, points to a directory where report files will be written.
|
52
|
+
* +CI_CAPTURE+: if set to value "off", stdout/stderr capture will be disabled.
|
53
|
+
|
54
|
+
== Source
|
55
|
+
|
56
|
+
You can get the CI::Reporter source using Git, in any of the following ways:
|
57
|
+
|
58
|
+
git clone git://git.caldersphere.net/ci_reporter.git
|
59
|
+
git clone git://github.com/nicksieger/ci_reporter.git
|
60
|
+
|
61
|
+
You can also download a tarball of the latest CI::Reporter source at http://github.com/nicksieger/ci_reporter/.
|
62
|
+
|
63
|
+
== License
|
64
|
+
|
65
|
+
This software is released under an MIT license. For details, see the LICENSE.txt file included with the distribution. The software is copyright (c) 2006-2010 Nick Sieger <nicksieger@gmail.com>.
|
data/Rakefile
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
MANIFEST = FileList["History.txt", "Manifest.txt", "README.txt", "LICENSE.txt", "Rakefile",
|
2
|
+
"*.rake", "lib/**/*.rb", "spec/**/*.rb", "tasks/**/*.rake"]
|
3
|
+
|
4
|
+
begin
|
5
|
+
File.open("Manifest.txt", "w") {|f| MANIFEST.each {|n| f << "#{n}\n"} }
|
6
|
+
require 'hoe'
|
7
|
+
require File.dirname(__FILE__) + '/lib/ci/reporter/version'
|
8
|
+
hoe = Hoe.spec("finnlabs-ci_reporter") do |p|
|
9
|
+
p.version = CI::Reporter::VERSION
|
10
|
+
p.url = "https://github.com/finnlabs/ci_reporter"
|
11
|
+
p.author = ["Nick Sieger", "Gregor Schmidt"]
|
12
|
+
p.email = "ruby@schmidtwisser.de"
|
13
|
+
p.summary = "CI::Reporter allows you to generate reams of XML for use with continuous integration systems."
|
14
|
+
p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
|
15
|
+
p.description = p.paragraphs_of('README.txt', 0...1).join("\n\n")
|
16
|
+
p.extra_deps.reject!{|d| d.first == "hoe"}
|
17
|
+
p.test_globs = ["spec/**/*_spec.rb"]
|
18
|
+
p.extra_deps << ['builder', ">= 2.1.2"]
|
19
|
+
end
|
20
|
+
hoe.spec.files = MANIFEST
|
21
|
+
hoe.spec.dependencies.delete_if { |dep| dep.name == "hoe" }
|
22
|
+
hoe.spec.rdoc_options += ["-SHN", "-f", "darkfish"]
|
23
|
+
|
24
|
+
task :gemspec do
|
25
|
+
File.open("#{hoe.name}.gemspec", "w") {|f| f << hoe.spec.to_ruby }
|
26
|
+
end
|
27
|
+
task :package => :gemspec
|
28
|
+
rescue LoadError
|
29
|
+
puts "You really need Hoe installed to be able to package this gem"
|
30
|
+
end
|
31
|
+
|
32
|
+
# Hoe insists on setting task :default => :test
|
33
|
+
# !@#$ no easy way to empty the default list of prerequisites
|
34
|
+
# Leave my tasks alone, Hoe
|
35
|
+
%w(default spec rcov).each do |task|
|
36
|
+
next unless Rake::Task.task_defined?(task)
|
37
|
+
Rake::Task[task].prerequisites.clear
|
38
|
+
Rake::Task[task].actions.clear
|
39
|
+
end
|
40
|
+
|
41
|
+
# No RCov on JRuby at the moment
|
42
|
+
if RUBY_PLATFORM =~ /java/
|
43
|
+
task :default => :spec
|
44
|
+
else
|
45
|
+
task :default => :rcov
|
46
|
+
end
|
47
|
+
|
48
|
+
RSpecTask = begin
|
49
|
+
require 'rspec/core/rake_task'
|
50
|
+
@spec_bin = 'rspec'
|
51
|
+
RSpec::Core::RakeTask
|
52
|
+
rescue LoadError
|
53
|
+
require 'spec/rake/spectask'
|
54
|
+
@spec_bin = 'spec'
|
55
|
+
Spec::Rake::SpecTask
|
56
|
+
end
|
57
|
+
|
58
|
+
RSpecTask.new do |t|
|
59
|
+
end
|
60
|
+
|
61
|
+
RSpecTask.new("spec:rcov") do |t|
|
62
|
+
t.rcov_opts = ['--exclude gems/*']
|
63
|
+
t.rcov = true
|
64
|
+
end
|
65
|
+
|
66
|
+
begin
|
67
|
+
require 'spec/rake/verify_rcov'
|
68
|
+
# so we don't confuse autotest
|
69
|
+
RCov::VerifyTask.new(:rcov) do |t|
|
70
|
+
# Can't get threshold up to 100 unless RSpec backwards compatibility
|
71
|
+
# code is dropped
|
72
|
+
t.threshold = 95
|
73
|
+
t.require_exact_threshold = false
|
74
|
+
end
|
75
|
+
rescue LoadError
|
76
|
+
end
|
77
|
+
|
78
|
+
task "spec:rcov" do
|
79
|
+
rm_f "Manifest.txt"
|
80
|
+
end
|
81
|
+
task :rcov => "spec:rcov"
|
82
|
+
|
83
|
+
task :generate_output do
|
84
|
+
rm_rf "acceptance/reports"
|
85
|
+
ENV['CI_REPORTS'] = "acceptance/reports"
|
86
|
+
begin
|
87
|
+
`ruby -Ilib -rubygems -rci/reporter/rake/test_unit_loader acceptance/test_unit_example_test.rb` rescue puts "Warning: #{$!}"
|
88
|
+
`ruby -Ilib -rubygems -S #{@spec_bin} --require ci/reporter/rake/rspec_loader --format CI::Reporter::RSpec acceptance/rspec_example_spec.rb` rescue puts "Warning: #{$!}"
|
89
|
+
`ruby -Ilib -rubygems -rci/reporter/rake/cucumber_loader -S cucumber --format CI::Reporter::Cucumber acceptance/cucumber` rescue puts "Warning: #{$!}"
|
90
|
+
ensure
|
91
|
+
ENV.delete 'CI_REPORTS'
|
92
|
+
end
|
93
|
+
end
|
94
|
+
task :acceptance => :generate_output
|
95
|
+
|
96
|
+
RSpecTask.new(:acceptance_spec) do |t|
|
97
|
+
t.pattern = FileList['acceptance/verification_spec.rb']
|
98
|
+
end
|
99
|
+
task :acceptance => :acceptance_spec
|
100
|
+
|
101
|
+
task :default => :acceptance
|
@@ -0,0 +1,120 @@
|
|
1
|
+
# Copyright (c) 2006-2010 Nick Sieger <nicksieger@gmail.com>
|
2
|
+
# See the file LICENSE.txt included with the distribution for
|
3
|
+
# software license details.
|
4
|
+
|
5
|
+
require 'ci/reporter/core'
|
6
|
+
require 'cucumber'
|
7
|
+
begin
|
8
|
+
require 'cucumber/ast/visitor'
|
9
|
+
rescue LoadError
|
10
|
+
end
|
11
|
+
|
12
|
+
module CI
|
13
|
+
module Reporter
|
14
|
+
class CucumberFailure
|
15
|
+
attr_reader :step
|
16
|
+
|
17
|
+
def initialize(step)
|
18
|
+
@step = step
|
19
|
+
end
|
20
|
+
|
21
|
+
def failure?
|
22
|
+
true
|
23
|
+
end
|
24
|
+
|
25
|
+
def error?
|
26
|
+
!failure?
|
27
|
+
end
|
28
|
+
|
29
|
+
def name
|
30
|
+
step.exception.class.name
|
31
|
+
end
|
32
|
+
|
33
|
+
def message
|
34
|
+
step.exception.message
|
35
|
+
end
|
36
|
+
|
37
|
+
def location
|
38
|
+
step.exception.backtrace.join("\n")
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
class Cucumber
|
43
|
+
attr_accessor :report_manager, :test_suite, :name
|
44
|
+
|
45
|
+
def initialize(step_mother, io, options)
|
46
|
+
@report_manager = ReportManager.new("features")
|
47
|
+
end
|
48
|
+
|
49
|
+
def before_feature(feature)
|
50
|
+
self.test_suite = TestSuite.new(@name)
|
51
|
+
test_suite.start
|
52
|
+
end
|
53
|
+
|
54
|
+
def after_feature(feature)
|
55
|
+
test_suite.name = @name
|
56
|
+
test_suite.finish
|
57
|
+
report_manager.write_report(@test_suite)
|
58
|
+
@test_suite = nil
|
59
|
+
end
|
60
|
+
|
61
|
+
def before_background(*args)
|
62
|
+
end
|
63
|
+
|
64
|
+
def after_background(*args)
|
65
|
+
end
|
66
|
+
|
67
|
+
def feature_name(keyword, name)
|
68
|
+
@name = (name || "Unnamed feature").split("\n").first
|
69
|
+
end
|
70
|
+
|
71
|
+
def scenario_name(keyword, name, *args)
|
72
|
+
@scenario = (name || "Unnamed scenario").split("\n").first
|
73
|
+
end
|
74
|
+
|
75
|
+
def before_steps(steps)
|
76
|
+
@test_case = TestCase.new(@scenario)
|
77
|
+
@test_case.start
|
78
|
+
end
|
79
|
+
|
80
|
+
def after_steps(steps)
|
81
|
+
@test_case.finish
|
82
|
+
|
83
|
+
case steps.status
|
84
|
+
when :pending, :undefined
|
85
|
+
@test_case.name = "#{@test_case.name} (PENDING)"
|
86
|
+
when :skipped
|
87
|
+
@test_case.name = "#{@test_case.name} (SKIPPED)"
|
88
|
+
when :failed
|
89
|
+
@test_case.failures << CucumberFailure.new(steps)
|
90
|
+
end
|
91
|
+
|
92
|
+
test_suite.testcases << @test_case
|
93
|
+
@test_case = nil
|
94
|
+
end
|
95
|
+
|
96
|
+
def before_examples(*args)
|
97
|
+
@header_row = true
|
98
|
+
end
|
99
|
+
|
100
|
+
def after_examples(*args)
|
101
|
+
end
|
102
|
+
|
103
|
+
def before_table_row(table_row)
|
104
|
+
@test_case = TestCase.new("#@scenario (outline: #{table_row.name})")
|
105
|
+
@test_case.start
|
106
|
+
end
|
107
|
+
|
108
|
+
def after_table_row(table_row)
|
109
|
+
if @header_row
|
110
|
+
@header_row = false
|
111
|
+
return
|
112
|
+
end
|
113
|
+
@test_case.finish
|
114
|
+
@test_case.failures << CucumberFailure.new(table_row) if table_row.failed?
|
115
|
+
test_suite.testcases << @test_case
|
116
|
+
@test_case = nil
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# Copyright (c) 2006-2010 Nick Sieger <nicksieger@gmail.com>
|
2
|
+
# See the file LICENSE.txt included with the distribution for
|
3
|
+
# software license details.
|
4
|
+
|
5
|
+
require File.expand_path('../utils', __FILE__)
|
6
|
+
|
7
|
+
namespace :ci do
|
8
|
+
namespace :setup do
|
9
|
+
task :cucumber_report_cleanup do
|
10
|
+
rm_rf ENV["CI_REPORTS"] || "features/reports"
|
11
|
+
end
|
12
|
+
|
13
|
+
task :cucumber => :cucumber_report_cleanup do
|
14
|
+
cuke_opts = ["--require", CI::Reporter.maybe_quote_filename("#{File.dirname(__FILE__)}/cucumber_loader.rb"),
|
15
|
+
"--format", "CI::Reporter::Cucumber"].join(" ")
|
16
|
+
ENV["CUCUMBER_OPTS"] = "#{ENV['CUCUMBER_OPTS']} #{cuke_opts}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# Copyright (c) 2006-2010 Nick Sieger <nicksieger@gmail.com>
|
2
|
+
# See the file LICENSE.txt included with the distribution for
|
3
|
+
# software license details.
|
4
|
+
|
5
|
+
require File.expand_path('../utils', __FILE__)
|
6
|
+
|
7
|
+
namespace :ci do
|
8
|
+
namespace :setup do
|
9
|
+
task :spec_report_cleanup do
|
10
|
+
rm_rf ENV["CI_REPORTS"] || "spec/reports"
|
11
|
+
end
|
12
|
+
|
13
|
+
task :rspec => :spec_report_cleanup do
|
14
|
+
spec_opts = ["--require", CI::Reporter.maybe_quote_filename("#{File.dirname(__FILE__)}/rspec_loader.rb"),
|
15
|
+
"--format", "CI::Reporter::RSpec"].join(" ")
|
16
|
+
ENV["SPEC_OPTS"] = "#{ENV['SPEC_OPTS']} #{spec_opts}"
|
17
|
+
end
|
18
|
+
|
19
|
+
task :rspecdoc => :spec_report_cleanup do
|
20
|
+
spec_opts = ["--require", CI::Reporter.maybe_quote_filename("#{File.dirname(__FILE__)}/rspec_loader.rb"),
|
21
|
+
"--format", "CI::Reporter::RSpecDoc"].join(" ")
|
22
|
+
ENV["SPEC_OPTS"] = "#{ENV['SPEC_OPTS']} #{spec_opts}"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# Copyright (c) 2006-2010 Nick Sieger <nicksieger@gmail.com>
|
2
|
+
# See the file LICENSE.txt included with the distribution for
|
3
|
+
# software license details.
|
4
|
+
|
5
|
+
require File.expand_path('../utils', __FILE__)
|
6
|
+
|
7
|
+
namespace :ci do
|
8
|
+
namespace :setup do
|
9
|
+
task :testunit do
|
10
|
+
rm_rf ENV["CI_REPORTS"] || "test/reports"
|
11
|
+
test_loader = CI::Reporter.maybe_quote_filename "#{File.dirname(__FILE__)}/test_unit_loader.rb"
|
12
|
+
ENV["TESTOPTS"] = "#{ENV["TESTOPTS"]} #{test_loader}"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# Copyright (c) 2006-2010 Nick Sieger <nicksieger@gmail.com>
|
2
|
+
# See the file LICENSE.txt included with the distribution for
|
3
|
+
# software license details.
|
4
|
+
|
5
|
+
$: << File.dirname(__FILE__) + "/../../.."
|
6
|
+
require 'ci/reporter/test_unit'
|
7
|
+
|
8
|
+
module Test #:nodoc:all
|
9
|
+
module Unit
|
10
|
+
module UI
|
11
|
+
module Console
|
12
|
+
class TestRunner
|
13
|
+
def create_mediator(suite)
|
14
|
+
# swap in our custom mediator
|
15
|
+
return CI::Reporter::TestUnit.new(suite)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# Copyright (c) 2006-2010 Nick Sieger <nicksieger@gmail.com>
|
2
|
+
# See the file LICENSE.txt included with the distribution for
|
3
|
+
# software license details.
|
4
|
+
|
5
|
+
module CI
|
6
|
+
module Reporter
|
7
|
+
def self.maybe_quote_filename(fn)
|
8
|
+
if fn =~ /\s/
|
9
|
+
fn = %{"#{fn}"}
|
10
|
+
end
|
11
|
+
fn
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# Copyright (c) 2006-2010 Nick Sieger <nicksieger@gmail.com>
|
2
|
+
# See the file LICENSE.txt included with the distribution for
|
3
|
+
# software license details.
|
4
|
+
|
5
|
+
require 'fileutils'
|
6
|
+
require 'digest/sha1'
|
7
|
+
|
8
|
+
module CI #:nodoc:
|
9
|
+
module Reporter #:nodoc:
|
10
|
+
class ReportManager
|
11
|
+
def initialize(prefix)
|
12
|
+
@basedir = ENV['CI_REPORTS'] || File.expand_path("#{Dir.getwd}/#{prefix.downcase}/reports")
|
13
|
+
@basename = "#{prefix.upcase}"
|
14
|
+
FileUtils.mkdir_p(@basedir)
|
15
|
+
end
|
16
|
+
|
17
|
+
def write_report(suite)
|
18
|
+
File.open(filename(suite.name), "w") do |f|
|
19
|
+
f << suite.to_xml
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
protected
|
24
|
+
|
25
|
+
def filename(test_name)
|
26
|
+
filebase = "#{@basename}-#{test_name.gsub(/[^a-zA-Z0-9]+/, '-')}"
|
27
|
+
if filebase.size > 251
|
28
|
+
filebase = "#{filebase[0..209]}-#{Digest::SHA1.hexdigest(filebase[209..-1])}"
|
29
|
+
end
|
30
|
+
"#{@basedir}/#{filebase}.xml"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|