bdd-legacy 0.0.12 → 0.0.13
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/.DS_Store +0 -0
- data/._.DS_Store +0 -0
- data/._Gemfile.lock +0 -0
- data/._bdd-legacy.gemspec +0 -0
- data/Gemfile +0 -2
- data/README.markdown +208 -0
- data/bdd-legacy.gemspec +3 -5
- data/bin/.DS_Store +0 -0
- data/bin/bdd-legacy +84 -84
- data/bin/templates/addition_steps.tt +15 -15
- data/bin/templates/additions_feature.tt +9 -9
- data/bin/templates/calculator.tt +17 -17
- data/bin/templates/env.tt +59 -53
- data/bin/templates/generic_browser_steps.tt +82 -65
- data/bin/templates/landing_page_feature.tt +22 -22
- data/bin/templates/landing_page_steps.tt +30 -30
- data/bin/templates/login_feature.tt +12 -12
- data/bin/templates/login_steps.tt +33 -33
- data/bin/templates/newgem.tt +1 -1
- data/bin/templates/rakefile.tt +5 -5
- data/bin/templates/sqlhelper.tt +40 -40
- data/bin/templates/sqlserver.tt +118 -118
- data/lib/.DS_Store +0 -0
- data/lib/._.DS_Store +0 -0
- data/lib/._bdd-legacy.rb +0 -0
- data/lib/bdd-legacy/._version.rb +0 -0
- data/lib/bdd-legacy/version.rb +1 -1
- metadata +63 -114
- data/bin/addition_steps.tt +0 -15
- data/bin/additions_feature.tt +0 -10
- data/bin/calculator.tt +0 -17
- data/bin/env.tt +0 -53
- data/bin/generic_browser_steps.tt +0 -66
- data/bin/landing_page_feature.tt +0 -23
- data/bin/landing_page_steps.tt +0 -30
- data/bin/login_feature.tt +0 -13
- data/bin/login_steps.tt +0 -33
- data/bin/newgem.tt +0 -2
- data/bin/rakefile.tt +0 -5
- data/bin/sqlhelper.tt +0 -40
- data/bin/sqlserver.tt +0 -118
- data/lib/templates/addition_steps.tt +0 -15
- data/lib/templates/additions_feature.tt +0 -10
- data/lib/templates/calculator.tt +0 -17
- data/lib/templates/env.tt +0 -53
- data/lib/templates/generic_browser_steps.tt +0 -66
- data/lib/templates/landing_page_feature.tt +0 -23
- data/lib/templates/landing_page_steps.tt +0 -30
- data/lib/templates/login_feature.tt +0 -13
- data/lib/templates/login_steps.tt +0 -33
- data/lib/templates/newgem.tt +0 -2
- data/lib/templates/rakefile.tt +0 -5
- data/lib/templates/sqlhelper.tt +0 -40
- data/lib/templates/sqlserver.tt +0 -118
data/.DS_Store
ADDED
Binary file
|
data/._.DS_Store
ADDED
Binary file
|
data/._Gemfile.lock
ADDED
Binary file
|
Binary file
|
data/Gemfile
CHANGED
data/README.markdown
ADDED
@@ -0,0 +1,208 @@
|
|
1
|
+
Behavior Driven Legacy Testing
|
2
|
+
===============================
|
3
|
+
|
4
|
+
**Why would you want to test a legacy system, such as a classic Asp application?**
|
5
|
+
|
6
|
+
One reason would be so that you could modify it safely. A BDD approach to legacy maintenance also lets
|
7
|
+
you rewrite a system piece by piece. In many instances the *system is the spec*. This means you would do well
|
8
|
+
to document whatever you touch since you usually own that code afterwards. BDD provides the best form of
|
9
|
+
documentation I know of in the form of *executable documentation*.
|
10
|
+
|
11
|
+
*What is the benefit of [executable documentation?](http://www.literateprogramming.com/index.html)*
|
12
|
+
|
13
|
+
Well with executable documentation you could [cut and paste it](http://www.literateprogramming.com/quotes_ad.html)
|
14
|
+
in an email and send it to a business expert. This means that there would be less
|
15
|
+
opportunity for something to get lost in the translation between your expert's statements
|
16
|
+
and the implementation of those statments in code.
|
17
|
+
|
18
|
+
Take a look at this example:
|
19
|
+
|
20
|
+
``` ruby
|
21
|
+
|
22
|
+
Feature: Login
|
23
|
+
In order to log into my app
|
24
|
+
As my app's personnel
|
25
|
+
I want to put in my user name and password
|
26
|
+
|
27
|
+
Scenario: Log in
|
28
|
+
Given I enter my username
|
29
|
+
And I enter my password
|
30
|
+
When I press Continue
|
31
|
+
Then I should see the environment link
|
32
|
+
And I select the environment link
|
33
|
+
```
|
34
|
+
|
35
|
+
Even without any [further explanation](https://github.com/cucumber/cucumber/wiki/Gherkin),
|
36
|
+
(if you know english) you should be able to read and understand the above statements very,
|
37
|
+
very, easily. This means your business experts can *at least be able to read* your code.
|
38
|
+
And yes, that is code. Therefore, **a feature is executable documentation**
|
39
|
+
|
40
|
+
|
41
|
+
**Requirements**
|
42
|
+
|
43
|
+
You must have [ruby](http://www.ruby-lang.org/en/downloads/) and [rubygems](http://rubyforge.org/frs/?group_id=126)
|
44
|
+
The sql server helpers in this gem use the win32ole which is only available on windows. Everything else will
|
45
|
+
work on mac or linux.
|
46
|
+
|
47
|
+
**Installation**
|
48
|
+
|
49
|
+
```
|
50
|
+
gem install bdd-legacy
|
51
|
+
```
|
52
|
+
|
53
|
+
Then run the bdd-legacy command for your app. This command will
|
54
|
+
create a directory with a cucumber test suite with a number of
|
55
|
+
utilities to get you started.
|
56
|
+
|
57
|
+
```
|
58
|
+
bdd-legacy mylegacyapp
|
59
|
+
```
|
60
|
+
**Specifiy Url**
|
61
|
+
|
62
|
+
Edit the *env.rb* file and point it to your application's domain name and url
|
63
|
+
Note: this can be a non-local url
|
64
|
+
|
65
|
+
``` ruby
|
66
|
+
#/features/support/env.rb
|
67
|
+
# Change this to the domain of your web server. Don't add the full url
|
68
|
+
$workingAppHostLink='http://localhost'
|
69
|
+
# add the url of your login page
|
70
|
+
$workingAppLoginRoute='/welcome/logon.asp'
|
71
|
+
```
|
72
|
+
|
73
|
+
**Specify login steps**
|
74
|
+
|
75
|
+
If you have a log in page, edit your the **login_steps.rb** file and change the **fill in** function
|
76
|
+
to be the *html* name/id of your username and password **fields** on your log in page
|
77
|
+
|
78
|
+
``` ruby
|
79
|
+
#/features/step_definitions/login_steps.rb
|
80
|
+
Given /^I enter my username$/ do
|
81
|
+
fill_in 'Username', :with => $workingAppUser
|
82
|
+
end
|
83
|
+
|
84
|
+
Given /^I enter my password$/ do
|
85
|
+
fill_in 'Password', :with => $workingAppPW
|
86
|
+
end
|
87
|
+
```
|
88
|
+
**Username/Password**
|
89
|
+
|
90
|
+
Change the application's user id and password in your *env.rb* file.
|
91
|
+
These will get put into the fields previously mentioned
|
92
|
+
|
93
|
+
``` ruby
|
94
|
+
#/features/support/env.rb
|
95
|
+
$workingAppUser='myapplicationusername'
|
96
|
+
$workingAppPW='myapplicationpw'
|
97
|
+
```
|
98
|
+
**Work flow**
|
99
|
+
|
100
|
+
Your normal workflow will start with writing a feature with scenarios similar to the following:
|
101
|
+
|
102
|
+
```ruby
|
103
|
+
Feature: Home Page
|
104
|
+
In order to work in my app
|
105
|
+
As my apps personnel
|
106
|
+
I need to land on the home page
|
107
|
+
|
108
|
+
Scenario: Land on the hope page
|
109
|
+
Given I am logged in
|
110
|
+
Then I should see "My Apps greeting"
|
111
|
+
And I should see "Something else that I want to check"
|
112
|
+
````
|
113
|
+
The feature relates to something the user wants to be able to do in your application.
|
114
|
+
The Scenario actually manipulates your application.
|
115
|
+
If you were to add the above feature into a 'homepage.feature' file you could
|
116
|
+
then run the following command:
|
117
|
+
|
118
|
+
````
|
119
|
+
cucumber features
|
120
|
+
````
|
121
|
+
|
122
|
+
which would then give you the following output:
|
123
|
+
|
124
|
+
``` ruby
|
125
|
+
Given /^I am logged in to my app$/ do
|
126
|
+
pending # express the regexp above with the code you wish you had
|
127
|
+
end
|
128
|
+
|
129
|
+
Then /^I should see something like "([^"]*)"$/ do |arg1|
|
130
|
+
pending # express the regexp above with the code you wish you had
|
131
|
+
end
|
132
|
+
|
133
|
+
When /^I press Continue$/ do
|
134
|
+
pending # express the regexp above with the code you wish you had
|
135
|
+
end
|
136
|
+
```
|
137
|
+
|
138
|
+
Which you then cut and paste into a step definition file.
|
139
|
+
Something like \features\step_definitions\home_page_steps.rb would work
|
140
|
+
|
141
|
+
**Step Definitions**
|
142
|
+
|
143
|
+
In the step definitions file, you will be using [Capybara](https://github.com/jnicklas/capybara)
|
144
|
+
commands to call your legacy application. The capybara command for one of the
|
145
|
+
previous steps looks like this:
|
146
|
+
|
147
|
+
``` ruby
|
148
|
+
Then /^I should see something like "([^"]*)"$/ do |arg1|
|
149
|
+
page.should have_content(arg1)
|
150
|
+
end
|
151
|
+
```
|
152
|
+
|
153
|
+
You can find examples of the capybara commands by looking at the specs in the driver.rb file.
|
154
|
+
To find the file run the following command
|
155
|
+
|
156
|
+
``` ruby
|
157
|
+
gem which capybara
|
158
|
+
```
|
159
|
+
|
160
|
+
which will give you the capybara directory on your machine. The driver.rb file will be
|
161
|
+
in (directory)\lib\capybara\spec
|
162
|
+
|
163
|
+
**Complete workflow**
|
164
|
+
|
165
|
+
1. Defining a feature (or scenario)
|
166
|
+
2. Copying and pasting the generated scenario matcher into a step definition file
|
167
|
+
3. Adding the (capybara) code to the step definition
|
168
|
+
4. Running the test with the 'cucumber features' command until the tests are green
|
169
|
+
5. Start over
|
170
|
+
|
171
|
+
**Firefox vs Internet Explorer**
|
172
|
+
|
173
|
+
The firefox webdriver is fast compared to Internet Explorer so I would recommend you use firefox for your testing.
|
174
|
+
In some cases if you are on windows you may want to test your application in IE (maybe your application only works in IE).
|
175
|
+
In order to this you can use a tag. Using an IE tag on a feature is done like so:
|
176
|
+
|
177
|
+
``` ruby
|
178
|
+
@ie
|
179
|
+
Scenario: Log in
|
180
|
+
Given I enter my username
|
181
|
+
And I enter my password
|
182
|
+
When I press "Continue"
|
183
|
+
Then I should see the environment link
|
184
|
+
And I select the environment link
|
185
|
+
```
|
186
|
+
|
187
|
+
Firefox is done the same way.
|
188
|
+
|
189
|
+
``` ruby
|
190
|
+
@firfox
|
191
|
+
Scenario: Log in
|
192
|
+
Given I enter my username
|
193
|
+
And I enter my password
|
194
|
+
When I press "Continue"
|
195
|
+
Then I should see the environment link
|
196
|
+
And I select the environment link
|
197
|
+
```
|
198
|
+
|
199
|
+
When running cucumber you can specify to run features for ie or firefox (or both)
|
200
|
+
|
201
|
+
```
|
202
|
+
cucumber features --tags @firefox
|
203
|
+
cucumber features --tags @ie
|
204
|
+
cucumber features --tags @ie,@firefox
|
205
|
+
```
|
206
|
+
`
|
207
|
+
|
208
|
+
|
data/bdd-legacy.gemspec
CHANGED
@@ -7,7 +7,6 @@ Gem::Specification.new do |s|
|
|
7
7
|
s.add_dependency "rake"
|
8
8
|
s.add_dependency "bundler", "~> 1.0.9"
|
9
9
|
s.add_dependency "fakeweb", "~> 1.3"
|
10
|
-
s.add_dependency "rake", ">= 0.8"
|
11
10
|
s.add_dependency "rdoc", "~> 2.5"
|
12
11
|
s.add_dependency "rspec", "~> 2.1"
|
13
12
|
s.add_dependency "simplecov", "~> 0.3"
|
@@ -22,7 +21,6 @@ Gem::Specification.new do |s|
|
|
22
21
|
s.add_dependency "prawn", ">= 0.8.4"
|
23
22
|
s.add_dependency "prawn-layout", ">= 0.8.4"
|
24
23
|
s.add_dependency "rack-test", ">= 0.5.7"
|
25
|
-
s.add_dependency "rake", ">= 0.8.7"
|
26
24
|
s.add_dependency "ramaze", ">= 0"
|
27
25
|
s.add_dependency "rspec", ">= 2.5.0"
|
28
26
|
s.add_dependency "simplecov", ">= 0.4.1"
|
@@ -38,14 +36,14 @@ Gem::Specification.new do |s|
|
|
38
36
|
s.platform = Gem::Platform::RUBY
|
39
37
|
s.authors = ["Wavell Watson"]
|
40
38
|
s.email = ["wavel.watson@gmail.com"]
|
41
|
-
s.homepage = ""
|
39
|
+
s.homepage = "https://github.com/wavell2003/bdd-legacy"
|
42
40
|
s.summary = %q{Installs tools needed for bdd testing of legacy applications.}
|
43
41
|
s.description = %q{Allows for use of feature driven testing of legacy (especially sql server) applications.}
|
44
42
|
|
45
43
|
s.rubyforge_project = "bdd-legacy"
|
46
44
|
|
47
|
-
s.files = `git ls-files`.split("\n")
|
45
|
+
s.files = `git ls-files`.split("\n")
|
48
46
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
49
|
-
s.executables = `git ls-files -- bin
|
47
|
+
s.executables = `git ls-files -- bin/bdd-legacy`.split("\n").map{ |f| File.basename(f) }
|
50
48
|
s.require_paths = ["lib"]
|
51
49
|
end
|
data/bin/.DS_Store
ADDED
Binary file
|
data/bin/bdd-legacy
CHANGED
@@ -1,84 +1,84 @@
|
|
1
|
-
#!/user/bin/env ruby
|
2
|
-
|
3
|
-
require 'thor'
|
4
|
-
require 'thor/group'
|
5
|
-
|
6
|
-
class BddLegacy < Thor::Group
|
7
|
-
include Thor::Actions
|
8
|
-
|
9
|
-
# Define arguments and options
|
10
|
-
argument :name
|
11
|
-
# class_option :test_framework, :default => :test_unit
|
12
|
-
|
13
|
-
def self.source_root
|
14
|
-
File.dirname(__FILE__)
|
15
|
-
end
|
16
|
-
|
17
|
-
def create_rake_file
|
18
|
-
template('templates/rakefile.tt', "#{name}/rakefile.rb")
|
19
|
-
end
|
20
|
-
|
21
|
-
def create_example_feature_file
|
22
|
-
template('templates/additions_feature.tt', "#{name}/features/additions.feature")
|
23
|
-
end
|
24
|
-
|
25
|
-
def create_login_feature_file
|
26
|
-
template('templates/login_feature.tt', "#{name}/features/login.feature")
|
27
|
-
end
|
28
|
-
|
29
|
-
def create_landing_page_feature_file
|
30
|
-
template('templates/landing_page_feature.tt', "#{name}/features/landing_page.feature")
|
31
|
-
end
|
32
|
-
|
33
|
-
def create_generic_steps_file
|
34
|
-
template('templates/generic_browser_steps.tt', "#{name}/features/step_definitions/generic_browser_steps.rb")
|
35
|
-
end
|
36
|
-
|
37
|
-
def create_login_steps_file
|
38
|
-
template('templates/login_steps.tt', "#{name}/features/step_definitions/login_steps.rb")
|
39
|
-
end
|
40
|
-
|
41
|
-
def create_landing_page_steps_file
|
42
|
-
template('templates/landing_page_steps.tt', "#{name}/features/step_definitions/landing_page_steps.rb")
|
43
|
-
end
|
44
|
-
|
45
|
-
def create_example_steps_file
|
46
|
-
template('templates/addition_steps.tt', "#{name}/features/step_definitions/addition_steps.rb")
|
47
|
-
end
|
48
|
-
|
49
|
-
def create_env_file
|
50
|
-
template('templates/env.tt', "#{name}/features/support/env.rb")
|
51
|
-
end
|
52
|
-
|
53
|
-
def create_sqlserver_file
|
54
|
-
template('templates/sqlserver.tt', "#{name}/lib/sqlserver.rb")
|
55
|
-
end
|
56
|
-
|
57
|
-
def create_sqlserver_wrapper_file
|
58
|
-
template('templates/sqlhelper.tt', "#{name}/lib/sqlhelper.rb")
|
59
|
-
end
|
60
|
-
|
61
|
-
def create_example_code_file
|
62
|
-
template('templates/calculator.tt', "#{name}/lib/calculator.rb")
|
63
|
-
end
|
64
|
-
|
65
|
-
# def create_feature_file
|
66
|
-
# template('templates/features.tt', "#{name}/lib/#{name}.rb")
|
67
|
-
# end
|
68
|
-
|
69
|
-
# def create_test_file
|
70
|
-
# test = options[:test_framework] == "rspec" ? :spec : :test
|
71
|
-
# create_file "#{name}/#{test}/#{name}_#{test}.rb"
|
72
|
-
# end
|
73
|
-
|
74
|
-
# def copy_licence
|
75
|
-
# if yes?("Use MIT license?")
|
76
|
-
# Make a copy of the MITLICENSE file at the source root
|
77
|
-
# copy_file "MITLICENSE", "#{name}/MITLICENSE"
|
78
|
-
# else
|
79
|
-
# say "Shame on you�", :red
|
80
|
-
# end
|
81
|
-
# end
|
82
|
-
end
|
83
|
-
|
84
|
-
BddLegacy.start
|
1
|
+
#!/user/bin/env ruby
|
2
|
+
|
3
|
+
require 'thor'
|
4
|
+
require 'thor/group'
|
5
|
+
|
6
|
+
class BddLegacy < Thor::Group
|
7
|
+
include Thor::Actions
|
8
|
+
|
9
|
+
# Define arguments and options
|
10
|
+
argument :name
|
11
|
+
# class_option :test_framework, :default => :test_unit
|
12
|
+
|
13
|
+
def self.source_root
|
14
|
+
File.dirname(__FILE__)
|
15
|
+
end
|
16
|
+
|
17
|
+
def create_rake_file
|
18
|
+
template('templates/rakefile.tt', "#{name}/rakefile.rb")
|
19
|
+
end
|
20
|
+
|
21
|
+
def create_example_feature_file
|
22
|
+
template('templates/additions_feature.tt', "#{name}/features/additions.feature")
|
23
|
+
end
|
24
|
+
|
25
|
+
def create_login_feature_file
|
26
|
+
template('templates/login_feature.tt', "#{name}/features/login.feature")
|
27
|
+
end
|
28
|
+
|
29
|
+
def create_landing_page_feature_file
|
30
|
+
template('templates/landing_page_feature.tt', "#{name}/features/landing_page.feature")
|
31
|
+
end
|
32
|
+
|
33
|
+
def create_generic_steps_file
|
34
|
+
template('templates/generic_browser_steps.tt', "#{name}/features/step_definitions/generic_browser_steps.rb")
|
35
|
+
end
|
36
|
+
|
37
|
+
def create_login_steps_file
|
38
|
+
template('templates/login_steps.tt', "#{name}/features/step_definitions/login_steps.rb")
|
39
|
+
end
|
40
|
+
|
41
|
+
def create_landing_page_steps_file
|
42
|
+
template('templates/landing_page_steps.tt', "#{name}/features/step_definitions/landing_page_steps.rb")
|
43
|
+
end
|
44
|
+
|
45
|
+
def create_example_steps_file
|
46
|
+
template('templates/addition_steps.tt', "#{name}/features/step_definitions/addition_steps.rb")
|
47
|
+
end
|
48
|
+
|
49
|
+
def create_env_file
|
50
|
+
template('templates/env.tt', "#{name}/features/support/env.rb")
|
51
|
+
end
|
52
|
+
|
53
|
+
def create_sqlserver_file
|
54
|
+
template('templates/sqlserver.tt', "#{name}/lib/sqlserver.rb")
|
55
|
+
end
|
56
|
+
|
57
|
+
def create_sqlserver_wrapper_file
|
58
|
+
template('templates/sqlhelper.tt', "#{name}/lib/sqlhelper.rb")
|
59
|
+
end
|
60
|
+
|
61
|
+
def create_example_code_file
|
62
|
+
template('templates/calculator.tt', "#{name}/lib/calculator.rb")
|
63
|
+
end
|
64
|
+
|
65
|
+
# def create_feature_file
|
66
|
+
# template('templates/features.tt', "#{name}/lib/#{name}.rb")
|
67
|
+
# end
|
68
|
+
|
69
|
+
# def create_test_file
|
70
|
+
# test = options[:test_framework] == "rspec" ? :spec : :test
|
71
|
+
# create_file "#{name}/#{test}/#{name}_#{test}.rb"
|
72
|
+
# end
|
73
|
+
|
74
|
+
# def copy_licence
|
75
|
+
# if yes?("Use MIT license?")
|
76
|
+
# Make a copy of the MITLICENSE file at the source root
|
77
|
+
# copy_file "MITLICENSE", "#{name}/MITLICENSE"
|
78
|
+
# else
|
79
|
+
# say "Shame on you�", :red
|
80
|
+
# end
|
81
|
+
# end
|
82
|
+
end
|
83
|
+
|
84
|
+
BddLegacy.start
|
@@ -1,15 +1,15 @@
|
|
1
|
-
Before do
|
2
|
-
@calculator = Calculator.new
|
3
|
-
end
|
4
|
-
|
5
|
-
Given /^I have entered ([0-9]*) into the calculator$/ do |value|
|
6
|
-
@calculator.enter( value.to_i )
|
7
|
-
end
|
8
|
-
|
9
|
-
When /^I press add$/ do
|
10
|
-
@calculator.add
|
11
|
-
end
|
12
|
-
|
13
|
-
Then /^the result should be ([0-9]*) on the screen$/ do |value|
|
14
|
-
@calculator.screen.should equal( value.to_i )
|
15
|
-
end
|
1
|
+
Before do
|
2
|
+
@calculator = Calculator.new
|
3
|
+
end
|
4
|
+
|
5
|
+
Given /^I have entered ([0-9]*) into the calculator$/ do |value|
|
6
|
+
@calculator.enter( value.to_i )
|
7
|
+
end
|
8
|
+
|
9
|
+
When /^I press add$/ do
|
10
|
+
@calculator.add
|
11
|
+
end
|
12
|
+
|
13
|
+
Then /^the result should be ([0-9]*) on the screen$/ do |value|
|
14
|
+
@calculator.screen.should equal( value.to_i )
|
15
|
+
end
|