-
Notifications
You must be signed in to change notification settings - Fork 0
/
howtos.html
237 lines (185 loc) · 7.66 KB
/
howtos.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>easyb makes it easy, man</title>
<meta name="keywords" content="BDD, behavior driven development, java, java bdd, groovy, groovy bdd,
groovy behavior driven development, java behavior driven development, ruby, rspec, easyb, easy bdd" />
<meta name="description" content="easyb is story verification framework built in the spirit of behavior driven development." />
<link href="default.css" rel="stylesheet" type="text/css" />
</head>
<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
var pageTracker = _gat._getTracker("UA-3500051-1");
pageTracker._initData();
pageTracker._trackPageview();
</script>
<body>
<!-- start header -->
<div id="header">
<h1><a href="http://www.easyb.org"><span>easyb</span></a></h1>
<h2> -- BDD in java can't get any easier</h2>
</div>
<!-- end header -->
<!-- start page -->
<div id="page">
<!-- start content -->
<div id="content">
<div class="post">
<h2 class="title">Stories with easyb</h2>
<div class="entry">
<p>BDD principles support the notion of stories quite nicely-- you can think of a story as narrative between a stakeholder and development (almost like a use case). In short, think of a story as a description of a requirement, which has an associated benefit and criteria for validation.</p>
<p>Stories can be made up of <code>scenario</code>s that group specifications. The specifications are essential-- they are essentially steps that are friendly to read. They are:
</p>
<ul>
<li>Given (a context)</li>
<li>When (something happens)</li>
<li>Then (something else happens)</li>
</ul>
<h3>Stories in action</h3>
<p>The default convention for stories in easyb is to place each story in a file ending with MyStory.story. So if you have story regarding shipping calculations, for example, you'd have a file named <code>ShippingCalculations.story</code>.</p>
<p>The code below shows a story in easyb in action-- the code has two scenarios which reside in a story file named <code>EmptyStack.story</code>.</p>
<pre><code>
import org.disco.easyb.bdd.stack.Stack
scenario "null is pushed onto empty stack", {
given "an empty stack",{
stack = new Stack()
}
when "null is pushed", {
pushnull = {
stack.push(null)
}
}
then "an exception should be thrown", {
ensureThrows(RuntimeException){
pushnull()
}
}
and "then the stack should still be empty", {
stack.empty.shouldBe true
}
}
scenario "pop is called on empty stack", {
given "an empty stack",{
stack = new Stack()
}
when "pop is called", {
popnull = {
stack.pop()
}
}
then "an exception should be thrown", {
ensureThrows(RuntimeException){
popnull()
}
}
and "then the stack should still be empty", {
stack.empty.shouldBe true
}
}
</code></pre>
<p>Does it not convey the intention clearly? Of course it does!! It's so easy too.</p>
<p>Take notice of multiple <code>scenario</code>s in that file, each with their own set of <code>given</code>s,<code>when</code>s and <code>then</code>s all coming together to create a <code>story</code>. </p>
<h3>Pending stories and scenarios</h3>
<p>easyb makes it easy to create stories with no coding so that you can come back to fill in the implementation later. </p>
<pre><code>scenario "customers should receive discounts", {
given "a shopping cart with 3 items"
when "a user checks out"
then "they should receive a 10% discount"
}
</code></pre>
<p>Note how the above scenario has no code-- it's simply just the text of the scenario-- easyb will mark any unimplemented feature as a pending specification.</p>
<h3>Printing stories</h3>
<p>It wouldn't be fair to only let the developers see this beautiful story now would it? We didn't think so either, so we decided to give you an easy way to print out the story without all that icky implementation code (we're too familiar with that glossy eye look stakeholders get when you show them code).</p>
<p>Story printing is available from command line as a format flag as well as via the easyb ant task. For instance, below is an example of two stories-- one with two scenarios and the other containing three.</p>
<p>This example also shows what you see when a specification isn't filled out and is marked as pending.</p>
<pre><code>
33 specifications (including 2 pending) executed successfully
Story: empty stack
scenario null is pushed onto empty stack
given an empty stack
when null is pushed
then an exception should be thrown
then the stack should still be empty
scenario pop is called on empty stack
given an empty stack
when pop is called
then an exception should be thrown
then the stack should still be empty
Story: single value stack
scenario pop is called on stack with one value
given an empty stack with one pushed value
when pop is called
then that object should be returned
then the stack should be empty
scenario stack with one value is not empty
given an empty stack with one pushed value
then the stack should not be empty
scenario peek is called
given a stack containing an item
when peek is called
then it should provide the value of the most recent pushed value
then the stack should not be empty
then calling pop should also return the peeked value which is \
the same as the original pushed value
then the stack should be empty
then an example pending [PENDING]
etc...
</code></pre>
<p>Easy story printing, eh?</p>
</div>
</div>
</div>
<!-- end content -->
<!-- start sidebar -->
<div id="sidebar">
<ul>
<li>
<h2>Overview</h2>
<ul>
<li><a href="./index.html">Home</a></li>
<li><a href="./howtos.html">Stories</a></li>
<li><a href="./howtobb.html">Specifications</a></li>
<li><a href="./download.html">Download</a></li>
</ul>
</li>
<li>
<h2>Details</h2>
<ul>
<li><a href="./running.html">Running easyb</a></li>
<li><a href="./tutorialstack.html">An in-depth tutorial</a></li>
<li><a href="./dsls.html">easyb syntax specification</a></li>
<li><a href="./lic.html">License</a></li>
<li><a href="./source.html">Source code</a></li>
<li><a href="./contact.html">Contact</a></li>
</ul>
</li>
<li>
<h2>Plug-ins</h2>
<ul>
<li><a href="./dbunit.html">DbUnit plug-in</a></li>
</ul>
</li>
<li>
<h2>Resources</h2>
<ul>
<li><a href="http://dannorth.net/introducing-bdd/">Introducing BDD</a> (DanNorth.net)</li>
<li><a href="http://rspec.rubyforge.org/">RSpec</a></li>
<li><a href="http://groovy.codehaus.org/">Groovy</a></li>
<li><a href="http://code.google.com/p/easyb/w/list">easyb wiki</a></li>
<li><a href="./articles.html">Additional resources</a></li>
</ul>
</li>
</ul>
<div style="clear: both;"> </div>
</div>
<!-- end sidebar -->
</div>
<!-- end page -->
<div id="footer">
</div>
</body>
</html>