cucumber_analytics 0.0.1

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.
Files changed (42) hide show
  1. data/.gitignore +17 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE +22 -0
  4. data/README.rdoc +76 -0
  5. data/Rakefile +2 -0
  6. data/cucumber_analytics.gemspec +22 -0
  7. data/features/analysis/feature_collection.feature +39 -0
  8. data/features/analysis/feature_file_collection.feature +36 -0
  9. data/features/analysis/step_collection.feature +137 -0
  10. data/features/analysis/tag_collection.feature +91 -0
  11. data/features/analysis/test_collection.feature +69 -0
  12. data/features/analysis/test_comparison.feature +123 -0
  13. data/features/modeling/background_modeling.feature +147 -0
  14. data/features/modeling/directory_modeling.feature +86 -0
  15. data/features/modeling/feature_file_modeling.feature +37 -0
  16. data/features/modeling/feature_modeling.feature +163 -0
  17. data/features/modeling/outline_modeling.feature +186 -0
  18. data/features/modeling/scenario_modeling.feature +154 -0
  19. data/features/step_definitions/background_steps.rb +55 -0
  20. data/features/step_definitions/directory_steps.rb +20 -0
  21. data/features/step_definitions/feature_steps.rb +62 -0
  22. data/features/step_definitions/file_steps.rb +18 -0
  23. data/features/step_definitions/outline_steps.rb +26 -0
  24. data/features/step_definitions/setup_steps.rb +50 -0
  25. data/features/step_definitions/test_steps.rb +82 -0
  26. data/features/step_definitions/world_steps.rb +158 -0
  27. data/features/support/env.rb +29 -0
  28. data/features/support/transforms.rb +3 -0
  29. data/lib/cucumber_analytics/feature_element.rb +54 -0
  30. data/lib/cucumber_analytics/outline_example.rb +31 -0
  31. data/lib/cucumber_analytics/parsed_background.rb +23 -0
  32. data/lib/cucumber_analytics/parsed_directory.rb +56 -0
  33. data/lib/cucumber_analytics/parsed_feature.rb +70 -0
  34. data/lib/cucumber_analytics/parsed_file.rb +140 -0
  35. data/lib/cucumber_analytics/parsed_scenario.rb +29 -0
  36. data/lib/cucumber_analytics/parsed_scenario_outline.rb +57 -0
  37. data/lib/cucumber_analytics/step.rb +81 -0
  38. data/lib/cucumber_analytics/test_element.rb +93 -0
  39. data/lib/cucumber_analytics/version.rb +3 -0
  40. data/lib/cucumber_analytics/world.rb +182 -0
  41. data/lib/cucumber_analytics.rb +12 -0
  42. metadata +174 -0
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in cucumber-analytics.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Eric Kessler
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,76 @@
1
+ = CucumberAnalytics
2
+
3
+ The intention of this gem is to provide a useful mechanism by which to answer
4
+ all of the burning questions that one might have about their Cucumber test base.
5
+
6
+ * Did old features get removed and leave dead step definitions behind? Or
7
+ perhaps the other way around and half of the steps in the code base are
8
+ undefined?
9
+
10
+ * Are there duplicate scenarios strewn about everywhere that only differ in
11
+ their step arguments and could be reduced into a single outline?
12
+
13
+ * Just how many different tags *are* there in this thing?
14
+
15
+ These are the kinds of questions that this gem aims to make answering easy,
16
+ either through directly providing the answer or by providing sufficient tools
17
+ that determining the answer yourself is just a few straightforward object
18
+ manipulations away.
19
+
20
+ == Installation
21
+
22
+ Add this line to your application's Gemfile:
23
+
24
+ gem 'cucumber_analytics'
25
+
26
+ And then execute:
27
+
28
+ $ bundle
29
+
30
+ Or install it yourself as:
31
+
32
+ $ gem install cucumber_analytics
33
+
34
+ == Usage
35
+
36
+ First things first. Load up the gem code.
37
+
38
+ require 'cucumber_analytics'
39
+
40
+ Next, let's generate a model for our Cucumber suite.
41
+
42
+ directory = CucumberAnalytics::ParsedDirectory.new('path/to/the/code_directory')
43
+ world = CucumberAnalytics::World
44
+
45
+ Now it's time to take a look around and see what we can see.
46
+
47
+ all_tags = world.tags_in(directory)
48
+ puts all_tags
49
+ #=> ["@Unit", "@Fragile", "@wip", "@wip", "@Critical", "@Unit", "@wip", "@Deprecated", "@wip", "@wip"]
50
+
51
+ puts all_tags.uniq
52
+ #=> ["@Unit", "@Fragile", "@wip", "@Critical", "@Deprecated"]
53
+
54
+ wip_tags = all_tags.select{ |tag| tag == '@wip' }
55
+
56
+ puts wip_tags.count.to_f / all_tags.count
57
+ #=> 0.5
58
+
59
+
60
+ all_steps = world.steps_in(directory)
61
+ puts all_steps.collect{ |step| step.step_text(with_keywords: false)}
62
+ #=> ["some step", "the user logs in", "the user will log in", "another step", "the user "Bob" logs in"]
63
+
64
+ So with a few simple commands we have discovered that there are five different
65
+ tags in our codebase and that @wip tags account for half of all usages. We have
66
+ also discovered that our team is creating several redundant steps that could be
67
+ rewritten into a single, reusable step.
68
+
69
+
70
+ == Contributing
71
+
72
+ 1. Fork it
73
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
74
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
75
+ 4. Push to the branch (`git push origin my-new-feature`)
76
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/cucumber_analytics/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Eric Kessler"]
6
+ gem.email = ["morrow748@gmail.com"]
7
+ gem.description = %q{Static analysis of Cucumber tests made easy.}
8
+ gem.summary = %q{This gem provides an API to programmatically break down Cucumber feature files so that they can be inspected and analyzed in a straightforward manner.}
9
+ gem.homepage = "https://github.com/enkessler/cucumber_analytics"
10
+
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = "cucumber_analytics"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = CucumberAnalytics::VERSION
17
+
18
+ gem.add_development_dependency("rake")
19
+ gem.add_development_dependency("cucumber")
20
+ gem.add_development_dependency("wrong")
21
+ gem.add_development_dependency("simplecov")
22
+ end
@@ -0,0 +1,39 @@
1
+ Feature: Features can be collected from arbitrary parts of the codebase.
2
+
3
+
4
+ Acceptance criteria
5
+
6
+ Features can be collected from:
7
+ 1. files
8
+ 2. directories
9
+
10
+
11
+ Background: Setup test codebase
12
+ Given a directory "feature_directory"
13
+ And the following feature file "test_file_1.feature":
14
+ """
15
+ Feature: The test feature 1.
16
+ """
17
+ And the file "test_file_1.feature" is read
18
+ And a directory "feature_directory/nested_directory"
19
+ And the following feature file "test_file_2.feature":
20
+ """
21
+ Feature: The test feature 2.
22
+ """
23
+ And the file "test_file_2.feature" is read
24
+ When the directory "feature_directory" is read
25
+ And the directory "feature_directory/nested_directory" is read
26
+
27
+
28
+ Scenario: Features can be collected from files
29
+ Then the features collected from file "1" are as follows:
30
+ | The test feature 1. |
31
+ Then the features collected from file "2" are as follows:
32
+ | The test feature 2. |
33
+
34
+ Scenario: Features can be collected from directories
35
+ Then the features collected from directory "1" are as follows:
36
+ | The test feature 1. |
37
+ | The test feature 2. |
38
+ And the features collected from directory "2" are as follows:
39
+ | The test feature 2. |
@@ -0,0 +1,36 @@
1
+ Feature: Feature files can be collected from arbitrary parts of the codebase.
2
+
3
+
4
+ Acceptance criteria
5
+
6
+ Feature files can be collected from:
7
+ 1. directories
8
+
9
+
10
+ Background: Setup test codebase
11
+ Given a directory "feature_directory"
12
+ And a directory "feature_directory/nested_directory_1"
13
+ And the following feature file "test_file_1.feature":
14
+ """
15
+ Feature: The test feature 1.
16
+ """
17
+ And the file "test_file_1.feature" is read
18
+ And a directory "feature_directory/nested_directory_2"
19
+ And the following feature file "test_file_2.feature":
20
+ """
21
+ Feature: The test feature 2.
22
+ """
23
+ And the file "test_file_2.feature" is read
24
+ When the directory "feature_directory" is read
25
+ And the directory "feature_directory/nested_directory_1" is read
26
+ And the directory "feature_directory/nested_directory_2" is read
27
+
28
+
29
+ Scenario: Feature files can be collected from directories
30
+ Then the files collected from directory "1" are as follows:
31
+ | test_file_1.feature |
32
+ | test_file_2.feature |
33
+ And the files collected from directory "2" are as follows:
34
+ | test_file_1.feature |
35
+ And the files collected from directory "3" are as follows:
36
+ | test_file_2.feature |
@@ -0,0 +1,137 @@
1
+ Feature: Steps can be collected from arbitrary parts of the codebase.
2
+
3
+
4
+ Acceptance criteria
5
+
6
+ Steps (both defined and undefined) can be collected from:
7
+ 1. backgrounds
8
+ 2. scenarios
9
+ 3. outlines
10
+ 4. features
11
+ 5. files
12
+ 6. directories
13
+
14
+
15
+ Background: Setup test directories
16
+ Given a directory "feature_directory"
17
+ And the following feature file "test_file_1.feature":
18
+ """
19
+ Feature: The test feature 1.
20
+
21
+ Background: Some general test setup stuff.
22
+ Given a defined step
23
+ And an undefined step
24
+
25
+ Scenario: The scenario's name.
26
+ Given another defined step
27
+ Then another undefined step
28
+ """
29
+ And the file "test_file_1.feature" is read
30
+ And a directory "feature_directory/nested_directory"
31
+ And the following feature file "test_file_2.feature":
32
+ """
33
+ Feature: The test feature 2.
34
+
35
+ Scenario Outline: The scenario outline's name.
36
+ Given a defined step
37
+ When another defined step
38
+ Then *<this>* *step is* *<undefined>*
39
+ Examples:
40
+ | this | undefined |
41
+ | x | y |
42
+ Examples:
43
+ | this | undefined |
44
+ | a | b |
45
+ """
46
+ And the file "test_file_2.feature" is read
47
+ And the following step definition file "some_step_defs.rb":
48
+ """
49
+ Given /^a defined step$/ do
50
+ pending
51
+ end
52
+ """
53
+ And the following step definition file "more_step_defs.rb":
54
+ """
55
+ Given /^another defined step$/ do
56
+ pending
57
+ end
58
+ """
59
+ When the step definition file "some_step_defs.rb" is read
60
+ And the step definition file "more_step_defs.rb" is read
61
+ And the directory "feature_directory" is read
62
+
63
+
64
+
65
+ Scenario: Steps can be collected from backgrounds
66
+ Then the steps collected from feature "1" background are as follows:
67
+ | Given a defined step |
68
+ | And an undefined step |
69
+ And the "defined" steps collected from feature "1" background are as follows:
70
+ | Given a defined step |
71
+ And the "undefined" steps collected from feature "1" background are as follows:
72
+ | And an undefined step |
73
+
74
+ Scenario: Steps can be collected from scenarios
75
+ Then the steps collected from feature "1" test "1" are as follows:
76
+ | Given another defined step |
77
+ | Then another undefined step |
78
+ And the "defined" steps collected from feature "1" test "1" are as follows:
79
+ | Given another defined step |
80
+ And the "undefined" steps collected from feature "1" test "1" are as follows:
81
+ | Then another undefined step |
82
+
83
+ Scenario: Steps can be collected from scenario outlines
84
+ Then the steps collected from feature "2" test "1" are as follows:
85
+ | Given a defined step |
86
+ | When another defined step |
87
+ | Then *<this>* *step is* *<undefined>* |
88
+ And the "defined" steps collected from feature "2" test "1" are as follows:
89
+ | Given a defined step |
90
+ | When another defined step |
91
+ And the "undefined" steps collected from feature "2" test "1" are as follows:
92
+ | Then *<this>* *step is* *<undefined>* |
93
+
94
+ Scenario: Steps can be collected from features
95
+ Then the steps collected from feature "1" are as follows:
96
+ | Given a defined step |
97
+ | And an undefined step |
98
+ | Given another defined step |
99
+ | Then another undefined step |
100
+ And the "defined" steps collected from feature "1" are as follows:
101
+ | Given a defined step |
102
+ | Given another defined step |
103
+ And the "undefined" steps collected from feature "1" are as follows:
104
+ | And an undefined step |
105
+ | Then another undefined step |
106
+
107
+ Scenario: Steps can be collected from files
108
+ Then the steps collected from file "1" are as follows:
109
+ | Given a defined step |
110
+ | And an undefined step |
111
+ | Given another defined step |
112
+ | Then another undefined step |
113
+ And the "defined" steps collected from file "1" are as follows:
114
+ | Given a defined step |
115
+ | Given another defined step |
116
+ And the "undefined" steps collected from file "1" are as follows:
117
+ | And an undefined step |
118
+ | Then another undefined step |
119
+
120
+ Scenario: Steps can be collected from directories
121
+ Then the steps collected from the directory are as follows:
122
+ | Given a defined step |
123
+ | And an undefined step |
124
+ | Given another defined step |
125
+ | Then another undefined step |
126
+ | Given a defined step |
127
+ | When another defined step |
128
+ | Then *<this>* *step is* *<undefined>* |
129
+ And the "defined" steps collected from the directory are as follows:
130
+ | Given a defined step |
131
+ | Given another defined step |
132
+ | Given a defined step |
133
+ | When another defined step |
134
+ And the "undefined" steps collected from the directory are as follows:
135
+ | And an undefined step |
136
+ | Then another undefined step |
137
+ | Then *<this>* *step is* *<undefined>* |
@@ -0,0 +1,91 @@
1
+ Feature: Tags can be collected from arbitrary parts of the codebase.
2
+
3
+
4
+ Acceptance criteria
5
+
6
+ Tags can be collected from:
7
+ 1. scenarios
8
+ 2. outlines
9
+ 3. features
10
+ 4. files
11
+ 5. directories
12
+
13
+
14
+ Background: Setup test codebase
15
+ Given a directory "feature_directory"
16
+ And the following feature file "test_file_1.feature":
17
+ """
18
+ @feature_tag_1
19
+ Feature: The test feature 1.
20
+
21
+ @scenario_tag_1
22
+ Scenario: The first scenario's name.
23
+ Given the first step
24
+ When the second step
25
+ Then the third step
26
+
27
+ @outline_tag_1
28
+ Scenario Outline: The scenario outline's name.
29
+ Given the first "<param1>"
30
+ When the second "<param2>"
31
+ Then the third step
32
+ @example_tag_1
33
+ Examples: text describing the significance of the examples
34
+ | param1 | param2 |
35
+ | x | y |
36
+ @example_tag_2
37
+ Examples: some examples with different significance and a tag
38
+ | param1 | param2 |
39
+ | a | b |
40
+ """
41
+ And the file "test_file_1.feature" is read
42
+ And a directory "feature_directory/nested_directory"
43
+ And the following feature file "test_file_2.feature":
44
+ """
45
+ @feature_tag_2
46
+ Feature: The test feature 2.
47
+
48
+ @scenario_tag_2
49
+ Scenario: The first scenario's name.
50
+ Given the first step
51
+ When the second step
52
+ Then the third step
53
+ """
54
+ And the file "test_file_2.feature" is read
55
+ When the directory "feature_directory" is read
56
+
57
+ Scenario: Tags can be collected from scenarios
58
+ Then the tags collected from feature "1" test "1" are as follows:
59
+ | @scenario_tag_1 |
60
+
61
+ Scenario: Tags can be collected from scenario outlines
62
+ Then the tags collected from feature "1" test "2" are as follows:
63
+ | @outline_tag_1 |
64
+ | @example_tag_1 |
65
+ | @example_tag_2 |
66
+
67
+ Scenario: Tags can be collected from features
68
+ Then the tags collected from feature "1" are as follows:
69
+ | @feature_tag_1 |
70
+ | @scenario_tag_1 |
71
+ | @outline_tag_1 |
72
+ | @example_tag_1 |
73
+ | @example_tag_2 |
74
+
75
+ Scenario: Tags can be collected from files
76
+ Then the tags collected from file "1" are as follows:
77
+ | @feature_tag_1 |
78
+ | @scenario_tag_1 |
79
+ | @outline_tag_1 |
80
+ | @example_tag_1 |
81
+ | @example_tag_2 |
82
+
83
+ Scenario: Tags can be collected from directories
84
+ Then the tags collected from directory are as follows:
85
+ | @feature_tag_1 |
86
+ | @scenario_tag_1 |
87
+ | @outline_tag_1 |
88
+ | @example_tag_1 |
89
+ | @example_tag_2 |
90
+ | @feature_tag_2 |
91
+ | @scenario_tag_2 |
@@ -0,0 +1,69 @@
1
+ Feature: Tests can be collected from arbitrary parts of the codebase.
2
+
3
+
4
+ Acceptance criteria
5
+
6
+ Tests can be collected from:
7
+ 1. features
8
+ 2. files
9
+ 3. directories
10
+
11
+
12
+ Background: Setup test codebase
13
+ Given a directory "feature_directory"
14
+ And the following feature file "test_file_1.feature":
15
+ """
16
+ Feature: The test feature 1.
17
+
18
+ Scenario: Test 1
19
+ Given the first step
20
+ When the second step
21
+ Then the third step
22
+
23
+ Scenario Outline: Test 2
24
+ Given the first "<param1>"
25
+ When the second "<param2>"
26
+ Then the third step
27
+ Examples: text describing the significance of the examples
28
+ | param1 | param2 |
29
+ | x | y |
30
+ Examples: some examples with different significance and a tag
31
+ | param1 | param2 |
32
+ | a | b |
33
+ """
34
+ And the file "test_file_1.feature" is read
35
+ And a directory "feature_directory/nested_directory"
36
+ And the following feature file "test_file_2.feature":
37
+ """
38
+ Feature: The test feature 2.
39
+
40
+ Scenario: Test 3
41
+ Given the first step
42
+ When the second step
43
+ Then the third step
44
+ """
45
+ And the file "test_file_2.feature" is read
46
+ When the directory "feature_directory" is read
47
+ And the directory "feature_directory/nested_directory" is read
48
+
49
+ Scenario: Tests can be collected from features
50
+ Then the tests collected from feature "1" are as follows:
51
+ | Test 1 |
52
+ | Test 2 |
53
+ Then the tests collected from feature "2" are as follows:
54
+ | Test 3 |
55
+
56
+ Scenario: Tests can be collected from files
57
+ Then the tests collected from file "1" are as follows:
58
+ | Test 1 |
59
+ | Test 2 |
60
+ Then the tests collected from file "2" are as follows:
61
+ | Test 3 |
62
+
63
+ Scenario: Tests can be collected from directories
64
+ Then the tests collected from directory "1" are as follows:
65
+ | Test 1 |
66
+ | Test 2 |
67
+ | Test 3 |
68
+ And the tests collected from directory "2" are as follows:
69
+ | Test 3 |
@@ -0,0 +1,123 @@
1
+ Feature: Test equality can be determined.
2
+
3
+
4
+ Acceptance criteria
5
+
6
+ Tests can be compared for equality.
7
+ 1. tests whose steps are the same except for arguments and keywords (i.e.
8
+ they match the same step definition) are equal
9
+
10
+
11
+ Background: Test file setup.
12
+ Given the following feature file:
13
+ """
14
+ Feature: A feature with duplicate tests.
15
+
16
+ Scenario: A test
17
+ Given this *parameterized* step takes a table:
18
+ | data 1 |
19
+ | data 2 |
20
+ And some setup step
21
+ When a step with a *parameter*
22
+ And a big step:
23
+ \"\"\"
24
+ little doc block
25
+ \"\"\"
26
+ Then *lots* *of* *parameters*
27
+
28
+ Scenario: Same test, different arguments and keywords
29
+ Given this *similarly parameterized* step takes a table:
30
+ | data 3 |
31
+ | data 4 |
32
+ Given some setup step
33
+ When a step with a *parameter*
34
+ * a big step:
35
+ \"\"\"
36
+ A little
37
+ bigger doc block
38
+ \"\"\"
39
+ Then *lots* *of* *parameters*
40
+
41
+ Scenario Outline: This is the same test as an outline
42
+ Given this *parameterized* step takes a table:
43
+ | <param1> |
44
+ | <param2> |
45
+ And some setup step
46
+ When a step with a *parameter*
47
+ And a big step:
48
+ \"\"\"
49
+ little doc block
50
+ \"\"\"
51
+ Then *lots* *of* *parameters*
52
+ Examples:
53
+ | param1 | param2 |
54
+ | x | y |
55
+ Examples:
56
+ | param1 | param2 |
57
+ | a | b |
58
+
59
+ Scenario Outline: Same outline, different arguments and keywords
60
+ Given this *similarly parameterized* step takes a table:
61
+ | <param3> |
62
+ | <param4> |
63
+ Given some setup step
64
+ When a step with a *slightly different parameter*
65
+ * a big step:
66
+ \"\"\"
67
+ A little
68
+ bigger doc block
69
+ \"\"\"
70
+ Then *lots* *of effectively the same* *parameters*
71
+ Examples:
72
+ | param1 | param2 |
73
+ | h | k |
74
+ Examples:
75
+ | param1 | param2 |
76
+ | i | j |
77
+
78
+ Scenario: A different test
79
+ Given this *parameterized* step takes a table:
80
+ | data 1 |
81
+ | data 2 |
82
+ And not the same setup step as before
83
+ When a step with a *parameter*
84
+ And a big step:
85
+ \"\"\"
86
+ little doc block
87
+ \"\"\"
88
+ Then *lots* *of* *parameters*
89
+
90
+ Scenario Outline: This is the same different test as an outline
91
+ Given this *similarly parameterized* step takes a table:
92
+ | <param1> |
93
+ | <param2> |
94
+ And not the same setup step as before
95
+ When a step with a *slightly different parameter*
96
+ And a big step:
97
+ \"\"\"
98
+ A little
99
+ bigger doc block
100
+ \"\"\"
101
+ Then *lots* *of effectively the same* *parameters*
102
+ Examples:
103
+ | param1 | param2 |
104
+ | x | y |
105
+ Examples:
106
+ | param1 | param2 |
107
+ | a | b |
108
+ """
109
+ And parameter delimiters of "*" and "*"
110
+ When the file is read
111
+
112
+
113
+ Scenario: Scenario to Scenario comparison
114
+ Then test "1" is equal to test "2"
115
+ And test "1" is not equal to test "5"
116
+
117
+ Scenario: Outline to Outline comparison
118
+ Then test "3" is equal to test "4"
119
+ And test "3" is not equal to test "6"
120
+
121
+ Scenario: Scenario to Outline comparison
122
+ Then test "1" is equal to test "3"
123
+ And test "1" is not equal to test "6"