cucumber 0.1.9 → 0.1.10
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.
- data/History.txt +31 -1
- data/Manifest.txt +15 -0
- data/bin/cucumber +2 -1
- data/config/hoe.rb +2 -1
- data/examples/calculator_ruby_features/features/addition.rb +1 -1
- data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +1 -0
- data/examples/i18n/de/Rakefile +6 -0
- data/examples/i18n/de/features/addition.feature +17 -0
- data/examples/i18n/de/features/division.feature +10 -0
- data/examples/i18n/de/features/step_definitons/calculator_steps.rb +30 -0
- data/examples/i18n/de/lib/calculator.rb +14 -0
- data/examples/i18n/en/Rakefile +1 -0
- data/examples/i18n/lt/Rakefile +6 -0
- data/examples/i18n/lt/features/addition.feature +17 -0
- data/examples/i18n/lt/features/division.feature +10 -0
- data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +31 -0
- data/examples/i18n/lt/lib/calculator.rb +14 -0
- data/examples/test_unit/Rakefile +6 -0
- data/examples/test_unit/features/step_definitions/test_unit_steps.rb +26 -0
- data/examples/test_unit/features/test_unit.feature +9 -0
- data/examples/tickets/features/tickets.feature +4 -2
- data/lib/autotest/discover.rb +1 -1
- data/lib/cucumber.rb +3 -3
- data/lib/cucumber/cli.rb +16 -6
- data/lib/cucumber/core_ext/proc.rb +31 -16
- data/lib/cucumber/executor.rb +35 -15
- data/lib/cucumber/formatters/ansicolor.rb +11 -13
- data/lib/cucumber/languages.yml +13 -1
- data/lib/cucumber/platform.rb +12 -0
- data/lib/cucumber/step_mother.rb +7 -1
- data/lib/cucumber/tree/feature.rb +3 -1
- data/lib/cucumber/tree/scenario.rb +17 -1
- data/lib/cucumber/treetop_parser/feature_de.rb +8 -8
- data/lib/cucumber/treetop_parser/feature_lt.rb +1591 -0
- data/lib/cucumber/version.rb +1 -1
- data/rails_generators/cucumber/templates/webrat_steps.rb +49 -0
- data/rails_generators/feature/templates/feature.erb +3 -3
- data/spec/cucumber/cli_spec.rb +33 -1
- data/spec/cucumber/executor_spec.rb +104 -28
- data/spec/cucumber/step_mother_spec.rb +7 -7
- data/spec/cucumber/tree/feature_spec.rb +31 -0
- data/spec/cucumber/tree/row_scenario_spec.rb +30 -0
- data/spec/spec_helper.rb +1 -0
- metadata +22 -7
data/History.txt
CHANGED
@@ -1,4 +1,34 @@
|
|
1
|
-
== 0.1.
|
1
|
+
== 0.1.10 2008-11-25
|
2
|
+
|
3
|
+
This release mostly has smaller bugfixes. The most significant new feature is how
|
4
|
+
line numbers are specified. You can now run multiple features at specific lines numbers like this:
|
5
|
+
|
6
|
+
cucumber foo.feature:15 bar.feature:6:45:111
|
7
|
+
|
8
|
+
This will run foo.feature at line 15 and bar.feature at line 6, 45 and 111.
|
9
|
+
|
10
|
+
=== New features
|
11
|
+
* Added example showing how to use Cucumber with Test::Unit + Matchy instead of RSpec (Aslak Hellesøy)
|
12
|
+
* Yield existing world object to World block (#87 Aslak Hellesøy)
|
13
|
+
* AUTOFEATURE=tRue works (case insensitive) (Aslak Hellesøy)
|
14
|
+
* Initial support for .NET via IronRuby. (Aslak Hellesøy)
|
15
|
+
* Lithuanian translation (sauliusgrigaitis)
|
16
|
+
* New webrat step defintions to wrap the new selects_time, selects_date, and selects_datetime methods. (Ben Mabey)
|
17
|
+
* Try to load webrat gem if it's not installed as a plugin (Aslak Hellesøy)
|
18
|
+
* Support example.feature:20 or example.feature:10:20:30 syntax for running features at specific line number(s). (#88 Joseph Wilk)
|
19
|
+
|
20
|
+
=== Bugfixes
|
21
|
+
* Windows - all the 'a' characters in the output have gone on strike (#81 Luis Lavena, Joseph Wilk, Aslak Hellesøy)
|
22
|
+
* Raise a nice error when encountering step definition without block (#95 Aslak Hellesøy)
|
23
|
+
* Features written using Ruby where breaking due to missing a line number (#91 Joseph Wilk)
|
24
|
+
* Directly creating a Table meant the scenario table header was never set which was causing a formatter error (#91 Joseph Wilk)
|
25
|
+
|
26
|
+
=== Removed features
|
27
|
+
* $KCODE='u' is no longer done automatically. Developers should do that explicitly when needed in step definitions or env.rb.
|
28
|
+
* Step definition without a block being treated as pending (#64 Joseph Wilk)
|
29
|
+
* The --line option has been removed. Use the new file.feature:line format instead.
|
30
|
+
|
31
|
+
== 0.1.9 2008-11-12
|
2
32
|
|
3
33
|
With this release Cucumber supports 19 (!) natural languages:
|
4
34
|
|
data/Manifest.txt
CHANGED
@@ -30,6 +30,11 @@ examples/i18n/da/Rakefile
|
|
30
30
|
examples/i18n/da/features/step_definitons/kalkulator_steps.rb
|
31
31
|
examples/i18n/da/features/summering.feature
|
32
32
|
examples/i18n/da/lib/kalkulator.rb
|
33
|
+
examples/i18n/de/Rakefile
|
34
|
+
examples/i18n/de/features/addition.feature
|
35
|
+
examples/i18n/de/features/division.feature
|
36
|
+
examples/i18n/de/features/step_definitons/calculator_steps.rb
|
37
|
+
examples/i18n/de/lib/calculator.rb
|
33
38
|
examples/i18n/en/Rakefile
|
34
39
|
examples/i18n/en/features/addition.feature
|
35
40
|
examples/i18n/en/features/division.feature
|
@@ -62,6 +67,11 @@ examples/i18n/ja/features/addition.feature
|
|
62
67
|
examples/i18n/ja/features/division.feature
|
63
68
|
examples/i18n/ja/features/step_definitons/calculator_steps.rb
|
64
69
|
examples/i18n/ja/lib/calculator.rb
|
70
|
+
examples/i18n/lt/Rakefile
|
71
|
+
examples/i18n/lt/features/addition.feature
|
72
|
+
examples/i18n/lt/features/division.feature
|
73
|
+
examples/i18n/lt/features/step_definitons/calculator_steps.rb
|
74
|
+
examples/i18n/lt/lib/calculator.rb
|
65
75
|
examples/i18n/no/Rakefile
|
66
76
|
examples/i18n/no/features/step_definitons/kalkulator_steps.rb
|
67
77
|
examples/i18n/no/features/summering.feature
|
@@ -92,6 +102,9 @@ examples/java/src/cucumber/demo/Hello.java
|
|
92
102
|
examples/selenium/Rakefile
|
93
103
|
examples/selenium/features/search.feature
|
94
104
|
examples/selenium/features/step_definitons/stories_steps.rb
|
105
|
+
examples/test_unit/Rakefile
|
106
|
+
examples/test_unit/features/step_definitions/test_unit_steps.rb
|
107
|
+
examples/test_unit/features/test_unit.feature
|
95
108
|
examples/tickets/Rakefile
|
96
109
|
examples/tickets/cucumber.yml
|
97
110
|
examples/tickets/features/step_definitons/tickets_steps.rb
|
@@ -134,6 +147,7 @@ lib/cucumber/formatters/progress_formatter.rb
|
|
134
147
|
lib/cucumber/languages.yml
|
135
148
|
lib/cucumber/model.rb
|
136
149
|
lib/cucumber/model/table.rb
|
150
|
+
lib/cucumber/platform.rb
|
137
151
|
lib/cucumber/rails/rspec.rb
|
138
152
|
lib/cucumber/rails/world.rb
|
139
153
|
lib/cucumber/rake/task.rb
|
@@ -160,6 +174,7 @@ lib/cucumber/treetop_parser/feature_fr.rb
|
|
160
174
|
lib/cucumber/treetop_parser/feature_id.rb
|
161
175
|
lib/cucumber/treetop_parser/feature_it.rb
|
162
176
|
lib/cucumber/treetop_parser/feature_ja.rb
|
177
|
+
lib/cucumber/treetop_parser/feature_lt.rb
|
163
178
|
lib/cucumber/treetop_parser/feature_nl.rb
|
164
179
|
lib/cucumber/treetop_parser/feature_no.rb
|
165
180
|
lib/cucumber/treetop_parser/feature_parser.rb
|
data/bin/cucumber
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# Add '.rb' to work around a bug in IronRuby's File#dirname
|
3
|
+
$:.unshift(File.dirname(__FILE__ + '.rb') + '/../lib') unless $:.include?(File.dirname(__FILE__ + '.rb') + '/../lib')
|
2
4
|
|
3
|
-
$:.unshift(File.dirname(__FILE__) + '/../lib') unless $:.include?(File.dirname(__FILE__) + '/../lib')
|
4
5
|
require 'cucumber/cli'
|
5
6
|
Cucumber::CLI.execute
|
data/config/hoe.rb
CHANGED
@@ -57,7 +57,8 @@ $hoe = Hoe.new(GEM_NAME, VERS) do |p|
|
|
57
57
|
# == Optional
|
58
58
|
p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
|
59
59
|
#p.extra_deps = [] # An array of rubygem dependencies [name, version], e.g. [ ['active_support', '>= 1.3.1'] ]
|
60
|
-
p.extra_deps = [ ['term-ansicolor', '>= 1.0.3'], ['treetop', '>= 1.2.4'], ['
|
60
|
+
p.extra_deps = [ ['term-ansicolor', '>= 1.0.3'], ['treetop', '>= 1.2.4'], ['diff-lcs', '>= 1.1.2'] ]
|
61
|
+
p.extra_dev_deps = [ ['rspec', '>= 1.1.11'] ]
|
61
62
|
|
62
63
|
#p.spec_extras = {} # A hash of extra values to set in the gemspec.
|
63
64
|
|
@@ -0,0 +1,17 @@
|
|
1
|
+
Funktionalität: Addition
|
2
|
+
Um dumme Fehler zu vermeiden
|
3
|
+
möchte ich als Matheidiot
|
4
|
+
die Summe zweier Zahlen gesagt bekommen
|
5
|
+
|
6
|
+
Szenario: Zwei Zahlen hinzufügen
|
7
|
+
Gegeben sei ich habe 50 in den Taschenrechner eingegeben
|
8
|
+
Und ich habe 70 in den Taschenrechner eingegeben
|
9
|
+
Wenn ich add drücke
|
10
|
+
Dann sollte das Ergebniss auf dem Bildschirm 120 sein
|
11
|
+
Und die Ergebnissklasse sollte eine Fixnum sein
|
12
|
+
|
13
|
+
Mehr Beispiele:
|
14
|
+
| Eingabe_1 | Eingabe_2 | Knopf | Ausgabe | Klasse |
|
15
|
+
| 20 | 30 | add | 50 | Fixnum |
|
16
|
+
| 2 | 5 | add | 7 | Fixnum |
|
17
|
+
| 0 | 40 | add | 40 | Fixnum |
|
@@ -0,0 +1,10 @@
|
|
1
|
+
Funktionalität: Division
|
2
|
+
Um dumme Fehler zu vermeiden
|
3
|
+
müssen Kassierer in der Lage sein einen Bruchteil zu berechnen
|
4
|
+
|
5
|
+
Szenario: Normale Zahlen
|
6
|
+
Gegeben sei ich habe 3 in den Taschenrechner eingegeben
|
7
|
+
Und ich habe 2 in den Taschenrechner eingegeben
|
8
|
+
Wenn ich divide drücke
|
9
|
+
Dann sollte das Ergebniss auf dem Bildschirm 1.5 sein
|
10
|
+
Und die Ergebnissklasse sollte eine Float sein
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'spec'
|
2
|
+
$:.unshift(File.dirname(__FILE__) + '/../../lib')
|
3
|
+
require 'calculator'
|
4
|
+
|
5
|
+
Before do
|
6
|
+
@calc = Calculator.new
|
7
|
+
end
|
8
|
+
|
9
|
+
After do
|
10
|
+
end
|
11
|
+
|
12
|
+
Given "ich habe $n in den Taschenrechner eingegeben" do |n|
|
13
|
+
@calc.push n.to_i
|
14
|
+
end
|
15
|
+
|
16
|
+
When /ich (\w+) drücke/ do |op|
|
17
|
+
@result = @calc.send op
|
18
|
+
end
|
19
|
+
|
20
|
+
Then /sollte das Ergebniss auf dem Bildschirm (.*) sein/ do |result|
|
21
|
+
@result.should == result.to_f
|
22
|
+
end
|
23
|
+
|
24
|
+
Then /die Ergebnissklasse sollte eine (\w*) sein/ do |class_name|
|
25
|
+
@result.class.name.should == class_name
|
26
|
+
end
|
27
|
+
|
28
|
+
Given /it should rain on (\w+)/ do |day|
|
29
|
+
@calc.rain?(day).should == true
|
30
|
+
end
|
data/examples/i18n/en/Rakefile
CHANGED
@@ -0,0 +1,17 @@
|
|
1
|
+
Sąvybė: Sudėtis
|
2
|
+
Norint išvengti kvailų klaidų
|
3
|
+
Kaip matematinis idiotas
|
4
|
+
Aš noriu, kad man pasakytų dviejų skaičių sumą
|
5
|
+
|
6
|
+
Scenarijus: dviejų skaičių sudėtis
|
7
|
+
Duota aš įvedžiau 50 į skaičiuotuvą
|
8
|
+
Ir aš įvedžiau 70 į skaičiuotuvą
|
9
|
+
Kai aš paspaudžiu "add"
|
10
|
+
Tada rezultatas ekrane turi būti 120
|
11
|
+
Ir rezultato klasė turi būti "Fixnum"
|
12
|
+
|
13
|
+
Daugiau pavyzdžių
|
14
|
+
| įvestis_1 | įvestis_2 | mygtukas | išvestis | klasė |
|
15
|
+
| 20 | 30 | add | 50 | Fixnum |
|
16
|
+
| 2 | 5 | add | 7 | Fixnum |
|
17
|
+
| 0 | 40 | add | 40 | Fixnum |
|
@@ -0,0 +1,10 @@
|
|
1
|
+
Feature: Dalyba
|
2
|
+
Norint išvengti klaidų
|
3
|
+
Kasininkai privalo mokėti skaičiuoti trupmenas
|
4
|
+
|
5
|
+
Scenarijus: Realieji skaičiai
|
6
|
+
Duota aš įvedžiau 3 į skaičiuotuvą
|
7
|
+
Ir aš įvedžiau 2 į skaičiuotuvą
|
8
|
+
Kai aš paspaudžiu "divide"
|
9
|
+
Tada rezultatas ekrane turi būti 1.5
|
10
|
+
Ir rezultato klasė turi būti "Float"
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec'
|
2
|
+
$:.unshift(File.dirname(__FILE__) + '/../../lib')
|
3
|
+
require 'calculator'
|
4
|
+
|
5
|
+
Before do
|
6
|
+
@calc = Calculator.new
|
7
|
+
end
|
8
|
+
|
9
|
+
After do
|
10
|
+
end
|
11
|
+
|
12
|
+
Given "aš įvedžiau $n į skaičiuotuvą" do |n|
|
13
|
+
@calc.push n.to_i
|
14
|
+
end
|
15
|
+
|
16
|
+
When /aš paspaudžiu "(\w+)"/ do |op|
|
17
|
+
@result = @calc.send op
|
18
|
+
end
|
19
|
+
|
20
|
+
Then /rezultatas ekrane turi būti (.*)/ do |result|
|
21
|
+
@result.should == result.to_f
|
22
|
+
end
|
23
|
+
|
24
|
+
Then /rezultato klasė turi būti "(\w*)"/ do |class_name|
|
25
|
+
@result.class.name.should == class_name
|
26
|
+
end
|
27
|
+
|
28
|
+
Given /turi lyti (\w+)/ do |day|
|
29
|
+
@calc.rain?(day).should == true
|
30
|
+
end
|
31
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'test/unit/assertions'
|
2
|
+
World do |o|
|
3
|
+
o.extend(Test::Unit::Assertions)
|
4
|
+
o
|
5
|
+
end
|
6
|
+
|
7
|
+
Given /^(\w+) = (\w+)$/ do |var, value|
|
8
|
+
instance_variable_set("@#{var}", value)
|
9
|
+
end
|
10
|
+
|
11
|
+
begin
|
12
|
+
require 'rubygems'
|
13
|
+
require 'matchy'
|
14
|
+
Then /^I can assert that (\w+) == (\w+)$/ do |var_a, var_b|
|
15
|
+
a = instance_variable_get("@#{var_a}")
|
16
|
+
b = instance_variable_get("@#{var_b}")
|
17
|
+
a.should == b
|
18
|
+
end
|
19
|
+
rescue LoadError
|
20
|
+
STDERR.puts "***** You should install matchy *****"
|
21
|
+
Then /^I can assert that (\w+) == (\w+)$/ do |var_a, var_b|
|
22
|
+
a = instance_variable_get("@#{var_a}")
|
23
|
+
b = instance_variable_get("@#{var_b}")
|
24
|
+
assert_equal(a, b)
|
25
|
+
end
|
26
|
+
end
|
data/lib/autotest/discover.rb
CHANGED
data/lib/cucumber.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
$:.unshift(File.dirname(__FILE__)) unless
|
2
2
|
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
3
|
+
|
4
|
+
require 'jcode'
|
5
|
+
require 'cucumber/platform'
|
3
6
|
require 'rubygems'
|
4
7
|
require 'treetop/runtime'
|
5
8
|
require 'treetop/ruby_extensions'
|
@@ -14,9 +17,6 @@ require 'cucumber/treetop_parser/feature_parser'
|
|
14
17
|
require 'cucumber/cli'
|
15
18
|
require 'cucumber/broadcaster'
|
16
19
|
|
17
|
-
$KCODE='u'
|
18
|
-
require 'jcode'
|
19
|
-
|
20
20
|
module Cucumber
|
21
21
|
LANGUAGE_FILE = File.expand_path(File.dirname(__FILE__) + '/cucumber/languages.yml')
|
22
22
|
|
data/lib/cucumber/cli.rb
CHANGED
@@ -22,7 +22,7 @@ module Cucumber
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
-
attr_reader :options
|
25
|
+
attr_reader :options, :paths
|
26
26
|
FORMATS = %w{pretty profile progress html autotest}
|
27
27
|
DEFAULT_FORMAT = 'pretty'
|
28
28
|
|
@@ -56,9 +56,6 @@ module Cucumber
|
|
56
56
|
@options[:require] ||= []
|
57
57
|
@options[:require] << v
|
58
58
|
end
|
59
|
-
opts.on("-l LINE", "--line LINE", "Only execute the scenario at the given line") do |v|
|
60
|
-
@options[:line] = v
|
61
|
-
end
|
62
59
|
opts.on("-s SCENARIO", "--scenario SCENARIO", "Only execute the scenario with the given name.",
|
63
60
|
"If this option is given more than once, run all",
|
64
61
|
"the specified scenarios.") do |v|
|
@@ -130,8 +127,9 @@ module Cucumber
|
|
130
127
|
if @options[:formats].empty?
|
131
128
|
@options[:formats][DEFAULT_FORMAT] = [@out_stream]
|
132
129
|
end
|
133
|
-
|
130
|
+
|
134
131
|
# Whatever is left after option parsing is the FILE arguments
|
132
|
+
args = extract_and_store_line_numbers(args)
|
135
133
|
@paths += args
|
136
134
|
end
|
137
135
|
|
@@ -164,7 +162,7 @@ Defined profiles in cucumber.yml:
|
|
164
162
|
executor.formatters = build_formatter_broadcaster(step_mother)
|
165
163
|
require_files
|
166
164
|
load_plain_text_features(features)
|
167
|
-
executor.
|
165
|
+
executor.lines_for_features = @options[:lines_for_features]
|
168
166
|
executor.scenario_names = @options[:scenario_names] if @options[:scenario_names]
|
169
167
|
executor.visit_features(features)
|
170
168
|
exit 1 if executor.failed
|
@@ -172,6 +170,18 @@ Defined profiles in cucumber.yml:
|
|
172
170
|
|
173
171
|
private
|
174
172
|
|
173
|
+
def extract_and_store_line_numbers(file_arguments)
|
174
|
+
@options[:lines_for_features] = Hash.new{|k,v| k[v] = []}
|
175
|
+
file_arguments.map do |arg|
|
176
|
+
_, file, lines = */^([\w\W]*?):([\d:]+)$/.match(arg)
|
177
|
+
unless file.nil?
|
178
|
+
@options[:lines_for_features][file] += lines.split(':').map { |line| line.to_i }
|
179
|
+
arg = file
|
180
|
+
end
|
181
|
+
arg
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
175
185
|
# Requires files - typically step files and ruby feature files.
|
176
186
|
def require_files
|
177
187
|
ARGV.clear # Shut up RSpec
|
@@ -6,6 +6,37 @@ module Cucumber
|
|
6
6
|
# Proc extension that allows a proc to be called in the context of any object.
|
7
7
|
# Also makes it possible to tack a name onto a Proc.
|
8
8
|
module CallIn
|
9
|
+
PROC_PATTERN = /[\d\w]+@(.*):(.*)>/
|
10
|
+
|
11
|
+
if Proc.new{}.to_s =~ PROC_PATTERN
|
12
|
+
def to_backtrace_line
|
13
|
+
"#{file_colon_line}:in `#{name}'"
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_comment_line
|
17
|
+
"# #{file_colon_line}"
|
18
|
+
end
|
19
|
+
|
20
|
+
def file_colon_line
|
21
|
+
path, line = *to_s.match(PROC_PATTERN)[1..2]
|
22
|
+
path = File.expand_path(path)
|
23
|
+
pwd = Dir.pwd
|
24
|
+
path = path[pwd.length+1..-1]
|
25
|
+
"#{path}:#{line}"
|
26
|
+
end
|
27
|
+
else
|
28
|
+
# This Ruby implementation doesn't implement Proc#to_s correctly
|
29
|
+
STDERR.puts "*** THIS RUBY IMPLEMENTATION DOESN'T REPORT FILE AND LINE FOR PROCS ***"
|
30
|
+
|
31
|
+
def to_backtrace_line
|
32
|
+
nil
|
33
|
+
end
|
34
|
+
|
35
|
+
def to_comment_line
|
36
|
+
""
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
9
40
|
attr_accessor :name
|
10
41
|
|
11
42
|
def call_in(obj, *args)
|
@@ -22,22 +53,6 @@ module Cucumber
|
|
22
53
|
arity == -1 ? 0 : arity
|
23
54
|
end
|
24
55
|
|
25
|
-
def to_backtrace_line
|
26
|
-
"#{file_colon_line}:in `#{name}'"
|
27
|
-
end
|
28
|
-
|
29
|
-
def to_comment_line
|
30
|
-
"# #{file_colon_line}"
|
31
|
-
end
|
32
|
-
|
33
|
-
def file_colon_line
|
34
|
-
path, line = *to_s.match(/[\d\w]+@(.*):(.*)>/)[1..2]
|
35
|
-
path = File.expand_path(path)
|
36
|
-
pwd = Dir.pwd
|
37
|
-
path = path[pwd.length+1..-1]
|
38
|
-
"#{path}:#{line}"
|
39
|
-
end
|
40
|
-
|
41
56
|
def meth
|
42
57
|
@meth ||= "__cucumber_#{object_id}"
|
43
58
|
end
|