gitlab_quality-test_tooling 1.7.0 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6924fc592c0dbb5e1ae0aed8710f7f7714c336bdd1d1d31b343e6edddd358ead
4
- data.tar.gz: 0ebb5fbe0aeff0417193d4521cf52a78d849b83d116e08118b9cf87ee2655a71
3
+ metadata.gz: 4ee3407afd5274be75c1bb63c7f7aeeb0d2353cf62f0fb75c1393bd2103c8c1e
4
+ data.tar.gz: a4965dd9d979a58c4202c6f25315d60e08d597d51322db491a077a0ae797cf34
5
5
  SHA512:
6
- metadata.gz: f9a64cbae7e3a34ae66450ae7fe20181560dc6860950a92e53c5aaf61ab10343372044968b5a726bef51b082a45dd9150d6f161d93a45a4ccf75d550cf981be1
7
- data.tar.gz: a77ea69469a02b3cbd089cade6be20347abc03cada1cf93fec8380456f000d083a914296e0b35faff573e60d73e4759abd1b5d224cb04e64b38862fe720cf65c
6
+ metadata.gz: 1619807ec2456f02c9d4a1c09dfb0aeba598de7d51fe7a0377c1e5a9f3f9fc82cf607fa34387bb5ee1691ad28b5637e75c18c38ce068269c3bba76e3c902df22
7
+ data.tar.gz: '0940057d402dfb8fbcd3a6d2d09f7ff698e26d140ebdda659fcc5347445574fa7f398b2bd91e8a39c872b0f8a9f368fa1f734e59e10262790ed2d507fb97e514'
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- gitlab_quality-test_tooling (1.7.0)
4
+ gitlab_quality-test_tooling (1.8.0)
5
5
  activesupport (>= 6.1, < 7.2)
6
6
  amatch (~> 0.4.1)
7
7
  gitlab (~> 4.19)
data/README.md CHANGED
@@ -77,6 +77,8 @@ Usage: exe/prepare-stage-reports [options]
77
77
  Purpose: Relate test failures to failure issues from RSpec report files (JSON or JUnit XML)
78
78
  Usage: exe/relate-failure-issue [options]
79
79
  -i, --input-files INPUT_FILES RSpec report files (JSON or JUnit XML)
80
+ -m METRICS_FILES, Test metrics files (JSON)
81
+ --metrics-files
80
82
  --max-diff-ratio MAX_DIFF_RATO
81
83
  Max stacktrace diff ratio for failure issues detection
82
84
  -p, --project PROJECT Can be an integer or a group/project string
@@ -15,6 +15,10 @@ options = OptionParser.new do |opts|
15
15
  params[:input_files] = input_files
16
16
  end
17
17
 
18
+ opts.on('-m', '--metrics-files METRICS_FILES', String, 'Test metrics files (JSON)') do |metrics_files|
19
+ params[:metrics_files] = metrics_files
20
+ end
21
+
18
22
  opts.on('--max-diff-ratio MAX_DIFF_RATO', Float, 'Max stacktrace diff ratio for failure issues detection') do |max_diff_ratio|
19
23
  params[:max_diff_ratio] = max_diff_ratio
20
24
  end
@@ -41,6 +41,7 @@ module GitlabQuality
41
41
  system_logs: [],
42
42
  base_issue_labels: nil,
43
43
  exclude_labels_for_search: nil,
44
+ metrics_files: [],
44
45
  **kwargs)
45
46
  super
46
47
  @max_diff_ratio = max_diff_ratio.to_f
@@ -49,11 +50,12 @@ module GitlabQuality
49
50
  @exclude_labels_for_search = Set.new(exclude_labels_for_search)
50
51
  @issue_type = 'issue'
51
52
  @commented_issue_list = Set.new
53
+ @metrics_files = Array(metrics_files)
52
54
  end
53
55
 
54
56
  private
55
57
 
56
- attr_reader :max_diff_ratio, :system_logs, :base_issue_labels, :exclude_labels_for_search
58
+ attr_reader :max_diff_ratio, :system_logs, :base_issue_labels, :exclude_labels_for_search, :metrics_files
57
59
 
58
60
  def run!
59
61
  puts "Reporting test failures in `#{files.join(',')}` as issues in project `#{project}` via the API at `#{Runtime::Env.gitlab_api_base}`."
@@ -66,16 +68,39 @@ module GitlabQuality
66
68
  write_issues_log_file
67
69
  end
68
70
 
71
+ def test_metric_collections
72
+ @test_metric_collections ||= Dir.glob(metrics_files).map do |path|
73
+ TestMetrics::JsonTestMetricCollection.new(path)
74
+ end
75
+ end
76
+
69
77
  def process_test_results(test_results)
70
78
  systemic_failures = systemic_failures_for_test_results(test_results)
71
79
 
72
80
  test_results.each do |test|
73
81
  collect_issues(test, relate_failure_to_issue(test)) if should_report?(test, systemic_failures)
82
+
83
+ copy_failure_issue_to_test_metrics(test) if metrics_files.any?
74
84
  end
75
85
 
76
86
  test_results.write
77
87
  end
78
88
 
89
+ def copy_failure_issue_to_test_metrics(test)
90
+ failure_issue = test.failure_issue
91
+
92
+ return unless failure_issue
93
+
94
+ test_metric_collections.find do |test_metric_collection|
95
+ test_metric = test_metric_collection.metric_for_test_id(test.example_id)
96
+
97
+ if test_metric
98
+ test_metric.fields['failure_issue'] = failure_issue
99
+ test_metric_collection.write
100
+ end
101
+ end
102
+ end
103
+
79
104
  def systemic_failures_for_test_results(test_results)
80
105
  test_results
81
106
  .flat_map { |test| test.failures.map { |failure| failure['message'].lines.first.chomp } }
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GitlabQuality
4
+ module TestTooling
5
+ module TestMetric
6
+ class JsonTestMetric
7
+ attr_reader :metric
8
+
9
+ def initialize(metric)
10
+ @metric = metric
11
+ end
12
+
13
+ def name
14
+ metric.fetch('name')
15
+ end
16
+
17
+ def time
18
+ metric.fetch('time')
19
+ end
20
+
21
+ def tags
22
+ @tags ||= metric.fetch('tags')
23
+ end
24
+
25
+ def fields
26
+ @fields ||= metric.fetch('fields')
27
+ end
28
+
29
+ def to_json(*options)
30
+ as_json.to_json(*options)
31
+ end
32
+
33
+ private
34
+
35
+ def as_json
36
+ {
37
+ name: name,
38
+ time: time,
39
+ tags: tags,
40
+ fields: fields
41
+ }
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+
5
+ module GitlabQuality
6
+ module TestTooling
7
+ module TestMetrics
8
+ class JsonTestMetricCollection
9
+ include Enumerable
10
+
11
+ attr_reader :path, :metrics
12
+
13
+ def initialize(path)
14
+ @path = path
15
+ @metrics = process
16
+ end
17
+
18
+ def metric_for_test_id(test_id)
19
+ metrics.find do |metric|
20
+ metric.fields['id'] == test_id
21
+ end
22
+ end
23
+
24
+ def write
25
+ File.write(path, JSON.pretty_generate(metrics))
26
+ end
27
+
28
+ private
29
+
30
+ def parse
31
+ JSON.parse(File.read(path))
32
+ rescue JSON::ParserError
33
+ Runtime::Logger.debug("#{self.class.name}##{__method__} attempted to parse invalid JSON at path: #{path}")
34
+ {}
35
+ end
36
+
37
+ def process
38
+ parse.map do |test|
39
+ GitlabQuality::TestTooling::TestMetric::JsonTestMetric.new(test)
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module GitlabQuality
4
4
  module TestTooling
5
- VERSION = "1.7.0"
5
+ VERSION = "1.8.0"
6
6
  end
7
7
  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.7.0
4
+ version: 1.8.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: 2023-11-29 00:00:00.000000000 Z
11
+ date: 2023-11-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: climate_control
@@ -422,6 +422,8 @@ files:
422
422
  - lib/gitlab_quality/test_tooling/system_logs/log_types/rails/graphql_log.rb
423
423
  - lib/gitlab_quality/test_tooling/system_logs/shared_fields.rb
424
424
  - lib/gitlab_quality/test_tooling/system_logs/system_logs_formatter.rb
425
+ - lib/gitlab_quality/test_tooling/test_metric/json_test_metric.rb
426
+ - lib/gitlab_quality/test_tooling/test_metrics/json_test_metric_collection.rb
425
427
  - lib/gitlab_quality/test_tooling/test_result/base_test_result.rb
426
428
  - lib/gitlab_quality/test_tooling/test_result/j_unit_test_result.rb
427
429
  - lib/gitlab_quality/test_tooling/test_result/json_test_result.rb