<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Jayway Team Blog &#187; bdd</title>
	<atom:link href="http://blog.jayway.com/tag/bdd/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.jayway.com</link>
	<description>Sharing Experience</description>
	<lastBuildDate>Tue, 20 Jul 2010 08:26:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Devoxx highlights</title>
		<link>http://blog.jayway.com/2008/12/23/devoxx-highlights/</link>
		<comments>http://blog.jayway.com/2008/12/23/devoxx-highlights/#comments</comments>
		<pubDate>Tue, 23 Dec 2008 22:29:31 +0000</pubDate>
		<dc:creator>Jacob Mattsson</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Events]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[bdd]]></category>
		<category><![CDATA[concurrency]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[frameworks]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[spring dm]]></category>

		<guid isPermaLink="false">http://blog.jayway.com/?p=699</guid>
		<description><![CDATA[In order to embrace the true Christmas spirit, I thought I'd share a few goodies from the Devoxx conference that took place in Antwerp, Belgium in mid December. Devoxx is the former JavaPolis that has changed name due to trademarking issues with Sun. Nonetheless, it's still the worlds largest independent Java conference, where the 3200 [...]]]></description>
			<content:encoded><![CDATA[<p>In order to embrace the true Christmas spirit, I thought I'd share a few goodies from the <a href="http://devoxx.com">Devoxx conference</a> that took place in Antwerp, Belgium in mid December. Devoxx is the former JavaPolis that has changed name due to trademarking issues with Sun. Nonetheless, it's still the worlds largest <em>independent</em> Java conference, where the 3200 attendees find themselves being literally showered with news from the broad Java community. Below follow summaries from some of the, IMHO, best sessions from this years conference. Enjoy!</p>
<h3>BDD in Java with easyb (John Ferguson Smart)</h3>
<p>John started out by arguing that TDD is not about testing, it's about writing better code. That is, it's about making your code more maintainable, flexible, reliable and simple. TDD is forces the programmer to think about how to test the class before actually writing the class. BDD, on the other hand, helps to determine what to test and to write more focused code, by starting with the behavior. Instead of thinking that you're testing your class, you should think that you're validating your requirements! </p>
<p>easyb is a BDD testing framework for Java, written in Groovy (hence providing full access to all Java API's). It ensures that tests become clearer and easier to both write and read!  It helps the developer to focus on the requirements only. A competitor to easyb is JBehave, which is an extension to JUnit. However, according to John, JBehave is more cumbersome than easyb.</p>
<p>easyb makes use of stories, much like the story cards in the Agile world. In a story, a narrative approach is used to describe a precise requirement. In easyb, a story could look like this:</p>
<pre class="groovy">&nbsp;
scenario â€œMake initial deposit onto a <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20new"><span style="color: #000000; font-weight: bold;">new</span></a> accountâ€, <span style="color: #66cc66;">&#123;</span>
	given â€œa <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20new"><span style="color: #000000; font-weight: bold;">new</span></a> accountâ€
	when â€œan initial deposit is madeâ€
	then â€œthe balance should be equal to the amount depositedâ€
<span style="color: #66cc66;">&#125;</span>
&nbsp;</pre>
<p>This scenario is quite clear and readable, isn't it!? Furthermore, it's self-documenting - a very appreciated feature =) And the syntax is so trivial that even a non-technical stakeholder would have no problem understanding it. The developer can then reuse the given scenario (pseudo) code and implement the test case, like this:</p>
<pre class="groovy">&nbsp;
<span style="color: #a1a100;">import com.mycompany.bankonline.domain.Account</span>
&nbsp;
scenario â€œMake initial deposit onto a <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20new"><span style="color: #000000; font-weight: bold;">new</span></a> accountâ€, <span style="color: #66cc66;">&#123;</span>
	given â€œa <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20new"><span style="color: #000000; font-weight: bold;">new</span></a> accountâ€, <span style="color: #66cc66;">&#123;</span>
		account = <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20new"><span style="color: #000000; font-weight: bold;">new</span></a> Account<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
	<span style="color: #66cc66;">&#125;</span>
	when â€œan initial deposit is madeâ€, <span style="color: #66cc66;">&#123;</span>
		initialAmount = <span style="color: #cc66cc;">100</span>
		account.<span style="color: #006600;">makeDeposit</span><span style="color: #66cc66;">&#40;</span>initialAmount<span style="color: #66cc66;">&#41;</span>
	<span style="color: #66cc66;">&#125;</span>
	then â€œthe balance should be equal to the amount depositedâ€, <span style="color: #66cc66;">&#123;</span>
		account.<span style="color: #006600;">balance</span>.<span style="color: #006600;">shouldBe</span> initialAmount
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;</pre>
<p>The <code>shouldBe</code> call is an intuitive and readable way to verify that the requirement holds. Another way to verify the outcomes is to use the <code>ensure</code> syntax. Example:</p>
<pre class="groovy">&nbsp;
ensure<span style="color: #66cc66;">&#40;</span>account.<span style="color: #006600;">balance</span> &gt; <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>
&nbsp;</pre>
<p>or</p>
<pre class="groovy">&nbsp;
ensure<span style="color: #66cc66;">&#40;</span>account<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
	has<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span>balance:<span style="color: #cc66cc;">100</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;</pre>
<p>easyb could be extended to use DBUnit (and further plugins for Grails and Excel are on the way). On the IDE support, the only good option is IntelliJ IDEA. It really comes down to the Groovy support, and Eclipse and NetBeans doesn't shine here. In those cases, you're better off running the tests in Maven or Ant, which both are well supported. In the upcoming version, easyb will have full support for Continuous Integration (CI), enabling automatic test execution in a CI-server such as Hudson.</p>
<p>Furthermore, easyb comes with a web application - Easiness (cmp. Fitnesse) - where stakeholders can create stories in plain text. The developers can then go ahead and implement the stories defined by the stakeholders. This is an important features, that further improves the cooperation between the customer and the provider. It really seems like a quite nice little framework! If you agree, have a look at it at <a href="http://easyb.org/">http://easyb.org/</a>.</p>
<h3>From Concurrent to Parallel â€“ Library-based parallelism in JDK 7 (Brian Goetz)</h3>
<p>Brian is an expert in the concurrency area, but he's not a good presenter! He speaks faster than I can read, and his slides are so packed with info that he doesn't have time to say the half of it. That put aside, in this very interesting session Brian presented some really cool concurrency features to be included in JDK 7.</p>
<p>As you probably know, JDK 5 introduced a set of very useful classes for course-grained parallelism. JDK 7 will introduce a framework for fine-grained parallelism - the "fork-join" framework.</p>
<p>We have now reach a point in time when Moore's laws isn't valid anymore. The new reality is not faster CPUs but more CPUs. To adapt to these changes, programmers have to change the way they think about parallelism. The unit of work (UoW) that represents a task to be solved must be split into even smaller parts to be able to keep all hardware busy. Nowadays, it isn't enough to for ex. spawn a new thread for each service call in a server, the UoW must be split up even further.</p>
<p>Examples of finer-grained parallelism is searching, sorting and filtering a data set. Such a task is preferably solved by dividing it into sub-problems and combining the sub-results at the end. We could use the course-grained concurrency tools (for ex. <code>Executor</code> + <code>Future</code>) introduced in JDK 5 to solve this problem. However, with multiple CPUs available, these tools doesn't perform optimally. For ex., the shared work queue in the <code>Executor</code> becomes a bottle neck when the number of threads/CPUs increases. Furthermore, these tools provide no form of load balancing, i.e. if one thread finishes before the others, it is never reused.</p>
<p>The divide-and-conquer algorithm could also be applied to solve the problem. This great advantage of this approach is that it's independent of the number of CPUs used! Using plain threads for this approach is too expensive though, since thread creation costs way too much. However, the fork-join-operation in JDK 7 solves problems like these using the divide-and-conquer algorithm in a much more effective way! Internally, it uses an slim thread pool to overcome the cost of thread creation. Furthermore, no data-copying penalty exist since the data set (for ex. an array) is not divided/copied during the solution. Instead, the indexes within the data structure is used to define each data subset. Another advantage is that the code doesn't know how many CPUs it executes on, hence it's portable! </p>
<p>While the <code>Executor</code> (JDK 5) should be used for tasks consisting of both IO and computing, the fork-join-operation (JDK 7) should be used for highly compute-intensive tasks. Examples of such tasks are matrix operations, numerical integrations and game playing. The JDK 7 class to be used for these kind of problems is <code>ParallelArray</code>. It's a utility class that greatly simplifies the work of solving a task in parallel. You can think of it as an in-memory database for data sets. Typical usage is:</p>
<pre class="java">&nbsp;
ParallelLongArray pa = ParallelLongArray.<span style="color: #006600;">createUsingHandoff</span><span style="color: #66cc66;">&#40;</span>array, forkJoinPool<span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333;">long</span> max = pa.<span style="color: #006600;">max</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;</pre>
<p>The <code>ParallelArray</code> class provides operations for:</p>
<ul>
<li>Filtering (nestable)</li>
<li>Mapping</li>
<li>Replacement</li>
<li>Aggregation (max, count, sum, ...)</li>
<li>Application (one action performed for each selected element)</li>
</ul>
<p>To compare, the <code>ParallelArray</code> class acts much like the Map-Produce concept introduced by Google but it works in a different domain (local system instead of in a distributed system).</p>
<p>The only downside really is that JDK 7 isn't scheduled until mid 2010, meaning we'll have to wait quite some time before we can actually use these new concurrency features. But from the looks of it ... it may be worth the wait!</p>
<h3>The SpringSource DM Server (Joris Kuipers)</h3>
<p>The reasons why SpringSource decided to develop a new application server were many. Today, modularity is important and developers spend much time on achieving it in their applications (layering, separation of concerns, etc.). However, when the application is deployed, all modularity is lost - the deployable unit is one huge, monolithic WAR file. That means that sharing code (let alone services) between applications become hard if not impossible. In order to perform the smallest update on the application, whole WAR file have to be redeployed. Furthermore, the servers themselves lack modularity; they come prepackaged with a lot of modules but there's no way to configure that your application only make use of a couple of them. Hence, they are all left in there, consuming unnecessary CPU cycles and memory.</p>
<p>The DM (Dynamic Modules) server was developed to tackle these issues of non-modularity. In order to achieve true modularity, is has been built on top of OSGi (namely the Equinox container). Since OSGi can be quite hard sometimes, the DM server conceal the complexity of OSGi in the same way as the Spring framework does with for ex. Remoting or JMX. </p>
<p>In order to be able to use a third-party library from within the DM server (and from any other OSGi containers), the standard JAR library needs to be extended with OSGi-specific meta data - the OSGi manifest. SpringSource has therefore created the Enterprise Bundle Repository, where they have started to upload and publish OSGi-ified Java EE libraries. If you're using Maven or Ivy, the bundle repository can easily be configured as a remote (or local) repository.</p>
<p>The DM server also introduces a couple of new OSGi import constructs, enabling ease of development. One example is the "Import-library" that can be useful if you want to make use of a framework (for ex. Spring) but don't want to waste your time having to specify every single Import-package (for example Spring-Remoting) within the framework (as you normally would have had to do). This doesn't affect performance improvement since (thanks to OSGi) none of the pre-installed bundles are loaded before they are actually used! Furthermore, with the DM server it's now possible to remove the library bloat of monolithic Java EE WARs. Instead of building the external libraries into your WAR, you can instead declare them as dependencies in the OSGi manifest headers. The server will then convert these into plain "Import-package" constructs during deployment. That way, the size of the built/deployed WAR can be reduced significantly!</p>
<p>In the DM server, one can of course deploy plain OSGi bundles but also WARs, EARs etc. Typical scenarios for deploying a plain OSGi bundle are stand-alone libraries, global services and small stand-alone applications. However, being able to deploy a bundle is not enough in most cases ... A normal application normally consist of multiple bundles, which becomes hard to un/deploy since there is no single deployable unit. Furthermore, with multiple bundles you don't get a common log file or a notion of an application scope. To tackle this issue, the DM server adds the notion of an application by introducing the PAR (Platform Archive) format. It's basically a JAR with a number of 'Application-*' manifest headers. You can think of it as an EAR in Java EE. PARs are versioned and the versions apply to all of their bundles. This mean that one can deploy a PAR twice with different versions but with the same bundles, without conflicts.</p>
<p>The DM server comes in several versions. Of course there's the community version, using a GPL and SpringSource license. Then there's the commercial license where full support from SpringSource is included. On the extension side, better Maven support will soon be released so that the dependencies can be specified in a single place (not like now when you have to duplicate them in the pom and in the manifest). There's a Eclipse-plugin available that enables re/deployments from within the IDE.</p>
<p>These are some of the features in the DM server. There are plenty or more cool ones, read all about them <a href="http://www.springsource.com/products/suite/dmserver">here</a>. There, you'll also find a lot of sample applications that can get you going! With the DM server, SpringSource feel that they are filling the (up until now) empty space of server side OSGi and states that "The DM server is the healthy new way to run your apps!". I must say it looks very promising! Why don't you go ahead and try it out!? I know I will!</p>
<p><em>If you appreciated these posts, you will definitely enjoy next years conference! Pick up your calendar and reserve December 2009 for a great week at Devoxx!</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jayway.com/2008/12/23/devoxx-highlights/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Behaviour Driven Development</title>
		<link>http://blog.jayway.com/2008/02/01/behaviour-driven-development/</link>
		<comments>http://blog.jayway.com/2008/02/01/behaviour-driven-development/#comments</comments>
		<pubDate>Fri, 01 Feb 2008 11:38:33 +0000</pubDate>
		<dc:creator>Andreas Ronge</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[bdd]]></category>
		<category><![CDATA[jayview]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[unit test]]></category>

		<guid isPermaLink="false">http://blog.jayway.com/?p=3392</guid>
		<description><![CDATA[Test Driven Development is a well established programming technique for creating high quality software. It is less known, however, that TDD is not only a programming technique but also a design methodology. The main goal of Behaviour Driven Development, a TDD based methodology, is to identify behaviours in both the analysis and the design phases. [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Test Driven Development is a well established programming technique for creating high quality software. It is less known, however, that TDD is not only a programming technique but also a design methodology.<br />
</strong></p>
<p>The main goal of Behaviour Driven Development, a TDD based methodology, is to identify behaviours in both the analysis and the design phases.<br />
In BDD [1] the test code looks more like a specification of behaviours than a test of the production code.</p>
<h2>Test Driven Development </h2>
<p>TDD can be summarized in one rule:<br />
“Writing code is only allowed if you have a failing unit test”. </p>
<p>The TDD development cycle:<br />
   1. Write a unit test<br />
   2. Run all tests and make sure the new one fails<br />
   3. Implement the simplest possible solution in order to make the test pass<br />
   4. Refactor the code. All tests must pass after the refactoring has been done.<br />
   5. Repeat - write a new unit test </p>
<h3>Problems:</h3>
<ul>
<li>	Unit	tests	suggest	a	strong	relationship	between	test	class	and	implementation<br />
class. Each class or method usually has a corresponding test class or test meth-<br />
od. This causes a high coupling between the class under test and the test case.<br />
It also means that we focus too early on the implementation details, instead of<br />
doing the design first.
<li>	Unclear	definition	of	granularity	of	units.	A	common	mistake	is	to	mix	up	unit test with integration tests - which may require complex setup of several com-<br />
ponents (like a database). Having a high coupling between test code and the<br />
implementation is a serious problem when later on refactoring is needed. In-<br />
stead one should use mock objects to explore interactions between objects.
<li>	Limitations	on	mock	objects	may	have	too	big	an	impact	on	the	design.	We<br />
often have to stop using the private, static and final keywords. This problem was<br />
discussed in the previous issue of JayView - Mocking Static Methods.
</ul>
<h2>The Marriage of Component<br />
Specification with Unit Test </h2>
<p>BDD has a similar development cycle, but instead of writing tests before coding you<br />
write specifications before coding.<br />
A specification consists of a description of behaviours which are expressed within a<br />
context. Behaviours become self-verifying by writing (coding) expectations in the<br />
form of examples. The specification is written in an executable form so that we can<br />
generate a readable specification and verify that its expectations are valid. </p>
<h3>Example </h3>
<p>For example let’s write a specification for a stack. We start by identifing its contexts,<br />
which are: “empty”, “neither empty nor full”, “full”. Example of behaviours for the<br />
empty context are: “should be empty”, “should not be empty after a push”. For each<br />
of those one continue to write expectations. Like TDD you specify a small set of<br />
behaviours at a time then implement it - short iterations.<br />
Let’s show how this can be done using standard JUnit since it is a well known<br />
tool. JUnit is not a good tool for doing BDD since it was only designed for doing<br />
testing. A more suitable tool is for example JDave [4] or RSpec [2] which let you<br />
create much more readable specification. (The analysis part of RSpec is shown in<br />
the next section). </p>
<pre>// The enclosed annotation makes JUnit run all inner classes as tests
@RunWith(org.junit.runners.Enclosed.class)
public class StackTest {
    public static class EmptyStack {
        private Stack stack;
        @Before
        public void before() {
            stack = new Stack();
        }
        @Test
        public void shouldBeEmpty() {
            assertTrue(stack.isEmpty());
        }
        @Test
        public void shouldNotBeEmptyAfterAPush() {
            stack.push(“Some value”);
            assertFalse(stack.isEmpty());
        }
        // ...
    }
    public static class NeitherEmptyNorFullStack {
        private Stack stack;
        @Before
        public void before() {
            stack = new Stack();
            stack.push(“x”);
        }
        @Test
        public void shouldAddToTheTopWhenSentPush() {
            stack.push(“y”);
            assertEquals(“y”, stack.peek());
        }
        // ...
    }
}
</pre>
<p>By replacing the word “test” with “should” and organizing tests around behaviours it<br />
becomes clear that we are using BDD to drive the design.<br />
This format also allows us to generate an even more readable specification by using<br />
for example the junitreport ant task with a custom style sheet that extracts the bold<br />
words. A proper BDD tool would have this ability built in. I believe this specification<br />
is much better than the (class) javadoc that are often missing or incorrect.<br />
As shown above we keep specification and test together in an executable unit. This<br />
approach can also be used at a system level. </p>
<h2>The Marriage of Application<br />
Requirements with Acceptance Tests </h2>
<p>Requirements and acceptance tests are captured using a template containing a story<br />
and one or more scenarios.<br />
<strong>As a</strong> Role, <strong>I want</strong> Feature, <strong>So that</strong> Benefit<br />
Scenario1: <strong>Given</strong> ... <strong>When</strong> ... <strong>Then</strong><br />
Scenario2 ...<br />
A story’s behaviour is its acceptance criteria - the scenarios. By using the template<br />
above we can collaborate on stories with customers. This is nothing new, it is just<br />
one way of doing analysis.<br />
What is new is that in BDD the specification is written down in an executable<br />
unit in order to have self-verifying tests. The Ruby RSpec tool has a slightly different<br />
approach. It can treat specification written in plain english as an executable unit. </p>
<h3>An example of a story:</h3>
<p>Story: transfer to cash account<br />
<strong>As a</strong> savings account holder<br />
<strong>I want</strong> to transfer money from my savings account<br />
<strong>So that</strong> I can get cash easily from an ATM<br />
Scenario: savings account is in credit<br />
<strong>Given</strong> my savings account balance is 100<br />
And my cash account balance is 10<br />
<strong>When</strong> I transfer 20 from my savings account to my cash account<br />
<strong>Then</strong> my savings account balance should be 80<br />
And my cash account balance should be 20<br />
Scenario: savings account is overdrawn<br />
<strong>Given</strong> my savings account balance is -20<br />
And my cash account balance is 10<br />
<strong>When</strong> I transfer 20 from my savings account to my cash account<br />
<strong>Then</strong> my savings account balance should be -20<br />
And my cash account balance should be 10</p>
<p>To perform verification on this specification we create an interpreter where we de-<br />
fine reusable test steps. </p>
<pre>class AccountSteps < Spec::Story::StepGroup
  steps do |define|
    define.given("my $account account balance is $balance") do |account,
balance|
      @accounts ||= {} # creates a new hash if @accounts is nil
      @accounts[account] = Account.new(balance.to_f)
    end
    define.then("my $account account balance should be $amount") do |account,
amount|
      @accounts[account].balance.should == amount.to_f
    end
    define.when("I transfer $amount from my $from account to my $to account")
do |amount, from, to|
       @accounts[from].transfere_to(@accounts[to], amount.to_f)
    end
  end
end
</pre>
<p>To run it we need to tell which steps are using what story:</p>
<pre>runner = Spec::Story::Runner::PlainTextStoryRunner.new(filename-of-the-story)
runner.steps << AccountSteps.new
runner.run </pre>
<p>RSpec matches each line in the story with the defined test steps. The code inside the<br />
define block will be executed if a match is found.<br />
For example, when the story runner reads the line “Given my savings account bal-<br />
ance is 100” it will execute </p>
<pre>@accounts['savings'] = Account.new("100".to_f).
</pre>
<p>That means a new account object is created and stored in the accounts hash. </p>
<p>Still stuck with Java ? Psst, you can use JRuby [5] to test and mock Java<br />
objects. For example, try the JtestR [6] tool which also integrates nicely<br />
with ant, maven and Buildr [3]. </p>
<h2>Conclusions</h2>
<p>There is not a big difference between TDD and BDD if TDD is used  correctly. TDD<br />
often causes brittle test code - a small change in the  production code may cause a<br />
major change in the test code. BDD gives the possibility of structuring tests to make<br />
them “refactoring friendly”. This is accomplished by organizing tests in small focused<br />
examples of  behaviours.<br />
People are not always aware that TDD is able to drive the design. By not  thinking<br />
in terms of tests but instead describing the what and why of  behaviours, it becomes<br />
clear that BDD is a methodology for analysis and design. </p>
<h2>References</h2>
<p>[1] BDD - <a href="http://behaviour-driven.org/">http://behaviour-driven.org/</a><br />
[2] RSpec - <a href="http://rspec.rubyforge.org/">http://rspec.rubyforge.org/</a><br />
[3] Buildr - <a href="http://buildr.rubyforge.org/">http://buildr.rubyforge.org/</a><br />
[4] JDave - <a href="http://www.jdave.org/">http://www.jdave.org/</a><br />
[5] JRuby - <a href="http://jruby.codehaus.org/">http://jruby.codehaus.org/</a><br />
[6] JtestR - <a href="http://jtestr.codehaus.org">http://jtestr.codehaus.org</a></p>
<p><em>Originally published in <a href="http://jayway.se/jayview">JayView</a>.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jayway.com/2008/02/01/behaviour-driven-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
