tuneup-plist-to-junit 0.0.1 → 0.0.2

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: 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