fastlane-plugin-retry_tests 1.0.1
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 +7 -0
- data/LICENSE +21 -0
- data/README.md +2 -0
- data/lib/fastlane/plugin/retry_tests.rb +16 -0
- data/lib/fastlane/plugin/retry_tests/actions/collate_junit_reports.rb +177 -0
- data/lib/fastlane/plugin/retry_tests/actions/multi_scan.rb +146 -0
- data/lib/fastlane/plugin/retry_tests/actions/suppress_tests.rb +93 -0
- data/lib/fastlane/plugin/retry_tests/actions/suppress_tests_from_junit.rb +102 -0
- data/lib/fastlane/plugin/retry_tests/actions/suppressed_tests.rb +72 -0
- data/lib/fastlane/plugin/retry_tests/actions/tests_from_junit.rb +59 -0
- data/lib/fastlane/plugin/retry_tests/actions/tests_from_xctestrun.rb +65 -0
- data/lib/fastlane/plugin/retry_tests/helper/correcting_scan_helper.rb +164 -0
- data/lib/fastlane/plugin/retry_tests/helper/junit_helper.rb +94 -0
- data/lib/fastlane/plugin/retry_tests/helper/reportname_helper.rb +70 -0
- data/lib/fastlane/plugin/retry_tests/helper/test_collector.rb +60 -0
- data/lib/fastlane/plugin/retry_tests/helper/xcodebuild_string.rb +14 -0
- data/lib/fastlane/plugin/retry_tests/version.rb +5 -0
- metadata +221 -0
@@ -0,0 +1,94 @@
|
|
1
|
+
require_relative 'xcodebuild_string'
|
2
|
+
|
3
|
+
module TestCenter
|
4
|
+
module Helper
|
5
|
+
module XcodeJunit
|
6
|
+
require 'xcodeproj'
|
7
|
+
|
8
|
+
class Report
|
9
|
+
def initialize(junit_report_filepath)
|
10
|
+
report_file = File.open(junit_report_filepath) { |f| REXML::Document.new(f) }
|
11
|
+
UI.user_error!("Malformed XML test report file given") if report_file.root.nil?
|
12
|
+
UI.user_error!("Valid XML file is not an Xcode test report") if report_file.get_elements('testsuites').empty?
|
13
|
+
|
14
|
+
@testables = []
|
15
|
+
report_file.elements.each('testsuites') do |testsuites_element|
|
16
|
+
@testables << Testable.new(testsuites_element)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def testables
|
21
|
+
return @testables
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class Testable
|
26
|
+
def initialize(xml_element)
|
27
|
+
@root = xml_element
|
28
|
+
@testsuites = []
|
29
|
+
@root.elements.each('testsuite') do |testsuite_element|
|
30
|
+
@testsuites << TestSuite.new(testsuite_element)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def name
|
35
|
+
return @root.attributes['name']
|
36
|
+
end
|
37
|
+
|
38
|
+
def testsuites
|
39
|
+
return @testsuites
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
class TestSuite
|
44
|
+
def initialize(xml_element)
|
45
|
+
@root = xml_element
|
46
|
+
@testcases = []
|
47
|
+
@root.elements.each('testcase') do |testcase_element|
|
48
|
+
@testcases << TestCase.new(testcase_element)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def name
|
53
|
+
return @root.attributes['name']
|
54
|
+
end
|
55
|
+
|
56
|
+
def identifier
|
57
|
+
name.testsuite
|
58
|
+
end
|
59
|
+
|
60
|
+
def is_swift?
|
61
|
+
return name.include?('.')
|
62
|
+
end
|
63
|
+
|
64
|
+
def testcases
|
65
|
+
return @testcases
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
class TestCase
|
70
|
+
attr_reader :identifier
|
71
|
+
attr_reader :skipped_test
|
72
|
+
|
73
|
+
def initialize(xml_element)
|
74
|
+
@root = xml_element
|
75
|
+
name = xml_element.attributes['name']
|
76
|
+
full_testsuite = xml_element.parent.attributes['name']
|
77
|
+
testsuite = full_testsuite.testsuite
|
78
|
+
is_swift = full_testsuite.testsuite_swift?
|
79
|
+
|
80
|
+
testable_filename = xml_element.parent.parent.attributes['name']
|
81
|
+
testable = File.basename(testable_filename, '.xctest')
|
82
|
+
@identifier = "#{testable}/#{testsuite}/#{name}"
|
83
|
+
@skipped_test = Xcodeproj::XCScheme::TestAction::TestableReference::SkippedTest.new
|
84
|
+
@skipped_test.identifier = "#{testsuite}/#{name}#{'()' if is_swift}"
|
85
|
+
@passed = xml_element.get_elements('failure').size.zero?
|
86
|
+
end
|
87
|
+
|
88
|
+
def passed?
|
89
|
+
@passed
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module TestCenter
|
2
|
+
module Helper
|
3
|
+
require 'fastlane_core/ui/ui.rb'
|
4
|
+
|
5
|
+
class ReportNameHelper
|
6
|
+
def initialize(output_types = nil, output_files = nil, custom_report_file_name = nil)
|
7
|
+
@output_types = output_types || 'junit'
|
8
|
+
@output_files = output_files || custom_report_file_name
|
9
|
+
@report_count = 0
|
10
|
+
|
11
|
+
if @output_types && @output_files.nil?
|
12
|
+
@output_files = @output_types.split(',').map { |type| "report.#{type}" }.join(',')
|
13
|
+
end
|
14
|
+
unless @output_types.include?('junit')
|
15
|
+
FastlaneCore::UI.important('Scan output types missing \'junit\', adding it')
|
16
|
+
@output_types = @output_types.split(',').push('junit').join(',')
|
17
|
+
if @output_types.split(',').size == @output_files.split(',').size + 1
|
18
|
+
@output_files = @output_files.split(',').push('report.xml').join(',')
|
19
|
+
FastlaneCore::UI.message('As output files has one less than the new number of output types, assumming the filename for the junit was missing and added it')
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
types = @output_types.split(',').each(&:chomp)
|
24
|
+
files = @output_files.split(',').each(&:chomp)
|
25
|
+
unless files.size == types.size
|
26
|
+
raise ArgumentError, "Error: count of :output_types, #{types}, does not match the output filename(s) #{files}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def numbered_filename(filename)
|
31
|
+
if @report_count > 0
|
32
|
+
basename = File.basename(filename, '.*')
|
33
|
+
extension = File.extname(filename)
|
34
|
+
filename = "#{basename}-#{@report_count + 1}#{extension}"
|
35
|
+
end
|
36
|
+
filename
|
37
|
+
end
|
38
|
+
|
39
|
+
def scan_options
|
40
|
+
files = @output_files.split(',').each(&:chomp)
|
41
|
+
files.map! do |filename|
|
42
|
+
filename.chomp
|
43
|
+
numbered_filename(filename)
|
44
|
+
end
|
45
|
+
{
|
46
|
+
output_types: @output_types,
|
47
|
+
output_files: files.join(',')
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
51
|
+
def junit_last_reportname
|
52
|
+
junit_index = @output_types.split(',').find_index('junit')
|
53
|
+
numbered_filename(@output_files.to_s.split(',')[junit_index])
|
54
|
+
end
|
55
|
+
|
56
|
+
def junit_reportname
|
57
|
+
junit_index = @output_types.split(',').find_index('junit')
|
58
|
+
@output_files.to_s.split(',')[junit_index]
|
59
|
+
end
|
60
|
+
|
61
|
+
def junit_filextension
|
62
|
+
File.extname(junit_reportname)
|
63
|
+
end
|
64
|
+
|
65
|
+
def increment
|
66
|
+
@report_count += 1
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module TestCenter
|
2
|
+
module Helper
|
3
|
+
require 'fastlane_core/ui/ui.rb'
|
4
|
+
require 'plist'
|
5
|
+
|
6
|
+
class TestCollector
|
7
|
+
def initialize(options)
|
8
|
+
@xctestrun_path = options[:xctestrun] || derived_testrun_path(options[:derived_data_path], options[:scheme])
|
9
|
+
@only_testing = options[:only_testing]
|
10
|
+
@skip_testing = options[:skip_testing]
|
11
|
+
end
|
12
|
+
|
13
|
+
def derived_testrun_path(derived_data_path, scheme)
|
14
|
+
Dir.glob("#{derived_data_path}/Build/Products/#{scheme}*.xctestrun").first
|
15
|
+
end
|
16
|
+
|
17
|
+
def testables
|
18
|
+
unless @testables
|
19
|
+
if @only_testing
|
20
|
+
@testables ||= only_testing_to_testables_tests.keys
|
21
|
+
else
|
22
|
+
@testables ||= Plist.parse_xml(@xctestrun_path).keys
|
23
|
+
end
|
24
|
+
end
|
25
|
+
@testables
|
26
|
+
end
|
27
|
+
|
28
|
+
def only_testing_to_testables_tests
|
29
|
+
tests = Hash.new { |h, k| h[k] = [] }
|
30
|
+
@only_testing.sort.each do |test_identifier|
|
31
|
+
testable = test_identifier.split('/', 2)[0]
|
32
|
+
tests[testable] << test_identifier
|
33
|
+
end
|
34
|
+
tests
|
35
|
+
end
|
36
|
+
|
37
|
+
def testables_tests
|
38
|
+
unless @testables_tests
|
39
|
+
if @only_testing
|
40
|
+
@testables_tests = only_testing_to_testables_tests
|
41
|
+
else
|
42
|
+
config = FastlaneCore::Configuration.create(::Fastlane::Actions::TestsFromXctestrunAction.available_options, xctestrun: @xctestrun_path)
|
43
|
+
@testables_tests = ::Fastlane::Actions::TestsFromXctestrunAction.run(config)
|
44
|
+
if @skip_testing
|
45
|
+
skipped_testable_tests = Hash.new { |h, k| h[k] = [] }
|
46
|
+
@skip_testing.sort.each do |skipped_test_identifier|
|
47
|
+
testable = skipped_test_identifier.split('/', 2)[0]
|
48
|
+
skipped_testable_tests[testable] << skipped_test_identifier
|
49
|
+
end
|
50
|
+
@testables_tests.each_key do |testable|
|
51
|
+
@testables_tests[testable] -= skipped_testable_tests[testable]
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
@testables_tests
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
metadata
ADDED
@@ -0,0 +1,221 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: fastlane-plugin-retry_tests
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Gloria Chow
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-03-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: plist
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: xcodeproj
|
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
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: xctest_list
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.1.2
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.1.2
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: bundler
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: colorize
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: fastlane
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 2.56.0
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 2.56.0
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: pry
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rake
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rspec
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: rubocop
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: simplecov
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
description: |2
|
168
|
+
This fastlane plugin includes the following actions:
|
169
|
+
1) multi_scan: uses scan to run Xcode tests, optionally in batches, a given number of times: only re-testing failing tests.
|
170
|
+
2) suppress_tests_from_junit: uses a junit xml report file to suppress either passing or failing tests in an Xcode Scheme.
|
171
|
+
3) suppress_tests: suppresses specific tests in a specific or all Xcode Schemes in a given project.
|
172
|
+
4) suppressed_tests: retrieves a list of tests that are suppressed in a specific or all Xcode Schemes in a project.
|
173
|
+
5) tests_from_junit: retrieves the failing and passing tests as reported in a junit xml file.
|
174
|
+
6) tests_from_xctestrun: retrieves all of the tests from xctest bundles referenced by the xctestrun file
|
175
|
+
7) collate_junit_reports: collects and correctly organizes junit reports from multiple test passes.
|
176
|
+
email: gchow@mercari.com
|
177
|
+
executables: []
|
178
|
+
extensions: []
|
179
|
+
extra_rdoc_files: []
|
180
|
+
files:
|
181
|
+
- LICENSE
|
182
|
+
- README.md
|
183
|
+
- lib/fastlane/plugin/retry_tests.rb
|
184
|
+
- lib/fastlane/plugin/retry_tests/actions/collate_junit_reports.rb
|
185
|
+
- lib/fastlane/plugin/retry_tests/actions/multi_scan.rb
|
186
|
+
- lib/fastlane/plugin/retry_tests/actions/suppress_tests.rb
|
187
|
+
- lib/fastlane/plugin/retry_tests/actions/suppress_tests_from_junit.rb
|
188
|
+
- lib/fastlane/plugin/retry_tests/actions/suppressed_tests.rb
|
189
|
+
- lib/fastlane/plugin/retry_tests/actions/tests_from_junit.rb
|
190
|
+
- lib/fastlane/plugin/retry_tests/actions/tests_from_xctestrun.rb
|
191
|
+
- lib/fastlane/plugin/retry_tests/helper/correcting_scan_helper.rb
|
192
|
+
- lib/fastlane/plugin/retry_tests/helper/junit_helper.rb
|
193
|
+
- lib/fastlane/plugin/retry_tests/helper/reportname_helper.rb
|
194
|
+
- lib/fastlane/plugin/retry_tests/helper/test_collector.rb
|
195
|
+
- lib/fastlane/plugin/retry_tests/helper/xcodebuild_string.rb
|
196
|
+
- lib/fastlane/plugin/retry_tests/version.rb
|
197
|
+
homepage: https://github.com/kouzoh/fastlane-plugin-retry_tests
|
198
|
+
licenses:
|
199
|
+
- MIT
|
200
|
+
metadata: {}
|
201
|
+
post_install_message:
|
202
|
+
rdoc_options: []
|
203
|
+
require_paths:
|
204
|
+
- lib
|
205
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
206
|
+
requirements:
|
207
|
+
- - ">="
|
208
|
+
- !ruby/object:Gem::Version
|
209
|
+
version: '0'
|
210
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
211
|
+
requirements:
|
212
|
+
- - ">="
|
213
|
+
- !ruby/object:Gem::Version
|
214
|
+
version: '0'
|
215
|
+
requirements: []
|
216
|
+
rubyforge_project:
|
217
|
+
rubygems_version: 2.6.14
|
218
|
+
signing_key:
|
219
|
+
specification_version: 4
|
220
|
+
summary: Makes testing your iOS app easier
|
221
|
+
test_files: []
|