rutema 0.4.3 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +8 -0
- data/Manifest.txt +14 -21
- data/README.txt +3 -2
- data/Rakefile +3 -2
- data/bin/rutemaweb +3 -3
- data/lib/rutema/historian.rb +6 -0
- data/lib/rutema/reporter_ar.rb +6 -2
- data/lib/rutema/system.rb +30 -8
- data/lib/rutemaweb/{htdocs → public}/bg_menu.gif +0 -0
- data/lib/rutemaweb/{htdocs → public}/bg_submenu.gif +0 -0
- data/lib/rutemaweb/{htdocs → public}/run_error.png +0 -0
- data/lib/rutemaweb/{htdocs → public}/run_ok.png +0 -0
- data/lib/rutemaweb/{htdocs → public}/run_warn.png +0 -0
- data/lib/rutemaweb/{htdocs → public}/step_error.png +0 -0
- data/lib/rutemaweb/{htdocs → public}/step_ok.png +0 -0
- data/lib/rutemaweb/{htdocs → public}/step_warn.png +0 -0
- data/lib/rutemaweb/{htdocs → public}/style.css +3 -3
- data/lib/rutemaweb/{htdocs → public}/tie_logo.gif +0 -0
- data/lib/rutemaweb/ramaze_controller.rb +164 -0
- data/lib/rutemaweb/view/layout.rhtml +47 -0
- data/test/distro_test/config/database.rutema +0 -1
- data/test/rutema.rutema +3 -0
- data/test/rutema.spec +9 -0
- metadata +27 -15
- data/lib/rutemaweb/rutemaweb.rb +0 -245
data/History.txt
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
== 0.5.0 / 2008-02-26
|
2
|
+
* activerecord reporter is now loaded by default (no need to require it in the configuration file)
|
3
|
+
* bugfix: step names correctly written in the database
|
4
|
+
* The web frontend now uses Ramaze
|
5
|
+
* using patir-0.5.3 because of the chdir bugfixes
|
6
|
+
* rutema can now test itself! rutemax and rutemah return meaningful exit codes. So there, we do it our own dogfood
|
7
|
+
* lots more documentation on usage and how to build a parser
|
8
|
+
|
1
9
|
== 0.4.3 / 2008-02-25
|
2
10
|
* fixed bug in rutemax when the activerecord reporter is used, where the database was not created relative to the configuration entry
|
3
11
|
* fixed bug in rutemah where the report was not printed (doh!)
|
data/Manifest.txt
CHANGED
@@ -13,32 +13,25 @@ lib/rutema/reporter.rb
|
|
13
13
|
lib/rutema/reporter_ar.rb
|
14
14
|
lib/rutema/historian.rb
|
15
15
|
lib/rutema/model.rb
|
16
|
-
lib/rutemaweb/
|
17
|
-
lib/rutemaweb/
|
18
|
-
lib/rutemaweb/
|
19
|
-
lib/rutemaweb/
|
20
|
-
lib/rutemaweb/
|
21
|
-
lib/rutemaweb/
|
22
|
-
lib/rutemaweb/
|
23
|
-
lib/rutemaweb/
|
24
|
-
lib/rutemaweb/
|
25
|
-
lib/rutemaweb/
|
26
|
-
lib/rutemaweb/
|
27
|
-
lib/rutemaweb/
|
28
|
-
lib/rutemaweb/htdocs/bg_submenu.gif
|
29
|
-
lib/rutemaweb/htdocs/run_error.png
|
30
|
-
lib/rutemaweb/htdocs/run_ok.png
|
31
|
-
lib/rutemaweb/htdocs/run_warn.png
|
32
|
-
lib/rutemaweb/htdocs/step_error.png
|
33
|
-
lib/rutemaweb/htdocs/step_ok.png
|
34
|
-
lib/rutemaweb/htdocs/step_warn.png
|
35
|
-
lib/rutemaweb/htdocs/style.css
|
36
|
-
lib/rutemaweb/htdocs/tie_logo.gif
|
16
|
+
lib/rutemaweb/ramaze_controller.rb
|
17
|
+
lib/rutemaweb/public/bg_menu.gif
|
18
|
+
lib/rutemaweb/public/bg_submenu.gif
|
19
|
+
lib/rutemaweb/public/run_error.png
|
20
|
+
lib/rutemaweb/public/run_ok.png
|
21
|
+
lib/rutemaweb/public/run_warn.png
|
22
|
+
lib/rutemaweb/public/step_error.png
|
23
|
+
lib/rutemaweb/public/step_ok.png
|
24
|
+
lib/rutemaweb/public/step_warn.png
|
25
|
+
lib/rutemaweb/public/style.css
|
26
|
+
lib/rutemaweb/public/tie_logo.gif
|
27
|
+
lib/rutemaweb/view/layout.rhtml
|
37
28
|
test/test_configuration.rb
|
38
29
|
test/test_specification.rb
|
39
30
|
test/test_system.rb
|
40
31
|
test/test_historian.rb
|
41
32
|
test/test_reporter.rb
|
33
|
+
test/rutema.rutema
|
34
|
+
test/rutema.spec
|
42
35
|
test/samples/check.spec
|
43
36
|
test/samples/setup.spec
|
44
37
|
test/samples/teardown.spec
|
data/README.txt
CHANGED
@@ -16,6 +16,8 @@ For more information look at http://patir.rubyforge.org/rutema
|
|
16
16
|
* rutemah - a tool to create reports out of a test result database
|
17
17
|
* rutemaweb - a web frontend for the test result database
|
18
18
|
|
19
|
+
There is a bug in camping 1.5 (in camping/webrick.rb line 59 res should be resp) that prevents the stylesheet from loading
|
20
|
+
|
19
21
|
== SYNOPSIS:
|
20
22
|
|
21
23
|
Once installed (which is simple) and configured (which can vary from simple to highly complex but is usually more complex than tying your shoelaces) you can do:
|
@@ -31,13 +33,12 @@ rutemax -c sample.cfg unattended - to run all unattended tests
|
|
31
33
|
== REQUIREMENTS:
|
32
34
|
|
33
35
|
* patir (http://patir.rubyforge.org)
|
34
|
-
* highline (http://highline.rubyforge.org)
|
35
36
|
* mailfactory (http://rubyforge.org/projects/mailfactory/)
|
36
37
|
* activerecord (http://ar.rubyonrails.com/)
|
37
38
|
* sqlite3 (http://rubyforge.org/projects/sqlite-ruby/)
|
38
39
|
* camping (http://camping.rubyforge.org/)
|
39
40
|
* ruport (http://rubyreports.org/)
|
40
|
-
|
41
|
+
* acts_as_reportable
|
41
42
|
== INSTALL:
|
42
43
|
|
43
44
|
* gem install rutema
|
data/Rakefile
CHANGED
@@ -14,13 +14,14 @@ Hoe.new('rutema', "#{Rutema::Version::STRING}") do |p|
|
|
14
14
|
p.description = p.paragraphs_of('README.txt', 1..5).join("\n\n")
|
15
15
|
p.url = p.paragraphs_of('README.txt', 0).first.split(/\n/)[1..-1]
|
16
16
|
p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
|
17
|
-
p.extra_deps<<['patir',">=0.
|
17
|
+
p.extra_deps<<['patir',">=0.5.2"]
|
18
18
|
p.extra_deps<<['highline']
|
19
19
|
p.extra_deps<<['mailfactory']
|
20
20
|
p.extra_deps<<['activerecord']
|
21
21
|
p.extra_deps<<['ruport']
|
22
22
|
p.extra_deps<<['acts_as_reportable']
|
23
|
-
p.extra_deps<<['
|
23
|
+
p.extra_deps<<['ramaze']
|
24
|
+
p.extra_deps<<['erubis']
|
24
25
|
p.spec_extras={:executables=>["rutemax","rutemah","rutemaweb"],
|
25
26
|
:default_executable=>"rutemax"}
|
26
27
|
end
|
data/bin/rutemaweb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
# Copyright (c) 2007 Vassilis Rizopoulos. All rights reserved.
|
2
2
|
begin
|
3
|
-
require 'rutemaweb/
|
3
|
+
require 'rutemaweb/ramaze_controller'
|
4
4
|
rescue LoadError
|
5
5
|
require 'rubygems'
|
6
|
-
require 'rutemaweb/
|
6
|
+
require 'rutemaweb/ramaze_controller'
|
7
7
|
end
|
8
8
|
|
9
|
-
|
9
|
+
start_ramaze
|
data/lib/rutema/historian.rb
CHANGED
@@ -96,12 +96,18 @@ module Rutema
|
|
96
96
|
end
|
97
97
|
def connect
|
98
98
|
ActiveRecord::Base.logger = @logger
|
99
|
+
if @configuration.source
|
99
100
|
if File.exist?(@configuration.source)
|
100
101
|
@logger.info("Connecting with database '#{@configuration.source}'")
|
101
102
|
ActiveRecord::Base.establish_connection(:adapter=>"sqlite3", :database=>@configuration.source )
|
102
103
|
else
|
103
104
|
@logger.fatal("Could not find #{@configuration.source}")
|
105
|
+
exit 1
|
104
106
|
end
|
107
|
+
else
|
108
|
+
@logger.fatal("No database source defined in the configuration")
|
109
|
+
exit 1
|
110
|
+
end
|
105
111
|
end
|
106
112
|
end
|
107
113
|
end
|
data/lib/rutema/reporter_ar.rb
CHANGED
@@ -14,7 +14,11 @@ module Rutema
|
|
14
14
|
@logger=definition[:logger]
|
15
15
|
@logger||=Patir.setup_logger
|
16
16
|
raise "No database file defined" unless definition[:dbfile]
|
17
|
-
|
17
|
+
unless definition[:dbfile]==":memory:"
|
18
|
+
@dbfile=File.expand_path(definition[:dbfile])
|
19
|
+
else
|
20
|
+
@dbfile=definition[:dbfile]
|
21
|
+
end
|
18
22
|
connect
|
19
23
|
end
|
20
24
|
|
@@ -53,7 +57,7 @@ module Rutema
|
|
53
57
|
end
|
54
58
|
scenario.step_states.each do |number,step|
|
55
59
|
st=Model::Step.new
|
56
|
-
st.name=step[:
|
60
|
+
st.name=step[:step_type]
|
57
61
|
st.number=number
|
58
62
|
st.status=step[:status].to_s
|
59
63
|
st.output=step[:output]
|
data/lib/rutema/system.rb
CHANGED
@@ -4,7 +4,7 @@ require 'rexml/document'
|
|
4
4
|
|
5
5
|
require 'rutema/specification'
|
6
6
|
require 'rutema/configuration'
|
7
|
-
require 'rutema/
|
7
|
+
require 'rutema/reporter_ar'
|
8
8
|
|
9
9
|
|
10
10
|
require 'rubygems'
|
@@ -15,8 +15,8 @@ module Rutema
|
|
15
15
|
#This module defines the version numbers for the library
|
16
16
|
module Version
|
17
17
|
MAJOR=0
|
18
|
-
MINOR=
|
19
|
-
TINY=
|
18
|
+
MINOR=5
|
19
|
+
TINY=0
|
20
20
|
STRING=[ MAJOR, MINOR, TINY ].join( "." )
|
21
21
|
end
|
22
22
|
#Is raised when an error is found in a specification
|
@@ -167,7 +167,7 @@ module Rutema
|
|
167
167
|
def parse_specification param
|
168
168
|
spec = super(param)
|
169
169
|
#change into the directory the spec is in to handle relative paths correctly
|
170
|
-
Dir.chdir(File.dirname(spec.filename)) do |path|
|
170
|
+
Dir.chdir(File.dirname(File.expand_path(spec.filename))) do |path|
|
171
171
|
spec.scenario.steps.each do |step|
|
172
172
|
case step.step_type
|
173
173
|
when "echo"
|
@@ -241,11 +241,13 @@ module Rutema
|
|
241
241
|
@logger.debug("Running #{spec}")
|
242
242
|
run_test(spec) if spec
|
243
243
|
else
|
244
|
-
@logger.
|
244
|
+
@logger.fatal("Don't know how to run '#{mode}'")
|
245
|
+
exit 1
|
245
246
|
end
|
246
247
|
rescue
|
247
248
|
@logger.debug($!)
|
248
|
-
@logger.
|
249
|
+
@logger.fatal("Runner error: #{$!.message}")
|
250
|
+
exit 1
|
249
251
|
end
|
250
252
|
@configuration.context.end_time=Time.now
|
251
253
|
@logger.info("Run completed in #{@configuration.context.end_time-@configuration.context.start_time}s")
|
@@ -267,7 +269,11 @@ module Rutema
|
|
267
269
|
t.join
|
268
270
|
end
|
269
271
|
end
|
270
|
-
|
272
|
+
|
273
|
+
#returns true if all scenarios in the last run were succesful
|
274
|
+
def last_run_a_success?
|
275
|
+
return @runner.success?
|
276
|
+
end
|
271
277
|
def to_s
|
272
278
|
"Parsed #{@parsed_files.size} files\n#{Rutema.text_report(@runner.states.values,@parse_errors)}"
|
273
279
|
end
|
@@ -416,6 +422,15 @@ module Rutema
|
|
416
422
|
@states.clear
|
417
423
|
@number_of_runs=0
|
418
424
|
end
|
425
|
+
|
426
|
+
#returns true if all the scenarios in the last run were succesfull or if nothing was run yet
|
427
|
+
def success?
|
428
|
+
@success=true
|
429
|
+
@states.each do |k,v|
|
430
|
+
@success&=v.success?
|
431
|
+
end
|
432
|
+
return @success
|
433
|
+
end
|
419
434
|
private
|
420
435
|
def run_scenario name,scenario
|
421
436
|
state=Patir::CommandSequenceStatus.new(name,scenario.steps)
|
@@ -555,7 +570,8 @@ module Rutema
|
|
555
570
|
if @configuration.check
|
556
571
|
@coordinator.run(@configuration.check)
|
557
572
|
else
|
558
|
-
@logger.
|
573
|
+
@logger.fatal("There is no check test defined in the configuration.")
|
574
|
+
exit 1
|
559
575
|
end
|
560
576
|
else
|
561
577
|
#run everything
|
@@ -563,6 +579,12 @@ module Rutema
|
|
563
579
|
end
|
564
580
|
@logger.info("Report:\n#{@coordinator.to_s}")
|
565
581
|
@coordinator.report
|
582
|
+
if @coordinator.parse_errors.empty? && @coordinator.last_run_a_success?
|
583
|
+
exit 0
|
584
|
+
else
|
585
|
+
@logger.warn("Not all tests were succesfull")
|
586
|
+
exit 1
|
587
|
+
end
|
566
588
|
end
|
567
589
|
end
|
568
590
|
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -13,11 +13,11 @@ table {
|
|
13
13
|
text-align: center;
|
14
14
|
|
15
15
|
}
|
16
|
-
#logo{float:left; background-image:url(tie_logo.gif); width:234px; height:213px;}
|
16
|
+
#logo{float:left; background-image:url(/tie_logo.gif); width:234px; height:213px;}
|
17
17
|
#topheader{float:right; width:566px; height:97px; background-color:#F0F0F0; position:relative}
|
18
18
|
#toplinks{position:absolute; right:10px; top:10px;}
|
19
|
-
#menu{float:right; width:566px; height:32px; background-image:url(bg_menu.gif); background-repeat:repeat-x;}
|
20
|
-
#submenu{float:right; width:566px; height:32px; background-image:url(bg_submenu.gif); background-position:top; background-repeat:repeat-x;}
|
19
|
+
#menu{float:right; width:566px; height:32px; background-image:url(/bg_menu.gif); background-repeat:repeat-x;}
|
20
|
+
#submenu{float:right; width:566px; height:32px; background-image:url(/bg_submenu.gif); background-position:top; background-repeat:repeat-x;}
|
21
21
|
#contenttext{float:right; width:566px;}
|
22
22
|
#contentnopanel{float:left; width:800px}
|
23
23
|
#leftpanel{float:left; width:234px;}
|
File without changes
|
@@ -0,0 +1,164 @@
|
|
1
|
+
# Copyright (c) 2008 Vassilis Rizopoulos. All rights reserved.
|
2
|
+
$:.unshift File.join(File.dirname(__FILE__),"..")
|
3
|
+
require 'rutema/system'
|
4
|
+
require 'rubygems'
|
5
|
+
require 'ramaze'
|
6
|
+
|
7
|
+
module Rutema
|
8
|
+
module UI
|
9
|
+
class MainController < Ramaze::Controller
|
10
|
+
engine :Erubis
|
11
|
+
layout :layout
|
12
|
+
#Time format to use for the start and stop times
|
13
|
+
TIME_FORMAT="%y%m%d - %H:%M:%S"
|
14
|
+
#image filename to use for succesfull scenarios
|
15
|
+
IMG_SCE_OK="/run_ok.png"
|
16
|
+
#image filename to use for failed scenarios
|
17
|
+
IMG_SCE_ERROR="/run_error.png"
|
18
|
+
#image filename to use for unexecuted scenarios
|
19
|
+
IMG_SCE_WARN="/run_warn.png"
|
20
|
+
#image filename to use for succesfull steps
|
21
|
+
IMG_STEP_OK="/step_ok.png"
|
22
|
+
#image filename to use for failed steps
|
23
|
+
IMG_STEP_ERROR="/step_error.png"
|
24
|
+
#image filename to use for unexecuted steps
|
25
|
+
IMG_STEP_WARN="/step_warn.png"
|
26
|
+
def index
|
27
|
+
@panel_content=panel_content(:runs)
|
28
|
+
@content="<p>This is the rutema web interface.<br/>It allows you to browse the contents of the test results database.</p><p>Currently you can view the results for each separate run, the results for a specific scenario (a complete list of all steps executed in the scenario with standard and error output logs) or the complete execution history of a scenario.</p>"
|
29
|
+
end
|
30
|
+
def run run_id=""
|
31
|
+
@panel_content=panel_content(:runs)
|
32
|
+
if !run_id.empty?
|
33
|
+
@content=single_run(run_id)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
def scenario scenario_id=""
|
37
|
+
@panel_content=panel_content(:scenarios)
|
38
|
+
if !scenario_id.empty?
|
39
|
+
if scenario_id.to_i==0
|
40
|
+
@content=scenario_by_name(scenario_id)
|
41
|
+
else
|
42
|
+
@content=scenario_in_a_run(scenario_id)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
private
|
47
|
+
#Renders the summary of all runs for a single scenario
|
48
|
+
def scenario_by_name scenario_id
|
49
|
+
ret=""
|
50
|
+
begin
|
51
|
+
table=Rutema::Model::Scenario.report_table(:all,:conditions=>["name = :spec_name",{:spec_name=>scenario_id}])
|
52
|
+
if table.empty?
|
53
|
+
ret="<p>no results for #{scenario_id}</p>"
|
54
|
+
else
|
55
|
+
table.replace_column("status") do |r|
|
56
|
+
scenario_status_snippet(r)
|
57
|
+
end
|
58
|
+
table.replace_column("version") {|r| r.version ? r.version : "N/A"}
|
59
|
+
table.replace_column("start_time"){|r| r.stop_time ? r.start_time.strftime(TIME_FORMAT) : nil}
|
60
|
+
table.replace_column("stop_time"){|r| r.stop_time.strftime(TIME_FORMAT)}
|
61
|
+
table.reorder("status","run_id","version","start_time","stop_time")
|
62
|
+
ret<<table.to_html
|
63
|
+
end
|
64
|
+
rescue
|
65
|
+
puts $!
|
66
|
+
"<p>could not retrieve data for #{scenario_id}</p>"
|
67
|
+
end
|
68
|
+
return ret
|
69
|
+
end
|
70
|
+
#Renders the information for a specific executed scenario
|
71
|
+
#giving a detailed list of the steps, with status and output
|
72
|
+
def scenario_in_a_run scenario_id
|
73
|
+
table=Rutema::Model::Step.report_table(:all,:conditions=>["scenario_id = :scenario_id",{:scenario_id=>scenario_id}])
|
74
|
+
if table.empty?
|
75
|
+
ret="<p>no results for #{scenario_id}</p>"
|
76
|
+
else
|
77
|
+
table.replace_column("status") do |r|
|
78
|
+
img_src=IMG_STEP_WARN if "not_executed"==r.status
|
79
|
+
img_src=IMG_STEP_OK if "success"==r.status
|
80
|
+
img_src=IMG_STEP_ERROR if "error"==r.status
|
81
|
+
"<img src=\"#{img_src}\" align=\"center\"/>"
|
82
|
+
end
|
83
|
+
table.reorder("number","status","name","output","error","duration")
|
84
|
+
ret=table.to_html
|
85
|
+
end
|
86
|
+
return ret
|
87
|
+
end
|
88
|
+
#will render a hash in a table of key||value rows
|
89
|
+
def context_table context
|
90
|
+
ret="<table><tr>"
|
91
|
+
context.each do |k,v|
|
92
|
+
ret<<"<td>#{k.to_s}</td><td>#{v.to_s}</td>"
|
93
|
+
end
|
94
|
+
ret<<"</tr></table>"
|
95
|
+
end
|
96
|
+
#Renders the information for a single run providing the context and a list of the scenarios
|
97
|
+
def single_run run_id
|
98
|
+
ret=""
|
99
|
+
begin
|
100
|
+
run=Rutema::Model::Run.find(run_id)
|
101
|
+
rescue
|
102
|
+
return "Could not find #{run_id}"
|
103
|
+
end
|
104
|
+
if run.context
|
105
|
+
ret<<context_table(run.context)
|
106
|
+
end
|
107
|
+
table=Rutema::Model::Scenario.report_table(:all,:conditions=>["run_id = :run_id",{:run_id=>run_id}],:except=>["run_id"])
|
108
|
+
if table.empty?
|
109
|
+
return "No scenarios for run #{run_id}"
|
110
|
+
else
|
111
|
+
table.replace_column("status") do |r|
|
112
|
+
scenario_status_snippet(r)
|
113
|
+
end
|
114
|
+
table.replace_column("version") {|r| r.version ? r.version : "N/A"}
|
115
|
+
table.replace_column("start_time"){|r| r.stop_time ? r.start_time.strftime(TIME_FORMAT) : nil}
|
116
|
+
table.replace_column("stop_time"){|r| r.stop_time.strftime(TIME_FORMAT)}
|
117
|
+
table.reorder("status","name","version","start_time","stop_time")
|
118
|
+
ret<<table.to_html
|
119
|
+
end
|
120
|
+
return ret
|
121
|
+
end
|
122
|
+
#Gives the HTML to use for the status column of a scenario list
|
123
|
+
def scenario_status_snippet r
|
124
|
+
if "not_executed"==r.status
|
125
|
+
"<img src=\"#{IMG_SCE_WARN}\" align=\"center\"/>"
|
126
|
+
else
|
127
|
+
img_src=IMG_SCE_OK if "success"==r.status
|
128
|
+
img_src=IMG_SCE_ERROR if "error"==r.status
|
129
|
+
"<a href=\"/scenario/#{r.data["id"]}\"><img src=\"#{img_src}\" align=\"center\"/></a>"
|
130
|
+
end
|
131
|
+
end
|
132
|
+
def panel_content context
|
133
|
+
ret=""
|
134
|
+
if context==:runs
|
135
|
+
#<img src="run_error.png" align="center"/><a href="index.html" class="smallgraytext">1 - 28.06.2007</a>
|
136
|
+
Rutema::Model::Run.find(:all,:select=>"id").reverse.each do |r|
|
137
|
+
ret<<"<a class=\"smallgreytext\" href=\"/run/#{r.id}\">Run #{r.id}</a><br/>"
|
138
|
+
end
|
139
|
+
elsif context==:scenarios
|
140
|
+
result=Rutema::Model::Scenario.find(:all).collect{|r| r.name}
|
141
|
+
result.uniq.sort.each do |r|
|
142
|
+
ret<<"<a class=\"smallgreytext\" href=\"/scenario/#{r}\">#{r}</a><br/>"
|
143
|
+
end
|
144
|
+
end
|
145
|
+
return ret
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
def start_ramaze
|
151
|
+
dbfile=ARGV.shift
|
152
|
+
if !dbfile
|
153
|
+
puts "please provide a database filename"
|
154
|
+
exit 0
|
155
|
+
end
|
156
|
+
if File.exist?(dbfile)
|
157
|
+
ActiveRecord::Base.establish_connection(:adapter=>"sqlite3", :database=>File.expand_path(dbfile) )
|
158
|
+
Dir.chdir(File.dirname(__FILE__)) do
|
159
|
+
Ramaze.start :force=>true#,:adapter=>:thin
|
160
|
+
end
|
161
|
+
else
|
162
|
+
$stderr.puts "Can't find database file '#{dbfile}'"
|
163
|
+
end
|
164
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
2
|
+
<html xmlns="http://www.w3.org/1999/xhtml">
|
3
|
+
<head>
|
4
|
+
<meta name="author" content="Vassilis Rizopoulos" />
|
5
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
6
|
+
<link rel="stylesheet" href="/style.css" type="text/css" />
|
7
|
+
<title>Rutema Historian</title>
|
8
|
+
</head>
|
9
|
+
<body>
|
10
|
+
<div id="page" align="center">
|
11
|
+
<div id="content" style="width:800px">
|
12
|
+
<div id="logo">
|
13
|
+
<div style="margin-top:70px" class="whitetitle">rutema</div>
|
14
|
+
</div>
|
15
|
+
<div id="topheader">
|
16
|
+
<div align="left" class="bodytext">
|
17
|
+
</div>
|
18
|
+
<div id="toplinks" class="smallgraytext">
|
19
|
+
</div>
|
20
|
+
</div>
|
21
|
+
<div id="menu">
|
22
|
+
<div align="right" class="smallwhitetext" style="padding:9px;">
|
23
|
+
<a href="/">Home</a> | <a href="/run">Runs</a> | <a href="/scenario">Scenarios</a>
|
24
|
+
</div>
|
25
|
+
</div>
|
26
|
+
<div id="submenu">
|
27
|
+
<div align="right" class="smallgraytext" style="padding:9px;"></div>
|
28
|
+
</div>
|
29
|
+
<div id="contenttext">
|
30
|
+
<div style="padding:10px">
|
31
|
+
<span class="titletext">Summary</span>
|
32
|
+
</div>
|
33
|
+
<div class="bodytext" style="padding:12px;" align="justify"><%=@content%></div>
|
34
|
+
</div>
|
35
|
+
<div id="leftpanel">
|
36
|
+
<div align="justify" class="graypanel">
|
37
|
+
<%=@panel_content%>
|
38
|
+
</div>
|
39
|
+
</div>
|
40
|
+
<div id="footer" class="smallgraytext">
|
41
|
+
<a href="/">Home</a> | <a href="http://patir.rubyforge.org/rutema">about rutema</a> |
|
42
|
+
© 2008 <a href="http://www.braveworld.net/riva" target="_blank">Vassilis Rizopoulos</a>
|
43
|
+
</div>
|
44
|
+
</div>
|
45
|
+
</div>
|
46
|
+
</body>
|
47
|
+
</html>
|
data/test/rutema.rutema
ADDED
data/test/rutema.spec
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
<specification name="TR001">
|
2
|
+
<title>Rutema self hosting test</title>
|
3
|
+
<description>Test that rutemax and rutemah are usable as steps in a specification using the distro test example</description>
|
4
|
+
<scenario>
|
5
|
+
<command cmd="rutemax -c distro_test/config/minimal.rutema"/>
|
6
|
+
<command cmd="rutemax -c distro_test/config/database.rutema"/>
|
7
|
+
<command cmd="rutemah -c distro_test/config/database.rutemah all"/>
|
8
|
+
</scenario>
|
9
|
+
</specification>
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rutema
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vassilis Rizopoulos
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-02-
|
12
|
+
date: 2008-02-26 00:00:00 +01:00
|
13
13
|
default_executable: rutemax
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -19,7 +19,7 @@ dependencies:
|
|
19
19
|
requirements:
|
20
20
|
- - ">="
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version:
|
22
|
+
version: 0.5.2
|
23
23
|
version:
|
24
24
|
- !ruby/object:Gem::Dependency
|
25
25
|
name: highline
|
@@ -67,7 +67,16 @@ dependencies:
|
|
67
67
|
version: "0"
|
68
68
|
version:
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: ramaze
|
71
|
+
version_requirement:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: "0"
|
77
|
+
version:
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: erubis
|
71
80
|
version_requirement:
|
72
81
|
version_requirements: !ruby/object:Gem::Requirement
|
73
82
|
requirements:
|
@@ -113,22 +122,25 @@ files:
|
|
113
122
|
- lib/rutema/reporter_ar.rb
|
114
123
|
- lib/rutema/historian.rb
|
115
124
|
- lib/rutema/model.rb
|
116
|
-
- lib/rutemaweb/
|
117
|
-
- lib/rutemaweb/
|
118
|
-
- lib/rutemaweb/
|
119
|
-
- lib/rutemaweb/
|
120
|
-
- lib/rutemaweb/
|
121
|
-
- lib/rutemaweb/
|
122
|
-
- lib/rutemaweb/
|
123
|
-
- lib/rutemaweb/
|
124
|
-
- lib/rutemaweb/
|
125
|
-
- lib/rutemaweb/
|
126
|
-
- lib/rutemaweb/
|
125
|
+
- lib/rutemaweb/ramaze_controller.rb
|
126
|
+
- lib/rutemaweb/public/bg_menu.gif
|
127
|
+
- lib/rutemaweb/public/bg_submenu.gif
|
128
|
+
- lib/rutemaweb/public/run_error.png
|
129
|
+
- lib/rutemaweb/public/run_ok.png
|
130
|
+
- lib/rutemaweb/public/run_warn.png
|
131
|
+
- lib/rutemaweb/public/step_error.png
|
132
|
+
- lib/rutemaweb/public/step_ok.png
|
133
|
+
- lib/rutemaweb/public/step_warn.png
|
134
|
+
- lib/rutemaweb/public/style.css
|
135
|
+
- lib/rutemaweb/public/tie_logo.gif
|
136
|
+
- lib/rutemaweb/view/layout.rhtml
|
127
137
|
- test/test_configuration.rb
|
128
138
|
- test/test_specification.rb
|
129
139
|
- test/test_system.rb
|
130
140
|
- test/test_historian.rb
|
131
141
|
- test/test_reporter.rb
|
142
|
+
- test/rutema.rutema
|
143
|
+
- test/rutema.spec
|
132
144
|
- test/samples/check.spec
|
133
145
|
- test/samples/setup.spec
|
134
146
|
- test/samples/teardown.spec
|
data/lib/rutemaweb/rutemaweb.rb
DELETED
@@ -1,245 +0,0 @@
|
|
1
|
-
# Copyright (c) 2007 Vassilis Rizopoulos. All rights reserved.
|
2
|
-
$:.unshift File.join(File.dirname(__FILE__),"..")
|
3
|
-
|
4
|
-
require 'rutema/model'
|
5
|
-
require 'rutema/historian'
|
6
|
-
require 'webrick'
|
7
|
-
require 'rubygems'
|
8
|
-
require 'camping/webrick'
|
9
|
-
|
10
|
-
|
11
|
-
Camping.goes :RutemaWeb
|
12
|
-
|
13
|
-
#This is the module containing the Camping views and controllers for the web interface to rutema
|
14
|
-
module RutemaWeb
|
15
|
-
HTDOCS=File.expand_path(File.join(File.dirname(__FILE__),"htdocs"))
|
16
|
-
#The rutema web interface controllers
|
17
|
-
module RutemaWeb::Controllers
|
18
|
-
#This is the main controller
|
19
|
-
#
|
20
|
-
#The various views on the data are found through the query keys
|
21
|
-
class Index < R '/'
|
22
|
-
def get
|
23
|
-
@head_title||="Rutema Historian"
|
24
|
-
@white_title||="Runs"
|
25
|
-
@title||="History"
|
26
|
-
@left_panel=:runs
|
27
|
-
if @input.empty?
|
28
|
-
render :start
|
29
|
-
else
|
30
|
-
if @input["scenario"]
|
31
|
-
@scenario_id=@input[:scenario]
|
32
|
-
scenario=Rutema::Model::Scenario.find(@scenario_id)
|
33
|
-
@title="#{scenario.name} from Run ##{scenario.run_id}"
|
34
|
-
@white_title="Scenario <br/>##{@scenario_id}"
|
35
|
-
render :scenario_in_a_run
|
36
|
-
elsif @input[:run]
|
37
|
-
@run_id=@input[:run]
|
38
|
-
@white_title="Run ##{@run_id}"
|
39
|
-
@title="Summary"
|
40
|
-
render :single_run
|
41
|
-
elsif @input["scenario_name"]
|
42
|
-
@spec_name=@input["scenario_name"]
|
43
|
-
@white_title=@spec_name
|
44
|
-
@title="Summary"
|
45
|
-
render :scenario_by_name
|
46
|
-
elsif @input["scenarios"]
|
47
|
-
@white_title="Scenarios"
|
48
|
-
@title="Summary"
|
49
|
-
@left_panel=:scenarios
|
50
|
-
render :start
|
51
|
-
elsif @input["runs"]
|
52
|
-
@white_title="Runs"
|
53
|
-
@title="Summary"
|
54
|
-
@left_panel=:runs
|
55
|
-
render :start
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
class StyleSheetsAndImages < R '/(.*[css|jpg|png|gif])'
|
62
|
-
def get name
|
63
|
-
@headers['Content-Type'] = "image/jpg" if name=~/$jpg/
|
64
|
-
@headers['Content-Type'] = "image/png" if name=~/$png/
|
65
|
-
@headers['Content-Type'] = "image/gif" if name=~/$gif/
|
66
|
-
@headers['Content-Type'] = "text/css" if name=~/$css/
|
67
|
-
@headers['X-Sendfile'] = File.join(RutemaWeb::HTDOCS,name)
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
module RutemaWeb::Views
|
72
|
-
#Time format to use for the start and stop times
|
73
|
-
TIME_FORMAT="%y%m%d - %H:%M:%S"
|
74
|
-
#image filename to use for succesfull scenarios
|
75
|
-
IMG_SCE_OK="run_ok.png"
|
76
|
-
#image filename to use for failed scenarios
|
77
|
-
IMG_SCE_ERROR="run_error.png"
|
78
|
-
#image filename to use for unexecuted scenarios
|
79
|
-
IMG_SCE_WARN="run_warn.png"
|
80
|
-
#image filename to use for succesfull steps
|
81
|
-
IMG_STEP_OK="step_ok.png"
|
82
|
-
#image filename to use for failed steps
|
83
|
-
IMG_STEP_ERROR="step_error.png"
|
84
|
-
#image filename to use for unexecuted steps
|
85
|
-
IMG_STEP_WARN="step_warn.png"
|
86
|
-
#The whole page in Markaby
|
87
|
-
def layout
|
88
|
-
xhtml_transitional do
|
89
|
-
head do
|
90
|
-
meta(:name=>"author",:content=>"Vassilis Rizopoulos")
|
91
|
-
link(:rel=>"stylesheet",:href=>"style.css",:type=>"text/css")
|
92
|
-
title { @head_title }
|
93
|
-
end
|
94
|
-
body do
|
95
|
-
div.page!(:align=>"center") do
|
96
|
-
div.content!(:style=>"width:800px") do
|
97
|
-
div.logo!{div.whitetitle(:style=>"margin-top:70px"){@white_title}}
|
98
|
-
div.topheader!{div.bodytext(:align=>"left"){br} }
|
99
|
-
div.menu!{}
|
100
|
-
div.submenu! do
|
101
|
-
div(:align=>"right",:class=>"smallgraytext",:style=>"padding:9px;") do
|
102
|
-
a(:href=>"?runs=all"){"runs"}+" | "+a(:href=>"?scenarios=all"){"scenarios"}
|
103
|
-
end
|
104
|
-
end
|
105
|
-
div.contenttext! do
|
106
|
-
div(:style=>"padding:10px"){span.titletext{@title}}
|
107
|
-
div.bodytext(:style=>"padding:12px;", :align=>"justify"){self<<yield}
|
108
|
-
end
|
109
|
-
leftpanel
|
110
|
-
div.footer!(:class=>"smallgraytext") {"© 2007 Vassilis Rizopoulos"}
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
#Start point: No rendering content
|
118
|
-
def start
|
119
|
-
p{"This is the rutema web interface.<br/>It allows you to browse the contents of the test results database."}
|
120
|
-
p{"Currently you can view the results for each separate run, the results for a specific scenario (a complete list of all steps executed in the scenario with standard and error output logs) or the complete execution history of a scenario."}
|
121
|
-
end
|
122
|
-
|
123
|
-
#Renders the information for a specific executed scenario
|
124
|
-
#giving a detailed list of the steps, with status and output
|
125
|
-
def scenario_in_a_run
|
126
|
-
table=Rutema::Model::Step.report_table(:all,:conditions=>["scenario_id = :scenario_id",{:scenario_id=>@scenario_id}])
|
127
|
-
table.replace_column("status") do |r|
|
128
|
-
img_src=IMG_STEP_WARN if "not_executed"==r.status
|
129
|
-
img_src=IMG_STEP_OK if "success"==r.status
|
130
|
-
img_src=IMG_STEP_ERROR if "error"==r.status
|
131
|
-
img(:src=>img_src,:align=>"center")
|
132
|
-
end
|
133
|
-
table.reorder("number","status","name","output","error","duration")
|
134
|
-
table.to_html
|
135
|
-
end
|
136
|
-
#Renders the information for a single run providing the context and a list of the scenarios
|
137
|
-
def single_run
|
138
|
-
ret=""
|
139
|
-
run=Rutema::Model::Run.find(@run_id)
|
140
|
-
if run.context
|
141
|
-
ret<<context_table(run.context)
|
142
|
-
end
|
143
|
-
table=Rutema::Model::Scenario.report_table(:all,:conditions=>["run_id = :run_id",{:run_id=>@run_id}],:except=>["run_id"])
|
144
|
-
table.replace_column("status") do |r|
|
145
|
-
if "not_executed"==r.status
|
146
|
-
img(:src=>IMG_SCE_WARN,:align=>"center")
|
147
|
-
else
|
148
|
-
img_src=IMG_SCE_OK if "success"==r.status
|
149
|
-
img_src=IMG_SCE_ERROR if "error"==r.status
|
150
|
-
a(:href=> "?scenario=#{r.data["id"]}"){img(:src=>img_src,:align=>"center")}
|
151
|
-
end
|
152
|
-
end
|
153
|
-
table.replace_column("version") {|r| r.version ? r.version : "N/A"}
|
154
|
-
table.replace_column("start_time"){|r| r.stop_time ? r.start_time.strftime(TIME_FORMAT) : nil}
|
155
|
-
table.replace_column("stop_time"){|r| r.stop_time.strftime(TIME_FORMAT)}
|
156
|
-
table.reorder("status","name","version","start_time","stop_time")
|
157
|
-
ret<<table.to_html
|
158
|
-
return ret
|
159
|
-
end
|
160
|
-
|
161
|
-
#Renders the summary of all runs for a single scenario
|
162
|
-
def scenario_by_name
|
163
|
-
ret=""
|
164
|
-
begin
|
165
|
-
table=Rutema::Model::Scenario.report_table(:all,:conditions=>["name = :spec_name",{:spec_name=>@spec_name}])
|
166
|
-
if table.empty?
|
167
|
-
ret=p{"no results for #{@spec_name}"}
|
168
|
-
else
|
169
|
-
table.replace_column("status") do |r|
|
170
|
-
if "not_executed"==r.status
|
171
|
-
img(:src=>IMG_SCE_WARN,:align=>"center")
|
172
|
-
else
|
173
|
-
img_src=IMG_SCE_OK if "success"==r.status
|
174
|
-
img_src=IMG_SCE_ERROR if "error"==r.status
|
175
|
-
a(:href=> "?scenario=#{r.data["id"]}"){img(:src=>img_src,:align=>"center")}
|
176
|
-
end
|
177
|
-
end
|
178
|
-
table.replace_column("version") {|r| r.version ? r.version : "N/A"}
|
179
|
-
table.replace_column("start_time"){|r| r.stop_time ? r.start_time.strftime(TIME_FORMAT) : nil}
|
180
|
-
table.replace_column("stop_time"){|r| r.stop_time.strftime(TIME_FORMAT)}
|
181
|
-
table.reorder("status","run_id","version","start_time","stop_time")
|
182
|
-
ret<<table.to_html
|
183
|
-
end
|
184
|
-
rescue
|
185
|
-
puts $!
|
186
|
-
ret=p{"could not retrieve data for #{@spec_name}"}
|
187
|
-
end
|
188
|
-
return ret
|
189
|
-
end
|
190
|
-
private
|
191
|
-
#Constructs the left panel of the page as a list of the test runs
|
192
|
-
def leftpanel
|
193
|
-
div.leftpanel! do
|
194
|
-
div.graypanel(:align=>"justify") do
|
195
|
-
span.bodytext do
|
196
|
-
if @left_panel==:runs
|
197
|
-
#<img src="run_error.png" align="center"/><a href="index.html" class="smallgraytext">1 - 28.06.2007</a>
|
198
|
-
Rutema::Model::Run.find(:all,:select=>"id").reverse.each do |r|
|
199
|
-
a.smallgraytext(:href=>"?run=#{r.id}"){"Run ##{r.id}"}
|
200
|
-
br
|
201
|
-
end
|
202
|
-
elsif @left_panel==:scenarios
|
203
|
-
result=Rutema::Model::Scenario.find(:all).collect{|r| r.name}
|
204
|
-
result.uniq.sort.each do |r|
|
205
|
-
a.smallgraytext(:href=>"?scenario_name=#{r}"){"#{r}"}
|
206
|
-
br
|
207
|
-
end
|
208
|
-
end
|
209
|
-
end
|
210
|
-
end
|
211
|
-
end
|
212
|
-
end
|
213
|
-
|
214
|
-
#will render a hash in a table of key||value rows
|
215
|
-
def context_table context
|
216
|
-
table do
|
217
|
-
tr do
|
218
|
-
context.each do |k,v|
|
219
|
-
td {k.to_s}
|
220
|
-
td {v.to_s}
|
221
|
-
end
|
222
|
-
end
|
223
|
-
end
|
224
|
-
end
|
225
|
-
end
|
226
|
-
end
|
227
|
-
|
228
|
-
#Starts a WEBRick server with the RutemaWeb controller in /
|
229
|
-
def start_server (port=3301,docroot=RutemaWeb::HTDOCS,mountpoint="/")
|
230
|
-
include WEBrick
|
231
|
-
dbfile=ARGV.shift
|
232
|
-
if !dbfile
|
233
|
-
puts "please provide a database filename"
|
234
|
-
exit 0
|
235
|
-
end
|
236
|
-
if File.exist?(dbfile)
|
237
|
-
ActiveRecord::Base.establish_connection(:adapter=>"sqlite3", :database=>dbfile )
|
238
|
-
s = HTTPServer.new(:Port => port, :DocumentRoot => docroot )
|
239
|
-
s.mount mountpoint, WEBrick::CampingHandler, RutemaWeb
|
240
|
-
trap("INT") { s.shutdown }
|
241
|
-
s.start
|
242
|
-
else
|
243
|
-
$stderr.puts "Can't find database file '#{dbfile}'"
|
244
|
-
end
|
245
|
-
end
|