fastlane-plugin-test_center 1.2.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/fastlane/plugin/test_center/actions/multi_scan.rb +6 -4
- data/lib/fastlane/plugin/test_center/actions/suppress_tests.rb +9 -4
- data/lib/fastlane/plugin/test_center/actions/suppress_tests_from_junit.rb +16 -56
- data/lib/fastlane/plugin/test_center/actions/suppressed_tests.rb +6 -2
- data/lib/fastlane/plugin/test_center/actions/tests_from_junit.rb +17 -34
- data/lib/fastlane/plugin/test_center/helper/junit_helper.rb +94 -0
- data/lib/fastlane/plugin/test_center/helper/xcodebuild_string.rb +14 -0
- data/lib/fastlane/plugin/test_center/version.rb +1 -1
- metadata +18 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1260815a43648f4c6b82c856b8113b96906bb757
|
4
|
+
data.tar.gz: 902bf36489b92aa7ce6c9ab3590d2c0cf99b9fd9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b80ac781c34de4efc71202e5b14e187abd6801bd61d4e731168e32702dc703935b4e5a7dc7b70b3825d25ebbd1f79492ceaf38276e19a03107f04c9a82e545a2
|
7
|
+
data.tar.gz: c4ded416a5215782795b81ed066b2210ad70e0dcc419b4ac475fb149bdc90d1b6a9d57b2283b6691f2ddc7941eff1c2e7f3109db0b362a99389552f42d098656
|
@@ -1,6 +1,7 @@
|
|
1
1
|
module Fastlane
|
2
2
|
module Actions
|
3
3
|
require 'fastlane/actions/scan'
|
4
|
+
require 'shellwords'
|
4
5
|
|
5
6
|
class MultiScanAction < Action
|
6
7
|
def self.run(params)
|
@@ -22,9 +23,10 @@ module Fastlane
|
|
22
23
|
rescue FastlaneCore::Interface::FastlaneTestFailure => e
|
23
24
|
UI.verbose("Scan failed with #{e}")
|
24
25
|
if try_count < params[:try_count]
|
25
|
-
|
26
|
-
|
27
|
-
|
26
|
+
report_filepath = junit_report_filepath(scan_options)
|
27
|
+
failed_tests = other_action.tests_from_junit(junit: report_filepath)[:failed]
|
28
|
+
scan_options[:only_testing] = failed_tests.map(&:shellescape)
|
29
|
+
increment_junit_report_filename(scan_options)
|
28
30
|
retry
|
29
31
|
end
|
30
32
|
end
|
@@ -123,7 +125,7 @@ module Fastlane
|
|
123
125
|
end
|
124
126
|
|
125
127
|
def self.authors
|
126
|
-
["lyndsey-ferguson/@
|
128
|
+
["lyndsey-ferguson/@lyndseydf"]
|
127
129
|
end
|
128
130
|
|
129
131
|
def self.is_supported?(platform)
|
@@ -5,7 +5,7 @@ module Fastlane
|
|
5
5
|
|
6
6
|
def self.run(params)
|
7
7
|
project_path = params[:xcodeproj]
|
8
|
-
|
8
|
+
all_tests_to_skip = params[:tests]
|
9
9
|
scheme = params[:scheme]
|
10
10
|
|
11
11
|
scheme_filepaths = Dir.glob("#{project_path}/{xcshareddata,xcuserdata}/**/xcschemes/#{scheme || '*'}.xcscheme")
|
@@ -18,6 +18,11 @@ module Fastlane
|
|
18
18
|
is_dirty = false
|
19
19
|
xcscheme = Xcodeproj::XCScheme.new(scheme_filepath)
|
20
20
|
xcscheme.test_action.testables.each do |testable|
|
21
|
+
buildable_name = File.basename(testable.buildable_references[0].buildable_name, '.xctest')
|
22
|
+
|
23
|
+
tests_to_skip = all_tests_to_skip.select { |test| test.start_with?(buildable_name) }
|
24
|
+
.map { |test| test.sub("#{buildable_name}/", '') }
|
25
|
+
|
21
26
|
tests_to_skip.each do |test_to_skip|
|
22
27
|
skipped_test = Xcodeproj::XCScheme::TestAction::TestableReference::SkippedTest.new
|
23
28
|
skipped_test.identifier = test_to_skip
|
@@ -55,9 +60,9 @@ module Fastlane
|
|
55
60
|
verify_block: proc do |tests|
|
56
61
|
UI.user_error!("Error: no tests were given to suppress!") unless tests and !tests.empty?
|
57
62
|
tests.each do |test_identifier|
|
58
|
-
is_valid_test_identifier = %r{^[a-zA-Z][a-zA-Z0-9]+(\/test[a-zA-Z0-9]+)?$} =~ test_identifier
|
63
|
+
is_valid_test_identifier = %r{^[a-zA-Z][a-zA-Z0-9]+\/[a-zA-Z][a-zA-Z0-9]+(\/test[a-zA-Z0-9]+)?$} =~ test_identifier
|
59
64
|
unless is_valid_test_identifier
|
60
|
-
UI.user_error!("Error: invalid test identifier '#{test_identifier}'. It must be in the format of 'TestSuiteToSuppress' or 'TestSuiteToSuppress/testToSuppress'")
|
65
|
+
UI.user_error!("Error: invalid test identifier '#{test_identifier}'. It must be in the format of 'Testable/TestSuiteToSuppress' or 'Testable/TestSuiteToSuppress/testToSuppress'")
|
61
66
|
end
|
62
67
|
end
|
63
68
|
end,
|
@@ -76,7 +81,7 @@ module Fastlane
|
|
76
81
|
end
|
77
82
|
|
78
83
|
def self.authors
|
79
|
-
["lyndsey-ferguson/@
|
84
|
+
["lyndsey-ferguson/@lyndseydf"]
|
80
85
|
end
|
81
86
|
|
82
87
|
def self.is_supported?(platform)
|
@@ -11,14 +11,20 @@ module Fastlane
|
|
11
11
|
UI.user_error!("Error: cannot find any schemes in the Xcode project")
|
12
12
|
end
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
14
|
+
testables = Hash.new([])
|
15
|
+
desired_passed_status = (params[:suppress_type] == :passing)
|
16
|
+
|
17
|
+
report = ::TestCenter::Helper::XcodeJunit::Report.new(params[:junit])
|
18
|
+
|
19
|
+
report.testables.each do |testable|
|
20
|
+
testables[testable.name] = []
|
21
|
+
testable.testsuites.each do |testsuite|
|
22
|
+
testsuite.testcases.each do |testcase|
|
23
|
+
if testcase.passed? == desired_passed_status
|
24
|
+
testables[testable.name] << testcase.skipped_test
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
22
28
|
end
|
23
29
|
|
24
30
|
scheme_filepaths.each do |scheme_filepath|
|
@@ -27,10 +33,7 @@ module Fastlane
|
|
27
33
|
|
28
34
|
xcscheme.test_action.testables.each do |testable|
|
29
35
|
buildable_name = testable.buildable_references[0].buildable_name
|
30
|
-
|
31
|
-
tests_per_target_to_suppress[buildable_name].each do |test_to_skip|
|
32
|
-
skipped_test = Xcodeproj::XCScheme::TestAction::TestableReference::SkippedTest.new
|
33
|
-
skipped_test.identifier = test_to_skip
|
36
|
+
testables[buildable_name].each do |skipped_test|
|
34
37
|
testable.add_skipped_test(skipped_test)
|
35
38
|
is_dirty = true
|
36
39
|
end
|
@@ -39,49 +42,6 @@ module Fastlane
|
|
39
42
|
end
|
40
43
|
end
|
41
44
|
|
42
|
-
def self.failing_tests(report_file)
|
43
|
-
tests = Hash.new { |hash, key| hash[key] = [] }
|
44
|
-
|
45
|
-
report_file.elements.each('*/testsuite/testcase/failure') do |failure_element|
|
46
|
-
testcase = failure_element.parent
|
47
|
-
testsuite_element = testcase.parent
|
48
|
-
buildable_name = buildable_name_from_testcase(testcase)
|
49
|
-
|
50
|
-
tests[buildable_name] << xctest_identifier(testcase)
|
51
|
-
# Remove all the failures from this in-memory xml file to make
|
52
|
-
# it easier to find the passing tests below
|
53
|
-
testsuite_element.delete_element testcase
|
54
|
-
end
|
55
|
-
tests
|
56
|
-
end
|
57
|
-
|
58
|
-
def self.passing_tests(report_file)
|
59
|
-
tests = Hash.new { |hash, key| hash[key] = [] }
|
60
|
-
|
61
|
-
report_file.elements.each('*/testsuite/testcase') do |testcase|
|
62
|
-
buildable_name = buildable_name_from_testcase(testcase)
|
63
|
-
|
64
|
-
tests[buildable_name] << xctest_identifier(testcase)
|
65
|
-
end
|
66
|
-
tests
|
67
|
-
end
|
68
|
-
|
69
|
-
def self.buildable_name_from_testcase(testcase)
|
70
|
-
testsuite_element = testcase.parent
|
71
|
-
buildable_element = testsuite_element.parent
|
72
|
-
buildable_element.attributes['name']
|
73
|
-
end
|
74
|
-
|
75
|
-
def self.xctest_identifier(testcase)
|
76
|
-
testcase_class = testcase.attributes['classname']
|
77
|
-
testcase_testmethod = testcase.attributes['name']
|
78
|
-
|
79
|
-
is_swift = testcase_class.include?('.')
|
80
|
-
testcase_class.gsub!(/.*\./, '')
|
81
|
-
testcase_testmethod << '()' if is_swift
|
82
|
-
"#{testcase_class}/#{testcase_testmethod}"
|
83
|
-
end
|
84
|
-
|
85
45
|
#####################################################
|
86
46
|
# @!group Documentation
|
87
47
|
#####################################################
|
@@ -131,7 +91,7 @@ module Fastlane
|
|
131
91
|
end
|
132
92
|
|
133
93
|
def self.authors
|
134
|
-
["lyndsey-ferguson/@
|
94
|
+
["lyndsey-ferguson/@lyndseydf"]
|
135
95
|
end
|
136
96
|
|
137
97
|
def self.is_supported?(platform)
|
@@ -17,8 +17,12 @@ module Fastlane
|
|
17
17
|
scheme_filepaths.each do |scheme_filepath|
|
18
18
|
xcscheme = Xcodeproj::XCScheme.new(scheme_filepath)
|
19
19
|
xcscheme.test_action.testables.each do |testable|
|
20
|
+
buildable_name = testable.buildable_references[0]
|
21
|
+
.buildable_name
|
22
|
+
|
23
|
+
buildable_name = File.basename(buildable_name, '.xctest')
|
20
24
|
testable.skipped_tests.map do |skipped_test|
|
21
|
-
skipped_tests.add(skipped_test.identifier)
|
25
|
+
skipped_tests.add("#{buildable_name}/#{skipped_test.identifier}")
|
22
26
|
end
|
23
27
|
end
|
24
28
|
end
|
@@ -57,7 +61,7 @@ module Fastlane
|
|
57
61
|
end
|
58
62
|
|
59
63
|
def self.authors
|
60
|
-
["lyndsey-ferguson/@
|
64
|
+
["lyndsey-ferguson/@lyndseydf"]
|
61
65
|
end
|
62
66
|
|
63
67
|
def self.is_supported?(platform)
|
@@ -2,43 +2,26 @@ module Fastlane
|
|
2
2
|
module Actions
|
3
3
|
class TestsFromJunitAction < Action
|
4
4
|
def self.run(params)
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
report = ::TestCenter::Helper::XcodeJunit::Report.new(params[:junit])
|
6
|
+
passing = []
|
7
|
+
failed = []
|
8
|
+
report.testables.each do |testable|
|
9
|
+
testable.testsuites.each do |testsuite|
|
10
|
+
testsuite.testcases.each do |testcase|
|
11
|
+
if testcase.passed?
|
12
|
+
passing << testcase.identifier
|
13
|
+
else
|
14
|
+
failed << testcase.identifier
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
9
19
|
{
|
10
|
-
|
11
|
-
|
20
|
+
failed: failed,
|
21
|
+
passing: passing
|
12
22
|
}
|
13
23
|
end
|
14
24
|
|
15
|
-
def self.failing_tests(report_file)
|
16
|
-
tests = Set.new
|
17
|
-
|
18
|
-
report_file.elements.each('*/testsuite/testcase/failure') do |failure_element|
|
19
|
-
testcase = failure_element.parent
|
20
|
-
tests << xctest_identifier(testcase)
|
21
|
-
end
|
22
|
-
tests
|
23
|
-
end
|
24
|
-
|
25
|
-
def self.passing_tests(report_file)
|
26
|
-
tests = Set.new
|
27
|
-
|
28
|
-
report_file.elements.each('*/testsuite/testcase[not(failure)]') do |testcase|
|
29
|
-
tests << xctest_identifier(testcase)
|
30
|
-
end
|
31
|
-
tests
|
32
|
-
end
|
33
|
-
|
34
|
-
def self.xctest_identifier(testcase)
|
35
|
-
testcase_class = testcase.attributes['classname']
|
36
|
-
testcase_testmethod = testcase.attributes['name']
|
37
|
-
|
38
|
-
testcase_class.gsub!(/.*\./, '')
|
39
|
-
"#{testcase_class}/#{testcase_testmethod}"
|
40
|
-
end
|
41
|
-
|
42
25
|
#####################################################
|
43
26
|
# @!group Documentation
|
44
27
|
#####################################################
|
@@ -65,7 +48,7 @@ module Fastlane
|
|
65
48
|
end
|
66
49
|
|
67
50
|
def self.authors
|
68
|
-
["lyndsey-ferguson/
|
51
|
+
["lyndsey-ferguson/lyndseydf"]
|
69
52
|
end
|
70
53
|
|
71
54
|
def self.is_supported?(platform)
|
@@ -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
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane-plugin-test_center
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.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: 2017-12-
|
11
|
+
date: 2017-12-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: xcodeproj
|
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'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: bundler
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -142,7 +156,9 @@ files:
|
|
142
156
|
- lib/fastlane/plugin/test_center/actions/suppress_tests_from_junit.rb
|
143
157
|
- lib/fastlane/plugin/test_center/actions/suppressed_tests.rb
|
144
158
|
- lib/fastlane/plugin/test_center/actions/tests_from_junit.rb
|
159
|
+
- lib/fastlane/plugin/test_center/helper/junit_helper.rb
|
145
160
|
- lib/fastlane/plugin/test_center/helper/test_center_helper.rb
|
161
|
+
- lib/fastlane/plugin/test_center/helper/xcodebuild_string.rb
|
146
162
|
- lib/fastlane/plugin/test_center/version.rb
|
147
163
|
homepage: https://github.com/lyndsey-ferguson/fastlane-plugin-test_center
|
148
164
|
licenses:
|