<?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/"
	>

<channel>
	<title>The Disco Blog</title>
	<atom:link href="http://thediscoblog.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://thediscoblog.com</link>
	<description>Can you dig it man?</description>
	<pubDate>Wed, 01 Jul 2009 19:03:18 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Euler was groovy too</title>
		<link>http://thediscoblog.com/2009/07/01/euler-was-groovy-too/</link>
		<comments>http://thediscoblog.com/2009/07/01/euler-was-groovy-too/#comments</comments>
		<pubDate>Wed, 01 Jul 2009 19:03:18 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
		
		<category><![CDATA[Dynamic Languages]]></category>

		<category><![CDATA[Groovy]]></category>

		<category><![CDATA[Software Development]]></category>

		<category><![CDATA[java]]></category>

		<category><![CDATA[project euler]]></category>

		<guid isPermaLink="false">http://thediscoblog.com/?p=643</guid>
		<description><![CDATA[
I recently stumbled across Project Euler, which is a hip website containing quite a few different math challenges. The idea being that people can attempt to solve any particular challenge which ever way they can (that is, in any language and with any algorithm) &#8212; the site doesn&#8217;t provide answers either &#8212; you must create [...]]]></description>
			<content:encoded><![CDATA[<p>
I recently stumbled across <a href="http://projecteuler.net">Project Euler</a>, which is a hip website containing quite a few different math challenges. The idea being that people can attempt to solve any particular challenge which ever way they can (that is, in any language and with any algorithm) &#8212; the site doesn&#8217;t provide answers either &#8212; you must create an account and submit your answer. Project Euler will then check your answer and issue a response &#8212; correct or incorrect. If it&#8217;s your bag and you Google the project, you&#8217;ll find some interesting posts solving various problems in various languages ranging from F# to Scala to C (and everything in between). What&#8217;s also interesting is that each post for a problem usually is different in some way or another, which of course provides some interesting learning opportunities.
</p>
<p>
<A HREF="http://projecteuler.net/index.php?section=problems&#038;id=1">Problem 1</A> entails figuring out the sum of numbers divisible by 3 and 5: 
</p>
<blockquote><p>
If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.<br />
Find the sum of all the multiples of 3 or 5 below 1000.
</p></blockquote>
<p>
I thought it would be interesting to see if I could solve this in <A HREF="http://groovy.codehaus.org">Groovy</A> as the solution clearly deals with iterating over a series of numbers &#8212; and as everyone who has played with <A HREF="http://thediscoblog.com/category/dynamic-languages/groovy/">Groovy</A> (or some other dynamic language for that matter) knows, <A HREF="http://thediscoblog.com/2008/11/27/ranges-in-groovy-are-hip/">iteration is a blast</A>, baby!
</p>
<p>
Accordingly, my first pass yielded the following code: </p>
<pre><code>def sum = 0
(1..&lt;1000).each{
 if((it % 5 == 0) || (it % 3 == 0)){
   sum += it
 }
}
assert sum == /* do it yourself, baby! */</code></pre>
</p>
<p>Note that I&#8217;m using Groovy&#8217;s <A HREF="http://groovy.codehaus.org/Collections">exclusive range feature</A> to easily iterate over all numbers less than 1000. I then proceed to use Groovy&#8217;s <code>it</code> variable, which represents the current value in the iteration (i.e. 1, 2, 3, etc) and test the instance with Java&#8217;s <A HREF="http://www.cafeaulait.org/course/week2/15.html">modulo operator</A> (that is, modulo returns the remainder of division &#8212; 10 modulo 5 is 0, but 11 modulo 5 is 1). If there is a match, I add it to the <code>sum</code> variable. This is programming 101 and brought me back to the Age of Aquarius, baby!!
</p>
<p>
That was easy enough; however, I wanted to see if I could do away with the <code>sum</code> variable by using one of Groovy&#8217;s many hip magic methods <A HREF="http://groovy.codehaus.org/JN1015-Collections">attached to collections</A>. Thus, my second attempt leverages Groovy&#8217;s <code>findAll</code> method, which permits putting a condition in the resulting <A HREF="http://thediscoblog.com/2009/02/09/leveraging-closures/">closure</A>, which then returns a collection meeting that criteria. Accordingly, with the returned collection of numbers meeting my criteria (that is, any number that is divisible by 5 or 3), I then have to issue the <code>sum</code> method like so:</p>
<pre><code>def val = (1..&lt;1000).findAll{(it % 5 == 0) || (it % 3 == 0)}
assert val.sum() == /* you gotta figure it out yourself, man! */</code></pre>
</p>
<p>Groovy&#8217;s <code>sum</code> method is straight forward &#8212; it takes all the values in a collection (presumably <A HREF="http://www.ibm.com/developerworks/java/library/j-pg10255.html">add-able</A>) and adds them up! </p>
<p>
Admittedly, the second example is a bit harder to read (at first glance, that is) but it sure is a bit more aesthetic than the first brute force bogue example, isn&#8217;t it?</p>
                 <p><center>You can now follow <a href="http://twitter.com/thediscoblog">The Disco Blog on Twitter</a>, baby!</center></p>             ]]></content:encoded>
			<wfw:commentRss>http://thediscoblog.com/2009/07/01/euler-was-groovy-too/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Agile testing: a whole team approach</title>
		<link>http://thediscoblog.com/2009/06/25/agile-testing-a-whole-team-approach/</link>
		<comments>http://thediscoblog.com/2009/06/25/agile-testing-a-whole-team-approach/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 23:15:04 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
		
		<category><![CDATA[Continuous Integration]]></category>

		<category><![CDATA[Developer Testing]]></category>

		<category><![CDATA[Software Development]]></category>

		<category><![CDATA[Agile]]></category>

		<category><![CDATA[bdd]]></category>

		<category><![CDATA[ci]]></category>

		<category><![CDATA[easyb]]></category>

		<category><![CDATA[software testing]]></category>

		<category><![CDATA[TDD]]></category>

		<category><![CDATA[unit testing]]></category>

		<guid isPermaLink="false">http://thediscoblog.com/?p=629</guid>
		<description><![CDATA[Agile testing is about two things: a whole life-cycle and whole team approach to testing. The whole life-cycle aspect stresses leveraging testing throughout a hip process as opposed to a distinct period. Likewise, a whole team approach welcomes all parties to the quality table as everyone (yes, that means all stakeholders) accepts responsibility for building [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://thediscoblog.com/2009/06/11/agile-testing-what-it-is/">Agile testing</a> is about two things: a <a href="http://thediscoblog.com/2009/06/17/agile-testing-a-whole-life-cycle-approach/">whole life-cycle</a> and whole team approach to testing. The whole life-cycle aspect stresses leveraging testing throughout a hip process as opposed to a distinct period. Likewise, a whole team approach welcomes all parties to the quality table as everyone (yes, that means all stakeholders) accepts responsibility for <em>building in</em> quality. </p>
<p><img style="PADDING-LEFT: 0.0em; PADDING-RIGHT: 1.0em; PADDING-TOP: 0.0em; FLOAT: LEFT; PADDING-BOTTOM: 0.5em" src="http://thediscoblog.com/images/2009/Happybusinesssm.jpg" alt="development 2.0: high costs!" width="357" height="252"/>While <a href="http://thediscoblog.com/2009/06/04/agile-testing-what-its-not/">traditional software methodologies</a> have the tendency to segment groups into logical units of responsibility, <a href="http://www.amazon.com/gp/product/0321534468?ie=UTF8&#038;tag=thdibl-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0321534468">agile teams</a><img src="http://www.assoc-amazon.com/e/ir?t=thdibl-20&#038;l=as2&#038;o=1&#038;a=0321534468" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> favor a more collaborative approach that facilitates working along side various people and groups containing differing skill sets and expectations. That is, for example, the client begins to take responsibility for elaborating expectations through a working effort to understand how the process unfolds. What&#8217;s more, by working closely with a client, a team can better understand what is needed <em>and why</em>. As opposed to a test document fashioned from a bogue requirements document (often times done by various teams working separately), leveraging a <a href="http://thediscoblog.com/2008/10/16/lost-in-translation-stop-using-different-languages/">story in a collaborative manner</a> ensures all parties are effectively on the same page.  Thus, the customer (or some proxy there of), development, and QA are working together in the process of constructing stories and indeed leverage the same stories for all related assets.</p>
<p>Because it&#8217;s their bag, when Agile teams embrace stories as a fundamental means as to conveying requirements (i.e. features) along with a means for validating them, a natural tendency is for all parties to begin to own quality. That is, since everyone is aware of how to validate a feature, everyone begins to practice validating such features. In essence, a story facilitates leveraging both <a href="http://www.amazon.com/gp/product/0321146530?ie=UTF8&#038;tag=thdibl-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0321146530">TDD</a><img src="http://www.assoc-amazon.com/e/ir?t=thdibl-20&#038;l=as2&#038;o=1&#038;a=0321146530" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> and functional testing (which are also both automated and exercised via <a href="http://www.amazon.com/gp/product/0321336380?ie=UTF8&#038;tag=thdibl-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0321336380">CI</a><img src="http://www.assoc-amazon.com/e/ir?t=thdibl-20&#038;l=as2&#038;o=1&#038;a=0321336380" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />) .</p>
<p>What&#8217;s more, when the whole team both works together off of the same artifacts that are continuously verified, everyone can better understand the meaning of &#8220;done&#8221; &#8212; that being the question  &#8220;is feature x finished and ready for the client (or clients) to have?&#8221; Of course, if everyone has utilized the same artifact (i.e. a <a href="http://www.amazon.com/gp/product/0321205685?ie=UTF8&#038;tag=thdibl-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0321205685">story</a><img src="http://www.assoc-amazon.com/e/ir?t=thdibl-20&#038;l=as2&#038;o=1&#038;a=0321205685" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />!) for both building and verifying a client&#8217;s expectations, then it is quite easy to check if the feature is done. </p>
<p>Thus, the whole team approach that leverages stories:</p>
<ul>
<li>ensures all hip parties see and understand the &#8220;big picture&#8221; of a particular project
<ul>
<li> that is, why someone wants an application (and its related features) built, which in turn further facilitates whole team ownership (along with more effective testing!)</li>
</ul>
</li>
<li>helps teams figure out the definition of done</li>
</ul>
<p>Obtaining these benefits is a matter of providing a means for all parties on a team to collaborate, which is often found in leveraging a story. Plus, visibility into overall team progress as facilitated via CI and automation. The whole team approach also meets the original goal of software testing  &#8212; that being the assurance that high quality code is delivered to interested parties. Teaming also reduces the tendency to throw up barriers that often plague efficiency.</p>
<p>Agile testing boils down to two fundamental changes, baby, that differentiate it from traditional software testing &#8212; both the notion that testing isn&#8217;t a phase but a whole life-cycle approach and that the entire team works together towards shared goals. Agile testing complements a highly efficient software development life-cycle and ultimately produces <em>better software faster</em>. </p>
                 <p><center>You can now follow <a href="http://twitter.com/thediscoblog">The Disco Blog on Twitter</a>, baby!</center></p>             ]]></content:encoded>
			<wfw:commentRss>http://thediscoblog.com/2009/06/25/agile-testing-a-whole-team-approach/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Agile testing: a whole life-cycle approach</title>
		<link>http://thediscoblog.com/2009/06/17/agile-testing-a-whole-life-cycle-approach/</link>
		<comments>http://thediscoblog.com/2009/06/17/agile-testing-a-whole-life-cycle-approach/#comments</comments>
		<pubDate>Wed, 17 Jun 2009 22:27:32 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
		
		<category><![CDATA[Continuous Integration]]></category>

		<category><![CDATA[Software Development]]></category>

		<category><![CDATA[Agile]]></category>

		<category><![CDATA[agile testing]]></category>

		<category><![CDATA[bdd]]></category>

		<category><![CDATA[ci]]></category>

		<category><![CDATA[easyb]]></category>

		<category><![CDATA[JUnit]]></category>

		<category><![CDATA[QA]]></category>

		<category><![CDATA[SCM]]></category>

		<category><![CDATA[software testing]]></category>

		<category><![CDATA[story]]></category>

		<category><![CDATA[TDD]]></category>

		<category><![CDATA[test driven development]]></category>

		<category><![CDATA[unit testing]]></category>

		<guid isPermaLink="false">http://thediscoblog.com/?p=624</guid>
		<description><![CDATA[As I elaborated in two previous hip posts entitled &#8220;Agile testing: what it&#8217;s not&#8221; and &#8220;Agile testing: what it is&#8221; agile testing boils down to two fundamental aspects &#8212; it&#8217;s about a whole life-cycle and whole team approach to testing. Note that the whole life-cycle gig is distinctly different than traditional processes, which often label [...]]]></description>
			<content:encoded><![CDATA[<p>As I elaborated in two previous hip posts entitled &#8220;<a href="http://thediscoblog.com/2009/06/04/agile-testing-what-its-not/">Agile testing: what it&#8217;s not</a>&#8221; and &#8220;<a href="http://thediscoblog.com/2009/06/11/agile-testing-what-it-is/">Agile testing: what it is</a>&#8221; agile testing boils down to two fundamental aspects &#8212; it&#8217;s about a whole life-cycle and whole team approach to testing. Note that the whole life-cycle gig is distinctly different than traditional processes, which often label a timeframe dedicated to testing (almost always after coding is &#8220;finished&#8221;). </p>
<div style="float:right; padding-left:1.0em; padding-top:0.7em;"><iframe src="http://rcm.amazon.com/e/cm?t=thdibl-20&#038;o=1&#038;p=8&#038;l=as1&#038;asins=0321534468&#038;fc1=000000&#038;IS2=1&#038;lt1=_blank&#038;m=amazon&#038;lc1=0000FF&#038;bc1=000000&#038;bg1=FFFFFF&#038;f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe></div>
<p>Rather than wait until the end of some period to begin testing, in an agile influenced testing organization, testing is done <em>throughout</em> a life-cycle.  Interestingly, the asset that both <a href="http://thediscoblog.com/2008/10/16/lost-in-translation-stop-using-different-languages/">facilitates collaboration</a> and increases testing productivity is the <a href="http://thediscoblog.com/2008/01/23/stories-are-easy-man/">story</a>.  A copasetic story both captures a feature (or requirement) and provides a means for validation; plus, stories are, by their nature, quite <a href="http://www.ibm.com/developerworks/edu/j-dw-java-easyb-i.html">easy to collaborate on</a>. In fact, rather than breaking into different groups to diligently define requirements documents, design documents, and test strategies, teams that instead focus on collaboratively authoring stories often times find a much more streamlined approach that lessens the inevitable impedance mismatch that occurs when different groups leverage different mediums (or documents).</p>
<p>In a broad sense, the approach of collaboratively leveraging stories to both define features and verify them can be seen as <em>Test Driven Development</em>. Indeed, depending on your view point, Test Driven Development (or <a href="http://www.ibm.com/developerworks/java/library/j-cq09187/index.html">TDD</a>) can be seen as a developmental practice focused on <a href="http://thediscoblog.com/category/developer-testing/">unit testing</a>; however, broadly defined it captures the mantra of agile testing &#8212; that is, the story defines both the feature and a means to test the feature. Whether that feature is tested via a unit test or a hip functional test doesn&#8217;t matter, man &#8212; the point being is that all parties are leveraging the same asset to drive the test. And best yet, the test itself is defined in language that customer can understand and indeed define if they choose to.</p>
<p>Because testing becomes a whole life cycle approach, a fundamental shift occurs with respect to test assets. As opposed to traditional processes where assets differ in implementation, definition and even storage, in an agile testing environment, all tests are assets defined collaboratively and stored along with source code. That is, functional tests are living assets that are managed and versioned just like code.  This process has a secondary benefit &#8212; QA becomes involved in what&#8217;s known as<a href="http://www.martinfowler.com/articles/continuousIntegration.html"> Continuous Integration</a>. Briefly, Continuous Integration (or CI) is the process of <a href="http://www.amazon.com/gp/product/0321336380/sr=8-1/qid=1155571519/ref=pd_bbs_1/102-2598958-5393756?ie=UTF8">continuously verifying software assets</a>.  By doing so, defects can be found early &#8212; where they are considerably less expensive to address. Thus, <a href="http://www.ibm.com/developerworks/edu/j-dw-java-cq11207-i.html">CI</a> provides a means to shorten the feedback loop and permits teams to find and fix issues as they arise, which is fundamentally different to finding and fixing defects after a long coding process.</p>
<p>What&#8217;s more, in order for QA to effectively leverage CI, automation is a must. That is, CI is an automatic process that doesn&#8217;t rely on human interaction; thus, for QA assets to be exercised along side of developmental assets, automation must be utilized. While teams will often inquire as to how much automation must be leveraged, there isn&#8217;t a hard and fast number; suffice to say, it&#8217;s healthy to grow automation assets over time. There will always be some level of manual tests &#8212; whether they be exploratory in nature or simple human verifications (things look correct) but the more automation leveraged, the better.</p>
<div style="float:right; padding-left:1.0em; padding-top:0.7em;"><iframe src="http://rcm.amazon.com/e/cm?t=thdibl-20&#038;o=1&#038;p=8&#038;l=as1&#038;asins=0321205685&#038;fc1=000000&#038;IS2=1&#038;lt1=_blank&#038;m=amazon&#038;lc1=0000FF&#038;bc1=000000&#038;bg1=FFFFFF&#038;f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe></div>
<p>Thus, embracing a whole life-cycle approach means embracing</p>
<ul>
<li> stories as a means to clearly enunciate features and how to verify them</li>
<li>treating test assets like code assets through
<ul>
<li>SCM</li>
<li> CI</li>
</ul>
</li>
<li> automation at all levels and granularity</li>
</ul>
<p>The whole life-cycle approach which stresses stories, CI, <a href="http://www-128.ibm.com/developerworks/edu/j-dw-java-junit4.html">TDD</a>, and automation has a number of benefits including:</p>
<ul>
<li> lowering the overall cost of addressing defects
<ul>
<li> because they are found quicker</li>
</ul>
</li>
<li> imbuing a stronger sense team camaraderie</li>
<ul>
<li> because QA collaborates with development and stakeholders closely and assets are shared across boundaries, baby</li>
</ul>
</li>
</ul>
<p>Agile testing&#8217;s whole-life cycle approach tends to break down traditional barriers that inhibit efficiencies and ultimately leads to better software quicker. Can you dig it, baby?</p>
                 <p><center>You can now follow <a href="http://twitter.com/thediscoblog">The Disco Blog on Twitter</a>, baby!</center></p>             ]]></content:encoded>
			<wfw:commentRss>http://thediscoblog.com/2009/06/17/agile-testing-a-whole-life-cycle-approach/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Grails hip tip: testing RESTful services</title>
		<link>http://thediscoblog.com/2009/06/15/grails-hip-tip-testing-restful-services/</link>
		<comments>http://thediscoblog.com/2009/06/15/grails-hip-tip-testing-restful-services/#comments</comments>
		<pubDate>Mon, 15 Jun 2009 18:29:17 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
		
		<category><![CDATA[Developer Testing]]></category>

		<category><![CDATA[Groovy]]></category>

		<category><![CDATA[Agile]]></category>

		<category><![CDATA[bdd]]></category>

		<category><![CDATA[dsl]]></category>

		<category><![CDATA[java]]></category>

		<category><![CDATA[open source]]></category>

		<category><![CDATA[programming]]></category>

		<category><![CDATA[rest]]></category>

		<category><![CDATA[TDD]]></category>

		<category><![CDATA[unit testing]]></category>

		<category><![CDATA[xunit]]></category>

		<guid isPermaLink="false">http://thediscoblog.com/?p=738</guid>
		<description><![CDATA[Are you building hip RESTful services in Grails that leverage XML? Because it&#8217;s your bag, do you want to test these services, easily? If so, then I&#8217;ve got a tool for you, baby. Grails&#8217; Functional Testing Plugin makes verifying XML based web services a snap, baby! 
This handy dandy plug-in along with Groovy&#8217;s multi-line Strings [...]]]></description>
			<content:encoded><![CDATA[<p>Are you building hip <a href="http://thediscoblog.com/2009/02/19/restful-grails-services-in-3-steps/">RESTful services in Grails</a> that leverage XML? Because it&#8217;s your bag, do you want to test these services, easily? If so, then I&#8217;ve got a tool for you, baby. Grails&#8217; <a href="http://grails.org/plugin/functional-test">Functional Testing Plugin</a> makes verifying XML based web services a snap, baby! </p>
<p>This handy dandy plug-in along with <a href="http://groovy.codehaus.org/Strings+and+GString">Groovy&#8217;s multi-line <code>String</code>s</a> makes testing XML GETs, POSTs, PUTs, and DELETEs a breeze with as little code as possible. To get started, you must first install the plug-in like so:</p>
<pre><code>$&gt;grails install-plugin functional-test</code></pre>
<p>Next, create a functional test like so:</p>
<pre><code>$&gt;grails create-functional-test MyRESTfulTest</code></pre>
<p>This command will create a new Groovy file in a <code>test/functional</code> directory. The newly generated Groovy class is <a href="http://www.ibm.com/developerworks/java/library/j-pg11094/index.html">an instance of an old style JUnit 3.x test</a> &#8212; accordingly, from here you can implement simple test methods in Groovy that have a lot of special methods at their disposal. </p>
<p>For example, to verify an HTTP GET to a RESTful service you can simply write:</p>
<pre><code>void testRESTfulGET() {
 get('/currentComnWidgRes/1200992722')
 assertStatus 200
 assertContent """&lt;?xml version="1.0" encoding="UTF-8" ?&gt;
   &lt;list&gt;&lt;currentComnWidgRes id="1200992722"&gt;
   &lt;effectiveDate&gt;2009-04-30 00:00:00.0 EDT&lt;/effectiveDate&gt;&lt;nib&gt;4348.23&lt;/nib&gt;
   &lt;/currentComnWidgRes&gt;&lt;/list&gt;"""
}</code></pre>
<p>Note the call to the plug-in&#8217;s <code>get</code> method; plus, note how I can compare the resulting response (in XML too, baby) via the  <code>assertContent</code> call that can take a multi-line <code>String</code> &#8212; isn&#8217;t that a snap?</p>
<p>POSTs are as easy too &#8212; simply leverage the plug-in&#8217;s <code>post</code> method and have at it, man!</p>
<pre><code>void doRESTfulPOST(){
 post("/currentComnWidgRes/"){
  body{
    """&lt;?xml version="1.0" encoding="UTF-8" ?&gt;
      &lt;currentComnWidgResid="6969"&gt;&lt;nib&gt;-90.0&lt;/nib&gt;
      &lt;effectiveDate&gt;2009-04-30&lt;/effectiveDate&gt;
      &lt;/currentComnWidgRes&gt;"""
    }
 }
 assertStatus 200
 assertContent """&lt;?xml version="1.0" encoding="UTF-8" ?&gt;
   &lt;currentComnAcctRes id="6969"&gt;
   &lt;effectiveDate&gt;2009-04-30 00:00:00.0 EDT&lt;/effectiveDate&gt;
   &lt;nib&gt;-90.0&lt;/nib&gt; &lt;/currentComnAcctRes&gt;"""
}</code></pre>
<p>Note, the <code>post</code> method takes a closure where you can set the body via another closure and like before, you can easily verify HTTP status codes and responses. </p>
<p>Running the plug-in is simple too &#8212; simply type:</p>
<pre><code>$&gt;grails functional-tests</code></pre>
<p>This command is quite handy as it fires up an instance of your web application; thus, the Grails Functional Testing plug-in makes functional testing, well, easy. What&#8217;s not to like about that? </p>
                 <p><center>You can now follow <a href="http://twitter.com/thediscoblog">The Disco Blog on Twitter</a>, baby!</center></p>             ]]></content:encoded>
			<wfw:commentRss>http://thediscoblog.com/2009/06/15/grails-hip-tip-testing-restful-services/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Agile testing: what it is</title>
		<link>http://thediscoblog.com/2009/06/11/agile-testing-what-it-is/</link>
		<comments>http://thediscoblog.com/2009/06/11/agile-testing-what-it-is/#comments</comments>
		<pubDate>Thu, 11 Jun 2009 21:29:52 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
		
		<category><![CDATA[Software Development]]></category>

		<category><![CDATA[Agile]]></category>

		<category><![CDATA[agile testing]]></category>

		<category><![CDATA[TDD]]></category>

		<category><![CDATA[testing]]></category>

		<category><![CDATA[traditional testing]]></category>

		<guid isPermaLink="false">http://thediscoblog.com/?p=616</guid>
		<description><![CDATA[In a previous post entitled &#8220;Agile testing: what it&#8217;s not&#8220;, I attempted to define how testing has been traditionally done; with the stage set as the status quo, my definition of agile testing hopefully will make a lot more sense. 
In the winter of 2001, a group of hip industry visionaries came together in an [...]]]></description>
			<content:encoded><![CDATA[<p>In a previous post entitled &#8220;<a href="http://thediscoblog.com/2009/06/04/agile-testing-what-its-not/">Agile testing: what it&#8217;s not</a>&#8220;, I attempted to define how testing has been traditionally done; with the stage set as the status quo, my definition of agile testing hopefully will make a lot more sense. </p>
<p><img style="PADDING-LEFT: 1.0em; PADDING-RIGHT: 0.0em; PADDING-TOP: 0.0em; FLOAT: RIGHT; PADDING-BOTTOM: 0.5em" src="http://thediscoblog.com/images/2009/reflectsm.jpg" alt="development 2.0: high costs!" width="306" height="230"/>In the winter of 2001, a <a href="http://agilemanifesto.org/">group of hip industry visionaries</a> came together in an effort to codify various lightweight development techniques, which had, for the large part, sprung out of a collective frustration over the high rate of project failures which have plagued the software industry for years. In essence, these perceptive individuals knew there was a better way of doing things and they captured the succinctness of what has become Agile in what’s known as the <a href="http://agilemanifesto.org/">Manifesto for Agile Software Development</a>, which explicitly values:</p>
<blockquote><p>
Individuals and interactions over processes and tools<br />
Working software over comprehensive documentation<br />
Customer collaboration over contract negotiation<br />
Responding to change over following a plan
</p></blockquote>
<p>The Manifesto <a href="http://thediscoblog.com/2008/10/17/the-myths-of-agile-testing-myths/">doesn’t discount aspects such as documentation</a>, plans, or tools (in fact, the authors admit these have value); it simply states that collaboration and <a href="http://www.amazon.com/gp/product/0321336380?ie=UTF8&#038;tag=thdibl-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0321336380">responding to change</a><img src="http://www.assoc-amazon.com/e/ir?t=thdibl-20&#038;l=as2&#038;o=1&#038;a=0321336380" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />, for instance, are more important in the overall pursuit of project success.</p>
<p>In many cases, organizations can see a direct link between these principles and software development; however, the link to software testing is often viewed (incorrectly) as tenuous. By examining the manifesto&#8217;s tenets closely, one can begin to discern that they are broad enough to fit all categories and phases one can divide the software life-cycle into. In fact, for those practitioners that have embraced Agile and successfully employed it <em>throughout a software life-cycle</em> have found, Agile testing boils down to two fundamental changes that differentiate it from traditional software testing. Those two facets are:</p>
<ul>
<li><a href="http://www.amazon.com/gp/product/0321534468?ie=UTF8&#038;tag=thdibl-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0321534468">software testing</a><img src="http://www.assoc-amazon.com/e/ir?t=thdibl-20&#038;l=as2&#038;o=1&#038;a=0321534468" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> is no longer a phase &#8212; it is part of the life-cycle &#8212; in fact, in a broad sense, both testing and development combine into what is largely known as <a href="http://www.amazon.com/gp/product/0321146530?ie=UTF8&#038;tag=thdibl-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0321146530">Test Driven Development</a><img src="http://www.assoc-amazon.com/e/ir?t=thdibl-20&#038;l=as2&#038;o=1&#038;a=0321146530" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
</li>
<li>everyone works collaboratively as one team rather than separate groups responsible for various aspects (i.e. everyone is accountable for quality)</li>
</ul>
<p>Thus, while the goal of software testing remains the same, the manner at which  it is achieved changes slightly in favor of a more adaptive approach that seeks to keep all parties informed and responsible.</p>
                 <p><center>You can now follow <a href="http://twitter.com/thediscoblog">The Disco Blog on Twitter</a>, baby!</center></p>             ]]></content:encoded>
			<wfw:commentRss>http://thediscoblog.com/2009/06/11/agile-testing-what-it-is/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Grails hip tip: logging SQL</title>
		<link>http://thediscoblog.com/2009/06/08/grails-hip-tip-logging-sql/</link>
		<comments>http://thediscoblog.com/2009/06/08/grails-hip-tip-logging-sql/#comments</comments>
		<pubDate>Mon, 08 Jun 2009 21:57:23 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
		
		<category><![CDATA[Groovy]]></category>

		<category><![CDATA[development 2.0]]></category>

		<category><![CDATA[grails]]></category>

		<category><![CDATA[hibernate]]></category>

		<category><![CDATA[java]]></category>

		<category><![CDATA[metaprogramming]]></category>

		<category><![CDATA[open source]]></category>

		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://thediscoblog.com/?p=656</guid>
		<description><![CDATA[When working with Grails (especially, when slapping it over legacy database, man) it&#8217;s often helpful to see the hip SQL the framework generates when manipulating domain objects. As mapping a legacy database to Grails can be tricky (but indeed, solvable, baby!), seeing generated SQL can unveil incorrect mapping, etc. 
Luckily, you can easily enable SQL [...]]]></description>
			<content:encoded><![CDATA[<p>When working with <a href="http://www.grails.org/">Grails</a> (especially, when slapping it over legacy database, man) it&#8217;s often helpful to see the hip SQL the framework generates when manipulating <a href="http://grails.org/doc/1.1/ref/Database%20Mapping/Usage.html">domain objects</a>. As mapping a legacy database to Grails can be tricky (but indeed, solvable, baby!), seeing generated SQL can unveil incorrect mapping, etc. </p>
<p>Luckily, you can easily enable SQL logging <em>without</em> having to mess with <a href="http://logging.apache.org/log4j/1.2/index.html">Log4J</a> configurations (i.e. debug, error, warn &#8220;packages blah blah&#8221;).  In the <code>DataSource.groovy</code> file in your project&#8217;s <code>grails-app/conf</code> directory, simply add the <code>loggingSql</code> variable to a desired <code>dataSource</code> closure (that is, you can enable this feature for a particular environment or all of them) like so:</p>
<pre><code>dataSource {
  //blah blah
  loggingSql = true
}</code></pre>
<p>After that, you&#8217;ll notice that all SQL statements Grails (or really, <a href="http://www.grails.org/Hibernate+Integration">Hibernate</a>) utilizes will be logged to whichever <code>appender</code> you&#8217;ve configured (i.e. <code>System.out</code>, by default). This little tip has proved quite copacetic for me, man! Can you dig it? </p>
                 <p><center>You can now follow <a href="http://twitter.com/thediscoblog">The Disco Blog on Twitter</a>, baby!</center></p>             ]]></content:encoded>
			<wfw:commentRss>http://thediscoblog.com/2009/06/08/grails-hip-tip-logging-sql/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Agile testing: what it&#8217;s not</title>
		<link>http://thediscoblog.com/2009/06/04/agile-testing-what-its-not/</link>
		<comments>http://thediscoblog.com/2009/06/04/agile-testing-what-its-not/#comments</comments>
		<pubDate>Thu, 04 Jun 2009 21:00:34 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
		
		<category><![CDATA[Software Development]]></category>

		<category><![CDATA[Agile]]></category>

		<category><![CDATA[bdd]]></category>

		<category><![CDATA[TDD]]></category>

		<category><![CDATA[testing]]></category>

		<category><![CDATA[waterfall]]></category>

		<guid isPermaLink="false">http://thediscoblog.com/?p=611</guid>
		<description><![CDATA[Because it&#8217;s my bag, I&#8217;ve been asked on more than one occasion the question: &#8220;what is agile testing?&#8221; &#8212; that is, what does Agile mean to traditional QA teams? Usually, the person asking the question is looking for a one word answer; however, it isn&#8217;t that easy. While I will answer the question over the [...]]]></description>
			<content:encoded><![CDATA[<p><img style="PADDING-LEFT: 1.0em; PADDING-RIGHT: 0.0em; PADDING-TOP: 0.0em; FLOAT: RIGHT; PADDING-BOTTOM: 0.5em" src="http://thediscoblog.com/images/2009/laughing01sm.jpg" alt="development 2.0: high costs!" width="202" height="304"/>Because it&#8217;s my bag, I&#8217;ve been asked on more than one occasion the question: &#8220;what is <a href="http://en.wikipedia.org/wiki/Agile_testing">agile testing</a>?&#8221; &#8212; that is, what does <a href="http://en.wikipedia.org/wiki/Agile_software_development">Agile</a> mean to traditional QA teams? Usually, the person asking the question is looking for a one word answer; however, it isn&#8217;t that easy. While I will answer the question over the course of a few posts, perhaps before describing <a href="http://thediscoblog.com/2008/10/17/the-myths-of-agile-testing-myths/">what agile testing means</a>, it might help to define what traditional software testing is. By doing so, the comparison unveils rather stark, yet quite <a href="http://thediscoblog.com/2008/10/16/lost-in-translation-stop-using-different-languages/">exciting differences</a>.  The comparison also maps a path that leads to a greater understanding of how agile testing both addresses the challenges of software testing and complements a highly efficient software development life-cycle.</p>
<p><a href="http://en.wikipedia.org/wiki/Software_testing">Software testing</a>, in the traditional sense of the phrase, is usually a phase towards the <a href="http://thediscoblog.com/2008/10/29/titanic-software-testing-goofs/">latter cycle of product development</a>; that is, it happens somewhere before product delivery and after the development team finishes writing code. In fact, in many cases, traditional software testing is last check that &#8220;ensures a product is ready for delivery&#8221; (i.e. that the code is of high quality, has few to no defects, is ready for customer interactions, etc). Yet, as anyone who has ever lived through this process knows</p>
<ul>
<li>it&#8217;s impossible to imbue quality into something that&#8217;s already been built (that is, quality is something that&#8217;s built in, man)</li>
<li>the longer the development cycle lasts, the harder it is to fully test the finished product (that is, at some point the time required to fully test a software application exceeds the expectations for delivery)</li>
<li> the cost of going through the &#8220;find and fix the bug&#8221; cycle is by this time increasing by the day (i.e it is a well known facet of software development that the cost to address a bug increases at a tremendous rate the longer it resides in software)</li>
</ul>
<p>Plus, this last step before going live often becomes a <a href="http://thediscoblog.com/2008/09/05/crowd-sourced-functional-testing-just-might-work/">veritable gate</a> (sometimes even referred to as the &#8220;quality gate&#8221;), which frequently pits two competing expectations (and their respective organizations) against each other. On one side, development is motivated to push their product live and QA is motivated to fix issues before pushing the product live (which means more work for development!).  Thus, one side is appearing to push one way and the other side is appearing to push the other way.  In many cases, this competing interest yields walls that unfortunately act as a barrier to efficiencies, which then pits IT against the business (who is motivated to push quality features live quickly).  Now three organizations are pushing against each other!</p>
<p>Thus, traditional software testing&#8217;s goal of providing a means to ensure high quality code is released is quite noble; however, in reality, this hip goal is quite challenging to do well in an efficient manner.  </p>
                 <p><center>You can now follow <a href="http://twitter.com/thediscoblog">The Disco Blog on Twitter</a>, baby!</center></p>             ]]></content:encoded>
			<wfw:commentRss>http://thediscoblog.com/2009/06/04/agile-testing-what-its-not/feed/</wfw:commentRss>
		</item>
		<item>
		<title>RESTing easy with Groovy&#8217;s HTTPBuilder</title>
		<link>http://thediscoblog.com/2009/06/02/resting-easy-with-groovys-httpbuilder/</link>
		<comments>http://thediscoblog.com/2009/06/02/resting-easy-with-groovys-httpbuilder/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 00:41:16 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
		
		<category><![CDATA[Dynamic Languages]]></category>

		<category><![CDATA[Groovy]]></category>

		<category><![CDATA[Agile]]></category>

		<category><![CDATA[HTTPBuilder]]></category>

		<category><![CDATA[java]]></category>

		<category><![CDATA[open source]]></category>

		<category><![CDATA[rest]]></category>

		<guid isPermaLink="false">http://thediscoblog.com/?p=635</guid>
		<description><![CDATA[Interacting with RESTful web services couldn&#8217;t be easier with Groovy&#8217;s HTTPBuilder. This handy library has a slick extension dubbed RESTClient, which facilitates handling all aspects of REST (such as GET and POST) quite nicely; plus, parsing and building of both requests and responses in either JSON or XML is a breeze, baby! 
Check it out&#8211; [...]]]></description>
			<content:encoded><![CDATA[<p>Interacting with <a href="http://thediscoblog.com/2009/05/25/1-2-3-storage-with-s3/">RESTful</a> web services couldn&#8217;t be easier with <a href="http://groovy.codehaus.org/">Groovy</a>&#8217;s <a href="http://groovy.codehaus.org/modules/http-builder/index.html">HTTPBuilder</a>. This handy library has a slick extension dubbed <a href="http://groovy.codehaus.org/modules/http-builder/doc/rest.html">RESTClient</a>, which facilitates handling all aspects of <a href="http://thediscoblog.com/2009/02/19/restful-grails-services-in-3-steps/">REST</a> (such as GET and POST) quite nicely; plus, parsing and building of both requests and responses in either <a href="http://www.json.org/">JSON</a> or XML is a breeze, baby! </p>
<p>Check it out&#8211; first, you must create an instance of <code> RESTClient</code> like so:</p>
<pre><code>def zorillo = new RESTClient("http://acme.zorrillo.com/")</code></pre>
<p>Because it&#8217;s my bag, I&#8217;m interacting with a service whose base URI is <code>acme.zorrillo.com</code>. With this instance, I can easily obtain information via an <a href="http://www.ibm.com/developerworks/edu/j-dw-java-rest-i.html">HTTP GET</a> like so:</p>
<pre><code>def res = zorillo.get(path:"widget/1010081127")</code></pre>
<p>In the above code, I&#8217;ve issued a GET request to <code>http://acme.zorrillo.com/widget/1010081127</code>, which returns an XML response that looks something like this:</p>
<pre><code>&lt;widget id='1010081127'&gt;
 &lt;type&gt;JPM&lt;/type&gt;
&lt;/widget&gt;</code></pre>
<p>Interestingly, with an instance of a response (in my case, <code>res</code>), you can grab an instance of the returned XML via the <code>data</code> property, which is the root node returned via Groovy&#8217;s hip <code><a href="http://www.ibm.com/developerworks/java/library/j-pg05199/index.html">XMLSlurper</a></code>. Thus, <code>data</code> points to the <code>widget</code> element; consequently, I can grab the attribute <code>id</code> and the corresponding element&#8217;s value quite easily:</p>
<pre><code>assert res.data.@id.text() == '1010081127'
assert res.data.type.text() == 'JPM'</code></pre>
<p>Need to post some data? That couldn&#8217;t be easier either, man &#8212; simply use <code> RESTClient</code>&#8217;s <code>post</code> method, which allows you to use a <code>MarkupBuilder</code> to construct corresponding XML like so:</p>
<pre><code>def ans = zorillo.post(path:"widget/",
		requestContentType: XML,
         body: {
           widget(id:'129033'){
             type("TFR")
          }
        })</code></pre>
<p>Note in this case, the POST URL is <code>http://acme.zorrillo.com/widget/</code> and I&#8217;m posting a document which looks like so:</p>
<pre><code>&lt;widget id='129033'&gt;
 &lt;type&gt;TFR&lt;/type&gt;
&lt;/widget&gt;</code></pre>
<p>But, because I&#8217;m using Groovy&#8217;s <code>MarkupBuilder</code> I don&#8217;t have to deal with XML directly &#8212; not bad, eh? The <code>/widget</code> service returns an XML document of the created widget if everything works; thus, I can verify things are kosher like so:</p>
<pre><code>assert ans.status == 200
assert ans.data.@id.text() == '129033'
assert ans.data.type.text() == 'TFR'</code></pre>
<p>How&#8217;s that for easy, man? The next time you need to interact with a <a href="http://thediscoblog.com/2008/07/22/restful-services-without-the-sweat/">RESTful</a> web service, consider using Groovy&#8217;s HTTPBuilder &#8212; it&#8217;s a snap! </p>
                 <p><center>You can now follow <a href="http://twitter.com/thediscoblog">The Disco Blog on Twitter</a>, baby!</center></p>             ]]></content:encoded>
			<wfw:commentRss>http://thediscoblog.com/2009/06/02/resting-easy-with-groovys-httpbuilder/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Scaling with Terracotta</title>
		<link>http://thediscoblog.com/2009/05/29/scaling-with-terracotta/</link>
		<comments>http://thediscoblog.com/2009/05/29/scaling-with-terracotta/#comments</comments>
		<pubDate>Fri, 29 May 2009 19:49:16 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
		
		<category><![CDATA[Podcast]]></category>

		<category><![CDATA[java]]></category>

		<category><![CDATA[javaworld]]></category>

		<category><![CDATA[open source]]></category>

		<category><![CDATA[Terracotta]]></category>

		<guid isPermaLink="false">http://thediscoblog.com/?p=601</guid>
		<description><![CDATA[I recently had the pleasure of chatting with Alex Miller, who is a respected Java concurrency and scalability enthusiast  (and fellow NFJS speaker) who works on Terracotta, an open source, Java-based clustering system. In this JavaWorld sponsored talk, Alex demystifies Terracotta, explaining the programming magic that enables enterprise customers to run 50 to 100 [...]]]></description>
			<content:encoded><![CDATA[<p>I recently had the pleasure of chatting with <a href="http://tech.puredanger.com/">Alex Miller</a>, who is a respected Java concurrency and scalability enthusiast  (and fellow NFJS speaker) who works on Terracotta, an open source, Java-based clustering system. In this <a href="http://www.javaworld.com/podcasts/jtech/2009/041309jtech-terracotta.html">JavaWorld sponsored talk</a>, Alex demystifies Terracotta, explaining the programming magic that enables enterprise customers to run 50 to 100 JVMs on a single application server instance. Alex also talks about Terracotta&#8217;s &#8220;sweet spot&#8221; &#8212; storing session data off of the database &#8212; and Terracotta 3.0, which promises new features that he says will eliminate certain scalability barriers.</p>
                 <p><center>You can now follow <a href="http://twitter.com/thediscoblog">The Disco Blog on Twitter</a>, baby!</center></p>             ]]></content:encoded>
			<wfw:commentRss>http://thediscoblog.com/2009/05/29/scaling-with-terracotta/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Forcing a failure in easyb</title>
		<link>http://thediscoblog.com/2009/05/27/forcing-a-failure-in-easyb/</link>
		<comments>http://thediscoblog.com/2009/05/27/forcing-a-failure-in-easyb/#comments</comments>
		<pubDate>Wed, 27 May 2009 22:23:32 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
		
		<category><![CDATA[Developer Testing]]></category>

		<category><![CDATA[Groovy]]></category>

		<category><![CDATA[bdd]]></category>

		<category><![CDATA[easyb]]></category>

		<category><![CDATA[java]]></category>

		<category><![CDATA[open source]]></category>

		<category><![CDATA[programming]]></category>

		<category><![CDATA[TDD]]></category>

		<category><![CDATA[testing]]></category>

		<category><![CDATA[unit testing]]></category>

		<guid isPermaLink="false">http://thediscoblog.com/?p=648</guid>
		<description><![CDATA[Occasionally during the course of writing a hip easyb story or specification, you might run into a condition that requires a forced failure. That is, based upon some behavior of the code under verification, you might explicitly want easyb to fail a particular scenario. For example, because it&#8217;s my bag, I have a then phrase [...]]]></description>
			<content:encoded><![CDATA[<p>Occasionally during the course of writing a hip <A HREF="http://easyb.org/">easyb story</A> or <A HREF="http://easyb.org/howtobb.html">specification</A>, you might run into a condition that requires a <I>forced failure</I>. That is, based upon some behavior of the code under verification, you might explicitly want easyb to fail a particular scenario. For example, because it&#8217;s my bag, I have a <code><A HREF="http://easyb.org/dsls.html">then</A></code> phrase within a scenario that contains a conditional &#8212; if something is true then verify some result; however, if something is false, then <A HREF="http://thediscoblog.com/2009/01/18/staying-exceptionally-wet/">force a failure</A>. It can be coded like so:</p>
<pre><code>then "the cell returned should be a date type", {
 sndcells = sheet.getRow(1)
 dtype = sndcells[2].getType()
 if(dtype == CellType.DATE){
  dt = sndcells[2].getDate()
  dt.getTime().shouldBe 1201737600000
 }else{
  fail "the type obtained wasn't a date, but was a ${dtype}"
 }
}</code></pre>
</p>
<p>In the code above, which is a copasetic snippet of a larger story on <A HREF="http://jexcelapi.sourceforge.net/">parsing an Excel</A> template, I&#8217;m verifying that I can obtain a <code>Date</code> type from a particular cell represented as a string (i.e. 1/31/2009). As you can see, if the <code>dtype</code> variable is of a desired type (i.e. <code>Date</code>), I can easily validate it via the <code>shouldBe</code> phrase. If for some reason, however, the cell I expect <I>isn&#8217;t</I> a date, I can <A HREF="http://thediscoblog.com/2008/07/02/its-ok-to-wet-yourself-every-once-in-awhile/">force easyb to fail</A> by using the <code>fail</code> phrase, which takes a <code>String</code> (note how you are free to use <A HREF="http://groovy.codehaus.org/">Groovy</A>&#8217;s groovy <code><A HREF="http://www.theserverside.com/news/thread.tss?thread_id=44442">GString</A></code> feature in the phrase as I&#8217;ve done with <code>${dtype}</code>).</p>
<p>Of course, I could have omitted the <code>else</code> clause entirely; however, in that case, I wouldn&#8217;t explicitly know that a particular scenario failed! Can you dig it, baby?</p>
                 <p><center>You can now follow <a href="http://twitter.com/thediscoblog">The Disco Blog on Twitter</a>, baby!</center></p>             ]]></content:encoded>
			<wfw:commentRss>http://thediscoblog.com/2009/05/27/forcing-a-failure-in-easyb/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
