allure-rspec 0.4.2 → 0.5.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 012d9f82fef3280defb7a7bf0279304b7bc5faed
4
- data.tar.gz: 8b0e5ecb45a6a704abfbe64ba2438950b441f846
3
+ metadata.gz: 4626a6eeb97f523375d513c76fc22cd796864d88
4
+ data.tar.gz: 4cadd49b7f4d032d25d1e7769a2a061e91431598
5
5
  SHA512:
6
- metadata.gz: daac4d24b366f3ce2cc20bf0750784df753c44a4c46dedd173dcdbdec05ab42042330185b2e9d3b508eeaf95e0991e43808e8e58f8e3f3fbeff6802b7499d8dc
7
- data.tar.gz: ce94edd8becef81deadbe5230ec408081645e2f683486cbc69109f027365f60c052ee1e198a80c18f9911e670573eaac9c9764604484e9d144f7b788e31a8346
6
+ metadata.gz: 861abf562a8def12955cf5e3d11db427741dbe899f6a8542202568ee8d2f7d056abf270c2c392033448493a4ff2b5161250a4e1726fab0459628667553403eaf
7
+ data.tar.gz: 8c2d6ae757c83ff486958a8dd73e89b49e29eee9730f0382c2edb42796e739c4f02197b458dd28878b2af8cd635dff0fa416fba83240da9c9300a55d53602581
data/Gemfile CHANGED
@@ -2,5 +2,4 @@ source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
4
  gem 'rspec', '~> 2.14.0'
5
- gem 'nokogiri', '~> 1.6.0'
6
- gem 'mimemagic'
5
+ gem 'allure-ruby-api', '0.6'
data/Gemfile.lock CHANGED
@@ -1,22 +1,24 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- allure-rspec (0.4.2)
5
- mimemagic
6
- nokogiri (~> 1.6.0)
4
+ allure-rspec (0.5.0)
7
5
  rspec (~> 2.14.0)
8
- uuid
9
6
 
10
7
  GEM
11
8
  remote: https://rubygems.org/
12
9
  specs:
10
+ allure-ruby-api (0.6)
11
+ mimemagic
12
+ nokogiri (~> 1.6.0)
13
+ rspec (~> 2.14.0)
14
+ uuid
13
15
  diff-lcs (1.2.5)
14
16
  macaddr (1.7.1)
15
17
  systemu (~> 2.6.2)
16
18
  mimemagic (0.2.1)
17
- mini_portile (0.5.2)
18
- nokogiri (1.6.0)
19
- mini_portile (~> 0.5.0)
19
+ mini_portile (0.6.0)
20
+ nokogiri (1.6.3.1)
21
+ mini_portile (= 0.6.0)
20
22
  rake (10.1.0)
21
23
  rspec (2.14.1)
22
24
  rspec-core (~> 2.14.0)
@@ -35,8 +37,7 @@ PLATFORMS
35
37
 
36
38
  DEPENDENCIES
37
39
  allure-rspec!
40
+ allure-ruby-api (= 0.6)
38
41
  bundler
39
- mimemagic
40
- nokogiri (~> 1.6.0)
41
42
  rake
42
43
  rspec (~> 2.14.0)
data/README.md CHANGED
@@ -4,6 +4,8 @@ Adaptor to use the Allure framework along with the RSpec
4
4
 
5
5
  ## What's new
6
6
 
7
+ * *0.5.0* - Migrating to allure-ruby-api.
8
+ * *0.4.2* - Support for labels (feature,story,severity,language,framework).
7
9
  * *0.4.1* - Support for before/after(:step) hooks.
8
10
  * *0.3.1* - Allure 1.4.0 format support.
9
11
 
@@ -30,20 +32,25 @@ your current directory.
30
32
 
31
33
  ```ruby
32
34
  AllureRSpec.configure do |c|
33
- c.output_dir = "/whatever/you/like"
35
+ c.output_dir = "/whatever/you/like" # default: allure/data
36
+ c.clean_dir = false # clean the output directory first? (default: true)
34
37
  end
35
38
  ```
36
39
 
37
40
  ## Usage examples
38
41
 
39
42
  ```ruby
40
- describe MySpec do
43
+ describe MySpec, :feature => "Some feature", :severity => :normal do
41
44
 
42
45
  before(:step) do |s|
43
46
  puts "Before step #{s.current_step}"
44
47
  end
45
48
 
46
- it "should be steps enabled" do
49
+ it "should be critical", :story => "First story", :severity => :critical do
50
+ "string".should == "string"
51
+ end
52
+
53
+ it "should be steps enabled", :story => ["First story", "Second story"] do
47
54
 
48
55
  step "step1" do
49
56
  attach_file "screenshot1", take_screenshot_as_file
data/allure-rspec.gemspec CHANGED
@@ -19,9 +19,6 @@ Gem::Specification.new do |s|
19
19
  s.require_paths = ['lib']
20
20
 
21
21
  s.add_dependency 'rspec', '~> 2.14.0'
22
- s.add_dependency 'nokogiri', '~> 1.6.0'
23
- s.add_dependency 'uuid'
24
- s.add_dependency 'mimemagic'
25
22
 
26
23
  s.add_development_dependency 'bundler'
27
24
  s.add_development_dependency 'rake'
data/lib/allure-rspec.rb CHANGED
@@ -1,8 +1,8 @@
1
+ require 'allure-ruby-api'
1
2
  require 'allure-rspec/version'
2
3
  require 'allure-rspec/formatter'
3
4
  require 'allure-rspec/adaptor'
4
5
  require 'allure-rspec/dsl'
5
- require 'allure-rspec/builder'
6
6
  require 'allure-rspec/hooks'
7
7
 
8
8
  module AllureRSpec
@@ -11,12 +11,17 @@ module AllureRSpec
11
11
  module Config
12
12
  class << self
13
13
  attr_accessor :output_dir
14
+ attr_accessor :clean_dir
14
15
 
15
16
  DEFAULT_OUTPUT_DIR = 'allure/data'
16
17
 
17
18
  def output_dir
18
19
  @output_dir || DEFAULT_OUTPUT_DIR
19
20
  end
21
+
22
+ def clean_dir?
23
+ @clean_dir || true
24
+ end
20
25
  end
21
26
  end
22
27
 
@@ -37,6 +42,9 @@ module AllureRSpec
37
42
  class << self
38
43
  def configure(&block)
39
44
  yield Config
45
+ AllureRubyApi.configure {|c|
46
+ c.output_dir = Config.output_dir
47
+ }
40
48
  end
41
49
  end
42
50
 
@@ -2,10 +2,6 @@ require 'digest'
2
2
  require 'mimemagic'
3
3
  module AllureRSpec
4
4
  module DSL
5
- def __mutex
6
- @@__mutex ||= Mutex.new
7
- end
8
-
9
5
  def current_step
10
6
  if defined? @@__current_step
11
7
  @@__current_step
@@ -14,6 +10,27 @@ module AllureRSpec
14
10
  end
15
11
  end
16
12
 
13
+ def step(step, &block)
14
+ suite = self.example.metadata[:example_group][:description_args].first
15
+ test = self.example.metadata[:description]
16
+ AllureRubyApi::Builder.start_step(suite, test, step)
17
+ __with_step step, &block
18
+ AllureRubyApi::Builder.stop_step(suite, test, step)
19
+ end
20
+
21
+ def attach_file(title, file, opts = {})
22
+ suite = self.example.metadata[:example_group][:description_args].first
23
+ test = self.example.metadata[:description]
24
+ step = current_step
25
+ AllureRubyApi::Builder.add_attachment suite, test, opts.merge(:file => file, :title => title, :step => step)
26
+ end
27
+
28
+ private
29
+
30
+ def __mutex
31
+ @@__mutex ||= Mutex.new
32
+ end
33
+
17
34
  def __with_step(step, &block)
18
35
  __mutex.synchronize do
19
36
  begin
@@ -26,32 +43,6 @@ module AllureRSpec
26
43
  end
27
44
  end
28
45
  end
29
-
30
- def step(step, &block)
31
- suite = self.example.metadata[:example_group][:description_args].first
32
- test = self.example.metadata[:description]
33
- AllureRSpec::Builder.start_step(suite, test, step)
34
- __with_step step, &block
35
- AllureRSpec::Builder.stop_step(suite, test, step)
36
- end
37
-
38
- def attach_file(title, file)
39
- step = current_step
40
- dir = Pathname.new(AllureRSpec::Config.output_dir)
41
- FileUtils.mkdir_p(dir)
42
- file_extname = File.extname(file.path.downcase)
43
- type = MimeMagic.by_path(file.path) || "text/plain"
44
- attachment = dir.join("#{Digest::SHA256.file(file.path).hexdigest}-attachment#{(file_extname.empty?) ? '' : file_extname}")
45
- FileUtils.cp(file.path, attachment)
46
- suite = self.example.metadata[:example_group][:description_args].first
47
- test = self.example.metadata[:description]
48
- AllureRSpec::Builder.add_attachment(suite, test, {
49
- :type => type,
50
- :title => title,
51
- :source => attachment.basename,
52
- :size => File.stat(attachment).size
53
- }, step)
54
- end
55
46
  end
56
47
  end
57
48
 
@@ -1,6 +1,5 @@
1
- require 'pathname'
2
- require 'uuid'
3
1
  require 'rspec/core/formatters/base_formatter'
2
+ require 'fileutils'
4
3
 
5
4
  module AllureRSpec
6
5
 
@@ -9,7 +8,7 @@ module AllureRSpec
9
8
  ALLOWED_LABELS = [:feature, :story, :severity, :language, :framework]
10
9
 
11
10
  def example_failed(example)
12
- AllureRSpec::Builder.stop_test(
11
+ AllureRubyApi::Builder.stop_test(
13
12
  example.metadata[:example_group][:description_args].first,
14
13
  example.metadata[:description],
15
14
  example.metadata[:execution_result].merge(
@@ -21,17 +20,17 @@ module AllureRSpec
21
20
  end
22
21
 
23
22
  def example_group_finished(group)
24
- AllureRSpec::Builder.stop_suite(group.metadata[:example_group][:description_args].first)
23
+ AllureRubyApi::Builder.stop_suite(group.metadata[:example_group][:description_args].first)
25
24
  super
26
25
  end
27
26
 
28
27
  def example_group_started(group)
29
- AllureRSpec::Builder.start_suite(group.metadata[:example_group][:description_args].first, labels(group))
28
+ AllureRubyApi::Builder.start_suite(group.metadata[:example_group][:description_args].first, labels(group))
30
29
  super
31
30
  end
32
31
 
33
32
  def example_passed(example)
34
- AllureRSpec::Builder.stop_test(
33
+ AllureRubyApi::Builder.stop_test(
35
34
  example.metadata[:example_group][:description_args].first,
36
35
  example.metadata[:description],
37
36
  example.metadata[:execution_result].merge(:caller => example.metadata[:caller])
@@ -46,31 +45,21 @@ module AllureRSpec
46
45
  def example_started(example)
47
46
  suite = example.metadata[:example_group][:description_args].first
48
47
  test = example.metadata[:description]
49
- AllureRSpec::Builder.start_test(suite, test, labels(example))
48
+ AllureRubyApi::Builder.start_test(suite, test, labels(example))
50
49
  super
51
50
  end
52
51
 
53
52
  def start(example_count)
54
53
  dir = Pathname.new(AllureRSpec::Config.output_dir)
55
- FileUtils.rm_rf(dir)
54
+ if AllureRSpec::Config.clean_dir?
55
+ FileUtils.rm_rf(dir)
56
+ end
57
+ FileUtils.mkdir_p(dir)
58
+ super
56
59
  end
57
60
 
58
61
  def stop
59
- AllureRSpec::Builder.each_suite_build do |suite, xml|
60
- dir = Pathname.new(AllureRSpec::Config.output_dir)
61
- FileUtils.mkdir_p(dir)
62
- out_file = dir.join("#{UUID.new.generate}-testsuite.xml")
63
- File.open(out_file, 'w+') do |file|
64
- file.write(xml)
65
- end
66
-
67
- xsd = Nokogiri::XML::Schema(File.read(Pathname.new(File.dirname(__FILE__)).join("../../allure-model.xsd")))
68
- doc = Nokogiri::XML(File.read(out_file))
69
-
70
- xsd.validate(doc).each do |error|
71
- $stderr.puts error.message
72
- end
73
- end
62
+ AllureRubyApi::Builder.build!
74
63
  super
75
64
  end
76
65
 
@@ -1,5 +1,5 @@
1
1
  module AllureRSpec # :nodoc:
2
2
  module Version # :nodoc:
3
- STRING = '0.4.2'
3
+ STRING = '0.5.0'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: allure-rspec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ilya Sadykov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-25 00:00:00.000000000 Z
11
+ date: 2014-08-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -24,48 +24,6 @@ dependencies:
24
24
  - - ~>
25
25
  - !ruby/object:Gem::Version
26
26
  version: 2.14.0
27
- - !ruby/object:Gem::Dependency
28
- name: nokogiri
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ~>
32
- - !ruby/object:Gem::Version
33
- version: 1.6.0
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ~>
39
- - !ruby/object:Gem::Version
40
- version: 1.6.0
41
- - !ruby/object:Gem::Dependency
42
- name: uuid
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - '>='
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - '>='
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: mimemagic
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - '>='
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - '>='
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
27
  - !ruby/object:Gem::Dependency
70
28
  name: bundler
71
29
  requirement: !ruby/object:Gem::Requirement
@@ -105,11 +63,9 @@ files:
105
63
  - Gemfile
106
64
  - Gemfile.lock
107
65
  - README.md
108
- - allure-model.xsd
109
66
  - allure-rspec.gemspec
110
67
  - lib/allure-rspec.rb
111
68
  - lib/allure-rspec/adaptor.rb
112
- - lib/allure-rspec/builder.rb
113
69
  - lib/allure-rspec/dsl.rb
114
70
  - lib/allure-rspec/formatter.rb
115
71
  - lib/allure-rspec/hooks.rb
@@ -141,5 +97,5 @@ rubyforge_project:
141
97
  rubygems_version: 2.0.3
142
98
  signing_key:
143
99
  specification_version: 4
144
- summary: allure-rspec-0.4.2
100
+ summary: allure-rspec-0.5.0
145
101
  test_files: []
data/allure-model.xsd DELETED
@@ -1,171 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <xs:schema attributeFormDefault="unqualified" elementFormDefault="unqualified"
3
- xmlns:xs="http://www.w3.org/2001/XMLSchema"
4
- xmlns:qa="urn:model.allure.qatools.yandex.ru"
5
- targetNamespace="urn:model.allure.qatools.yandex.ru">
6
-
7
- <xs:element name="test-suite" type="qa:test-suite-result"/>
8
-
9
- <xs:complexType name="test-suite-result">
10
- <xs:all>
11
- <xs:element name="name" type="xs:string"/>
12
- <xs:element name="title" type="xs:string" minOccurs="0"/>
13
- <xs:element name="description" type="qa:description" minOccurs="0"/>
14
- <xs:element name="test-cases" type="qa:test-cases-result" minOccurs="0"/>
15
- <xs:element name="labels" type="qa:labels" minOccurs="0"/>
16
- </xs:all>
17
- <xs:attribute name="start" type="xs:long" use="required"/>
18
- <xs:attribute name="stop" type="xs:long" use="required"/>
19
- <xs:attribute name="version" type="xs:string"/>
20
- </xs:complexType>
21
-
22
- <xs:complexType name="test-cases-result">
23
- <xs:sequence>
24
- <xs:element name="test-case" type="qa:test-case-result" maxOccurs="unbounded" minOccurs="0"/>
25
- </xs:sequence>
26
- </xs:complexType>
27
-
28
- <xs:complexType name="test-case-result">
29
- <xs:all>
30
- <xs:element name="name" type="xs:string"/>
31
- <xs:element name="title" type="xs:string" minOccurs="0"/>
32
- <xs:element name="description" type="qa:description" minOccurs="0"/>
33
- <xs:element name="failure" type="qa:failure" minOccurs="0"/>
34
- <xs:element name="steps" type="qa:steps" minOccurs="0"/>
35
- <xs:element name="attachments" type="qa:attachments" minOccurs="0"/>
36
- <xs:element name="labels" type="qa:labels" minOccurs="0"/>
37
- <xs:element name="parameters" type="qa:parameters" minOccurs="0"/>
38
- </xs:all>
39
- <xs:attribute name="start" type="xs:long" use="required"/>
40
- <xs:attribute name="stop" type="xs:long" use="required"/>
41
- <xs:attribute name="status" type="qa:status" use="required"/>
42
- </xs:complexType>
43
-
44
- <xs:complexType name="steps">
45
- <xs:sequence>
46
- <xs:element name="step" type="qa:step" minOccurs="0" maxOccurs="unbounded"/>
47
- </xs:sequence>
48
- </xs:complexType>
49
-
50
- <xs:complexType name="step">
51
- <xs:all>
52
- <xs:element name="name" type="xs:string"/>
53
- <xs:element name="title" type="xs:string" minOccurs="0"/>
54
- <xs:element name="attachments" type="qa:attachments" minOccurs="0"/>
55
- <xs:element name="steps" type="qa:steps" minOccurs="0"/>
56
- </xs:all>
57
- <xs:attribute name="start" type="xs:long" use="required"/>
58
- <xs:attribute name="stop" type="xs:long" use="required"/>
59
- <xs:attribute name="status" type="qa:status" use="required"/>
60
- </xs:complexType>
61
-
62
- <xs:complexType name="failure">
63
- <xs:all>
64
- <xs:element name="message" type="xs:string"/>
65
- <xs:element name="stack-trace" type="xs:string" minOccurs="0"/>
66
- </xs:all>
67
- </xs:complexType>
68
-
69
- <xs:complexType name="labels">
70
- <xs:sequence>
71
- <xs:element name="label" type="qa:label" minOccurs="0" maxOccurs="unbounded"/>
72
- </xs:sequence>
73
- </xs:complexType>
74
-
75
- <xs:complexType name="label">
76
- <xs:attribute name="name" type="xs:string" use="required"/>
77
- <xs:attribute name="value" type="xs:string" use="required"/>
78
- </xs:complexType>
79
-
80
- <xs:complexType name="parameters">
81
- <xs:sequence>
82
- <xs:element name="parameter" type="qa:parameter" minOccurs="0" maxOccurs="unbounded"/>
83
- </xs:sequence>
84
- </xs:complexType>
85
-
86
- <xs:complexType name="parameter">
87
- <xs:attribute name="name" type="xs:string" use="required"/>
88
- <xs:attribute name="value" type="xs:string" use="required"/>
89
- <xs:attribute name="kind" type="qa:parameter-kind" use="required"/>
90
- </xs:complexType>
91
-
92
- <xs:simpleType name="parameter-kind">
93
- <xs:restriction base="xs:string">
94
- <xs:enumeration value="argument"/>
95
- <xs:enumeration value="system-property"/>
96
- <xs:enumeration value="environment-variable"/>
97
- </xs:restriction>
98
- </xs:simpleType>
99
-
100
- <xs:complexType name="attachments">
101
- <xs:sequence>
102
- <xs:element name="attachment" type="qa:attachment" minOccurs="0" maxOccurs="unbounded"/>
103
- </xs:sequence>
104
- </xs:complexType>
105
-
106
- <xs:complexType name="attachment">
107
- <xs:attribute name="title" type="xs:string" use="required"/>
108
- <xs:attribute name="source" type="xs:string" use="required"/>
109
- <xs:attribute name="type" type="xs:string" use="required"/>
110
- <xs:attribute name="size" type="xs:int"/>
111
- </xs:complexType>
112
-
113
- <!--Deprecated, will be removed in 1.4.0-->
114
- <xs:simpleType name="attachment-type">
115
- <xs:restriction base="xs:string">
116
- <xs:enumeration value="txt"/>
117
- <xs:enumeration value="html"/>
118
- <xs:enumeration value="xml"/>
119
- <xs:enumeration value="png"/>
120
- <xs:enumeration value="jpg"/>
121
- <xs:enumeration value="json"/>
122
- <xs:enumeration value="other"/>
123
- </xs:restriction>
124
- </xs:simpleType>
125
-
126
- <xs:simpleType name="status">
127
- <xs:restriction base="xs:string">
128
- <xs:enumeration value="failed"/>
129
- <xs:enumeration value="broken"/>
130
- <xs:enumeration value="passed"/>
131
- <xs:enumeration value="canceled"/>
132
- <xs:enumeration value="pending"/>
133
- </xs:restriction>
134
- </xs:simpleType>
135
-
136
- <xs:simpleType name="label-name">
137
- <xs:restriction base="xs:string">
138
- <xs:enumeration value="feature"/>
139
- <xs:enumeration value="story"/>
140
- <xs:enumeration value="severity"/>
141
- <xs:enumeration value="language"/>
142
- <xs:enumeration value="framework"/>
143
- </xs:restriction>
144
- </xs:simpleType>
145
-
146
- <xs:simpleType name="severity-level">
147
- <xs:restriction base="xs:string">
148
- <xs:enumeration value="blocker"/>
149
- <xs:enumeration value="critical"/>
150
- <xs:enumeration value="normal"/>
151
- <xs:enumeration value="minor"/>
152
- <xs:enumeration value="trivial"/>
153
- </xs:restriction>
154
- </xs:simpleType>
155
-
156
- <xs:complexType name="description">
157
- <xs:simpleContent>
158
- <xs:extension base="xs:string">
159
- <xs:attribute name="type" type="qa:description-type" default="text"/>
160
- </xs:extension>
161
- </xs:simpleContent>
162
- </xs:complexType>
163
-
164
- <xs:simpleType name="description-type">
165
- <xs:restriction base="xs:string">
166
- <xs:enumeration value="markdown"/>
167
- <xs:enumeration value="text"/>
168
- <xs:enumeration value="html"/>
169
- </xs:restriction>
170
- </xs:simpleType>
171
- </xs:schema>
@@ -1,182 +0,0 @@
1
- require 'rexml/text'
2
-
3
- module AllureRSpec
4
-
5
- class Builder
6
- class << self
7
- attr_accessor :suites
8
- MUTEX = Mutex.new
9
-
10
- def init_suites
11
- MUTEX.synchronize {
12
- self.suites ||= {}
13
- }
14
- end
15
-
16
- def start_suite(title, labels = [:severity => :normal])
17
- init_suites
18
- MUTEX.synchronize do
19
- puts "Starting case_or_suite #{title} with labels #{labels}"
20
- self.suites[title] = {
21
- :title => title,
22
- :start => timestamp,
23
- :tests => {},
24
- :labels => labels
25
- }
26
- end
27
- end
28
-
29
- def start_test(suite, test, labels = [:severity => :normal])
30
- MUTEX.synchronize do
31
- puts "Starting test #{suite}.#{test} with labels #{labels}"
32
- self.suites[suite][:tests][test] = {
33
- :title => test,
34
- :start => timestamp,
35
- :failure => nil,
36
- :steps => {},
37
- :attachments => [],
38
- :labels => labels,
39
- }
40
- end
41
- end
42
-
43
- def stop_test(suite, test, result = {})
44
- self.suites[suite][:tests][test][:steps].each do |step_title, step|
45
- if step[:stop].nil? || step[:stop] == 0
46
- stop_step(suite, test, step_title, result[:status])
47
- end
48
- end
49
- MUTEX.synchronize do
50
- puts "Stopping test #{suite}.#{test}"
51
- self.suites[suite][:tests][test][:stop] = timestamp(result[:finished_at])
52
- self.suites[suite][:tests][test][:start] = timestamp(result[:started_at])
53
- self.suites[suite][:tests][test][:status] = result[:status]
54
- if (result[:status].to_sym != :passed)
55
- self.suites[suite][:tests][test][:failure] = {
56
- :stacktrace => escape(((result[:exception] && result[:exception].backtrace) || []).map { |s| s.to_s }.join("\r\n")),
57
- :message => escape(result[:exception].to_s),
58
- }
59
- end
60
-
61
- end
62
- end
63
-
64
- def escape(text)
65
- #REXML::Text.new(text, false, nil, false)
66
- text
67
- end
68
-
69
- def start_step(suite, test, step)
70
- MUTEX.synchronize do
71
- puts "Starting step #{suite}.#{test}.#{step}"
72
- self.suites[suite][:tests][test][:steps][step] = {
73
- :title => step,
74
- :start => timestamp,
75
- :attachments => []
76
- }
77
- end
78
- end
79
-
80
- def add_attachment(suite, test, attachment, step = nil)
81
- attach = {
82
- :title => attachment[:title],
83
- :source => attachment[:source],
84
- :type => attachment[:type],
85
- :size => attachment[:size],
86
- }
87
- if step.nil?
88
- self.suites[suite][:tests][test][:attachments] << attach
89
- else
90
- self.suites[suite][:tests][test][:steps][step][:attachments] << attach
91
- end
92
- end
93
-
94
- def stop_step(suite, test, step, status = :passed)
95
- MUTEX.synchronize do
96
- puts "Stopping step #{suite}.#{test}.#{step}"
97
- self.suites[suite][:tests][test][:steps][step][:stop] = timestamp
98
- self.suites[suite][:tests][test][:steps][step][:status] = status
99
- end
100
- end
101
-
102
- def stop_suite(title)
103
- init_suites
104
- MUTEX.synchronize do
105
- puts "Stopping case_or_suite #{title}"
106
- self.suites[title][:stop] = timestamp
107
- end
108
- end
109
-
110
- def timestamp(time = nil)
111
- ((time || Time.now).to_f * 1000).to_i
112
- end
113
-
114
- def each_suite_build(&block)
115
- suites_xml = []
116
- self.suites.each do |suite_title, suite|
117
- builder = Nokogiri::XML::Builder.new do |xml|
118
- xml.send "ns2:test-suite", :start => suite[:start] || 0, :stop => suite[:stop] || 0, 'xmlns' => '', "xmlns:ns2" => "urn:model.allure.qatools.yandex.ru" do
119
- xml.send :name, suite_title
120
- xml.send :title, suite_title
121
- xml.send "test-cases" do
122
- suite[:tests].each do |test_title, test|
123
- xml.send "test-case", :start => test[:start] || 0, :stop => test[:stop] || 0, :status => test[:status] do
124
- xml.send :name, test_title
125
- xml.send :title, test_title
126
- unless test[:failure].nil?
127
- xml.failure do
128
- xml.message test[:failure][:message]
129
- xml.send "stack-trace", test[:failure][:stacktrace]
130
- end
131
- end
132
- xml.steps do
133
- test[:steps].each do |step_title, step_obj|
134
- xml.step(:start => step_obj[:start] || 0, :stop => step_obj[:stop] || 0, :status => step_obj[:status]) do
135
- xml.send :name, step_title
136
- xml.send :title, step_title
137
- xml_attachments(xml, step_obj[:attachments])
138
- end
139
- end
140
- end
141
- xml_attachments(xml, test[:attachments])
142
- xml_labels(xml, suite[:labels].merge(test[:labels]))
143
- xml.parameters
144
- end
145
- end
146
- end
147
- xml_labels(xml, suite[:labels])
148
- end
149
- end
150
- xml = builder.to_xml
151
- yield suite, xml
152
- suites_xml << xml
153
- end
154
- suites_xml
155
- end
156
-
157
- private
158
-
159
- def xml_attachments(xml, attachments)
160
- xml.attachments do
161
- attachments.each do |attach|
162
- xml.attachment :source => attach[:source], :title => attach[:title], :size => attach[:size], :type => attach[:type]
163
- end
164
- end
165
- end
166
-
167
- def xml_labels(xml, labels)
168
- xml.labels do
169
- labels.each do |name, value|
170
- if value.is_a?(Array)
171
- value.each do |v|
172
- xml.label :name => name, :value => v
173
- end
174
- else
175
- xml.label :name => name, :value => value
176
- end
177
- end
178
- end
179
- end
180
- end
181
- end
182
- end