rutema 0.9.3 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/History.txt CHANGED
@@ -1,3 +1,13 @@
1
+ == 1.0.0 / 2008-10-06
2
+ * DB schema change: title and description added to scenario table
3
+ * footer parameter for the email reporter
4
+ * Specification titles included in the text reports
5
+ * When parsing multiple specifications a duplicate name will now generate a parser error
6
+ * rutema_updater upgrades existing databases, check http://patir.rubyforge.org/rutema/update_090_to_100.html
7
+ * rutemah scrapped
8
+ * rutemax logs it's version always
9
+ * activerecord 2.1.1 is now in use
10
+
1
11
  == 0.9.3 / 2008-09-10
2
12
  * Sorted result summaries in the text and the email reporter
3
13
  * ActiveRecordReporter registration logging
data/Manifest.txt CHANGED
@@ -3,13 +3,12 @@ History.txt
3
3
  Manifest.txt
4
4
  README.txt
5
5
  Rakefile
6
- bin/rutemah
7
6
  bin/rutemax
7
+ bin/rutema_upgrader
8
8
  distro_test.sh
9
9
  lib/rutema/configuration.rb
10
10
  lib/rutema/db.rb
11
11
  lib/rutema/gems.rb
12
- lib/rutema/historian.rb
13
12
  lib/rutema/model.rb
14
13
  lib/rutema/reporter.rb
15
14
  lib/rutema/reporters/activerecord.rb
@@ -19,11 +18,10 @@ lib/rutema/reporters/text.rb
19
18
  lib/rutema/specification.rb
20
19
  lib/rutema/system.rb
21
20
  selftest.sh
21
+ test/data/sample09.db
22
22
  test/distro_test/config/database.rutema
23
- test/distro_test/config/database.rutemah
24
23
  test/distro_test/config/full.rutema
25
24
  test/distro_test/config/jruby.rutema
26
- test/distro_test/config/jruby.rutemah
27
25
  test/distro_test/config/minimal.rutema
28
26
  test/distro_test/specs/T001.spec
29
27
  test/distro_test/specs/T002.spec
@@ -35,8 +33,8 @@ test/distro_test/specs/no_title.spec
35
33
  test/distro_test/specs/sample.spec
36
34
  test/rutema.rutema
37
35
  test/rutema.spec
36
+ test/migration.spec
38
37
  test/test_configuration.rb
39
- test/test_historian.rb
40
38
  test/test_model.rb
41
39
  test/test_reporter.rb
42
40
  test/test_specification.rb
data/Rakefile CHANGED
@@ -14,13 +14,13 @@ 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.5.7"]
17
+ p.extra_deps<<['patir',">=0.6.0"]
18
18
  p.extra_deps<<['highline']
19
19
  p.extra_deps<<['mailfactory']
20
- p.extra_deps<<['activerecord','=2.0.2']
20
+ p.extra_deps<<['activerecord','=2.1.1']
21
21
  p.extra_deps<<['ruport']
22
22
  p.extra_deps<<['acts_as_reportable']
23
- p.spec_extras={:executables=>["rutemax","rutemah"],
23
+ p.spec_extras={:executables=>["rutemax","rutema_upgrader"],
24
24
  :default_executable=>"rutemax"}
25
25
  end
26
26
 
@@ -0,0 +1,74 @@
1
+ # Copyright (c) 2008 Vassilis Rizopoulos. All rights reserved.
2
+ require 'rubygems'
3
+ require 'rutema/system'
4
+ require 'patir/base'
5
+
6
+ #Parses the command line arguments
7
+ def parse_command_line args
8
+ args.options do |opt|
9
+ opt.on("Usage:")
10
+ opt.on("rutema_upgrader [options] config_file")
11
+ opt.on("Options:")
12
+ opt.on("--debug", "-d","Turns on debug messages") { $DEBUG=true }
13
+ opt.on("-v", "--version","Displays the version") { $stdout.puts("v#{Version::STRING}");exit 0 }
14
+ opt.on("--help", "-h", "-?", "This text") { $stdout.puts opt; exit 0 }
15
+ opt.parse!
16
+ #and now the rest
17
+ if args.empty?
18
+ $stdout.puts opt
19
+ exit 0
20
+ else
21
+ return args.shift
22
+ end
23
+ end
24
+ end
25
+ logger=Patir.setup_logger
26
+ config_file=parse_command_line(ARGV)
27
+ begin
28
+ raise "No configuration file defined!" if !config_file
29
+ configuration=Rutema::RutemaXConfigurator.new(config_file,logger).configuration
30
+ Dir.chdir(File.dirname(config_file)) do
31
+ coordinator=Rutema::Coordinator.new(configuration,logger)
32
+ specs=coordinator.parse_all_specifications
33
+ specifications=Hash.new
34
+ specs.each do |s|
35
+ specifications[s.name]=[s.title,s.description]
36
+ end
37
+ database=nil
38
+ configuration.reporters.each do |rep|
39
+ if rep[:class]==Rutema::ActiveRecordReporter
40
+ database=rep[:db][:database]
41
+ break
42
+ end
43
+ end
44
+ if database && File.exists?(database)
45
+ Rutema.connect_to_ar(database,logger,false)
46
+ test_scenario=Rutema::Model::Scenario.find(:first)
47
+ if test_scenario.respond_to?(:title) && test_scenario.respond_to?(:description)
48
+ logger.info("Schema appears updated")
49
+ else
50
+ logger.info("Updating schema")
51
+ #Rutema::Model::UpgradeV9toV10.up
52
+ end
53
+ logger.info("Setting title and description values")
54
+ Rutema::Model::Scenario.find(:all).each do |sc|
55
+ if specifications[sc.name]
56
+ logger.info("Setting columns for #{sc.name}:#{sc.id}")
57
+ sc.title=specifications[sc.name][0]
58
+ sc.description=specifications[sc.name][1]
59
+ sc.save
60
+ end
61
+ end
62
+ else
63
+ logger.fatal("Database '#{database}' does not exist")
64
+ end
65
+ end
66
+ rescue Patir::ConfigurationException
67
+ logger.debug($!)
68
+ logger.fatal("Configuration error '#{$!.message}'")
69
+ exit 1
70
+ rescue
71
+ logger.debug($!)
72
+ logger.fatal("#{$!.message}")
73
+ exit 1
74
+ end
data/bin/rutemax CHANGED
File without changes
data/distro_test.sh CHANGED
@@ -1,7 +1,6 @@
1
1
  #!/bin/sh
2
2
  rutemax -c test/distro_test/config/minimal.rutema
3
- rutemax -c test/distro_test/config/database.rutema
4
- rutemah -c test/distro_test/config/database.rutemah all
3
+ rutemax -c test/distro_test/config/database.rutema
5
4
  rutemax -c test/distro_test/config/full.rutema --check
6
5
  rutemax -c test/distro_test/config/full.rutema
7
6
  #rutemax -c test/distro_test/config/minimal.rutema --step
@@ -63,7 +63,6 @@ module Rutema
63
63
 
64
64
  #Hash values for passing data to the system. It's supposed to be used in the reporters and contain
65
65
  #values such as version numbers, tester names etc.
66
- #
67
66
  def context= definition
68
67
  @context||=Hash.new
69
68
  raise Patir::ConfigurationException,"Only accepting hash values as context_data" unless definition.kind_of?(Hash)
@@ -72,7 +71,7 @@ module Rutema
72
71
  end
73
72
  end
74
73
 
75
- #Adds the files to the specification available to RutemaX.
74
+ #Adds the files to the specifications available to RutemaX.
76
75
  def tests= array_of_files
77
76
  @tests||=Array.new
78
77
  @tests+=array_of_files
@@ -117,18 +116,6 @@ module Rutema
117
116
  end
118
117
  end
119
118
 
120
- #This module defines the "configuration directives" used in the configuration of RutemaH
121
- module RutemaHConfiguration
122
- #The configuration keys for the historian's database. This is adapter dependent.
123
- #
124
- #Currently SQLite is supported on MRI and h2 on jRuby.
125
- #
126
- #:database defines the name of the file (or directory for h2) to use for the database and is the only required key.
127
- def db= definition
128
- raise Patir::ConfigurationException,"required key :database is missing from #{definition}" unless definition[:database]
129
- @db=definition
130
- end
131
- end
132
119
  #This class reads a RutemaX configuration file
133
120
  class RutemaXConfigurator<Patir::Configurator
134
121
  include RutemaXConfiguration
@@ -161,20 +148,4 @@ module Rutema
161
148
  end
162
149
  end
163
150
 
164
- #This class reads a RutemaH configuration file
165
- class RutemaHConfigurator<RutemaXConfigurator
166
- include RutemaHConfiguration
167
- def initialize config_file,logger=nil
168
- super(config_file,logger)
169
- end
170
-
171
- def configuration
172
- cfg=super
173
- Dir.chdir(File.dirname(config_file)) do |path|
174
- @db[:database]=File.expand_path(@db[:database])
175
- cfg.db=@db
176
- end
177
- return cfg
178
- end
179
- end
180
151
  end
data/lib/rutema/gems.rb CHANGED
@@ -1,9 +1,11 @@
1
1
  require 'rubygems'
2
- gem 'activerecord','=2.0.2'
2
+ gem 'activerecord','=2.1.1'
3
3
  require 'active_record'
4
+ gem 'patir','>=0.5.8'
4
5
  require 'patir/configuration'
5
6
  require 'patir/command'
6
7
  require 'patir/base'
8
+
7
9
  require 'ruport/acts_as_reportable'
8
10
  require 'mailfactory'
9
11
  require 'highline'
data/lib/rutema/model.rb CHANGED
@@ -32,6 +32,8 @@ module Rutema
32
32
  t.column :start_time, :datetime,:null=>false
33
33
  t.column :stop_time, :datetime
34
34
  t.column :version, :string
35
+ t.column :title, :string
36
+ t.column :description, :string
35
37
  end
36
38
 
37
39
  create_table :steps do |t|
@@ -56,7 +58,7 @@ module Rutema
56
58
  has_many :scenarios
57
59
  has_many :parse_errors
58
60
  serialize :context
59
- acts_as_reportable
61
+ acts_as_reportable
60
62
  end
61
63
 
62
64
  class Scenario<ActiveRecord::Base
@@ -74,5 +76,19 @@ module Rutema
74
76
  belongs_to :run
75
77
  acts_as_reportable
76
78
  end
79
+
80
+ class UpgradeV9toV10<ActiveRecord::Migration
81
+ def self.up
82
+ puts("Adding new columns")
83
+ add_column(:scenarios, :title, :string,{:default=>"title"})
84
+ add_column(:scenarios, :description, :string,{:default=>"description"})
85
+ puts("Updating existing scenario entries")
86
+ Rutema::Model::Scenario.find(:all).each do |sc|
87
+ puts "Updating scenario #{sc.id}"
88
+ sc.title="#{name}"
89
+ sc.description="#{name}"
90
+ end
91
+ end
92
+ end
77
93
  end
78
94
  end
@@ -25,7 +25,7 @@ module Rutema
25
25
  @dbfile=database_configuration[:database]
26
26
  end
27
27
  Rutema.connect_to_ar(@dbfile,@logger)
28
- @logger.info("Reporter '#{self.to_s}' registered")
28
+ @logger.info("Reporter #{self.to_s} registered")
29
29
  end
30
30
 
31
31
  #We get all the data for a Rutema::Model::Run entry in here.
@@ -53,8 +53,12 @@ module Rutema
53
53
  spec=specifications[scenario.sequence_name]
54
54
  if spec
55
55
  sc.version=spec.version if spec.has_version?
56
+ sc.title=spec.title
57
+ sc.description=spec.description
56
58
  else
57
59
  @logger.debug("Could not find specification for #{scenario.sequence_name}")
60
+ sc.title=scenario.sequence_name
61
+ sc.description=""
58
62
  end
59
63
  if scenario.strategy==:attended
60
64
  sc.attended=true
@@ -43,6 +43,8 @@ module Rutema
43
43
  #customize
44
44
  @subject=definition[:subject]
45
45
  @subject||=""
46
+ @footer=definition[:footer]
47
+ @footer||=""
46
48
  @logger.info("Reporter '#{self.to_s}' registered")
47
49
  end
48
50
 
@@ -54,6 +56,7 @@ module Rutema
54
56
  def report specifications,runner_states,parse_errors,configuration
55
57
  @mail.subject = "#{@subject}"
56
58
  @mail.text = TextReporter.new.report(specifications,runner_states,parse_errors,configuration)
59
+ @mail.text << "\n\n#{@footer}"
57
60
  begin
58
61
  if @recipients.empty?
59
62
  @logger.error("No recipients for the report mail")
@@ -27,15 +27,15 @@ module Rutema
27
27
  msg<<"\nNo scenarios in this run" if runner_states.empty?
28
28
  msg<<"\nOne scenario in the current run:" if runner_states.size==1
29
29
  msg<<"\n#{runner_states.size} scenarios in the current run:" if runner_states.size>1
30
- rstates=runner_states.sort_by{ |state| state.sequence_id.to_s }
30
+ rstates=runner_states.sort_by do |state|
31
+ state.sequence_id.to_i
32
+ end
31
33
  rstates.each do |state|
34
+ msg<<"\n#{specifications[state.sequence_name].title}" if specifications[state.sequence_name]
32
35
  msg<<"\n#{state.summary}\n---"
33
36
  end
34
37
  return msg
35
38
  end
36
- def sorted_scenario_report runner_states
37
-
38
- end
39
39
  end
40
40
 
41
41
  end
data/lib/rutema/system.rb CHANGED
@@ -9,9 +9,9 @@ require 'rutema/gems'
9
9
  module Rutema
10
10
  #This module defines the version numbers for the library
11
11
  module Version
12
- MAJOR=0
13
- MINOR=9
14
- TINY=3
12
+ MAJOR=1
13
+ MINOR=0
14
+ TINY=0
15
15
  STRING=[ MAJOR, MINOR, TINY ].join( "." )
16
16
  end
17
17
  #The Elements module provides the namespace for the various modules adding parser functionality
@@ -61,7 +61,11 @@ module Rutema
61
61
  class ParserError<RuntimeError
62
62
  end
63
63
 
64
- #Base class that bombs out when used....
64
+ #Base class that bombs out when used.
65
+ #
66
+ #Initialze expects a hash and as a base implementation assigns :logger as the internal logger.
67
+ #
68
+ #By default the internal logger will log to the console if no logger is provided.
65
69
  class SpecificationParser
66
70
  attr_reader :configuration
67
71
  def initialize params
@@ -313,7 +317,18 @@ module Rutema
313
317
  @configuration.context.end_time=Time.now
314
318
  @logger.info("Run completed in #{@configuration.context.end_time-@configuration.context.start_time}s")
315
319
  end
316
-
320
+
321
+ #Parses all specification files defined in the configuration
322
+ def parse_all_specifications
323
+ @configuration.tests.collect do |t|
324
+ begin
325
+ parse_specification(t)
326
+ rescue
327
+ @logger.debug($!)
328
+ @logger.error($!.message)
329
+ end
330
+ end.compact
331
+ end
317
332
  #Delegates reporting to all configured reporters spawning one thread per reporter
318
333
  #
319
334
  #It then joins the threads and returns when all of them are finished.
@@ -377,7 +392,13 @@ module Rutema
377
392
  @parsed_files<<filename
378
393
  @parsed_files.uniq!
379
394
  spec=@parser.parse_specification(spec_file)
380
- @specifications[spec.name]=spec
395
+ if @specifications[spec.name]
396
+ msg="Duplicate specification name '#{spec.name}' in '#{spec_file}'"
397
+ @logger.error(msg)
398
+ @parse_errors<<{:filename=>spec_file,:error=>msg}
399
+ else
400
+ @specifications[spec.name]=spec
401
+ end
381
402
  rescue ParserError
382
403
  @logger.error("Error parsing '#{spec_file}': #{$!.message}")
383
404
  @parse_errors<<{:filename=>filename,:error=>$!.message}
@@ -389,16 +410,6 @@ module Rutema
389
410
  end
390
411
  return spec
391
412
  end
392
- def parse_all_specifications
393
- @configuration.tests.collect do |t|
394
- begin
395
- parse_specification(t)
396
- rescue
397
- @logger.debug($!)
398
- @logger.error($!.message)
399
- end
400
- end.compact
401
- end
402
413
 
403
414
  def run_scenarios specs
404
415
  specs.compact!
@@ -591,6 +602,7 @@ module Rutema
591
602
  def initialize command_line_args
592
603
  parse_command_line(command_line_args)
593
604
  @logger=Patir.setup_logger(@log_file)
605
+ @logger.info("rutemax v#{Version::STRING}")
594
606
  begin
595
607
  raise "No configuration file defined!" if !@config_file
596
608
  @configuration=RutemaXConfigurator.new(@config_file,@logger).configuration
@@ -618,7 +630,7 @@ module Rutema
618
630
  opt.on("--log FILE", "-l FILE",String,"Redirects the log output to FILE") { |@log_file|}
619
631
  opt.on("--check","Runs just the check test"){@check=true}
620
632
  opt.on("--step","Runs test cases step by step"){@step=true}
621
- opt.on("-v", "--version","Displays the version") { $stdout.puts("v#{Version::STRING}");exit 0 }
633
+ opt.on("-v", "--version","Displays the version") { $stdout.puts("rutemax v#{Version::STRING}");exit 0 }
622
634
  opt.on("--help", "-h", "-?", "This text") { $stdout.puts opt; exit 0 }
623
635
  opt.on("The commands are:")
624
636
  opt.on("\tall - Runs all tests")
Binary file
@@ -0,0 +1,9 @@
1
+ <specification name="TR002">
2
+ <title>Migration v0.9 to v1.0</title>
3
+ <description>Test that the database migration code is succesfull between versions 0.9.0 and 1.0.0</description>
4
+ <scenario>
5
+ <command cmd="cp data/sample09.db data/test.db"/>
6
+ <command cmd="rutema_upgrader data/test.db"/>
7
+ <command cmd="rm data/test.db"/>
8
+ </scenario>
9
+ </specification>
data/test/rutema.rutema CHANGED
@@ -1,3 +1,3 @@
1
1
  configuration.parser={:class=>Rutema::MinimalXMLParser}
2
2
  configuration.reporter={:class=>Rutema::ActiveRecordReporter, :db=>{:database=>"rutema.db"}}
3
- configuration.tests=["rutema.spec"]
3
+ configuration.tests=["rutema.spec","migration.spec"]
data/test/rutema.spec CHANGED
@@ -1,11 +1,10 @@
1
1
  <specification name="TR001">
2
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>
3
+ <description>Test that rutemax is usable as a step in a specification using the distro test example</description>
4
4
  <scenario>
5
5
  <command cmd="rutemax -c distro_test/config/minimal.rutema"/>
6
6
  <command cmd="rutemax -c distro_test/config/database.rutema"/>
7
7
  <command cmd="rutemax -c distro_test/config/database.rutema distro_test/specs/T001.spec"/>
8
8
  <command cmd="rutemax -c distro_test/config/full.rutema"/>
9
- <command cmd="rutemah -c distro_test/config/database.rutemah all"/>
10
9
  </scenario>
11
10
  </specification>
@@ -32,14 +32,7 @@ module TestRutema
32
32
  assert_not_nil(cfg.tests)
33
33
  assert_not_nil(cfg.context)
34
34
  end
35
- def test_rutemah_configuration
36
- cfg=nil
37
- #load the valid configuration
38
- assert_nothing_raised() { cfg=Rutema::RutemaHConfigurator.new("distro_test/config/database.rutemah").configuration}
39
- assert_not_nil(cfg.db)
40
- assert_nothing_raised() { cfg=Rutema::RutemaHConfigurator.new("distro_test/config/jruby.rutemah").configuration}
41
- assert_not_nil(cfg.db)
42
- end
35
+
43
36
  def test_specification_paths
44
37
  cfg=Rutema::RutemaXConfigurator.new("distro_test/config/full.rutema").configuration
45
38
  assert_not_nil(cfg.tests)
@@ -67,33 +67,57 @@ module TestRutema
67
67
  st.step=MockCommand.new(2)
68
68
  st.step=MockCommand.new(3)
69
69
  @status=[st]
70
+
70
71
  end
71
72
  def test_new
73
+ spec=mock()
74
+ spec.expects(:title).returns("A test sequence")
75
+ specs={"test_seq"=>spec}
72
76
  definition={:server=>"localhost",:port=>25,:recipients=>["test"],:sender=>"rutema",:subject=>"test"}
73
77
  r=Rutema::EmailReporter.new(definition)
74
78
  Net::SMTP.expects(:start).times(2)
75
- assert_nothing_raised() { puts r.report(nil,@status,@parse_errors,nil) }
76
- assert_nothing_raised() { puts r.report(nil,[],[],nil) }
79
+ assert_nothing_raised() { puts r.report(specs,@status,@parse_errors,nil) }
80
+ assert_nothing_raised() { puts r.report(specs,[],[],nil) }
77
81
  end
78
82
 
79
83
  def test_multiple_scenarios
84
+ #The status mocks
80
85
  status1=mock()
81
- status1.expects(:summary).returns("test1. Status - error. States 3\nStep status summary:\n\t1:'echo' - success\n\t2:'check' - warning\n\t3:'try' - error")
82
- status1.expects(:sequence_id).returns(2)
86
+ status1.expects(:summary).returns("test6. Status - error. States 3\nStep status summary:\n\t1:'echo' - success\n\t2:'check' - warning\n\t3:'try' - error")
87
+ status1.expects(:sequence_id).returns(6)
88
+ status1.expects(:sequence_name).returns("T2").times(2)
83
89
  status2=mock()
84
- status2.expects(:summary).returns("test2. Status - success. States 3\nStep status summary:\n\t1:'echo' - success\n\t2:'check' - success\n\t3:'try' - success")
85
- status2.expects(:sequence_id).returns(1)
90
+ status2.expects(:summary).returns("test10. Status - success. States 3\nStep status summary:\n\t1:'echo' - success\n\t2:'check' - success\n\t3:'try' - success")
91
+ status2.expects(:sequence_id).returns(10)
92
+ status2.expects(:sequence_name).returns("T1").times(2)
86
93
  status3=mock()
87
- status3.expects(:summary).returns("test3. Status - success. States 3\nStep status summary:\n\t1:'echo' - success\n\t2:'check' - success\n\t3:'try' - success")
94
+ status3.expects(:summary).returns("testNil. Status - success. States 3\nStep status summary:\n\t1:'echo' - success\n\t2:'check' - success\n\t3:'try' - success")
88
95
  status3.expects(:sequence_id).returns(nil)
96
+ status3.expects(:sequence_name).returns(nil)
89
97
  status4=mock()
90
- status4.expects(:summary).returns("test4. Status - success. States 3\nStep status summary:\n\t1:'echo' - success\n\t2:'check' - success\n\t3:'try' - success")
91
- status4.expects(:sequence_id).returns("1s")
92
- @status=[status1,status2,status3,status4]
98
+ status4.expects(:summary).returns("test10s. Status - success. States 3\nStep status summary:\n\t1:'echo' - success\n\t2:'check' - success\n\t3:'try' - success")
99
+ status4.expects(:sequence_id).returns("10s")
100
+ status4.expects(:sequence_name).returns("Setup").times(2)
101
+ status5=mock()
102
+ status5.expects(:summary).returns("test60. Status - error. States 3\nStep status summary:\n\t1:'echo' - success\n\t2:'check' - warning\n\t3:'try' - error")
103
+ status5.expects(:sequence_id).returns(60)
104
+ status5.expects(:sequence_name).returns("T1").times(2)
105
+ stati=[status1,status2,status3,status4,status5]
106
+ #mock the mailing code
93
107
  definition={:server=>"localhost",:port=>25,:recipients=>["test"],:sender=>"rutema",:subject=>"test"}
94
108
  r=Rutema::EmailReporter.new(definition)
95
109
  Net::SMTP.expects(:start)
96
- assert_nothing_raised() { puts r.report(nil,@status,@parse_errors,nil) }
110
+ #The specification mocks
111
+ spec1=mock()
112
+ spec1.expects(:title).times(2).returns("T1")
113
+ spec2=mock()
114
+ spec2.expects(:title).returns("T2")
115
+ spec3=mock()
116
+ spec3.expects(:title).returns("Setup")
117
+ specs={"T1"=>spec1,
118
+ "T2"=>spec2,
119
+ "Setup"=>spec3}
120
+ assert_nothing_raised() { puts r.report(specs,stati,@parse_errors,nil) }
97
121
  end
98
122
  end
99
123
  end
data/test/test_system.rb CHANGED
@@ -120,19 +120,27 @@ EOT
120
120
  conf=OpenStruct.new(:parser=>{:class=>Rutema::BaseXMLParser},
121
121
  :tools=>{},
122
122
  :paths=>{},
123
- :tests=>[],
123
+ :tests=>["distro_test/specs/sample.spec","distro_test/specs/duplicate_name.spec"],
124
124
  :reporters=>[],
125
125
  :context=>OpenStruct.new)
126
126
  coord=nil
127
- assert_nothing_raised() { coord=Rutema::Coordinator.new(conf) }
128
127
  assert_nothing_raised() do
128
+ coord=Rutema::Coordinator.new(conf)
129
129
  coord.run(:all)
130
+ assert_equal(1,coord.parse_errors.size)
131
+ coord=Rutema::Coordinator.new(conf)
130
132
  coord.run(:attended)
133
+ assert_equal(1,coord.parse_errors.size)
134
+ coord=Rutema::Coordinator.new(conf)
131
135
  coord.run(:unattended)
136
+ assert_equal(1,coord.parse_errors.size)
137
+ coord=Rutema::Coordinator.new(conf)
132
138
  coord.run("distro_test/specs/sample.spec")
139
+ assert_equal(0,coord.parse_errors.size)
140
+ coord=Rutema::Coordinator.new(conf)
133
141
  coord.run("distro_test/specs/no_title.spec")
142
+ assert_equal(1,coord.parse_errors.size)
134
143
  end
135
- assert_equal(1,coord.parse_errors.size)
136
144
  puts coord.to_s if $DEBUG
137
145
  end
138
146
 
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.9.3
4
+ version: 1.0.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-09-10 00:00:00 +02:00
12
+ date: 2008-10-06 00:00:00 +02:00
13
13
  default_executable: rutemax
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -20,7 +20,7 @@ dependencies:
20
20
  requirements:
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: 0.5.7
23
+ version: 0.6.0
24
24
  version:
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: highline
@@ -50,7 +50,7 @@ dependencies:
50
50
  requirements:
51
51
  - - "="
52
52
  - !ruby/object:Gem::Version
53
- version: 2.0.2
53
+ version: 2.1.1
54
54
  version:
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: ruport
@@ -86,7 +86,7 @@ description: "== DESCRIPTION: rutema is a test execution tool with a twist. It a
86
86
  email: riva@braveworld.net
87
87
  executables:
88
88
  - rutemax
89
- - rutemah
89
+ - rutema_upgrader
90
90
  extensions: []
91
91
 
92
92
  extra_rdoc_files:
@@ -100,13 +100,12 @@ files:
100
100
  - Manifest.txt
101
101
  - README.txt
102
102
  - Rakefile
103
- - bin/rutemah
104
103
  - bin/rutemax
104
+ - bin/rutema_upgrader
105
105
  - distro_test.sh
106
106
  - lib/rutema/configuration.rb
107
107
  - lib/rutema/db.rb
108
108
  - lib/rutema/gems.rb
109
- - lib/rutema/historian.rb
110
109
  - lib/rutema/model.rb
111
110
  - lib/rutema/reporter.rb
112
111
  - lib/rutema/reporters/activerecord.rb
@@ -116,11 +115,10 @@ files:
116
115
  - lib/rutema/specification.rb
117
116
  - lib/rutema/system.rb
118
117
  - selftest.sh
118
+ - test/data/sample09.db
119
119
  - test/distro_test/config/database.rutema
120
- - test/distro_test/config/database.rutemah
121
120
  - test/distro_test/config/full.rutema
122
121
  - test/distro_test/config/jruby.rutema
123
- - test/distro_test/config/jruby.rutemah
124
122
  - test/distro_test/config/minimal.rutema
125
123
  - test/distro_test/specs/T001.spec
126
124
  - test/distro_test/specs/T002.spec
@@ -132,8 +130,8 @@ files:
132
130
  - test/distro_test/specs/sample.spec
133
131
  - test/rutema.rutema
134
132
  - test/rutema.spec
133
+ - test/migration.spec
135
134
  - test/test_configuration.rb
136
- - test/test_historian.rb
137
135
  - test/test_model.rb
138
136
  - test/test_reporter.rb
139
137
  - test/test_specification.rb
@@ -161,13 +159,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
161
159
  requirements: []
162
160
 
163
161
  rubyforge_project: patir
164
- rubygems_version: 1.2.0
162
+ rubygems_version: 1.3.0
165
163
  signing_key:
166
164
  specification_version: 2
167
165
  summary: rutema is a test execution and management framework for heterogeneous testing environments
168
166
  test_files:
169
167
  - test/test_configuration.rb
170
- - test/test_historian.rb
171
168
  - test/test_model.rb
172
169
  - test/test_reporter.rb
173
170
  - test/test_specification.rb
data/bin/rutemah DELETED
@@ -1,9 +0,0 @@
1
- # Copyright (c) 2007 Vassilis Rizopoulos. All rights reserved.
2
- begin
3
- require 'rutema/historian'
4
- rescue LoadError
5
- require 'rubygems'
6
- require 'rutema/historian'
7
- end
8
-
9
- Rutema::RutemaH.new(ARGV)
@@ -1,106 +0,0 @@
1
- # Copyright (c) 2007 Vassilis Rizopoulos. All rights reserved.
2
- $:.unshift File.join(File.dirname(__FILE__),"..")
3
- require 'rutema/model'
4
- require 'rutema/system'
5
- require 'rutema/db'
6
- require 'rutema/gems'
7
-
8
- module Rutema
9
- #The "historian" application class
10
- #
11
- #RutemaH provides reports for test results over time using the data stored by the ActiveRecordReporter
12
- class RutemaH
13
- require 'optparse'
14
- def initialize command_line_args
15
- parse_command_line(command_line_args)
16
- logger=Patir.setup_logger(@log_file)
17
- begin
18
- raise "No configuration file defined!" if !@config_file
19
- configuration=RutemaHConfigurator.new(@config_file,logger).configuration
20
- historian=Historian.new(configuration,logger)
21
- puts historian.history(@command)
22
- rescue Patir::ConfigurationException
23
- logger.debug($!)
24
- logger.fatal("Configuration error '#{$!.message}'")
25
- exit 1
26
- rescue
27
- logger.debug($!)
28
- logger.fatal("#{$!.message}")
29
- exit 1
30
- end
31
- end
32
- private
33
- def parse_command_line args
34
- args.options do |opt|
35
- opt.on("Usage:")
36
- opt.on("rutemah [options] -c CONFIG command")
37
- opt.on("Options:")
38
- opt.on("--debug", "-d","Turns on debug messages") { $DEBUG=true }
39
- opt.on("--config FILE", "-c FILE",String,"Loads the configuration from FILE") { |@config_file|}
40
- opt.on("--log FILE", "-l FILE",String,"Redirects the log output to FILE") { |@log_file|}
41
- opt.on("-v", "--version","Displays the version") { $stdout.puts("v#{Version::STRING}");exit 0 }
42
- opt.on("--help", "-h", "-?", "This text") { $stdout.puts opt; exit 0 }
43
- opt.on("Commands are:")
44
- opt.on("all - lists all entries in the database")
45
- opt.on("\"testname\" - lists all tests runs for the given test name")
46
- opt.parse!
47
- #and now the rest
48
- if args.empty?
49
- $stdout.puts opt
50
- exit 0
51
- else
52
- @command=args.shift
53
- end
54
- end
55
- end#parse_command_line
56
- end
57
-
58
- class Historian
59
- def initialize configuration,logger=nil
60
- @logger=logger
61
- @logger||=Patir.setup_logger
62
- @configuration=configuration
63
- Rutema.connect_to_ar(@configuration.db[:database],@logger,false)
64
- end
65
-
66
- def history mode
67
- begin
68
- case mode
69
- when "all"
70
- table=Model::Scenario.report_table(:all)
71
- if table.empty?
72
- @logger.warn("No entries found")
73
- else
74
- ret=Ruport::Data::Grouping(beautify(table),:by=>"run_id")
75
- end
76
- when String
77
- ret=per_spec(mode)
78
- end
79
- rescue
80
- @logger.debug($!)
81
- @logger.error("Could not retrieve scenario data from the database")
82
- end
83
- return ret
84
- end
85
- private
86
- def beautify table
87
- @logger.debug("Beautifying...")
88
- table.reorder("run_id","name","status","attended","version","start_time","stop_time")
89
- table.replace_column("version") {|r| r.version ? r.version : "N/A"}
90
- table.replace_column("attended") {|r| r.attended=="t" ? "yes" : "no"}
91
- table.replace_column("start_time") {|r| r.stop_time ? r.start_time : nil}
92
- return table
93
- end
94
- def per_spec spec_name
95
- @logger.debug("History of #{spec_name}")
96
- table=Model::Scenario.report_table(:all,:conditions=>"name = '#{spec_name}'",:except=>["id","number"])
97
- if table.empty?
98
- @logger.warn("No test run records found for #{spec_name}")
99
- nil
100
- else
101
- beautify(table)
102
- end
103
-
104
- end
105
- end
106
- end
@@ -1,7 +0,0 @@
1
- #include the configuration from database.rutema
2
- configuration.load_from_file("database.rutema")
3
- #This is the verbose version of the configuration entry:
4
- #configuration.db={:database=>"sample.db",:adapter=>"sqlite3"}
5
- #For the time being the adapter is being automatically set according to the platform we're running on, so the :adapter is ignored
6
- #SQLite for MRI and h2 for jRuby
7
- configuration.db={:database=>"sample.db"}
@@ -1,7 +0,0 @@
1
- #include the configuration from database.rutema
2
- configuration.load_from_file("database.rutema")
3
- #This is the verbose version of the configuration entry:
4
- #configuration.db=:database=>"db/h2",:adapter=>"jdbch2"}
5
- #For the time being the adapter is being automatically set according to the platform we're running on, so the :adapter is ignored
6
- #SQLite for MRI and h2 for jRuby
7
- configuration.db={:database=>"db/h2"}
@@ -1,82 +0,0 @@
1
- $:.unshift File.join(File.dirname(__FILE__),"..","lib")
2
- require 'test/unit'
3
- require 'ostruct'
4
- require 'fileutils'
5
- require 'rutema/historian'
6
- #$DEBUG=true
7
- module TestRutema
8
- class TestHistorian<Test::Unit::TestCase
9
- def setup
10
- @configuration=OpenStruct.new
11
- @configuration.db={:database=>":memory:"}
12
- @configuration.db={:database=>"db/h2"} if RUBY_PLATFORM =~ /java/
13
- end
14
- def teardown
15
- ActiveRecord::Base.remove_connection
16
- FileUtils.rm_rf("db/") if File.exists?("db/")
17
- end
18
- def test_history
19
- assert_nothing_raised() do
20
- h=Rutema::Historian.new(@configuration)
21
- Rutema::Model::Schema.up
22
- a_bunch_of_data
23
- assert_not_nil( h.history("all"), "There should be some history there" )
24
- assert_not_nil(h.history("TC001"), "TC001 should have some history" )
25
- assert_nil(h.history("test5"), "No history expected of test5" )
26
- assert_not_nil( h.history("all") )
27
- assert_not_nil( h.history("TC002") )
28
- end
29
- end
30
- def test_no_db
31
- ActiveRecord::Base.remove_connection
32
- if RUBY_PLATFORM =~ /java/
33
- @configuration.db={:database=>"foo",:adapter=>"jdbch2"}
34
- else
35
- @configuration.db={:database=>"foo",:adapter=>"sqlite3"}
36
-
37
- end
38
- assert_nothing_raised() do
39
- h=Rutema::Historian.new(@configuration)
40
- assert_nothing_raised() { h.history("all")}
41
- end
42
- end
43
-
44
- def a_bunch_of_data
45
- runs=[]
46
- runs<<Rutema::Model::Run.new(:context=>{:version=>"0.4a"},:scenarios=>success_scenarios)
47
- runs<<Rutema::Model::Run.new(:context=>{:version=>"0.4b"},:scenarios=>success_scenarios)
48
- runs<<Rutema::Model::Run.new(:context=>{:version=>"0.4c"},:scenarios=>failure_scenarios)
49
- runs.each{|r| r.save}
50
- end
51
- def success_scenarios
52
- scenarios=[]
53
- 1.upto(2) do |i|
54
- steps=[]
55
- steps<<Rutema::Model::Step.new(:name=>"hard",:number=>1,:status=>"success",
56
- :output=>"the first step is hard",:error=>"",:duration=>1)
57
- steps<<Rutema::Model::Step.new(:name=>"easy",:number=>2,:status=>"success",
58
- :output=>"the next step is easy",:error=>"",:duration=>1)
59
- scenarios<<Rutema::Model::Scenario.new(:name=>"TC00#{i}",:version=>"100",
60
- :attended=>false,:status=>"success",
61
- :start_time=>(Time.now-10000*i),:stop_time=>(Time.now-10000*i),
62
- :steps=>steps)
63
- end
64
- return scenarios
65
- end
66
- def failure_scenarios
67
- failed_step=Rutema::Model::Step.new(:name=>"echo",:number=>1,:status=>"error",
68
- :output=>"Hel^.",:error=>"IO error",:duration=>1)
69
- [Rutema::Model::Scenario.new(:name=>"TC003",:version=>"10",
70
- :attended=>false,:status=>"error",:steps=>[failed_step],
71
- :start_time=>(Time.now-10000),:stop_time=>Time.now)]
72
- end
73
- def setup_for_mri
74
- ActiveRecord::Base.establish_connection(:adapter => "sqlite3",:database =>":memory:")
75
- @configuration.db={:database=>":memory:",:adapter=>"sqlite3"}
76
- end
77
- def setup_for_java
78
- ActiveRecord::Base.establish_connection(:adapter => "jdbch2",:database =>"db/h2")
79
- @configuration.db={:database=>"db/h2",:adapter=>"jdbch2"}
80
- end
81
- end
82
- end