spinach 0.0.2 → 0.0.4
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/.travis.yml +8 -0
- data/Rakefile +7 -3
- data/bin/spinach +5 -15
- data/features/feature_name_guessing.feature +10 -0
- data/features/steps/feature_name_guessing.rb +39 -0
- data/lib/spinach/capybara.rb +0 -2
- data/lib/spinach/config.rb +1 -1
- data/lib/spinach/dsl.rb +64 -29
- data/lib/spinach/exceptions.rb +28 -0
- data/lib/spinach/feature.rb +1 -1
- data/lib/spinach/parser.rb +4 -0
- data/lib/spinach/reporter/stdout.rb +75 -0
- data/lib/spinach/reporter.rb +7 -39
- data/lib/spinach/runner/feature.rb +72 -0
- data/lib/spinach/runner/scenario.rb +55 -0
- data/lib/spinach/runner.rb +58 -57
- data/lib/spinach/support.rb +19 -0
- data/lib/spinach/version.rb +1 -1
- data/lib/spinach.rb +7 -2
- data/spinach.gemspec +4 -1
- data/test/spinach/dsl_test.rb +21 -17
- data/test/spinach/feature_test.rb +41 -11
- data/test/spinach/reporter/stdout_test.rb +128 -0
- data/test/spinach/reporter_test.rb +4 -59
- data/test/spinach/runner/feature_test.rb +108 -0
- data/test/spinach/runner/scenario_test.rb +70 -0
- data/test/spinach/runner_test.rb +38 -76
- data/test/spinach/support_test.rb +33 -0
- data/test/spinach_test.rb +29 -1
- metadata +71 -19
data/.travis.yml
ADDED
data/Rakefile
CHANGED
@@ -5,8 +5,12 @@ Bundler::GemHelper.install_tasks
|
|
5
5
|
require 'rake/testtask'
|
6
6
|
Rake::TestTask.new do |t|
|
7
7
|
t.libs << "test"
|
8
|
-
t.test_files = FileList['test/**/*_test.rb']
|
9
|
-
t.
|
8
|
+
t.test_files = FileList['./test/**/*_test.rb']
|
9
|
+
# t.loader = :direct
|
10
10
|
end
|
11
11
|
|
12
|
-
task :
|
12
|
+
task :spinach do
|
13
|
+
exec "bundle exec spinach"
|
14
|
+
end
|
15
|
+
|
16
|
+
task :default => [:test, :spinach]
|
data/bin/spinach
CHANGED
@@ -6,20 +6,10 @@ rescue LoadError
|
|
6
6
|
require_relative '../lib/spinach'
|
7
7
|
end
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
9
|
+
features = if ARGV.any?
|
10
|
+
ARGV
|
11
|
+
else
|
12
|
+
Dir.glob(File.join 'features', '**', '*.feature')
|
13
13
|
end
|
14
14
|
|
15
|
-
|
16
|
-
File.expand_path File.join(Spinach.config[:support_path], '**', '*.rb')
|
17
|
-
).each do |file|
|
18
|
-
require file
|
19
|
-
end
|
20
|
-
|
21
|
-
ARGV.each do |file|
|
22
|
-
Spinach::Runner.new(
|
23
|
-
Spinach::Parser.new(file).parse
|
24
|
-
).run
|
25
|
-
end
|
15
|
+
Spinach::Runner.new(features).run
|
@@ -0,0 +1,10 @@
|
|
1
|
+
Feature: Feature name guessing
|
2
|
+
In order to be faster writing steps
|
3
|
+
As a test writer
|
4
|
+
I want the names of the features to be guessed from the feature class name
|
5
|
+
|
6
|
+
Scenario: Basic guess
|
7
|
+
Given I am writing a feature called "My cool feature"
|
8
|
+
And I write a class named "MyCoolFeature"
|
9
|
+
When I run spinach
|
10
|
+
Then I want "MyCoolFeature" class to be used to run it
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'aruba/api'
|
2
|
+
class FeatureNameGuessing < Spinach::Feature
|
3
|
+
include Aruba::Api
|
4
|
+
|
5
|
+
Given 'I am writing a feature called "My cool feature"' do
|
6
|
+
write_file('features/my_cool_feature.feature',
|
7
|
+
'Feature: My cool feature
|
8
|
+
|
9
|
+
Scenario: This is scenario is cool
|
10
|
+
When this is so meta
|
11
|
+
Then the world is crazy
|
12
|
+
')
|
13
|
+
end
|
14
|
+
|
15
|
+
And 'I write a class named "MyCoolFeature"' do
|
16
|
+
write_file('features/steps/my_cool_feature.rb',
|
17
|
+
'class MyCoolFeature < Spinach::Feature
|
18
|
+
When "this is so meta" do
|
19
|
+
end
|
20
|
+
|
21
|
+
Then "the world is crazy" do
|
22
|
+
end
|
23
|
+
end')
|
24
|
+
end
|
25
|
+
|
26
|
+
When 'I run spinach'do
|
27
|
+
run_feature 'features/my_cool_feature.feature'
|
28
|
+
end
|
29
|
+
|
30
|
+
Then 'I want "MyCoolFeature" class to be used to run it' do
|
31
|
+
all_stderr.must_be_empty
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def run_feature(command)
|
37
|
+
run "../../bin/spinach #{command}"
|
38
|
+
end
|
39
|
+
end
|
data/lib/spinach/capybara.rb
CHANGED
data/lib/spinach/config.rb
CHANGED
@@ -41,7 +41,7 @@ module Spinach
|
|
41
41
|
# output to the standard output
|
42
42
|
#
|
43
43
|
def default_reporter
|
44
|
-
@default_reporter || Spinach::Reporter::Stdout
|
44
|
+
@default_reporter || Spinach::Reporter::Stdout.new
|
45
45
|
end
|
46
46
|
|
47
47
|
# Allows you to read the config object using a hash-like syntax.
|
data/lib/spinach/dsl.rb
CHANGED
@@ -4,39 +4,74 @@ module Spinach
|
|
4
4
|
#
|
5
5
|
module DSL
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
# @param [Proc] block
|
12
|
-
# action to perform in that step
|
13
|
-
#
|
14
|
-
# @example
|
15
|
-
# class MyFeature << Spinach::Feature
|
16
|
-
# When "I go to the toilet" do
|
17
|
-
# @sittin_on_the_toilet.must_equal true
|
18
|
-
# end
|
19
|
-
# end
|
20
|
-
#
|
21
|
-
%w{When Given Then And But}.each do |connector|
|
22
|
-
define_method connector do |string, &block|
|
23
|
-
define_method("#{connector} #{string}", &block)
|
7
|
+
def self.included(base)
|
8
|
+
base.class_eval do
|
9
|
+
include InstanceMethods
|
10
|
+
extend ClassMethods
|
24
11
|
end
|
25
12
|
end
|
26
13
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
14
|
+
module ClassMethods
|
15
|
+
|
16
|
+
# Defines an action to perform given a particular step literal.
|
17
|
+
#
|
18
|
+
# @param [String] step name
|
19
|
+
# The step literal
|
20
|
+
# @param [Proc] block
|
21
|
+
# action to perform in that step
|
22
|
+
#
|
23
|
+
# @example
|
24
|
+
# class MyFeature << Spinach::Feature
|
25
|
+
# When "I go to the toilet" do
|
26
|
+
# @sittin_on_the_toilet.must_equal true
|
27
|
+
# end
|
28
|
+
# end
|
29
|
+
#
|
30
|
+
def Given(string, &block)
|
31
|
+
define_method(string, &block)
|
32
|
+
end
|
33
|
+
|
34
|
+
alias_method :When, :Given
|
35
|
+
alias_method :Then, :Given
|
36
|
+
alias_method :And, :Given
|
37
|
+
alias_method :But, :Given
|
38
|
+
|
39
|
+
# Defines this feature's name
|
40
|
+
#
|
41
|
+
# @example
|
42
|
+
# class MyFeature < Spinach::Feature
|
43
|
+
# feature "Satisfy needs"
|
44
|
+
# end
|
45
|
+
#
|
46
|
+
def feature(name)
|
47
|
+
@feature_name = name
|
48
|
+
end
|
49
|
+
|
50
|
+
# @return [String] this feature's name
|
51
|
+
#
|
52
|
+
attr_reader :feature_name
|
36
53
|
end
|
37
54
|
|
38
|
-
|
39
|
-
|
40
|
-
|
55
|
+
module InstanceMethods
|
56
|
+
|
57
|
+
# Execute a given step.
|
58
|
+
#
|
59
|
+
# @param [String] step
|
60
|
+
# the step to execute
|
61
|
+
#
|
62
|
+
def execute_step(step)
|
63
|
+
if self.respond_to?(step)
|
64
|
+
self.send(step)
|
65
|
+
else
|
66
|
+
raise Spinach::StepNotDefinedException.new(
|
67
|
+
self, step
|
68
|
+
)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def name
|
73
|
+
self.class.feature_name
|
74
|
+
end
|
75
|
+
end
|
41
76
|
end
|
42
77
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Spinach
|
2
|
+
# This class represents the feature raised when Spniach can't find a class
|
3
|
+
# for a feature.
|
4
|
+
class FeatureNotFoundException < StandardError
|
5
|
+
def initialize(options)
|
6
|
+
@not_found_class = options.first
|
7
|
+
@feature = options.last
|
8
|
+
end
|
9
|
+
|
10
|
+
def message
|
11
|
+
"Could not find class for `#{@feature}` feature. Please create a #{@not_found_class}.rb file at #{Spinach.config[:step_definitions_path]}"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# This class represents the step raised when Spinach can't find a step for a
|
16
|
+
# Scenario.
|
17
|
+
#
|
18
|
+
class StepNotDefinedException < StandardError
|
19
|
+
|
20
|
+
attr_reader :feature, :step
|
21
|
+
|
22
|
+
def initialize(feature, step)
|
23
|
+
@feature = feature
|
24
|
+
@step = step
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
data/lib/spinach/feature.rb
CHANGED
data/lib/spinach/parser.rb
CHANGED
@@ -0,0 +1,75 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Spinach
|
4
|
+
class Reporter
|
5
|
+
# The Stdout reporter outputs the runner results to the standard output
|
6
|
+
#
|
7
|
+
class Stdout < Reporter
|
8
|
+
|
9
|
+
# Prints the feature name to the standard output
|
10
|
+
#
|
11
|
+
def feature(name)
|
12
|
+
puts "\nFeature: #{name}".white.underline
|
13
|
+
end
|
14
|
+
|
15
|
+
# Prints the scenario name to the standard ouput
|
16
|
+
#
|
17
|
+
def scenario(name)
|
18
|
+
puts "\n Scenario: #{name}".white
|
19
|
+
end
|
20
|
+
|
21
|
+
# Prints the step name to the standard output. If failed, it puts an
|
22
|
+
# F! before
|
23
|
+
#
|
24
|
+
def step(keyword, name, result)
|
25
|
+
case result
|
26
|
+
when :success
|
27
|
+
puts " ✔ #{keyword} #{name}".green
|
28
|
+
when :undefined_step
|
29
|
+
puts " ? #{keyword} #{name}".yellow
|
30
|
+
when :failure
|
31
|
+
puts " ✘ #{keyword} #{name}".red
|
32
|
+
when :error
|
33
|
+
puts " ! #{keyword} #{name}".red
|
34
|
+
when :skip
|
35
|
+
puts " ~ #{keyword} #{name}".cyan
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# Prints a blank line at the end
|
40
|
+
#
|
41
|
+
def end
|
42
|
+
puts ""
|
43
|
+
end
|
44
|
+
|
45
|
+
def error_summary(errors)
|
46
|
+
puts
|
47
|
+
puts " #{"Error summary".underline}"
|
48
|
+
puts
|
49
|
+
errors.each do |error, step, line, scenario|
|
50
|
+
step_file = error.backtrace.detect do |f|
|
51
|
+
f =~ /<class:#{scenario.feature.class}>/
|
52
|
+
end
|
53
|
+
step_file = step_file.split(':')[0..1].join(':') if step_file
|
54
|
+
|
55
|
+
puts
|
56
|
+
puts " #{scenario.feature_name.light_white} :: #{scenario.name.light_blue} :: #{step.light_green} (line #{line})"
|
57
|
+
puts " #{step_file}" if step_file
|
58
|
+
puts
|
59
|
+
puts " * #{error.message}".red
|
60
|
+
puts error.backtrace.map {|e| " #{e}"}
|
61
|
+
puts
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def report_exception(exception)
|
66
|
+
@errors << exception
|
67
|
+
output = exception.message.split("\n").map{ |line|
|
68
|
+
" #{line}"
|
69
|
+
}.join("\n")
|
70
|
+
puts "#{output}\n\n"
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
data/lib/spinach/reporter.rb
CHANGED
@@ -6,6 +6,10 @@ module Spinach
|
|
6
6
|
# results
|
7
7
|
#
|
8
8
|
class Reporter
|
9
|
+
# Initialize a reporter with an empty error container.
|
10
|
+
def initialize
|
11
|
+
@errors = []
|
12
|
+
end
|
9
13
|
|
10
14
|
# Receives this hook when a feature is invoked
|
11
15
|
# @param [String] name
|
@@ -29,7 +33,7 @@ module Spinach
|
|
29
33
|
# @param [Symbol] result
|
30
34
|
# the step name and its finishing state. May be :success or :failure
|
31
35
|
#
|
32
|
-
def step(name, result)
|
36
|
+
def step(keyword, name, result)
|
33
37
|
raise "Abstract method!"
|
34
38
|
end
|
35
39
|
|
@@ -39,43 +43,7 @@ module Spinach
|
|
39
43
|
raise "Abstract method!"
|
40
44
|
end
|
41
45
|
|
42
|
-
# The Stdout reporter outputs the runner results to the standard output
|
43
|
-
#
|
44
|
-
class Stdout < Reporter
|
45
|
-
|
46
|
-
# Prints the feature name to the standard output
|
47
|
-
#
|
48
|
-
def feature(name)
|
49
|
-
puts "\nFeature: #{name}".white.underline
|
50
|
-
end
|
51
|
-
|
52
|
-
# Prints the scenario name to the standard ouput
|
53
|
-
#
|
54
|
-
def scenario(name)
|
55
|
-
puts " Scenario: #{name}".white
|
56
|
-
end
|
57
|
-
|
58
|
-
# Prints the step name to the standard output. If failed, it puts an
|
59
|
-
# F! before
|
60
|
-
#
|
61
|
-
def step(name, result)
|
62
|
-
words = name.split(" ")
|
63
|
-
connector = words.shift
|
64
|
-
phrase = words.join(" ")
|
65
|
-
if result == :success
|
66
|
-
puts " ✔ #{connector} #{phrase}".green
|
67
|
-
elsif result == :failure
|
68
|
-
puts " ✘ #{connector} #{phrase}".red
|
69
|
-
elsif result == :skip
|
70
|
-
puts " ~ #{connector} #{phrase}".yellow
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
# Prints a blank line at the end
|
75
|
-
#
|
76
|
-
def end
|
77
|
-
puts ""
|
78
|
-
end
|
79
|
-
end
|
80
46
|
end
|
81
47
|
end
|
48
|
+
|
49
|
+
require_relative 'reporter/stdout'
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module Spinach
|
2
|
+
class Runner
|
3
|
+
# A feature runner handles a particular Spinach::Feature run.
|
4
|
+
#
|
5
|
+
class Feature
|
6
|
+
|
7
|
+
# @param [String] filename
|
8
|
+
# path to the feature file. Scenario line could be passed to run just
|
9
|
+
# that scenario.
|
10
|
+
# @example feature/a_cool_feature.feature:12
|
11
|
+
#
|
12
|
+
# @param [Spinach::Reporter] reporter
|
13
|
+
# the reporter that will log this run
|
14
|
+
#
|
15
|
+
def initialize(filename, reporter)
|
16
|
+
@filename, @scenario_line = filename.split(':')
|
17
|
+
@reporter = reporter
|
18
|
+
end
|
19
|
+
|
20
|
+
attr_reader :reporter
|
21
|
+
attr_reader :filename
|
22
|
+
|
23
|
+
# @return [Spinach::Feature]
|
24
|
+
# the feature towards which this scenario will be run
|
25
|
+
#
|
26
|
+
def feature
|
27
|
+
@feature ||= Spinach.find_feature(feature_name).new
|
28
|
+
end
|
29
|
+
|
30
|
+
# @return [Hash]
|
31
|
+
# the parsed data for this feature
|
32
|
+
#
|
33
|
+
def data
|
34
|
+
@data ||= Spinach::Parser.new(filename).parse
|
35
|
+
end
|
36
|
+
|
37
|
+
# @return [String]
|
38
|
+
# this feature's name
|
39
|
+
#
|
40
|
+
def feature_name
|
41
|
+
@feature_name ||= data['name']
|
42
|
+
end
|
43
|
+
|
44
|
+
# @return [Hash]
|
45
|
+
# the parsed scenarios for this runner's feature
|
46
|
+
#
|
47
|
+
def scenarios
|
48
|
+
@scenarios ||= data['elements']
|
49
|
+
end
|
50
|
+
|
51
|
+
# Runs this feature
|
52
|
+
#
|
53
|
+
def run
|
54
|
+
reporter.feature(feature_name)
|
55
|
+
failures = []
|
56
|
+
scenarios.each do |scenario|
|
57
|
+
if !@scenario_line || scenario['line'].to_s == @scenario_line
|
58
|
+
feature.send(:before)
|
59
|
+
failure = Scenario.new(feature_name, feature, scenario, reporter).run
|
60
|
+
failures << failure if failure
|
61
|
+
feature.send(:after)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
unless failures.length.zero?
|
66
|
+
reporter.error_summary(failures)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Spinach
|
2
|
+
class Runner
|
3
|
+
# A Scenario Runner handles a particular scenario run.
|
4
|
+
#
|
5
|
+
class Scenario
|
6
|
+
attr_reader :name, :feature, :feature_name, :steps, :reporter
|
7
|
+
|
8
|
+
# @param [Spinach::Feature] feature
|
9
|
+
# the feature that contains the steps
|
10
|
+
#
|
11
|
+
# @param [Hash] data
|
12
|
+
# the parsed feature data
|
13
|
+
#
|
14
|
+
# @param [Spinach::Reporter]
|
15
|
+
# the reporter
|
16
|
+
#
|
17
|
+
def initialize(feature_name, feature, data, reporter)
|
18
|
+
@feature_name = feature_name
|
19
|
+
@name = data['name']
|
20
|
+
@steps = data['steps']
|
21
|
+
@reporter = reporter
|
22
|
+
@feature = feature
|
23
|
+
end
|
24
|
+
|
25
|
+
# Runs this scenario and signals the reporter
|
26
|
+
#
|
27
|
+
def run
|
28
|
+
reporter.scenario(name)
|
29
|
+
steps.each do |step|
|
30
|
+
keyword = step['keyword'].strip
|
31
|
+
name = step['name'].strip
|
32
|
+
line = step['line']
|
33
|
+
unless @failure
|
34
|
+
begin
|
35
|
+
feature.execute_step(name)
|
36
|
+
reporter.step(keyword, name, :success)
|
37
|
+
rescue MiniTest::Assertion => e
|
38
|
+
@failure = [e, name, line, self]
|
39
|
+
reporter.step(keyword, name, :failure)
|
40
|
+
rescue Spinach::StepNotDefinedException => e
|
41
|
+
@failure = [e, name, line, self]
|
42
|
+
reporter.step(keyword, name, :undefined_step)
|
43
|
+
rescue StandardError => e
|
44
|
+
@failure = [e, name, line, self]
|
45
|
+
reporter.step(keyword, name, :error)
|
46
|
+
end
|
47
|
+
else
|
48
|
+
reporter.step(keyword, name, :skip)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
@failure
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/lib/spinach/runner.rb
CHANGED
@@ -3,84 +3,85 @@ module Spinach
|
|
3
3
|
# actual calls to the feature classes.
|
4
4
|
#
|
5
5
|
class Runner
|
6
|
+
|
6
7
|
# Initializes the runner with a parsed feature
|
7
|
-
# @param [Hash] data
|
8
|
-
# the parsed feature data
|
9
8
|
#
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
9
|
+
# @param [Array<String>] filenames
|
10
|
+
# an array of feature filenames to run
|
11
|
+
#
|
12
|
+
# @param [Hash] options
|
13
|
+
#
|
14
|
+
# @option options [String] :step_definitions_path
|
15
|
+
# The path in which step definitions are found
|
16
|
+
#
|
17
|
+
# @option options [String] :support_path
|
18
|
+
# The path with the support ruby files
|
19
|
+
#
|
20
|
+
def initialize(filenames, options = {})
|
21
|
+
@filenames = filenames
|
15
22
|
|
16
|
-
|
17
|
-
|
23
|
+
@step_definitions_path = options.delete(:step_definitions_path ) ||
|
24
|
+
Spinach.config.step_definitions_path
|
25
|
+
|
26
|
+
@support_path = options.delete(:support_path ) ||
|
27
|
+
Spinach.config.support_path
|
18
28
|
|
19
|
-
# Returns the feature class for the provided feature data
|
20
|
-
# @return [Spinach::Feature] feature
|
21
|
-
# this runner's feature
|
22
|
-
#
|
23
|
-
def feature
|
24
|
-
@feature ||= Spinach.find_feature(@feature_name)
|
25
29
|
end
|
26
30
|
|
27
|
-
|
28
|
-
|
29
|
-
#
|
30
|
-
def scenarios
|
31
|
-
@scenarios
|
31
|
+
def reporter
|
32
|
+
@reporter ||= Spinach::config.default_reporter
|
32
33
|
end
|
33
34
|
|
35
|
+
attr_reader :filenames
|
36
|
+
|
37
|
+
# The default path where the steps are located
|
38
|
+
attr_reader :step_definitions_path
|
39
|
+
|
40
|
+
# The default path where the support files are located
|
41
|
+
attr_reader :support_path
|
42
|
+
|
34
43
|
# Runs this runner and outputs the results in a colorful manner.
|
35
44
|
#
|
36
45
|
def run
|
37
|
-
|
38
|
-
reports = []
|
39
|
-
|
40
|
-
reporter.feature(@feature_name)
|
46
|
+
require_dependencies
|
41
47
|
|
42
|
-
|
43
|
-
|
48
|
+
filenames.each do |filename|
|
49
|
+
Feature.new(filename, reporter).run
|
44
50
|
end
|
45
51
|
reporter.end
|
46
52
|
|
47
53
|
end
|
48
54
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
@steps = data['steps']
|
55
|
-
@runner = runner
|
55
|
+
# Requires step definitions and support files
|
56
|
+
#
|
57
|
+
def require_dependencies
|
58
|
+
(support_files + step_definition_files).each do |file|
|
59
|
+
require file
|
56
60
|
end
|
61
|
+
end
|
57
62
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
+
# List of step definition files
|
64
|
+
#
|
65
|
+
# @return [Array<String>] files
|
66
|
+
#
|
67
|
+
def step_definition_files
|
68
|
+
Dir.glob(
|
69
|
+
File.expand_path File.join(step_definitions_path, '**', '*.rb')
|
70
|
+
)
|
71
|
+
end
|
63
72
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
reporter.step(step_name, :success)
|
73
|
-
rescue MiniTest::Assertion=>e
|
74
|
-
reporter.step(step_name, :failure)
|
75
|
-
@failed = true
|
76
|
-
end
|
77
|
-
else
|
78
|
-
reporter.step(step_name, :skip)
|
79
|
-
end
|
80
|
-
end
|
81
|
-
feature.send(:after)
|
82
|
-
end
|
73
|
+
# List of support files
|
74
|
+
#
|
75
|
+
# @return [Array<String>] files
|
76
|
+
#
|
77
|
+
def support_files
|
78
|
+
Dir.glob(
|
79
|
+
File.expand_path File.join(support_path, '**', '*.rb')
|
80
|
+
)
|
83
81
|
end
|
84
82
|
|
85
83
|
end
|
86
84
|
end
|
85
|
+
|
86
|
+
require_relative 'runner/feature'
|
87
|
+
require_relative 'runner/scenario'
|