Class: Datadog::CI::Test

Inherits:
Span
  • Object
show all
Defined in:
lib/datadog/ci/test.rb

Overview

Represents a single part of a test run.

Instance Attribute Summary

Attributes inherited from Span

#tracer_span

Instance Method Summary collapse

Methods inherited from Span

#base_commit_sha, #clear_tag, #failed?, #get_metric, #get_tag, #git_branch, #git_commit_sha, #git_repository_url, #id, #initialize, #os_architecture, #os_platform, #os_version, #passed?, #runtime_name, #runtime_version, #service, #set_default_tags, #set_environment_runtime_tags, #set_metric, #set_tag, #set_tags, #skipped?, #source_file, #to_s, #trace_id, #type, #undefined?

Constructor Details

This class inherits a constructor from Datadog::CI::Span

Instance Method Details

#all_executions_failed?Boolean

Returns:

  • (Boolean)


192
193
194
# File 'lib/datadog/ci/test.rb', line 192

def all_executions_failed?
  !!test_suite&.all_executions_failed?(datadog_test_id)
end

#all_executions_passed?Boolean

Returns:

  • (Boolean)


197
198
199
# File 'lib/datadog/ci/test.rb', line 197

def all_executions_passed?
  !!test_suite&.all_executions_passed?(datadog_test_id)
end

#any_retry_passed?Boolean

Returns:

  • (Boolean)


187
188
189
# File 'lib/datadog/ci/test.rb', line 187

def any_retry_passed?
  !!test_suite&.any_test_retry_passed?(datadog_test_id)
end

#attempt_to_fix?Boolean

Returns “true” if this flaky test has fixing attempts (determined by Datadog backend).

Returns:

  • (Boolean)

    true if this test is attempted to be fixed.



101
102
103
# File 'lib/datadog/ci/test.rb', line 101

def attempt_to_fix?
  get_tag(Ext::Test::TAG_IS_ATTEMPT_TO_FIX) == "true"
end

#datadog_skip_reasonObject



202
203
204
205
206
207
208
# File 'lib/datadog/ci/test.rb', line 202

def datadog_skip_reason
  if skipped_by_test_impact_analysis?
    Ext::Test::SkipReason::TEST_IMPACT_ANALYSIS
  elsif disabled? || quarantined?
    Ext::Test::SkipReason::TEST_MANAGEMENT_DISABLED
  end
end

#datadog_test_idString

Returns the test id according to Datadog’s test impact analysis.

Returns:

  • (String)

    the test id according to Datadog’s test impact analysis.



21
22
23
# File 'lib/datadog/ci/test.rb', line 21

def datadog_test_id
  @datadog_test_id ||= Utils::TestRun.datadog_test_id(name, test_suite_name, parameters)
end

#disabled?Boolean

Returns “true” if this test is disabled by Datadog test management.

Returns:

  • (Boolean)

    true if this test is disabled, false otherwise.



95
96
97
# File 'lib/datadog/ci/test.rb', line 95

def disabled?
  get_tag(Ext::Test::TAG_IS_TEST_DISABLED) == "true"
end

#failed!(exception: nil) ⇒ void

This method returns an undefined value.

Sets the status of the span to “fail”.

Parameters:

  • exception (Exception) (defaults to: nil)

    the exception that caused the test to fail.



144
145
146
147
148
149
150
151
152
153
154
# File 'lib/datadog/ci/test.rb', line 144

def failed!(exception: nil)
  super

  # if we should ignore failures, we consider this test to be passed
  if should_ignore_failures?
    # use a special "fail_ignored" status to mark this test as failed but ignored
    record_test_result(Ext::Test::ExecutionStatsStatus::FAIL_IGNORED)
  else
    record_test_result(Ext::Test::Status::FAIL)
  end
end

#finishvoid

This method returns an undefined value.

Finishes the current test.



27
28
29
30
31
32
33
34
35
# File 'lib/datadog/ci/test.rb', line 27

def finish
  if is_retry? && retry_reason.nil?
    set_tag(Ext::Test::TAG_RETRY_REASON, Ext::Test::RetryReason::RETRY_EXTERNAL)
  end

  test_visibility.deactivate_test

  super
end

#is_new?Boolean

Returns “true” if this span represents a test that wasn’t known to Datadog before.

Returns:

  • (Boolean)

    true if this test is a new one, false otherwise.



83
84
85
# File 'lib/datadog/ci/test.rb', line 83

def is_new?
  get_tag(Ext::Test::TAG_IS_NEW) == "true"
end

#is_retry?Boolean

Returns “true” if test span represents a retry.

Returns:

  • (Boolean)

    true if this test is a retry, false otherwise.



71
72
73
# File 'lib/datadog/ci/test.rb', line 71

def is_retry?
  get_tag(Ext::Test::TAG_IS_RETRY) == "true"
end

#itr_unskippable!void

This method returns an undefined value.

Marks this test as unskippable by the Test Impact Analysis. This must be done before the test execution starts.

Examples of tests that should be unskippable:

  • tests that read files from disk

  • tests that make network requests

  • tests that call external processes

  • tests that use forking



121
122
123
124
125
126
127
128
129
130
131
# File 'lib/datadog/ci/test.rb', line 121

def itr_unskippable!
  TestOptimisation::Telemetry.itr_unskippable
  set_tag(Ext::Test::TAG_ITR_UNSKIPPABLE, "true")

  if skipped_by_test_impact_analysis?
    clear_tag(Ext::Test::TAG_ITR_SKIPPED_BY_ITR)

    TestOptimisation::Telemetry.itr_forced_run
    set_tag(Ext::Test::TAG_ITR_FORCED_RUN, "true")
  end
end

#modified?Boolean

Returns “true” if this test is marked as modified (e.g., impacted by code changes).

Returns:

  • (Boolean)

    true if this test is modified, false otherwise.



107
108
109
# File 'lib/datadog/ci/test.rb', line 107

def modified?
  get_tag(Ext::Test::TAG_TEST_IS_MODIFIED) == "true"
end

#nameString

Returns the name of the test.

Returns:

  • (String)

    the name of the test.



16
17
18
# File 'lib/datadog/ci/test.rb', line 16

def name
  get_tag(Ext::Test::TAG_NAME)
end

#parametersString?

Gets the parameters for this test (e.g. Cucumber example or RSpec specs) as a serialized JSON.

Returns:

  • (String)

    the serialized JSON of the parameters

  • (nil)

    if this test does not have parameters



182
183
184
# File 'lib/datadog/ci/test.rb', line 182

def parameters
  get_tag(Ext::Test::TAG_PARAMETERS)
end

#passed!void

This method returns an undefined value.

Sets the status of the span to “pass”.



135
136
137
138
139
# File 'lib/datadog/ci/test.rb', line 135

def passed!
  super

  record_test_result(Ext::Test::Status::PASS)
end

#quarantined?Boolean

Returns “true” if this test is quarantined by Datadog test management.

Returns:

  • (Boolean)

    true if this test is quarantined, false otherwise.



89
90
91
# File 'lib/datadog/ci/test.rb', line 89

def quarantined?
  get_tag(Ext::Test::TAG_IS_QUARANTINED) == "true"
end

#retry_reasonString

Returns string with a reason why test was retried

Returns:

  • (String)

    retry reason



77
78
79
# File 'lib/datadog/ci/test.rb', line 77

def retry_reason
  get_tag(Ext::Test::TAG_RETRY_REASON)
end

#set_parameters(arguments, metadata = {}) ⇒ void

This method returns an undefined value.

Sets the parameters for this test (e.g. Cucumber example or RSpec specs). Parameters are needed to compute test fingerprint to distinguish between different tests having same names.

Parameters:

  • arguments (Hash)

    the arguments that test accepts as key-value hash

  • metadata (Hash) (defaults to: {})

    optional metadata



172
173
174
175
176
# File 'lib/datadog/ci/test.rb', line 172

def set_parameters(arguments,  = {})
  return if arguments.nil?

  set_tag(Ext::Test::TAG_PARAMETERS, Utils::TestRun.test_parameters(arguments: arguments, metadata: ))
end

#should_ignore_failures?Boolean

Returns:

  • (Boolean)


216
217
218
# File 'lib/datadog/ci/test.rb', line 216

def should_ignore_failures?
  quarantined? || disabled? || any_retry_passed?
end

#should_skip?Boolean

Returns:

  • (Boolean)


211
212
213
# File 'lib/datadog/ci/test.rb', line 211

def should_skip?
  skipped_by_test_impact_analysis? || (disabled? && !attempt_to_fix?)
end

#skipped!(exception: nil, reason: nil) ⇒ void

This method returns an undefined value.

Sets the status of the span to “skip”.

Parameters:

  • exception (Exception) (defaults to: nil)

    the exception that caused the test to fail.

  • reason (String) (defaults to: nil)

    the reason why the test was skipped.



160
161
162
163
164
# File 'lib/datadog/ci/test.rb', line 160

def skipped!(exception: nil, reason: nil)
  super

  record_test_result(Ext::Test::Status::SKIP)
end

#skipped_by_test_impact_analysis?Boolean

Returns:

  • (Boolean)


221
222
223
# File 'lib/datadog/ci/test.rb', line 221

def skipped_by_test_impact_analysis?
  get_tag(Ext::Test::TAG_ITR_SKIPPED_BY_ITR) == "true"
end

#test_module_idString

Span id of the running test module this test belongs to.

Returns:

  • (String)

    the span id of the test module.



59
60
61
# File 'lib/datadog/ci/test.rb', line 59

def test_module_id
  get_tag(Ext::Test::TAG_TEST_MODULE_ID)
end

#test_session_idString

Span id of the running test session this test belongs to.

Returns:

  • (String)

    the span id of the test session.



65
66
67
# File 'lib/datadog/ci/test.rb', line 65

def test_session_id
  get_tag(Ext::Test::TAG_TEST_SESSION_ID)
end

#test_suiteDatadog::CI::TestSuite?

Running test suite that this test is part of (if any).

Returns:



40
41
42
43
# File 'lib/datadog/ci/test.rb', line 40

def test_suite
  suite_name = test_suite_name
  CI.active_test_suite(suite_name) if suite_name
end

#test_suite_idString

Span id of the running test suite this test belongs to.

Returns:

  • (String)

    the span id of the test suite.



47
48
49
# File 'lib/datadog/ci/test.rb', line 47

def test_suite_id
  get_tag(Ext::Test::TAG_TEST_SUITE_ID)
end

#test_suite_nameString

Name of the running test suite this test belongs to.

Returns:

  • (String)

    the name of the test suite.



53
54
55
# File 'lib/datadog/ci/test.rb', line 53

def test_suite_name
  get_tag(Ext::Test::TAG_SUITE)
end