Class: Cucumber::Core::Test::Runner

Inherits:
Object
  • Object
show all
Includes:
Messages::Helpers::TimeConversion
Defined in:
lib/cucumber/core/test/runner.rb

Defined Under Namespace

Classes: RunningTestCase

Instance Method Summary collapse

Constructor Details

#initialize(event_bus, id_generator = Cucumber::Messages::Helpers::IdGenerator::UUID.new, backtrace_filter = nil, max_attempts = 1) ⇒ Runner

Returns a new instance of Runner.



17
18
19
20
21
22
23
# File 'lib/cucumber/core/test/runner.rb', line 17

def initialize(event_bus, id_generator = Cucumber::Messages::Helpers::IdGenerator::UUID.new, backtrace_filter = nil, max_attempts = 1)
  @event_bus = event_bus
  @id_generator = id_generator
  @backtrace_filter = backtrace_filter
  @max_attempts = max_attempts
  @current_test_case = nil
end

Instance Method Details

#around_hook(hook) ⇒ Object



55
56
57
58
59
60
# File 'lib/cucumber/core/test/runner.rb', line 55

def around_hook(hook, &)
  result = running_test_case.execute(hook, &)
  event_bus.test_step_finished running_test_step, result if running_test_step
  @running_test_step = nil
  self
end

#calculate_test_case_result(test_case) ⇒ Object



66
67
68
69
70
71
72
# File 'lib/cucumber/core/test/runner.rb', line 66

def calculate_test_case_result(test_case)
  if running_test_case.result.unknown?
    Result::Undefined.new('The test case has no steps', Result::UnknownDuration.new, ["#{test_case.location}:in `#{test_case.name}'"])
  else
    running_test_case.result
  end
end

#doneObject



62
63
64
# File 'lib/cucumber/core/test/runner.rb', line 62

def done
  self
end

#test_case(test_case, &descend) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/cucumber/core/test/runner.rb', line 25

def test_case(test_case, &descend)
  @attempt = @current_test_case == test_case ? @attempt + 1 : 1
  @current_test_case = test_case
  @current_test_case_started_id = id_generator.new_id
  @running_test_case = RunningTestCase.new
  @running_test_step = nil
  event_bus.test_case_started(test_case)
  event_bus.envelope(to_test_case_started_envelope(test_case))

  descend.call(self)

  result = calculate_test_case_result(test_case)
  event_bus.test_case_finished(test_case, result)
  event_bus.envelope(to_test_case_finished_envelope(result))
  self
end

#test_step(test_step) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/cucumber/core/test/runner.rb', line 42

def test_step(test_step)
  @running_test_step = test_step
  event_bus.test_step_started test_step
  event_bus.envelope(to_test_step_started_envelope(test_step))

  step_result = running_test_case.execute(test_step)

  event_bus.test_step_finished test_step, step_result
  event_bus.envelope(to_test_step_finished_envelope(test_step, step_result))
  @running_test_step = nil
  self
end

#to_error_message(message_element) ⇒ Object



128
129
130
131
132
133
# File 'lib/cucumber/core/test/runner.rb', line 128

def to_error_message(message_element)
  <<~ERROR_MESSAGE
    #{message_element.message} (#{message_element.class})
    #{message_element.backtrace}
  ERROR_MESSAGE
end

#to_exception_object(result, message_element) ⇒ Object



135
136
137
138
139
140
141
142
143
# File 'lib/cucumber/core/test/runner.rb', line 135

def to_exception_object(result, message_element)
  return unless result.failed?

  Cucumber::Messages::Exception.new(
    type: message_element.class,
    message: message_element.message,
    stack_trace: message_element.backtrace.join("\n")
  )
end

#to_test_case_finished_envelope(result) ⇒ Object



85
86
87
88
89
90
91
92
93
# File 'lib/cucumber/core/test/runner.rb', line 85

def to_test_case_finished_envelope(result)
  Cucumber::Messages::Envelope.new(
    test_case_finished: Cucumber::Messages::TestCaseFinished.new(
      test_case_started_id: @current_test_case_started_id,
      timestamp: time_to_timestamp(Time.now),
      will_be_retried: result.failed? && (@attempt < @max_attempts)
    )
  )
end

#to_test_case_started_envelope(test_case) ⇒ Object



74
75
76
77
78
79
80
81
82
83
# File 'lib/cucumber/core/test/runner.rb', line 74

def to_test_case_started_envelope(test_case)
  Cucumber::Messages::Envelope.new(
    test_case_started: Cucumber::Messages::TestCaseStarted.new(
      id: @current_test_case_started_id,
      test_case_id: test_case.id,
      timestamp: time_to_timestamp(Time.now),
      attempt: @attempt
    )
  )
end

#to_test_step_finished_envelope(test_step, step_result) ⇒ Object



105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/cucumber/core/test/runner.rb', line 105

def to_test_step_finished_envelope(test_step, step_result)
  result = @backtrace_filter.nil? ? step_result : step_result.with_filtered_backtrace(@backtrace_filter)
  result_message = result.to_message
  if result.failed? || result.pending?
    message_element = result.failed? ? result.exception : result

    result_message = Cucumber::Messages::TestStepResult.new(
      status: result_message.status,
      duration: result_message.duration,
      message: to_error_message(message_element),
      exception: to_exception_object(result, message_element)
    )
  end
  Cucumber::Messages::Envelope.new(
    test_step_finished: Cucumber::Messages::TestStepFinished.new(
      test_step_id: test_step.id,
      test_case_started_id: @current_test_case_started_id,
      test_step_result: result_message,
      timestamp: time_to_timestamp(Time.now)
    )
  )
end

#to_test_step_started_envelope(test_step) ⇒ Object



95
96
97
98
99
100
101
102
103
# File 'lib/cucumber/core/test/runner.rb', line 95

def to_test_step_started_envelope(test_step)
  Cucumber::Messages::Envelope.new(
    test_step_started: Cucumber::Messages::TestStepStarted.new(
      test_step_id: test_step.id,
      test_case_started_id: @current_test_case_started_id,
      timestamp: time_to_timestamp(Time.now)
    )
  )
end