tuneup-plist-to-junit 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3c4362932bc7e756badcfc523c406fd05c47ad0e
4
- data.tar.gz: 90355223ca4ee0bb777a67868807be4d456b4535
3
+ metadata.gz: 1fda575e2ef3f1a5b7978392523dc5b4c23b6ee5
4
+ data.tar.gz: 65ccf833cae8797e43adc8fad194c88de731fd85
5
5
  SHA512:
6
- metadata.gz: 19f10e904c4560ef2588194d6fee58ca9e7134543062d3084503a82907bad4183332a229b4f5c4365e594c0c6d2e89b5bc83e007d161407f280edfeab14d479d
7
- data.tar.gz: cdfd99bea3ce7b4f45d21671dd5adcc6932e0313a2de37d62ef4d02c520267664de9d3340ce5a808b342d9fbbfaa44f0471eaf3aa2e1df1999a7a13123d411a5
6
+ metadata.gz: a87b7e0a1e18b1049ab1e653ed84bbebf357a902820c209b626b27a6fef75f4725dd8e65671041bb48a45c0aa14bc3918c5f775d16604f8ece93df65e44cd21f
7
+ data.tar.gz: 759876c1cf3da45e652bfa29d465d72184515242a3c84f7629de4990787dd40343feb56ceb96c0980876f014a6124e4c87a564d07b2544b03dbe20bc82307369
data/README.md CHANGED
@@ -34,6 +34,7 @@ To use, simply use
34
34
  Specific options:
35
35
  -i, --input FILE UIAutomation plist generated with TuneupJS. Default: Automation Results.plist
36
36
  -o, --output FILE Output location of JUnit test report. Default: test_report.xml
37
+ -c, --class-name CLASSNAME The class name to use on the test case. Default: UIAutomation
37
38
 
38
39
  Common options:
39
40
  -h, --help Show this message
@@ -11,9 +11,10 @@ require_relative '../lib/tuneup_plist_to_junit_utils'
11
11
  def parse_command_line_args(args)
12
12
  options = OpenStruct.new
13
13
 
14
- # Set our default input/output arguments
14
+ # Set our default input/output and class name arguments
15
15
  options.input = 'Automation Results.plist'
16
16
  options.output = 'test_report.xml'
17
+ options.class_name = 'UIAutomation'
17
18
 
18
19
  # Build our options parser
19
20
  opt_parser = OptionParser.new do |opts|
@@ -31,6 +32,10 @@ def parse_command_line_args(args)
31
32
  options.output = output
32
33
  end
33
34
 
35
+ opts.on('-c', '--class-name CLASSNAME', 'The class name to use on the test case. Default: UIAutomation') do |output|
36
+ options.class_name = output
37
+ end
38
+
34
39
  opts.separator ''
35
40
  opts.separator 'Common options:'
36
41
 
@@ -55,6 +60,6 @@ end
55
60
  options = parse_command_line_args(ARGV)
56
61
 
57
62
  # Convert the plist file to junit xml and write it to our destination
58
- junit_report = TuneUpPlistToJunitUtils.new.generate_reports(options.input)
63
+ junit_report = TuneUpPlistToJunitUtils.new.generate_reports(options.input, options.class_name)
59
64
  File.open(options.output, 'w') { |f| f.write(junit_report) }
60
65
 
@@ -1,3 +1,3 @@
1
1
  module TuneUpPlistToJunit
2
- VERSION = "0.0.1"
2
+ VERSION = '0.0.2'
3
3
  end
@@ -70,7 +70,7 @@ class TuneUpPlistToJunitUtils
70
70
  :timestamp => timestamp,
71
71
  :messages => []}
72
72
 
73
- # In order to add a message to our current test, the message type can't be a begin or end node
73
+ # In order to add a message to our current test, the message type can't be a begin or end node
74
74
  elsif current_test && log_message_type != END_FAILURE && log_message_type != END_SUCCESS && log_message_type != START_TEST
75
75
  message = log_message_type == SCREENSHOT ? screenshot : message
76
76
  message = "#{message} \nView Dump: \n#{JSON.pretty_generate(children)}\n" if children
@@ -79,8 +79,8 @@ class TuneUpPlistToJunitUtils
79
79
  :log_message_type => log_message_type,
80
80
  :timestamp => timestamp}
81
81
 
82
- # If the current test is present and the message type is an end node, then add the current test to our tests and
83
- # reset the current test
82
+ # If the current test is present and the message type is an end node, then add the current test to our tests and
83
+ # reset the current test
84
84
  elsif current_test && (log_message_type == END_FAILURE || log_message_type == END_SUCCESS)
85
85
  current_test[:end_message_type] = log_message_type
86
86
  current_test[:elapsed_time] = timestamp.to_time - current_test[:timestamp].to_time
@@ -96,8 +96,9 @@ class TuneUpPlistToJunitUtils
96
96
  # the tests can then me transformed into a junit style xml output
97
97
  #
98
98
  # @param tests [Array] array of processed plist tests as generated from (@see #convert_log_messages_to_tests)
99
+ # @param [String] junit_class_name the class name to append to each <testcase/> tag
99
100
  # @return [String] a junit xml string
100
- def generate_junit_report(tests)
101
+ def generate_junit_report(tests, junit_class_name)
101
102
  # Gather our root <testsuite/> tag information
102
103
  total_tests = tests.size
103
104
  total_errors = tests.reduce(0) { |sum, t| sum + t[:messages].count { |m| m[:log_message_type] == LOG_ERROR } }
@@ -111,7 +112,7 @@ class TuneUpPlistToJunitUtils
111
112
  xml.testsuite(:tests => total_tests, :errors => total_errors, :failures => total_failures, :timestamp => starting_time, :time => total_time) {
112
113
  # For each of our tests we want to create a <testcase/> tag
113
114
  tests.each do |test|
114
- xml.testcase(:name => test[:name], :time => test[:elapsed_time]) {
115
+ xml.testcase(:name => test[:name], :time => test[:elapsed_time], :classname => junit_class_name) {
115
116
 
116
117
  # If the test case ended in a failure, we want to add a <failure/> tag
117
118
  if test[:end_message_type] == END_FAILURE
@@ -146,11 +147,12 @@ class TuneUpPlistToJunitUtils
146
147
  # Process the plist file and generates a JUnit style xml string
147
148
  #
148
149
  # @param [String] plist_file_or_xml file name or xml of the UIAutomation plist file
150
+ # @param [String] junit_class_name the class name to append to each <testcase/> tag
149
151
  # @return [String] the JUnit style xml
150
- def generate_reports(plist_file_or_xml)
152
+ def generate_reports(plist_file_or_xml, junit_class_name)
151
153
  log_messages = parse_plist(plist_file_or_xml)
152
154
  tests = convert_log_messages_to_tests(log_messages)
153
- generate_junit_report(tests)
155
+ generate_junit_report(tests, junit_class_name)
154
156
  end
155
157
 
156
158
  end
@@ -1,32 +1,32 @@
1
1
  <?xml version="1.0"?>
2
2
  <testsuite tests="12" errors="3" failures="3" timestamp="2014-03-04T20:36:27+00:00" time="166.0">
3
- <testcase name="Holding login button shows the edit url popup" time="14.0">
3
+ <testcase name="Holding login button shows the edit url popup" time="14.0" classname="UIAutomation">
4
4
  <system-out>target.frontMostApp().mainWindow().buttons()["Login Button"].touchAndHold("5.5")</system-out>
5
5
  <system-out>target.frontMostApp().mainWindow().textViews()[0].touchAndHold("1.1")</system-out>
6
6
  <system-out>target.frontMostApp().editingMenu().elements()["Select All"].tap()</system-out>
7
7
  <system-out>target.frontMostApp().keyboard().typeString("http://vince.poweredbypeanuts.com:3000/api")</system-out>
8
8
  <system-out>target.frontMostApp().mainWindow().buttons()[1].tap()</system-out>
9
9
  </testcase>
10
- <testcase name="Login button takes us to the login webview" time="2.0">
10
+ <testcase name="Login button takes us to the login webview" time="2.0" classname="UIAutomation">
11
11
  <system-out>target.frontMostApp().mainWindow().buttons()["Login Button"].tap()</system-out>
12
12
  </testcase>
13
- <testcase name="Searching for provider yeilds only one result" time="3.0">
13
+ <testcase name="Searching for provider yeilds only one result" time="3.0" classname="UIAutomation">
14
14
  <system-out>target.frontMostApp().mainWindow().scrollViews()[0].webViews()[0].textFields()[0].tap()</system-out>
15
15
  <system-out>target.frontMostApp().keyboard().typeString("DemoDummy")</system-out>
16
16
  </testcase>
17
- <testcase name="Tapping the provider link brings us to the demo login page" time="3.0">
17
+ <testcase name="Tapping the provider link brings us to the demo login page" time="3.0" classname="UIAutomation">
18
18
  <system-out>target.frontMostApp().mainWindow().scrollViews()[0].webViews()[0].links()["DemoDummy"].tap()</system-out>
19
19
  </testcase>
20
- <testcase name="Logging in with our dummy user shows the login screen, then inbox" time="8.0">
20
+ <testcase name="Logging in with our dummy user shows the login screen, then inbox" time="8.0" classname="UIAutomation">
21
21
  <system-out>target.frontMostApp().mainWindow().scrollViews()[0].webViews()[0].textFields()[0].tap()</system-out>
22
22
  <system-out>target.frontMostApp().keyboard().typeString("automated@singlewire.com")</system-out>
23
23
  <system-out>target.frontMostApp().mainWindow().scrollViews()[0].webViews()[0].buttons()["Login"].tap()</system-out>
24
24
  </testcase>
25
- <testcase name="Inbox contains no initial rows" time="8.0"/>
26
- <testcase name="Clicking on the compose icon starts the loading process. Initial templates show." time="1.0">
25
+ <testcase name="Inbox contains no initial rows" time="8.0" classname="UIAutomation"/>
26
+ <testcase name="Clicking on the compose icon starts the loading process. Initial templates show." time="1.0" classname="UIAutomation">
27
27
  <system-out>target.frontMostApp().navigationBar().rightButton().tap()</system-out>
28
28
  </testcase>
29
- <testcase name="Clicking on the first template shows the compose screen." time="3.0">
29
+ <testcase name="Clicking on the first template shows the compose screen." time="3.0" classname="UIAutomation">
30
30
  <failure message="Clicking on the first template shows the compose screen." type="Fail"/>
31
31
  <system-out>target.frontMostApp().mainWindow().tableViews()["Message Templates Table"].cells()[0].tap()</system-out>
32
32
  <error message="AssertionException: &quot;Expected &lt;The following is a test of the Edmonds Community College Mass Notification System. The following is a test of the Edmonds Community College Mass Notification System. If this was an actual emergency, you would receive essential news and information.&gt; but received &lt;An intruder has been spotted on campus&gt;&quot;" type="Error"/>
@@ -707,7 +707,7 @@ View Dump:
707
707
  <system-out>target.captureRectWithName("{origin:{x:0.00,y:0.00}, size:{height:568.00,width:320.00}}", "Clicking on the first template shows the compose screen.-fail")</system-out>
708
708
  <system-out>3696C5B1-5177-4A8A-8FAD-9D7EEBE4B9C8</system-out>
709
709
  </testcase>
710
- <testcase name="Clicking the send button starts the send process. We receive the notification within 10 seconds." time="112.0">
710
+ <testcase name="Clicking the send button starts the send process. We receive the notification within 10 seconds." time="112.0" classname="UIAutomation">
711
711
  <failure message="Clicking the send button starts the send process. We receive the notification within 10 seconds." type="Fail"/>
712
712
  <system-out>target.frontMostApp().navigationBar().rightButton().tap()</system-out>
713
713
  <error message="AssertionException: &quot;Expected &lt;1&gt; but received &lt;0&gt;&quot;" type="Error"/>
@@ -902,7 +902,7 @@ View Dump:
902
902
  <system-out>target.captureRectWithName("{origin:{x:0.00,y:0.00}, size:{height:568.00,width:320.00}}", "Clicking the send button starts the send process. We receive the notification within 10 seconds.-fail")</system-out>
903
903
  <system-out>4A226AB2-F15D-4ACF-A508-9B1A1868230B</system-out>
904
904
  </testcase>
905
- <testcase name="Deleting the notification removes it from the table view" time="10.0">
905
+ <testcase name="Deleting the notification removes it from the table view" time="10.0" classname="UIAutomation">
906
906
  <failure message="Deleting the notification removes it from the table view" type="Fail"/>
907
907
  <system-out>Cannot perform action on invalid element: UIAElementNil from target.frontMostApp().mainWindow().tableViews()["Inbox Table"].cells()[0]</system-out>
908
908
  <error message="VerboseError: Cannot perform action on invalid element: UIAElementNil from target.frontMostApp().mainWindow().tableViews()[&quot;Inbox Table&quot;].cells()[0]" type="Error"/>
@@ -1097,10 +1097,10 @@ View Dump:
1097
1097
  <system-out>target.captureRectWithName("{origin:{x:0.00,y:0.00}, size:{height:568.00,width:320.00}}", "Deleting the notification removes it from the table view-fail")</system-out>
1098
1098
  <system-out>119716EC-B426-42CE-B90E-0A4F553254FD</system-out>
1099
1099
  </testcase>
1100
- <testcase name="Clicking the menu icon shows the slide out menu with the correct details" time="0.0">
1100
+ <testcase name="Clicking the menu icon shows the slide out menu with the correct details" time="0.0" classname="UIAutomation">
1101
1101
  <system-out>target.frontMostApp().navigationBar().leftButton().tap()</system-out>
1102
1102
  </testcase>
1103
- <testcase name="Clicking the log out button starts the log out process" time="2.0">
1103
+ <testcase name="Clicking the log out button starts the log out process" time="2.0" classname="UIAutomation">
1104
1104
  <system-out>target.frontMostApp().mainWindow().tableViews()["Menu Table"].cells()["Log Out"].tap()</system-out>
1105
1105
  </testcase>
1106
1106
  </testsuite>
@@ -1,6 +1,6 @@
1
1
  <?xml version="1.0"?>
2
2
  <testsuite tests="1" errors="1" failures="1" timestamp="2014-03-04T20:37:06+00:00" time="3.0">
3
- <testcase name="Clicking on the first template shows the compose screen." time="3.0">
3
+ <testcase name="Clicking on the first template shows the compose screen." time="3.0" classname="UIAutomation">
4
4
  <failure message="Clicking on the first template shows the compose screen." type="Fail"/>
5
5
  <system-out>target.frontMostApp().mainWindow().tableViews()["Message Templates Table"].cells()[0].tap()</system-out>
6
6
  <error message="AssertionException: &quot;Expected &lt;The following is a test of the Edmonds Community College Mass Notification System. The following is a test of the Edmonds Community College Mass Notification System. If this was an actual emergency, you would receive essential news and information.&gt; but received &lt;An intruder has been spotted on campus&gt;&quot;" type="Error"/>
@@ -1,4 +1,4 @@
1
1
  <?xml version="1.0"?>
2
2
  <testsuite tests="1" errors="0" failures="0" timestamp="2014-03-04T20:36:27+00:00" time="14.0">
3
- <testcase name="Holding login button shows the edit url popup" time="14.0"/>
3
+ <testcase name="Holding login button shows the edit url popup" time="14.0" classname="UIAutomation"/>
4
4
  </testsuite>
@@ -3,34 +3,34 @@ require 'tuneup_plist_to_junit_utils'
3
3
  describe TuneUpPlistToJunitUtils, '#generate_reports' do
4
4
  it 'generates the correct output for no tests' do
5
5
  utils = TuneUpPlistToJunitUtils.new
6
- utils.generate_reports('test/test_plists/no_tests.plist').should eq(File.read('test/expected_outputs/no_tests.xml'))
6
+ utils.generate_reports('test/test_plists/no_tests.plist', 'UIAutomation').should eq(File.read('test/expected_outputs/no_tests.xml'))
7
7
  end
8
8
  end
9
9
 
10
10
  describe TuneUpPlistToJunitUtils, '#generate_reports' do
11
11
  it 'generates the correct output for no tests, but with log messages' do
12
12
  utils = TuneUpPlistToJunitUtils.new
13
- utils.generate_reports('test/test_plists/no_tests_with_crud.plist').should eq(File.read('test/expected_outputs/no_tests_with_crud.xml'))
13
+ utils.generate_reports('test/test_plists/no_tests_with_crud.plist', 'UIAutomation').should eq(File.read('test/expected_outputs/no_tests_with_crud.xml'))
14
14
  end
15
15
  end
16
16
 
17
17
  describe TuneUpPlistToJunitUtils, '#generate_reports' do
18
18
  it 'generates the correct output for a single failure with children' do
19
19
  utils = TuneUpPlistToJunitUtils.new
20
- utils.generate_reports('test/test_plists/single_fail_with_children.plist').should eq(File.read('test/expected_outputs/single_fail_with_children.xml'))
20
+ utils.generate_reports('test/test_plists/single_fail_with_children.plist', 'UIAutomation').should eq(File.read('test/expected_outputs/single_fail_with_children.xml'))
21
21
  end
22
22
  end
23
23
 
24
24
  describe TuneUpPlistToJunitUtils, '#generate_reports' do
25
25
  it 'generates the correct output for a single passing test' do
26
26
  utils = TuneUpPlistToJunitUtils.new
27
- utils.generate_reports('test/test_plists/single_passing.plist').should eq(File.read('test/expected_outputs/single_passing.xml'))
27
+ utils.generate_reports('test/test_plists/single_passing.plist', 'UIAutomation').should eq(File.read('test/expected_outputs/single_passing.xml'))
28
28
  end
29
29
  end
30
30
 
31
31
  describe TuneUpPlistToJunitUtils, '#generate_reports' do
32
32
  it 'generates the correct output for a lots of tests with failures/successes' do
33
33
  utils = TuneUpPlistToJunitUtils.new
34
- utils.generate_reports('test/test_plists/all.plist').should eq(File.read('test/expected_outputs/all.xml'))
34
+ utils.generate_reports('test/test_plists/all.plist', 'UIAutomation').should eq(File.read('test/expected_outputs/all.xml'))
35
35
  end
36
36
  end
@@ -8,9 +8,9 @@ Gem::Specification.new do |spec|
8
8
  spec.version = TuneUpPlistToJunit::VERSION
9
9
  spec.authors = ['Vincent Pizzo']
10
10
  spec.email = %w(vincent.pizzo@singlewire.com)
11
- spec.description = %q{Processes a UIAutomation Plist file as generated by tuneup.js into a JUnit format}
12
- spec.summary = %q{Processes a UIAutomation Plist file as generated by tuneup.js into a JUnit format. Used so it can easily be parsed by CI such as Jenkins.}
13
- spec.homepage = 'http://github.com/vincentjames501/TuneUpPlistToJunit'
11
+ spec.description = %q{Processes a UIAutomation plist file as generated by TuneupJS into a JUnit XML format so it can be parsed by a CI server such as Jenkins.}
12
+ spec.summary = %q{Processes a UIAutomation plist file as generated by TuneupJS into a JUnit XML format so it can be properly parsed by a CI server such as Jenkins.}
13
+ spec.homepage = 'https://github.com/vincentjames501/TuneUpPlistToJunit'
14
14
  spec.license = 'MIT'
15
15
 
16
16
  spec.files = `git ls-files`.split($/)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tuneup-plist-to-junit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vincent Pizzo
@@ -14,74 +14,74 @@ dependencies:
14
14
  name: plist
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ~>
18
18
  - !ruby/object:Gem::Version
19
19
  version: 3.1.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ~>
25
25
  - !ruby/object:Gem::Version
26
26
  version: 3.1.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: nokogiri
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ~>
32
32
  - !ruby/object:Gem::Version
33
33
  version: 1.6.1
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ~>
39
39
  - !ruby/object:Gem::Version
40
40
  version: 1.6.1
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ~>
46
46
  - !ruby/object:Gem::Version
47
47
  version: '1.3'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ~>
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.3'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - '>='
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - '>='
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
73
+ - - ~>
74
74
  - !ruby/object:Gem::Version
75
75
  version: 2.14.1
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - "~>"
80
+ - - ~>
81
81
  - !ruby/object:Gem::Version
82
82
  version: 2.14.1
83
- description: Processes a UIAutomation Plist file as generated by tuneup.js into a
84
- JUnit format
83
+ description: Processes a UIAutomation plist file as generated by TuneupJS into a JUnit
84
+ XML format so it can be parsed by a CI server such as Jenkins.
85
85
  email:
86
86
  - vincent.pizzo@singlewire.com
87
87
  executables:
@@ -89,7 +89,7 @@ executables:
89
89
  extensions: []
90
90
  extra_rdoc_files: []
91
91
  files:
92
- - ".gitignore"
92
+ - .gitignore
93
93
  - Gemfile
94
94
  - LICENSE.txt
95
95
  - README.md
@@ -109,7 +109,7 @@ files:
109
109
  - test/test_plists/single_passing.plist
110
110
  - test/tuneup_plist_to_junit_utils_spec.rb
111
111
  - tuneup-plist-to-junit.gemspec
112
- homepage: http://github.com/vincentjames501/TuneUpPlistToJunit
112
+ homepage: https://github.com/vincentjames501/TuneUpPlistToJunit
113
113
  licenses:
114
114
  - MIT
115
115
  metadata: {}
@@ -119,21 +119,21 @@ require_paths:
119
119
  - lib
120
120
  required_ruby_version: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - ">="
122
+ - - '>='
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  required_rubygems_version: !ruby/object:Gem::Requirement
126
126
  requirements:
127
- - - ">="
127
+ - - '>='
128
128
  - !ruby/object:Gem::Version
129
129
  version: '0'
130
130
  requirements: []
131
131
  rubyforge_project:
132
- rubygems_version: 2.2.0
132
+ rubygems_version: 2.0.3
133
133
  signing_key:
134
134
  specification_version: 4
135
- summary: Processes a UIAutomation Plist file as generated by tuneup.js into a JUnit
136
- format. Used so it can easily be parsed by CI such as Jenkins.
135
+ summary: Processes a UIAutomation plist file as generated by TuneupJS into a JUnit
136
+ XML format so it can be properly parsed by a CI server such as Jenkins.
137
137
  test_files:
138
138
  - test/expected_outputs/all.xml
139
139
  - test/expected_outputs/no_tests.xml