gitlab_quality-test_tooling 1.31.0 → 1.33.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 +4 -4
- data/Gemfile.lock +1 -1
- data/lib/gitlab_quality/test_tooling/knapsack_reports/spec_run_time.rb +38 -4
- data/lib/gitlab_quality/test_tooling/knapsack_reports/spec_run_time_report.rb +5 -1
- data/lib/gitlab_quality/test_tooling/labels_inference.rb +0 -1
- data/lib/gitlab_quality/test_tooling/report/concerns/group_and_category_labels.rb +7 -4
- data/lib/gitlab_quality/test_tooling/report/knapsack_report_issue.rb +3 -4
- data/lib/gitlab_quality/test_tooling/report/report_as_issue.rb +5 -5
- data/lib/gitlab_quality/test_tooling/report/slow_test_issue.rb +3 -3
- data/lib/gitlab_quality/test_tooling/test_meta/processor/add_to_blocking_processor.rb +6 -3
- data/lib/gitlab_quality/test_tooling/test_meta/processor/add_to_quarantine_processor.rb +6 -3
- data/lib/gitlab_quality/test_tooling/test_meta/test_meta_updater.rb +20 -0
- data/lib/gitlab_quality/test_tooling/test_result/base_test_result.rb +51 -4
- data/lib/gitlab_quality/test_tooling/test_result/j_unit_test_result.rb +1 -52
- data/lib/gitlab_quality/test_tooling/test_result/json_test_result.rb +0 -51
- data/lib/gitlab_quality/test_tooling/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 19bea0cdd5a0f100cec11b00c6415c39f8ab637165f67171ad6edac7c33128b9
|
|
4
|
+
data.tar.gz: 9727a96a8ca06238ae89bacdb6f3cc88b66451a6190cac8df48fc82102e7c155
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5dfdfea69e7e2f3500b243d83489050e6d0f2a251a1657a43250206a3710c0b848bdbb38ac34e645a2ec1dc4fc19ce4df47afa21a8c038754ac76f6b606cb14f
|
|
7
|
+
data.tar.gz: 7aa7942d0f0f86c75a2f07eea937c70c9f725b4025302778176e0fb0b9a14db41acd983d1202f86b6a59ce6f00b1c6f85ba214d86deb1a947167a57ff82ad3a4
|
data/Gemfile.lock
CHANGED
|
@@ -4,19 +4,39 @@ module GitlabQuality
|
|
|
4
4
|
module TestTooling
|
|
5
5
|
module KnapsackReports
|
|
6
6
|
class SpecRunTime
|
|
7
|
-
attr_reader :
|
|
7
|
+
attr_reader :file, :expected, :actual, :expected_suite_duration, :actual_suite_duration, :project, :ref
|
|
8
8
|
|
|
9
9
|
ACTUAL_TO_EXPECTED_SPEC_RUN_TIME_RATIO_THRESHOLD = 1.5 # actual run time is longer than expected by 50% +
|
|
10
10
|
SPEC_WEIGHT_PERCENTAGE_TRESHOLD = 15 # a spec file takes 15%+ of the total test suite run time
|
|
11
11
|
SUITE_DURATION_THRESHOLD = 70 * 60 # if test suite takes more than 70 minutes, job risks timing out
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
FEATURE_CATEGORY_METADATA_REGEX = /(?<=feature_category: :)(?<feature_category>\w+)/
|
|
13
|
+
|
|
14
|
+
def initialize(
|
|
15
|
+
file:,
|
|
16
|
+
expected:,
|
|
17
|
+
actual:,
|
|
18
|
+
expected_suite_duration:,
|
|
19
|
+
actual_suite_duration:,
|
|
20
|
+
token: '',
|
|
21
|
+
project: Runtime::Env.ci_project_path,
|
|
22
|
+
ref: Runtime::Env.ci_commit_ref_name)
|
|
15
23
|
@file = file
|
|
16
24
|
@expected = expected.to_f
|
|
17
25
|
@actual = actual.to_f
|
|
18
26
|
@expected_suite_duration = expected_suite_duration.to_f
|
|
19
27
|
@actual_suite_duration = actual_suite_duration.to_f
|
|
28
|
+
@token = token
|
|
29
|
+
@project = project
|
|
30
|
+
@ref = ref
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def feature_category
|
|
34
|
+
file_lines.each do |line|
|
|
35
|
+
match = FEATURE_CATEGORY_METADATA_REGEX.match(line)
|
|
36
|
+
next unless match
|
|
37
|
+
|
|
38
|
+
break match[:feature_category]
|
|
39
|
+
end
|
|
20
40
|
end
|
|
21
41
|
|
|
22
42
|
def should_report?
|
|
@@ -50,6 +70,8 @@ module GitlabQuality
|
|
|
50
70
|
|
|
51
71
|
private
|
|
52
72
|
|
|
73
|
+
attr_reader :token
|
|
74
|
+
|
|
53
75
|
def exceed_actual_to_expected_ratio_threshold?
|
|
54
76
|
actual / expected >= ACTUAL_TO_EXPECTED_SPEC_RUN_TIME_RATIO_THRESHOLD
|
|
55
77
|
end
|
|
@@ -80,6 +102,18 @@ module GitlabQuality
|
|
|
80
102
|
def file_link
|
|
81
103
|
"https://gitlab.com/#{project}/-/blob/#{Runtime::Env.ci_commit_ref_name}/#{file}"
|
|
82
104
|
end
|
|
105
|
+
|
|
106
|
+
def file_lines
|
|
107
|
+
files_client.file_contents.lines(chomp: true)
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def files_client
|
|
111
|
+
@files_client ||= GitlabClient::RepositoryFilesClient.new(
|
|
112
|
+
token: token,
|
|
113
|
+
project: project,
|
|
114
|
+
file_path: file,
|
|
115
|
+
ref: ref)
|
|
116
|
+
end
|
|
83
117
|
end
|
|
84
118
|
end
|
|
85
119
|
end
|
|
@@ -8,10 +8,11 @@ module GitlabQuality
|
|
|
8
8
|
class SpecRunTimeReport
|
|
9
9
|
attr_reader :project, :expected_report, :actual_report
|
|
10
10
|
|
|
11
|
-
def initialize(project:, expected_report_path:, actual_report_path:)
|
|
11
|
+
def initialize(project:, expected_report_path:, actual_report_path:, token: '')
|
|
12
12
|
@project = project
|
|
13
13
|
@expected_report = parse(expected_report_path)
|
|
14
14
|
@actual_report = parse(actual_report_path)
|
|
15
|
+
@token = token
|
|
15
16
|
end
|
|
16
17
|
|
|
17
18
|
def filtered_report
|
|
@@ -25,6 +26,7 @@ module GitlabQuality
|
|
|
25
26
|
end
|
|
26
27
|
|
|
27
28
|
spec_run_time = SpecRunTime.new(
|
|
29
|
+
token: token,
|
|
28
30
|
project: project,
|
|
29
31
|
file: spec_file,
|
|
30
32
|
expected: expected_run_time,
|
|
@@ -39,6 +41,8 @@ module GitlabQuality
|
|
|
39
41
|
|
|
40
42
|
private
|
|
41
43
|
|
|
44
|
+
attr_reader :token
|
|
45
|
+
|
|
42
46
|
def parse(report_path)
|
|
43
47
|
JSON.parse(File.read(report_path))
|
|
44
48
|
end
|
|
@@ -10,7 +10,6 @@ module GitlabQuality
|
|
|
10
10
|
WWW_GITLAB_COM_SITE = 'https://about.gitlab.com'
|
|
11
11
|
WWW_GITLAB_COM_GROUPS_JSON = "#{WWW_GITLAB_COM_SITE}/groups.json".freeze
|
|
12
12
|
WWW_GITLAB_COM_CATEGORIES_JSON = "#{WWW_GITLAB_COM_SITE}/categories.json".freeze
|
|
13
|
-
FEATURE_CATEGORY_METADATA_REGEX = /(?<=feature_category: :)\w+/
|
|
14
13
|
|
|
15
14
|
def infer_labels_from_product_group(product_group)
|
|
16
15
|
[groups_mapping.dig(product_group, 'label')].compact.to_set
|
|
@@ -10,11 +10,14 @@ module GitlabQuality
|
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
def new_issue_labels(test)
|
|
13
|
-
|
|
13
|
+
debug_line = ' => [DEBUG] '
|
|
14
|
+
debug_line += "product_group: #{test&.product_group}; " if test.respond_to?(:product_group)
|
|
15
|
+
debug_line += "feature_category: #{test&.feature_category}" if test.respond_to?(:feature_category)
|
|
16
|
+
puts debug_line
|
|
14
17
|
|
|
15
|
-
new_labels = self.class::NEW_ISSUE_LABELS
|
|
16
|
-
|
|
17
|
-
|
|
18
|
+
new_labels = self.class::NEW_ISSUE_LABELS
|
|
19
|
+
new_labels += labels_inference.infer_labels_from_product_group(test.product_group) if test.respond_to?(:product_group)
|
|
20
|
+
new_labels += labels_inference.infer_labels_from_feature_category(test.feature_category) if test.respond_to?(:feature_category)
|
|
18
21
|
up_to_date_labels(test: test, new_labels: new_labels)
|
|
19
22
|
end
|
|
20
23
|
end
|
|
@@ -14,6 +14,8 @@ module GitlabQuality
|
|
|
14
14
|
# - If not found:
|
|
15
15
|
# - Create a new issue with the run time data
|
|
16
16
|
class KnapsackReportIssue < ReportAsIssue
|
|
17
|
+
include Concerns::GroupAndCategoryLabels
|
|
18
|
+
|
|
17
19
|
NEW_ISSUE_LABELS = Set.new(['test', 'type::maintenance', 'maintenance::performance', 'priority::3', 'severity::3', 'knapsack_report']).freeze
|
|
18
20
|
SEARCH_LABELS = %w[test maintenance::performance knapsack_report].freeze
|
|
19
21
|
JOB_TIMEOUT_EPIC_URL = 'https://gitlab.com/groups/gitlab-org/quality/engineering-productivity/-/epics/19'
|
|
@@ -36,6 +38,7 @@ module GitlabQuality
|
|
|
36
38
|
|
|
37
39
|
def search_and_create_issue
|
|
38
40
|
filtered_report = KnapsackReports::SpecRunTimeReport.new(
|
|
41
|
+
token: token,
|
|
39
42
|
project: project,
|
|
40
43
|
expected_report_path: expected_report_path,
|
|
41
44
|
actual_report_path: actual_report_path
|
|
@@ -67,10 +70,6 @@ module GitlabQuality
|
|
|
67
70
|
files.first
|
|
68
71
|
end
|
|
69
72
|
|
|
70
|
-
def new_issue_labels(_spec_run_time)
|
|
71
|
-
NEW_ISSUE_LABELS
|
|
72
|
-
end
|
|
73
|
-
|
|
74
73
|
def new_issue_title(spec_run_time)
|
|
75
74
|
"Job timeout risk: #{spec_run_time.file} ran much longer than expected"
|
|
76
75
|
end
|
|
@@ -124,12 +124,12 @@ module GitlabQuality
|
|
|
124
124
|
issue_attrs = {}
|
|
125
125
|
|
|
126
126
|
new_description = new_issue_description(test)
|
|
127
|
-
issue_attrs[:description] = new_description
|
|
127
|
+
issue_attrs[:description] = new_description if issue.description != new_description
|
|
128
128
|
|
|
129
129
|
new_labels = up_to_date_labels(test: test, issue: issue).to_a
|
|
130
|
-
issue_attrs[:
|
|
130
|
+
issue_attrs[:add_labels] = new_labels if (new_labels - issue.labels).any?
|
|
131
131
|
|
|
132
|
-
gitlab.edit_issue(iid: issue.iid, options: issue_attrs)
|
|
132
|
+
gitlab.edit_issue(iid: issue.iid, options: issue_attrs) if issue_attrs.any?
|
|
133
133
|
end
|
|
134
134
|
|
|
135
135
|
def issue_labels(issue)
|
|
@@ -149,14 +149,14 @@ module GitlabQuality
|
|
|
149
149
|
labels |= new_labels.to_set
|
|
150
150
|
ee_test?(test) ? labels << 'Enterprise Edition' : labels.delete('Enterprise Edition')
|
|
151
151
|
|
|
152
|
-
if test.quarantine?
|
|
152
|
+
if test.respond_to?(:quarantine?) && test.quarantine?
|
|
153
153
|
labels << 'quarantine'
|
|
154
154
|
labels << "quarantine::#{test.quarantine_type}"
|
|
155
155
|
else
|
|
156
156
|
labels.delete_if { |label| label.include?('quarantine') }
|
|
157
157
|
end
|
|
158
158
|
|
|
159
|
-
labels << 'rspec-shared-examples' if test.calls_shared_examples?
|
|
159
|
+
labels << 'rspec-shared-examples' if test.respond_to?(:calls_shared_examples?) && test.calls_shared_examples?
|
|
160
160
|
|
|
161
161
|
labels
|
|
162
162
|
end
|
|
@@ -44,11 +44,11 @@ module GitlabQuality
|
|
|
44
44
|
|
|
45
45
|
def health_problem_status_label_quick_action(reports_list)
|
|
46
46
|
case reports_list.reports_count
|
|
47
|
-
when
|
|
47
|
+
when 6099..Float::INFINITY
|
|
48
48
|
'/label ~"slowness::1"'
|
|
49
|
-
when
|
|
49
|
+
when 2177..6098
|
|
50
50
|
'/label ~"slowness::2"'
|
|
51
|
-
when
|
|
51
|
+
when 521..2176
|
|
52
52
|
'/label ~"slowness::3"'
|
|
53
53
|
else
|
|
54
54
|
'/label ~"slowness::4"'
|
|
@@ -50,18 +50,21 @@ module GitlabQuality
|
|
|
50
50
|
|
|
51
51
|
private
|
|
52
52
|
|
|
53
|
-
attr_reader :context, :file_path, :file, :file_contents, :example_name, :mr_title, :changed_line_no
|
|
53
|
+
attr_reader :context, :file_path, :file, :file_contents, :example_name, :mr_title, :changed_line_no, :matched_lines
|
|
54
54
|
|
|
55
55
|
# Checks if there is already an MR open
|
|
56
56
|
#
|
|
57
57
|
# @return [Boolean]
|
|
58
|
-
def proceed_with_commit?
|
|
58
|
+
def proceed_with_commit? # rubocop:disable Metrics/AbcSize
|
|
59
59
|
if changed_line_no.negative?
|
|
60
60
|
Runtime::Logger.info(" No lines were changed in #{file_path}. Will not proceed with creating MR.")
|
|
61
61
|
return false
|
|
62
62
|
elsif context.commit_processed?(file_path, changed_line_no)
|
|
63
63
|
Runtime::Logger.info(" Record already processed for #{file_path}:#{changed_line_no}. Will not proceed with creating MR.")
|
|
64
64
|
return false
|
|
65
|
+
elsif context.quarantined?(matched_lines, file_contents)
|
|
66
|
+
Runtime::Logger.info(" This test is in quarantine: #{file_path}:#{changed_line_no}. Will not proceed with creating MR.")
|
|
67
|
+
return false
|
|
65
68
|
end
|
|
66
69
|
|
|
67
70
|
true
|
|
@@ -120,7 +123,7 @@ module GitlabQuality
|
|
|
120
123
|
#
|
|
121
124
|
# @return [Array<String, Integer>] first value holds the new content, the second value holds the line number of the test
|
|
122
125
|
def add_metadata # rubocop:disable Metrics/AbcSize
|
|
123
|
-
matched_lines = context.find_example_match_lines(file_contents, example_name)
|
|
126
|
+
@matched_lines = context.find_example_match_lines(file_contents, example_name)
|
|
124
127
|
|
|
125
128
|
if matched_lines.any? { |line| line[0].include?(':blocking') }
|
|
126
129
|
Runtime::Logger.info("Example '#{example_name}' is already blocking")
|
|
@@ -60,12 +60,12 @@ module GitlabQuality
|
|
|
60
60
|
private
|
|
61
61
|
|
|
62
62
|
attr_reader :context, :file_path, :file_contents, :failure_issue_url, :example_name,
|
|
63
|
-
:mr_title, :failure_issue, :changed_line_no
|
|
63
|
+
:mr_title, :failure_issue, :changed_line_no, :matched_lines
|
|
64
64
|
|
|
65
65
|
# Checks if the failure issue is closed or if there is already an MR open
|
|
66
66
|
#
|
|
67
67
|
# @return [Boolean]
|
|
68
|
-
def proceed_with_commit?
|
|
68
|
+
def proceed_with_commit? # rubocop:disable Metrics/AbcSize
|
|
69
69
|
if context.issue_is_closed?(failure_issue)
|
|
70
70
|
Runtime::Logger.info(" Failure issue '#{failure_issue_url}' is closed. Will not proceed with creating MR.")
|
|
71
71
|
return false
|
|
@@ -75,6 +75,9 @@ module GitlabQuality
|
|
|
75
75
|
elsif failure_is_related_to_test_environment?
|
|
76
76
|
Runtime::Logger.info(" Failure issue '#{failure_issue_url}' is environment related. Will not proceed with creating MR.")
|
|
77
77
|
return false
|
|
78
|
+
elsif context.quarantined?(matched_lines, file_contents)
|
|
79
|
+
Runtime::Logger.info(" This test is already in quarantine: #{file_path}:#{changed_line_no}. Will not proceed with creating MR.")
|
|
80
|
+
return false
|
|
78
81
|
end
|
|
79
82
|
|
|
80
83
|
true
|
|
@@ -199,7 +202,7 @@ module GitlabQuality
|
|
|
199
202
|
#
|
|
200
203
|
# @return [Array<String, Integer>] first value holds the new content, the second value holds the line number of the test
|
|
201
204
|
def add_metadata # rubocop:disable Metrics/AbcSize
|
|
202
|
-
matched_lines = context.find_example_match_lines(file_contents, example_name)
|
|
205
|
+
@matched_lines = context.find_example_match_lines(file_contents, example_name)
|
|
203
206
|
|
|
204
207
|
context.update_matched_line(matched_lines.last, file_contents.dup) do |line|
|
|
205
208
|
indentation = context.indentation(line)
|
|
@@ -129,6 +129,26 @@ module GitlabQuality
|
|
|
129
129
|
matched_lines
|
|
130
130
|
end
|
|
131
131
|
|
|
132
|
+
# Scans the content from the matched line until `do` is found to look for quarantine token
|
|
133
|
+
#
|
|
134
|
+
# @param [Array] matched_lines an array of arrays containing the matched line and their index
|
|
135
|
+
# @param [String] file_contents the content of the spec file
|
|
136
|
+
# @return [Bolean]
|
|
137
|
+
def quarantined?(matched_lines, file_contents)
|
|
138
|
+
lines = file_contents.split("\n")
|
|
139
|
+
|
|
140
|
+
matched_lines.each do |matched_line|
|
|
141
|
+
matched_line_starting_index = matched_line[1]
|
|
142
|
+
|
|
143
|
+
lines[matched_line_starting_index..].each do |line|
|
|
144
|
+
return true if line.include?('quarantine: {')
|
|
145
|
+
break if / do$/.match?(line)
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
false
|
|
150
|
+
end
|
|
151
|
+
|
|
132
152
|
# Update the provided matched_line with content from the block if given
|
|
133
153
|
#
|
|
134
154
|
# @param [Array<String, Integer>] matched_line first value holds the line content, the second value holds the line number
|
|
@@ -32,10 +32,6 @@ module GitlabQuality
|
|
|
32
32
|
raise NotImplementedError
|
|
33
33
|
end
|
|
34
34
|
|
|
35
|
-
def line_number
|
|
36
|
-
raise NotImplementedError
|
|
37
|
-
end
|
|
38
|
-
|
|
39
35
|
def section
|
|
40
36
|
raise NotImplementedError
|
|
41
37
|
end
|
|
@@ -52,10 +48,53 @@ module GitlabQuality
|
|
|
52
48
|
raise NotImplementedError
|
|
53
49
|
end
|
|
54
50
|
|
|
51
|
+
def product_group
|
|
52
|
+
report['product_group'].to_s
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def feature_category
|
|
56
|
+
report['feature_category']
|
|
57
|
+
end
|
|
58
|
+
|
|
55
59
|
def failures?
|
|
56
60
|
failures.any?
|
|
57
61
|
end
|
|
58
62
|
|
|
63
|
+
def product_group?
|
|
64
|
+
product_group != ''
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def failure_issue
|
|
68
|
+
report['failure_issue']
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def failure_issue=(new_failure_issue)
|
|
72
|
+
report['failure_issue'] = new_failure_issue
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def line_number
|
|
76
|
+
report['line_number']
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def level
|
|
80
|
+
report['level']
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def run_time
|
|
84
|
+
report['run_time'].to_f.round(2)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def screenshot?
|
|
88
|
+
!!screenshot
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def quarantine?
|
|
92
|
+
# The value for 'quarantine' could be nil, a hash, a string,
|
|
93
|
+
# or true (if the test just has the :quarantine tag)
|
|
94
|
+
# But any non-nil or false value should means the test is in quarantine
|
|
95
|
+
!!quarantine
|
|
96
|
+
end
|
|
97
|
+
|
|
59
98
|
def file
|
|
60
99
|
@file ||= relative_file.start_with?('qa/') ? "qa/#{relative_file}" : relative_file
|
|
61
100
|
end
|
|
@@ -98,6 +137,14 @@ module GitlabQuality
|
|
|
98
137
|
private
|
|
99
138
|
|
|
100
139
|
attr_reader :token, :project, :ref
|
|
140
|
+
|
|
141
|
+
def screenshot
|
|
142
|
+
report.fetch('screenshot', nil)
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def quarantine
|
|
146
|
+
report.fetch('quarantine', nil)
|
|
147
|
+
end
|
|
101
148
|
end
|
|
102
149
|
end
|
|
103
150
|
end
|
|
@@ -40,64 +40,13 @@ module GitlabQuality
|
|
|
40
40
|
end
|
|
41
41
|
end
|
|
42
42
|
|
|
43
|
-
def quarantine
|
|
44
|
-
!report['quarantine'].nil?
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def quarantine?
|
|
48
|
-
# The value for 'quarantine' could be nil, a hash, a string,
|
|
49
|
-
# or true (if the test just has the :quarantine tag)
|
|
50
|
-
# But any non-nil or false value should means the test is in quarantine
|
|
51
|
-
!!quarantine
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
def line_number
|
|
55
|
-
report['line_number']
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
def level
|
|
59
|
-
report['level']
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
def run_time
|
|
63
|
-
report['run_time'].to_f.round(2)
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
def screenshot
|
|
67
|
-
report['screenshot']
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
def screenshot?
|
|
71
|
-
!!screenshot
|
|
72
|
-
end
|
|
73
|
-
|
|
74
43
|
def max_duration_for_test
|
|
75
|
-
|
|
44
|
+
''
|
|
76
45
|
end
|
|
77
46
|
|
|
78
47
|
def ci_job_url
|
|
79
48
|
ENV.fetch('CI_JOB_URL', '')
|
|
80
49
|
end
|
|
81
|
-
|
|
82
|
-
def product_group
|
|
83
|
-
report['product_group'].to_s
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
def product_group?
|
|
87
|
-
product_group != ''
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
def feature_category
|
|
91
|
-
report['feature_category']
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
def failure_issue
|
|
95
|
-
report['failure_issue']
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
def failure_issue=(new_failure_issue)
|
|
99
|
-
report['failure_issue'] = new_failure_issue
|
|
100
|
-
end
|
|
101
50
|
end
|
|
102
51
|
end
|
|
103
52
|
end
|
|
@@ -68,21 +68,6 @@ module GitlabQuality
|
|
|
68
68
|
report['testcase'] = new_testcase
|
|
69
69
|
end
|
|
70
70
|
|
|
71
|
-
def failure_issue
|
|
72
|
-
report['failure_issue']
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
def failure_issue=(new_failure_issue)
|
|
76
|
-
report['failure_issue'] = new_failure_issue
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
def quarantine?
|
|
80
|
-
# The value for 'quarantine' could be nil, a hash, a string,
|
|
81
|
-
# or true (if the test just has the :quarantine tag)
|
|
82
|
-
# But any non-nil or false value should means the test is in quarantine
|
|
83
|
-
!!quarantine
|
|
84
|
-
end
|
|
85
|
-
|
|
86
71
|
def quarantine_type
|
|
87
72
|
quarantine['type'] if quarantine?
|
|
88
73
|
end
|
|
@@ -91,26 +76,10 @@ module GitlabQuality
|
|
|
91
76
|
quarantine['issue'] if quarantine?
|
|
92
77
|
end
|
|
93
78
|
|
|
94
|
-
def screenshot?
|
|
95
|
-
!!screenshot
|
|
96
|
-
end
|
|
97
|
-
|
|
98
79
|
def screenshot_image
|
|
99
80
|
screenshot['image'] if screenshot?
|
|
100
81
|
end
|
|
101
82
|
|
|
102
|
-
def product_group
|
|
103
|
-
report['product_group'].to_s
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
def product_group?
|
|
107
|
-
product_group != ''
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
def feature_category
|
|
111
|
-
report['feature_category']
|
|
112
|
-
end
|
|
113
|
-
|
|
114
83
|
def section
|
|
115
84
|
report['section']
|
|
116
85
|
end
|
|
@@ -119,22 +88,10 @@ module GitlabQuality
|
|
|
119
88
|
report['category']
|
|
120
89
|
end
|
|
121
90
|
|
|
122
|
-
def run_time
|
|
123
|
-
report['run_time'].to_f.round(2)
|
|
124
|
-
end
|
|
125
|
-
|
|
126
91
|
def example_id
|
|
127
92
|
report['id']
|
|
128
93
|
end
|
|
129
94
|
|
|
130
|
-
def line_number
|
|
131
|
-
report['line_number']
|
|
132
|
-
end
|
|
133
|
-
|
|
134
|
-
def level
|
|
135
|
-
report['level']
|
|
136
|
-
end
|
|
137
|
-
|
|
138
95
|
def ci_job_id
|
|
139
96
|
report['ci_job_url'].split('/').last
|
|
140
97
|
end
|
|
@@ -180,14 +137,6 @@ module GitlabQuality
|
|
|
180
137
|
|
|
181
138
|
private
|
|
182
139
|
|
|
183
|
-
def quarantine
|
|
184
|
-
report.fetch('quarantine', nil)
|
|
185
|
-
end
|
|
186
|
-
|
|
187
|
-
def screenshot
|
|
188
|
-
report.fetch('screenshot', nil)
|
|
189
|
-
end
|
|
190
|
-
|
|
191
140
|
def format_message_lines(message_lines)
|
|
192
141
|
message_lines.is_a?(Array) ? message_lines.join("\n") : message_lines
|
|
193
142
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: gitlab_quality-test_tooling
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.33.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- GitLab Quality
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2024-07-
|
|
11
|
+
date: 2024-07-26 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: climate_control
|