fastlane-plugin-test_center 2.2.1 → 2.3.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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a64f4a3e425bf54d6af1be29d1d469cf23583b1d
|
4
|
+
data.tar.gz: 317d1a0570db66453b52472d8579b7a32fb08c84
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fd94cba9b112713bf4dc445a64b623081f4ebfd59f97e607c0240c4c771983acd78896dfb379314c9fecd62b07ac6320f61dab54eba8efaeade55eff27b6e848
|
7
|
+
data.tar.gz: 788604b0ddc8f88a3f00b83d2c03f0084e1efda670fdb4c0b46db3796487b5a9047411314767aaf82a488f98b644531f0d873ec7d7dae76e9f627f4938d57762
|
data/README.md
CHANGED
@@ -23,6 +23,7 @@ This fastlane plugin includes the following actions:
|
|
23
23
|
- `suppress_tests`: suppresses specific tests in a specific or all Xcode Schemes in a given project
|
24
24
|
- `suppressed_tests`: retrieves a list of tests that are suppressed in a specific or all Xcode Schemes in a project
|
25
25
|
- `tests_from_junit`: retrieves the failing and passing tests as reported in a junit xml file
|
26
|
+
- `collate_junit_reports`: collects and correctly organizes junit reports from multiple test passes
|
26
27
|
|
27
28
|
## Example
|
28
29
|
|
@@ -0,0 +1,134 @@
|
|
1
|
+
require 'pry-byebug'
|
2
|
+
module Fastlane
|
3
|
+
module Actions
|
4
|
+
class CollateJunitReportsAction < Action
|
5
|
+
def self.run(params)
|
6
|
+
report_filepaths = params[:reports]
|
7
|
+
if report_filepaths.size == 1
|
8
|
+
FileUtils.cp(report_filepaths[0], params[:collated_report])
|
9
|
+
else
|
10
|
+
reports = report_filepaths.map { |report_filepath| REXML::Document.new(File.new(report_filepath)) }
|
11
|
+
|
12
|
+
# copy any missing testsuites
|
13
|
+
target_report = reports.shift
|
14
|
+
reports.each do |report|
|
15
|
+
report.elements.each('//testsuite') do |testsuite|
|
16
|
+
testsuite_name = testsuite.attributes['name']
|
17
|
+
|
18
|
+
target_testsuite = REXML::XPath.first(target_report, "//testsuite[@name='#{testsuite_name}']")
|
19
|
+
if target_testsuite
|
20
|
+
testsuite.elements.each('testcase') do |testcase|
|
21
|
+
classname = testcase.attributes['classname']
|
22
|
+
name = testcase.attributes['name']
|
23
|
+
target_testcase = REXML::XPath.first(target_testsuite, "testcase[@name='#{name}' and @classname='#{classname}']")
|
24
|
+
# Replace target_testcase with testcase
|
25
|
+
if target_testcase
|
26
|
+
target_testcase.parent.insert_after(target_testcase, testcase)
|
27
|
+
target_testcase.parent.delete_element(target_testcase)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
else
|
31
|
+
testable = REXML::XPath.first(target_report, "//testsuites")
|
32
|
+
testable << testsuite
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
target_report.elements.each('//testsuite') do |testsuite|
|
37
|
+
update_testsuite_counts(testsuite)
|
38
|
+
end
|
39
|
+
testable = REXML::XPath.first(target_report, 'testsuites')
|
40
|
+
update_testable_counts(testable)
|
41
|
+
|
42
|
+
FileUtils.mkdir_p(File.dirname(params[:collated_report]))
|
43
|
+
File.open(params[:collated_report], 'w') do |f|
|
44
|
+
target_report.write(f, 2)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.update_testable_counts(testable)
|
50
|
+
testsuites = REXML::XPath.match(testable, 'testsuite')
|
51
|
+
test_count = 0
|
52
|
+
failure_count = 0
|
53
|
+
testsuites.each do |testsuite|
|
54
|
+
test_count += testsuite.attributes['tests'].to_i
|
55
|
+
failure_count += testsuite.attributes['failures'].to_i
|
56
|
+
end
|
57
|
+
testable.attributes['tests'] = test_count.to_s
|
58
|
+
testable.attributes['failures'] = failure_count.to_s
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.update_testsuite_counts(testsuite)
|
62
|
+
testcases = REXML::XPath.match(testsuite, 'testcase')
|
63
|
+
testsuite.attributes['tests'] = testcases.size.to_s
|
64
|
+
failure_count = testcases.reduce(0) do |count, testcase|
|
65
|
+
if REXML::XPath.first(testcase, 'failure')
|
66
|
+
count += 1
|
67
|
+
end
|
68
|
+
count
|
69
|
+
end
|
70
|
+
testsuite.attributes['failures'] = failure_count.to_s
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.attribute_sum_string(node1, node2, attribute)
|
74
|
+
value1 = node1.attributes[attribute].to_i
|
75
|
+
value2 = node2.attributes[attribute].to_i
|
76
|
+
(value1 + value2).to_s
|
77
|
+
end
|
78
|
+
|
79
|
+
#####################################################
|
80
|
+
# @!group Documentation
|
81
|
+
#####################################################
|
82
|
+
|
83
|
+
def self.description
|
84
|
+
"Combines and combines tests from multiple junit report files"
|
85
|
+
end
|
86
|
+
|
87
|
+
def self.details
|
88
|
+
"The first junit report is used as the base report. Testcases " \
|
89
|
+
"from other reports are added if they do not already exist, or " \
|
90
|
+
"if the testcases already exist, they are replaced." \
|
91
|
+
"" \
|
92
|
+
"This is done because it is assumed that fragile tests, when " \
|
93
|
+
"re-run will often succeed due to less interference from other " \
|
94
|
+
"tests and the subsequent junit reports will have more passed tests." \
|
95
|
+
"" \
|
96
|
+
"Inspired by Derek Yang's fastlane-plugin-merge_junit_report"
|
97
|
+
end
|
98
|
+
|
99
|
+
def self.available_options
|
100
|
+
[
|
101
|
+
FastlaneCore::ConfigItem.new(
|
102
|
+
key: :reports,
|
103
|
+
env_name: 'COLLATE_JUNIT_REPORTS_REPORTS',
|
104
|
+
description: 'An array of junit reports to collate. The first report is used as the base into which other reports are merged in',
|
105
|
+
optional: false,
|
106
|
+
type: Array,
|
107
|
+
verify_block: proc do |reports|
|
108
|
+
UI.user_error!('No junit report files found') if reports.empty?
|
109
|
+
reports.each do |report|
|
110
|
+
UI.user_error!("Error: junit report not found: '#{report}'") unless File.exist?(report)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
),
|
114
|
+
FastlaneCore::ConfigItem.new(
|
115
|
+
key: :collated_report,
|
116
|
+
env_name: 'COLLATE_JUNIT_REPORTS_COLLATED_REPORT',
|
117
|
+
description: 'The final junit report file where all testcases will be merged into',
|
118
|
+
optional: true,
|
119
|
+
default_value: 'result.xml',
|
120
|
+
type: String
|
121
|
+
)
|
122
|
+
]
|
123
|
+
end
|
124
|
+
|
125
|
+
def self.authors
|
126
|
+
["lyndsey-ferguson/@lyndseydf"]
|
127
|
+
end
|
128
|
+
|
129
|
+
def self.is_supported?(platform)
|
130
|
+
platform == :ios
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
module Fastlane
|
2
2
|
module Actions
|
3
3
|
require 'fastlane/actions/scan'
|
4
|
-
require 'fastlane/plugin/merge_junit_report'
|
5
4
|
require 'shellwords'
|
6
5
|
|
7
6
|
class MultiScanAction < Action
|
@@ -53,9 +52,9 @@ module Fastlane
|
|
53
52
|
if match
|
54
53
|
final_report_name = "#{match[:filename]}#{extension}"
|
55
54
|
end
|
56
|
-
other_action.
|
57
|
-
|
58
|
-
|
55
|
+
other_action.collate_junit_reports(
|
56
|
+
reports: report_files.reverse,
|
57
|
+
collated_report: File.absolute_path(File.join(scan_options[:output_directory], final_report_name))
|
59
58
|
)
|
60
59
|
end
|
61
60
|
FileUtils.rm_f(Dir.glob("#{scan_options[:output_directory]}/*-[1-9]*#{extension}"))
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane-plugin-test_center
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lyndsey Ferguson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-01-
|
11
|
+
date: 2018-01-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: xcodeproj
|
@@ -24,20 +24,6 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: fastlane-plugin-merge_junit_report
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">="
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
28
|
name: bundler
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -157,6 +143,7 @@ description: |2
|
|
157
143
|
3) suppress_tests: suppresses specific tests in a specific or all Xcode Schemes in a given project.
|
158
144
|
4) suppressed_tests: retrieves a list of tests that are suppressed in a specific or all Xcode Schemes in a project.
|
159
145
|
5) tests_from_junit: retrieves the failing and passing tests as reported in a junit xml file.
|
146
|
+
6) collate_junit_reports: collects and correctly organizes junit reports from multiple test passes.
|
160
147
|
email: ldf.public+github@outlook.com
|
161
148
|
executables: []
|
162
149
|
extensions: []
|
@@ -165,6 +152,7 @@ files:
|
|
165
152
|
- LICENSE
|
166
153
|
- README.md
|
167
154
|
- lib/fastlane/plugin/test_center.rb
|
155
|
+
- lib/fastlane/plugin/test_center/actions/collate_junit_reports.rb
|
168
156
|
- lib/fastlane/plugin/test_center/actions/multi_scan.rb
|
169
157
|
- lib/fastlane/plugin/test_center/actions/suppress_tests.rb
|
170
158
|
- lib/fastlane/plugin/test_center/actions/suppress_tests_from_junit.rb
|