<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>ISerializable - Roy Osherove&amp;#39;s Blog</title><link>http://weblogs.asp.net/rosherove/default.aspx</link><description>Unit Testing, Agile Development, Architecture, Team System &amp;amp; .NET  - By Roy Osherove</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><image><link>http://www.ISerializable.com</link><url>http://files.osherove.com/Roy_Pic_BW_Small.jpg</url><title>Roy Osherove</title></image><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/Iserializable" type="application/rss+xml" /><feedburner:emailServiceId>2059</feedburner:emailServiceId><feedburner:feedburnerHostname>http://www.feedburner.com</feedburner:feedburnerHostname><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site.</feedburner:browserFriendly><item><title>Graphic Designer Wanted</title><link>http://feeds.feedburner.com/~r/Iserializable/~3/412915179/graphic-designer-wanted.aspx</link><pubDate>Mon, 06 Oct 2008 15:55:39 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6659409</guid><dc:creator>RoyOsherove</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://weblogs.asp.net/rosherove/rsscomments.aspx?PostID=6659409</wfw:commentRss><comments>http://weblogs.asp.net/rosherove/archive/2008/10/06/graphic-designer-wanted.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://www.typemock.com"&gt;We&lt;/a&gt; are looking for a part\full time graphics designer.&lt;/p&gt;  &lt;p&gt;the initial need is to create great icons, design logos and such. If that person also has web design skills, all the better, as our site is going to be revamped and redone.&lt;/p&gt;  &lt;p&gt;We have no problem working with people offshore and online, so if you're interested or know someone who's amazing at this kind of stuff, email me at &lt;strong&gt;roy AT osherove.com&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6659409" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/Iserializable?a=riFC2Z"&gt;&lt;img src="http://feeds.feedburner.com/~a/Iserializable?i=riFC2Z" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=HWLiM"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=HWLiM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=QJc3M"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=QJc3M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=T5Hdm"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=T5Hdm" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Iserializable/~4/412915179" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/rosherove/archive/tags/.NET/default.aspx">.NET</category><feedburner:origLink>http://weblogs.asp.net/rosherove/archive/2008/10/06/graphic-designer-wanted.aspx</feedburner:origLink></item><item><title>Deadlock Challenge</title><link>http://feeds.feedburner.com/~r/Iserializable/~3/412572574/deadlock-challenge.aspx</link><pubDate>Mon, 06 Oct 2008 07:38:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6658999</guid><dc:creator>RoyOsherove</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://weblogs.asp.net/rosherove/rsscomments.aspx?PostID=6658999</wfw:commentRss><comments>http://weblogs.asp.net/rosherove/archive/2008/10/06/deadlock-challenge.aspx#comments</comments><description>&lt;p&gt;If you're into multi threading, &lt;a href="http://blog.typemock.com/2008/10/simple-deadlock-challenge.html"&gt;how about a little deadlock challenge&lt;/a&gt;?&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6658999" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/Iserializable?a=uUYxs0"&gt;&lt;img src="http://feeds.feedburner.com/~a/Iserializable?i=uUYxs0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=V18HM"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=V18HM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=hbPSM"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=hbPSM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=gaBom"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=gaBom" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Iserializable/~4/412572574" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/rosherove/archive/tags/.NET/default.aspx">.NET</category><feedburner:origLink>http://weblogs.asp.net/rosherove/archive/2008/10/06/deadlock-challenge.aspx</feedburner:origLink></item><item><title>Isolator feature focus: Recursive Fakes</title><link>http://feeds.feedburner.com/~r/Iserializable/~3/411425975/isolator-feature-focus-recursive-fakes.aspx</link><pubDate>Sat, 04 Oct 2008 22:17:05 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6657903</guid><dc:creator>RoyOsherove</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://weblogs.asp.net/rosherove/rsscomments.aspx?PostID=6657903</wfw:commentRss><comments>http://weblogs.asp.net/rosherove/archive/2008/10/04/isolator-feature-focus-recursive-fakes.aspx#comments</comments><description>&lt;p&gt;Here’s another feature &lt;a href="http://www.typemock.com"&gt;Typemock Isolator&lt;/a&gt; has that no one else currently has: the ability to return fake objects from properties recursively (without the use of an auto mocking container for such a feat). this saved &lt;strong&gt;a lot&lt;/strong&gt; of reperitive test code of creating stubs that return stubs that return some custom result.&lt;/p&gt;  &lt;p&gt;For example, an object person has a manager which is also a person (which of course also has a manager etc..)&lt;/p&gt;  &lt;p&gt;here’s how you can use this feature:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;[Test,Isolated]     &lt;br /&gt;public void test()      &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Person person = Isolate.Fake.Instance&amp;lt;Person&amp;gt;(&lt;font color="#ff0000"&gt;Members.ReturnRecursiveFakes&lt;/font&gt;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Assert.IsNotNull(person.Manager.Manager.Manager.Manager);      &lt;br /&gt;} &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;This test will pass (Manager is null by default. look at the class in question below:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;class Person     &lt;br /&gt;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public string Name      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get { return name; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public Person Manager     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get { return manager; }      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private string name;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private Person manager;      &lt;br /&gt;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Here is how you can return stub results from properties of the stubbed objects:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;[Test,Isolated]     &lt;br /&gt;public void test()      &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Person person = Isolate.Fake.Instance&amp;lt;Person&amp;gt;(Members.ReturnRecursiveFakes);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#ff0000"&gt;Isolate.WhenCalled(() =&amp;gt; person.Manager.Manager.Name)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .WillReturn(&amp;quot;roy&amp;quot;);&lt;/font&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Assert.AreEqual(&amp;quot;roy&amp;quot;,person.Manager.Manager.Name);      &lt;br /&gt;} &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Notice that:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;p&gt;&lt;/p&gt;      &lt;p&gt;By saying “ReturnRecursiveFakes” we are actually saying “I don’t care who uses this object and how from now on. It will return a fake when needed from all properties and the properties of the stubs as well.&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;We can still set stub results on the fakes on any level&lt;/p&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;If we wanted to only fake the Manager name and leave everything else intact we could just use a live object in the test like this:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;[Test,Isolated]     &lt;br /&gt;public void test()      &lt;br /&gt;{      &lt;br /&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160; Person person =&lt;font color="#ff0000"&gt; new Person();&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160;&amp;#160; Isolate.WhenCalled(() =&amp;gt; person.Manager.Manager.Name)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .WillReturn(&amp;quot;roy&amp;quot;);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Assert.AreEqual(&amp;quot;roy&amp;quot;,person.Manager.Manager.Name);      &lt;br /&gt;} &lt;/font&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6657903" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/Iserializable?a=J3FtCu"&gt;&lt;img src="http://feeds.feedburner.com/~a/Iserializable?i=J3FtCu" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=rU1ZM"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=rU1ZM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=Ga2QM"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=Ga2QM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=ipbjm"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=ipbjm" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Iserializable/~4/411425975" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/rosherove/archive/tags/Unit+Testing/default.aspx">Unit Testing</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile/default.aspx">Agile</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Typemock/default.aspx">Typemock</category><feedburner:origLink>http://weblogs.asp.net/rosherove/archive/2008/10/04/isolator-feature-focus-recursive-fakes.aspx</feedburner:origLink></item><item><title>BDD: Behavior vs. Spec Frameworks</title><link>http://feeds.feedburner.com/~r/Iserializable/~3/411409241/bdd-behavior-vs-spec-frameworks.aspx</link><pubDate>Sat, 04 Oct 2008 21:49:01 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6657884</guid><dc:creator>RoyOsherove</dc:creator><slash:comments>8</slash:comments><wfw:commentRss>http://weblogs.asp.net/rosherove/rsscomments.aspx?PostID=6657884</wfw:commentRss><comments>http://weblogs.asp.net/rosherove/archive/2008/10/04/bdd-behavior-vs-spec-frameworks.aspx#comments</comments><description>&lt;p&gt;In my search to understand a little more about BDD and BDD frameworks, one gem that I gleaned is that there is an important distinction between “Spec” and “Behavior” frameworks. “Spec” is intended for the unit level granularity (like unit tests) and “Behavior” is intended to relay user stories at the application level.&lt;/p&gt;  &lt;p&gt;This makes sense to me because in all the BDD discussions I’ve seen I had a hard time understanding why you want to put an application level story on top of a unit level story. it just didn’t make sense. &lt;/p&gt;  &lt;p&gt;So here’s what I get so far (correct me):&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;I can use Behavior Frameworks &lt;/strong&gt;to create stories that use the same shared language that my customer would understand, at the application level use cases. Most frameworks that support this allow you to “code” this up which still has a lot of friction for most people to read so it’s a problem.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;I can use Spec Frameworks &lt;/strong&gt;to replace the language I use in my current unit tests so that instead of “testing” I am defining “behavior” of a component at the unit level. this is usually almost a purely syntactical change in nature.&lt;/p&gt;  &lt;p&gt;Some Frameworks have APIs for both Specs and Behaviors (like RSpec). Some only have APIs for one of them (which ones?)&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6657884" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/Iserializable?a=bsIBtG"&gt;&lt;img src="http://feeds.feedburner.com/~a/Iserializable?i=bsIBtG" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=pSb4M"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=pSb4M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=8Y2cM"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=8Y2cM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=aV3Um"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=aV3Um" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Iserializable/~4/411409241" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/rosherove/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile/default.aspx">Agile</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/BDD/default.aspx">BDD</category><feedburner:origLink>http://weblogs.asp.net/rosherove/archive/2008/10/04/bdd-behavior-vs-spec-frameworks.aspx</feedburner:origLink></item><item><title>Agile Testing tools List</title><link>http://feeds.feedburner.com/~r/Iserializable/~3/410638201/agile-testing-tools-list.aspx</link><pubDate>Fri, 03 Oct 2008 21:55:32 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6656860</guid><dc:creator>RoyOsherove</dc:creator><slash:comments>20</slash:comments><wfw:commentRss>http://weblogs.asp.net/rosherove/rsscomments.aspx?PostID=6656860</wfw:commentRss><comments>http://weblogs.asp.net/rosherove/archive/2008/10/03/agile-testing-tools-list.aspx#comments</comments><description>&lt;p&gt;Working on an appendix &lt;a href="http://www.ArtOfUnitTesting.com"&gt;for my book&lt;/a&gt;, with a list of tools and frameworks you should care about. Tell me if I missed anything:&lt;/p&gt;  &lt;p&gt;· Mock Frameworks&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;o Moq&lt;/p&gt;    &lt;p&gt;o Rhino Mocks&lt;/p&gt;    &lt;p&gt;o Typemock Isolator&lt;/p&gt;    &lt;p&gt;o NMock&lt;/p&gt;    &lt;p&gt;o NUnit.Mocks&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;· Test Frameworks&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;o MS Test&lt;/p&gt;    &lt;p&gt;o NUnit&lt;/p&gt;    &lt;p&gt;o MbUnit &lt;/p&gt;    &lt;p&gt;o XUnit&lt;/p&gt;    &lt;p&gt;o Gallio&amp;#160; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;· Dependency Injection and Ioc Containers&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;o StructureMap&lt;/p&gt;    &lt;p&gt;o Microsoft Unity&lt;/p&gt;    &lt;p&gt;o Castle Windsor&lt;/p&gt;    &lt;p&gt;o Common IServiceLocator Framework&lt;/p&gt;    &lt;p&gt;o Managed Extensibility Framework&lt;/p&gt;    &lt;p&gt;o Spring.NET&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;o AutoFac&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;· Database testing&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;o Use Integration testing&lt;/p&gt;    &lt;p&gt;o MbUnit,NUnit,XUnit Rollback attributes&lt;/p&gt;    &lt;p&gt;o TransactionScope&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;· Web Testing&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;o Ivonna and Typemock&lt;/p&gt;    &lt;p&gt;o Team System Web Test&lt;/p&gt;    &lt;p&gt;o NUnitASP&lt;/p&gt;    &lt;p&gt;o Watin&lt;/p&gt;    &lt;p&gt;o Watir&lt;/p&gt;    &lt;p&gt;o Selenium&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;· UI Testing&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;o NUnitForms&lt;/p&gt;    &lt;p&gt;o Project White&lt;/p&gt;    &lt;p&gt;o Team System UI Tests&lt;/p&gt;    &lt;p&gt;o Typemock Isolator&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;· Threading Related Testing&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;o Microsoft Chess&lt;/p&gt;    &lt;p&gt;o Typemock Racer&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;o Osherove.ThreadTester&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;· General Testing&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;o Pex&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;· Acceptance Testing&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;o Fit &amp;amp; Fitnesse&lt;/p&gt;    &lt;p&gt;o Watin and Watir and selenium&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6656860" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/Iserializable?a=AkHZSK"&gt;&lt;img src="http://feeds.feedburner.com/~a/Iserializable?i=AkHZSK" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=M7NTM"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=M7NTM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=x9euM"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=x9euM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=XQAym"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=XQAym" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Iserializable/~4/410638201" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/rosherove/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile/default.aspx">Agile</category><feedburner:origLink>http://weblogs.asp.net/rosherove/archive/2008/10/03/agile-testing-tools-list.aspx</feedburner:origLink></item><item><title>Isolator feature focus: Live objects in unit tests</title><link>http://feeds.feedburner.com/~r/Iserializable/~3/408966179/isolator-feature-focus-live-objects-in-unit-tests.aspx</link><pubDate>Thu, 02 Oct 2008 05:37:06 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6651833</guid><dc:creator>RoyOsherove</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://weblogs.asp.net/rosherove/rsscomments.aspx?PostID=6651833</wfw:commentRss><comments>http://weblogs.asp.net/rosherove/archive/2008/10/02/isolator-feature-focus-live-objects-in-unit-tests.aspx#comments</comments><description>&lt;p&gt;Here is one feature that sets Typemock Isolator apart from all the other frameworks, that has nothing to do with legacy code: Live Objects.&lt;/p&gt;  &lt;p&gt;This feature allows you to just “new” up an instance of an object, if you can, and then fake method results on it, and send it somewhere into production code:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt; [TestMethod, Isolated]&lt;br /&gt; public void DoSomething_LoggerHasFullDisk_NothingHappens()&lt;br /&gt; {&lt;br /&gt;&lt;font color="#ff0000"&gt;   RealLogger logger = new RealLogger();&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;   Isolate.WhenCalled(()=&amp;gt; logger.IsDiskFull).WillReturn(true);&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;pre&gt;   new MyClass(logger).DoSomething();..&lt;br /&gt; &lt;br /&gt; }&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;With any other framework you are forced to “mock” or “stub” the RealLogger class to begin using it. Removing this need makes for clearer more elegant tests. This feature is already available in &lt;a href="http://blog.typemock.com/2008/09/typemock-isolator-51-released.html"&gt;Isolator 5.1 that was released this week.&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6651833" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/Iserializable?a=1dHgRS"&gt;&lt;img src="http://feeds.feedburner.com/~a/Iserializable?i=1dHgRS" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=3BgbM"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=3BgbM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=5xjZM"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=5xjZM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=I4bBm"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=I4bBm" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Iserializable/~4/408966179" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/rosherove/archive/tags/Unit+Testing/default.aspx">Unit Testing</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile/default.aspx">Agile</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Typemock/default.aspx">Typemock</category><feedburner:origLink>http://weblogs.asp.net/rosherove/archive/2008/10/02/isolator-feature-focus-live-objects-in-unit-tests.aspx</feedburner:origLink></item><item><title>Unit Testing decoupled from TDD as well== Adoption</title><link>http://feeds.feedburner.com/~r/Iserializable/~3/408254309/unit-testing-decoupled-from-tdd-as-well-adoption.aspx</link><pubDate>Wed, 01 Oct 2008 13:27:22 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6650125</guid><dc:creator>RoyOsherove</dc:creator><slash:comments>16</slash:comments><wfw:commentRss>http://weblogs.asp.net/rosherove/rsscomments.aspx?PostID=6650125</wfw:commentRss><comments>http://weblogs.asp.net/rosherove/archive/2008/10/01/unit-testing-decoupled-from-tdd-as-well-adoption.aspx#comments</comments><description>&lt;p&gt;The discussion on the future of unit testing for the masses has shifted from the standard “if they are too stupid to learn it, we don’t want them” to “TDD without good design will make really bad tests”. and this is a good thing. it’s a good thing because it secretly implies that if you could write Good Unit Tests, regardless of design, then teaching design as a separate thing should not pose a problem.&lt;/p&gt;  &lt;p&gt;Discussion so far:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://weblogs.asp.net/rosherove/archive/2008/09/26/unit-testing-decoupled-from-design-adoption.aspx"&gt;Unit Testing Decoupled From Design == adoption&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://weblogs.asp.net/rosherove/archive/2008/09/20/goodbye-mocks-farewell-stubs.aspx"&gt;Goodbye mocks, Farewell stubs&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;But first, let’s make one thing clear: &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;TDD is NOT Unit Testing.&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;My previous post was not “TDD decoupled from design==adoption”, it was “Unit testing decoupled from design == adoption&lt;/p&gt;  &lt;p&gt;TDD is (technically) about &lt;strong&gt;when&lt;/strong&gt; you write the unit test.&lt;/p&gt;  &lt;p&gt;You can still write crappy tests in TDD mode. With good design. Unit Tests deserve a good book about them without TDD in it because the current books about TDD suffer from lack of SRP.&lt;/p&gt;  &lt;p&gt;On the other hand you can still write good tests, without TDD. The design might make them a little longer, but if you learn to write unit tests well, this should not pose a problem.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;Learn &lt;a href="http://www.infoq.com/news/2008/03/cockburn-testing-guts"&gt;Good Unit Testing&lt;/a&gt; regardless of TDD and Design&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;people can start learning unit testing before learning TDD. they learn the silly stuff (the kind udi looks down upon) in an hour, and then they get to the hard stuff : making the tests readable, maintainable and trust worthy.&amp;#160; these are &lt;strong&gt;separate&lt;/strong&gt; properties that can be learned to be done regardless of design, since test naming convention, refactoring and correctness can be learned in separate.&lt;/p&gt;  &lt;p&gt;The only reason it’s really hard to teach in separate today is because as those devs get to test real world code they have to start dealing with real world dependencies and that it the barrier that usually stops most people. having “intermediate” frameworks in place such as JMockit and Typemock Isolator can help in that regard, keeping people focused on the task at hand and deferring the need to learn other types of design for a time that is better. The idea is to let the developer &lt;em&gt;choose&lt;/em&gt; when to learn which technique:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Learn how to write good unit tests (&lt;a href="http://www.manning.com/osherove/"&gt;book&lt;/a&gt;)&lt;/li&gt;    &lt;li&gt;Learn Good Design technique (give me a link to a good starter book!)&lt;/li&gt;    &lt;li&gt;Learn Test Driven Development (&lt;a href="http://www.amazon.com/exec/obidos/ASIN/0735619484/iserializable-20"&gt;book&lt;/a&gt;)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I want a developer to grok each one of those things to a very deep level, but today’s “market” wants them to learn it all in one go. Since each one is its own little art form, are you really surprised to learn that most of the mass population is not there yet?&lt;/p&gt;  &lt;p&gt;If people think that the only way to write good unit tests that are not worthless is by doing them TDD style with SOLID design, they are showing several things to me:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;they don’t get what “good” unit testing is&lt;/li&gt;    &lt;li&gt;They don’t “get” what value good tests have outside the context of TDD&lt;/li&gt;    &lt;li&gt;they guide a community who reads them down a path of “all or nothing”. which for most people begets “nothing”.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Field notes:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Udi &lt;a href="http://www.udidahan.com/2008/09/30/unit-testing-for-developers-and-managers/"&gt;writes&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“If logic is duplicated, if the code is tightly coupled, if there is no separation of concerns, the unit tests will be useless - even if they “test” the class in isolation.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;That is wrong in many levels. Let’s start with the fact that a unit test can have a specific value in testing a specific class in isolation, even if the bugs in that class are duplicated on other classes. If Udi does not agree on that, I don’t know what else to say about that. I &lt;strong&gt;wish&lt;/strong&gt;&amp;#160; that what he meant was that all these problems were repeating in the tests, since this is usually why people fail when they start out unit testing: they write crappy tests with bugs, code duplication and lack of isolation (this can all be learned). But he’s not.&amp;#160; It feels like a “purist” view that does not reflect the real world. It must be nice living in an echo chamber!&lt;/p&gt;  &lt;p&gt;Let’s see udi contradict himself in the same post:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“Managers shouldn’t necessarily sacrifice their projects on this altar of learning. Organizations need to find ways for developers to safely practice these techniques as a part of developing their “human resources”. First of all, this needs to be communicated to everyone - that the organization understands the importance of these techniques, the desires of developers to adopt them, and the projects that need to be delivered.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;“…It’s a gradual process.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;That’s the problem Udi. It’s &lt;strong&gt;not&lt;/strong&gt; possible to do it gradually today, because people keep saying that you can’t do things in little chunks. you have to learn it all together. If we were to help developers learn what good unit testing means they could much more easily learn that stuff, and then learn the other stuff. &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Casey &lt;a href="http://devlicio.us/blogs/casey/archive/2008/10/01/testing-is-not-technically-hard-it-is-hard-because-it-requires-clear-thought-and-understanding.aspx"&gt;writes&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“It is not a technical challenge to write a unit test, any half trained monkey could do it. A few attributes, a couple of classes, a few new() statements, and a few Assert statements. We don't need magic mocking frameworks, we don't need any mocking frameworks for 90% of our tests, we don't need application of 12 GoF principles before we can write a test, honestly.&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;Testing and writing automated tests is hard because it requires a strong understanding of the user stories that sit behind your code and project, because it requires you to think as a user and not as a developer, and because it requires you to be able to think of multiple conflicting axioms, test cases and class interactions, and how to cover the weaknesses of each individual test with other complementary tests.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Casey preached about what he sees as the “end game” for unit testing, TDD and Design. where everything is in one great ball of goodness. Or did he?&lt;/p&gt;  &lt;p&gt;Let’s separate these points into better chunks:&lt;/p&gt;  &lt;p&gt;Design related stuff:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;to think of multiple… class interactions &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Good Test related stuff:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Understanding of the user stories&lt;/li&gt;    &lt;li&gt;Think as a user not a developer&lt;/li&gt;    &lt;li&gt;think of multiple conflicting axioms (..?) test cases..&lt;/li&gt;    &lt;li&gt;how to cover the weaknesses of each individual test with other complementation tests.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;TDD related stuff&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;none&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;So, what I gather from casey’s words is that you want your tests to be :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;testing the right thing&lt;/li&gt;    &lt;li&gt;be readable and show intent&lt;/li&gt;    &lt;li&gt;have good coverage&lt;/li&gt;    &lt;li&gt;test or be aware of class interactions (the design related stuff)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;except the last point which is where most of today’s mock frameworks force you to redesign, there is nothing here you can’t learn separated &lt;strong&gt;from &lt;/strong&gt;TDD and SOLID techniques. the interaction stuff is where those other isolation frameworks I mentioned come into place.&lt;/p&gt;  &lt;p&gt;We need to &lt;strong&gt;decouple Good Unit Testing&lt;/strong&gt; from TDD and SOLID. And it seems that not only “noobs”, as a stupid idiot commented thoughtfully on my last post, can benefit from learning this distinction.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6650125" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/Iserializable?a=roC1Wn"&gt;&lt;img src="http://feeds.feedburner.com/~a/Iserializable?i=roC1Wn" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=oYsdM"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=oYsdM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=cec9M"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=cec9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=OmY7m"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=OmY7m" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Iserializable/~4/408254309" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile+Related/default.aspx">Agile Related</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile/default.aspx">Agile</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Art+Of+Unit+Testing/default.aspx">Art Of Unit Testing</category><feedburner:origLink>http://weblogs.asp.net/rosherove/archive/2008/10/01/unit-testing-decoupled-from-tdd-as-well-adoption.aspx</feedburner:origLink></item><item><title>Unit Testing decoupled from Design == Adoption</title><link>http://feeds.feedburner.com/~r/Iserializable/~3/404103849/unit-testing-decoupled-from-design-adoption.aspx</link><pubDate>Fri, 26 Sep 2008 20:30:32 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6643297</guid><dc:creator>RoyOsherove</dc:creator><slash:comments>43</slash:comments><wfw:commentRss>http://weblogs.asp.net/rosherove/rsscomments.aspx?PostID=6643297</wfw:commentRss><comments>http://weblogs.asp.net/rosherove/archive/2008/09/26/unit-testing-decoupled-from-design-adoption.aspx#comments</comments><description>&lt;p&gt;In &lt;a href="http://weblogs.asp.net/rosherove/archive/2008/09/20/goodbye-mocks-farewell-stubs.aspx"&gt;my previous post&lt;/a&gt; I started talking in more coherent words about feelings I’ve had lurking in the past year. This post is an expansion of that, after having some &lt;a href="http://twitter.com/royosherove"&gt;great twitter conversations&lt;/a&gt; in the past few days with some great people. Treat this as a stream of consciousness.&lt;/p&gt;  &lt;p&gt;before that, here’s a short highlight summary of responses to my post in other blogs:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.mockobjects.com/2008/09/tdd-killing-messenger.html"&gt;Steve Freeman thinks I’m pulling the wrong way&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://ayende.com/Blog/archive/2008/09/23/cuddling-is-consider-harmful.aspx"&gt;So does Ayende&lt;/a&gt; (in a way)&lt;/li&gt;    &lt;li&gt;&lt;a href="http://tech.groups.yahoo.com/group/altdotnet/message/15301"&gt;A goof thread on this in the alt.net mailing list&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;there are also plenty of people who picked up the ball (some of them have already done that before I started mumbling on my blog) and continue to make better attempts at bringing knowledge to the masses, in more coherent, newbie friendly manner.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://rhysc.blogspot.com/2008/09/tdd-fail-fast.html"&gt;Rhys shares some hints and gotchas&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://codebetter.com/blogs/ian_cooper/archive/2008/09/23/learning-and-crafstmanship.aspx"&gt;Ian Cooper gets it&lt;/a&gt; (even if he doesn’t think he does – I’ll explain later)&lt;/li&gt;    &lt;li&gt;&lt;a href="http://codebetter.com/blogs/jeremy.miller/archive/2008/09/22/question-of-the-day.aspx"&gt;Jeremy is asking important questions&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://feeds.feedburner.com/~r/GrabBagOfT/~3/399405713/ten-tips-to-maximize-the-return-on-your-tdd-investment.aspx"&gt;Jimmy has good tips&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;and the comments on that post are… interesting (some are very expected, though).&lt;/p&gt;  &lt;p&gt;Let’s make another interesting statement, and this one is indeed product related. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;To reach the masses, we need to decouple &lt;/u&gt;&lt;a href="http://www.lostechies.com/blogs/chad_myers/archive/2008/03/07/pablo-s-topic-of-the-month-march-solid-principles.aspx"&gt;S.O.L.I.D&lt;/a&gt;&lt;u&gt; Design Principles from Unit Testing and TDD&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I’m not saying throw out design. I’m saying – it’s important enough to be learnt on its own, and not in the context of tests. in fact, in that context, it inhibits too many people to be practical as a learning tool. so we need to separate forces.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;But why?&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The wall to start unit testing is too high (for most devs) and will always be too high if you have to know your SOLID in order to even start writing your first test or refactor your code for testability.&amp;#160; This problem only exists in static languages like Java, C# and VB.NET, where in order to replace something you need to have a way to do polymorphism on that class (interface, or inheritance with virtual methods).&lt;/p&gt;  &lt;p&gt;The reason people love &lt;a href="http://weblogs.asp.net/rosherove/archive/2007/10/08/the-various-meanings-of-tdd.aspx"&gt;Test Driven design&lt;/a&gt;&lt;strong&gt;&lt;/strong&gt; so much is because the technique, aided by most of today’s leading mock frameworks, squeezes out all the problematic static coupling that exists in the current design, before it will even let you test something. Can’t decouple that web service dependency from your class? you’re screwed. Redesign and only then you can test it. Have a static method that gets called? you’ll need to jump hoops to override the calls to that method, let alone the method itself. Feel the burn, baby!&lt;/p&gt;  &lt;p&gt;TDD existed before mocking frameworks existed. what did people do then? SmallTalk was one of the first languages that had people doing TDD with it.&amp;#160; SmallTalk is &lt;em&gt;testable&lt;/em&gt; by default in that you can re-define anything to do anything else at runtime. People just &lt;em&gt;thought about&lt;/em&gt;&amp;#160; their design as they wrote the tests first, and they had no real constraint on what specific design to follow. It still holds today in Ruby, for example.&lt;/p&gt;  &lt;p&gt;Now, the reason today’s “hardcore” Test Driven Design is even &lt;em&gt;possible&lt;/em&gt; is because current mocking frameworks &lt;strong&gt;rely&lt;/strong&gt; on static language (and compiler) to tell the developer what can and cannot be done in terms of replacing objects and implementations. That &lt;strong&gt;forces&lt;/strong&gt; a specific design methodology that closely matches what SOLID principles stand for, and it’s &lt;strong&gt;great&lt;/strong&gt;. you get great code out of it, and nice designs.&lt;/p&gt;  &lt;p&gt;I repeat – I love the idea of SOLID design and I practice it. &lt;/p&gt;  &lt;p&gt;So, why do I think that these things should be decoupled? At the end of the day it is a &lt;strong&gt;constraint&lt;/strong&gt; that is put upon each developer that wants to start unit testing (not even talking about legacy code right now). That means that each developer that starts tests will hit a brick wall and will &lt;strong&gt;have&lt;/strong&gt; to start reading up on all things SOLID, patterns, &lt;a href="http://www.manning.com/osherove/"&gt;or just buy my book&lt;/a&gt;. There is no “easy” way. and that’s fine and dandy for most of the people reading this blog. And for the past four or five years, it’s been just as fine and dandy for me too.&lt;/p&gt;  &lt;p&gt;BUT, The adoption rate for TDD and unit testing at all is low, and I suspect that it is indeed this learning curve that makes that possible. And it will &lt;strong&gt;continue&lt;/strong&gt; to be low as long as doing &lt;em&gt;great&lt;/em&gt; (not OK, &lt;em&gt;great&lt;/em&gt;!) designs is a prerequisite to doing proper unit testing (or at all). The current mock frameworks (most) enable this notion and embrace it. &lt;/p&gt;  &lt;p&gt;Today we live in our own little echo chamber where everyone is happy with their “pure” designs and consultant fees, because we are part of a very elite group: those you need to pay in order to learn the “hard stuff” to do something which many people &lt;em&gt;want&lt;/em&gt; to do but just can’t. It’s almost like knowing Regular Expressions, except a much larger scope. We’re making it harder &lt;em&gt;on purpose&lt;/em&gt; to start doing unit testing, because we believe that it’s someone’s best interest (and in a way, in our best interest) to learn SOLID first. &lt;/p&gt;  &lt;p&gt;The people I know from the mocking community are amazing, passionate and smart people. They would &lt;em&gt;never&lt;/em&gt; do anything they don’t fully believe in, and their value system is almost radically pure. And I love that. but we cannot play judge here. people learn in different ways, and the low adoption rate tells us that it’s not working as well as expected.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;Why would decoupling work?&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;If we were able to &lt;strong&gt;decouple&lt;/strong&gt; the requirement of knowing SOLID and just get people to start testing &lt;strong&gt;today&lt;/strong&gt; and learn SOLID &lt;strong&gt;later&lt;/strong&gt; or in parallel, adoption would be much higher. Why?&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;People who get test infected soon want to learn SOLID anyway&lt;/li&gt;    &lt;li&gt;People who succeed doing one thing, will be more open to adopting other things from the same source of knowledge&lt;/li&gt;    &lt;li&gt;It’s less scary, and less time consuming to start doing things. We reduce the barrier to entry into the agile world.&lt;/li&gt;    &lt;li&gt;It allows developers in a non-agile environment to do little,incremental steps on the road to a better way of working, without needing to chow down the whole meal in one big bite.&lt;/li&gt;    &lt;li&gt;Sucky tests are better than no tests. They also &lt;em&gt;lead&lt;/em&gt; to better tests and better understanding of design as people learn and get better at it.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;What’s stopping us?&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;But with the current set of mock frameworks, you can’t do all those things. you technically are not &lt;em&gt;allowed &lt;/em&gt;to do that. and that’s why solutions like Rhino, Moq, and NMock will not appeal to the masses, and why solutions that support other types of design decisions (JMockit, Typemock Isolator) will continue to gain popularity as people strive to become more agile under non-agile conditions. they provide that needed stepping stone to learn unit testing without needing to learn SOLID as a requirement. That’s the difference. But the community is actively depressing thoughts about using such tools today because of the belief that TDD and design have to go hand in hand at ALL times. &lt;/p&gt;  &lt;p&gt;Many of them that will read this are scared that I’m even suggesting this, because they fear a return to darker ages where people didn’t have a clue, and there was nothing to stop them from screwing up the design. But as you’ll see later on, the plan is to get people &lt;em&gt;on board&lt;/em&gt; the design stuff, just not as a prerequisite to the unit testing stuff. that’s all.&lt;/p&gt;  &lt;p&gt;Of course, the big problem here is that I actually &lt;em&gt;work&lt;/em&gt; at Typemock, and thus, many people feel that every word that comes out of my mouth is a sales pitch. but the reality is that if Typemock had been an open source project, those people would have read the &lt;em&gt;words&lt;/em&gt; that I write, and not try to find a hidden meaning in them. and the truth is I’d write something like this even if I didn’t work there today. I’d quit to say these words with more credibility but I want to have an impact on how those products work and feel, so I’m not going to do that, sorry.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;What does the industry need to do?&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;      &lt;p&gt;Direct people who are reluctant to go through that big learning curve or have a problem with the current frameworks to tools that mitigate those fears (Typemock, JMockit). One is open source, the other has an open source free license. so they are both achievable to use and play with.&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;When doing so, learning better design techniques should be on the horizon. but it’s important not to discourage use of these frameworks on existing non SOLID design notions. people have a hard time with change as it is. They need to learn one step at a time and we have to let them have the time to grok things separately if they want to.&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;Decouple the task of teaching unit testing from the task of teaching design. They are both important but are not a requirement of each other. We need more Design material out there with a simple way to reach and find it (we’re on the way today). Unit testing information is already out there and more is going out every day.&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p&gt;Realize that tools that enable different designs are not a problem, but a way to get a foot in the door with developers who wouldn’t walk through that agile door in other ways. it’s a &lt;em&gt;bigger net &lt;/em&gt;to catch more fish. These tools allow people to have a bridge to the agile world with less pain involved.&lt;/p&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;This is something that we need to continue talking about, since it can change the future for most devs today. If we shy away from talking about this, and stay in our cozy little submarine underwater, we will sail right beneath all those people lying on the beach, wondering what’s up with all those people in the water, or afraid to take a swimming lesson. (yeah, the world’s worst analogy)&lt;/p&gt;  &lt;p&gt;Thoughts? Comments? &lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6643297" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/Iserializable?a=WroANI"&gt;&lt;img src="http://feeds.feedburner.com/~a/Iserializable?i=WroANI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=PbKJL"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=PbKJL" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=vmd5L"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=vmd5L" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=3jr5l"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=3jr5l" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Iserializable/~4/404103849" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/rosherove/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile/default.aspx">Agile</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Art+Of+Unit+Testing/default.aspx">Art Of Unit Testing</category><feedburner:origLink>http://weblogs.asp.net/rosherove/archive/2008/09/26/unit-testing-decoupled-from-design-adoption.aspx</feedburner:origLink></item><item><title>Goodbye mocks, Farewell stubs</title><link>http://feeds.feedburner.com/~r/Iserializable/~3/398093130/goodbye-mocks-farewell-stubs.aspx</link><pubDate>Sat, 20 Sep 2008 12:45:59 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6635929</guid><dc:creator>RoyOsherove</dc:creator><slash:comments>46</slash:comments><wfw:commentRss>http://weblogs.asp.net/rosherove/rsscomments.aspx?PostID=6635929</wfw:commentRss><comments>http://weblogs.asp.net/rosherove/archive/2008/09/20/goodbye-mocks-farewell-stubs.aspx#comments</comments><description>&lt;p&gt;About 4 years ago I was consulting for one of the largest companies in Israel (about 15,000+ employees) and helping them grok TDD and automated unit testing. I had spent there over a year and a half, on and off, and was teaching both .net, C++ and java developers about the techniques and tools they can use. &lt;/p&gt;  &lt;p&gt;I was consulting for C++, Java and .NET developers. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;The C++ devs were first.&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;They had plenty of objections to what I was teaching them, because the amount of code refactoring they needed to do in order to make their code testable was almost unrealistic for them. Even writing new code meant writing something on top of old-untestable code, and they had a hard time adjusting to the more interface (pure virtual) based, contract driven TDD approach for new code. C++ devs has a hard time becuase it takes more code to write good testable code, and the coding tools they used (VS on windows and VI and such on UNIX based systems) didnt’ provide a good productive way to make code “bend” easily as they refactored it or created it in the first place. every little change meant a big “search and replace”. every method refactoring meant adding it the declaration in an .h file and thus they tried to have a little to do with changing code as possible.&lt;/p&gt;  &lt;p&gt;Looking back, today they still don’t have the right infrastructure in place or the right tooling or the willingness to do unit testing or TDD becuase it’s too hard with the current tooling to accomplish it.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;I had also spent some time with the .NET devs&lt;/u&gt;&lt;/p&gt;  &lt;p&gt; and thought them the same things. Becuase tooling support was better it was a bit easier for them to accept the practices, but still people had a lot of trouble grasping concepts such as dependency injection, inversion of control and designing for testability in general. I found that most people didn’t really have a big problem with the idea of exposing things they didn’t use to expose before, it was more about the concept of learning how to refactor the code in interesting OO ways to make it testable. Making a class non sealed, a method virtual, and then inheriting from that class and testing against the inherited class (“extract and override”) was very much unintuitive for them, and other concepts like containers (spring at the time) didn’t help them get into the groove either. For them it was like drinking water from a fire hose.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Consulting for the java devs&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;Java has lots going for it in terms of unit testing, automation and TDD&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Java devs have a much longer “heritage” of tooling and unit testing than in the .NET world, and so you’d expect them to be more inclined to do these things. &lt;/li&gt;    &lt;li&gt;JUnit is part of any decent java idea so the barrier for entry should be lower, right? &lt;/li&gt;    &lt;li&gt;Refactoring was also in most decent java IDE's, so you’d expect them to grok that too. but that wasn’t the case. &lt;/li&gt;    &lt;li&gt;class methods in java are virtual by default so you can override what you want as long as the class is not sealed (final)== more testable by default.&lt;/li&gt;    &lt;li&gt;Java required a much higher OO learning curve to start with. Good OO knowledge is fundamental for testable designs.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Unfortunately, most developers I met didn’t even know how to use the refactoring tools they had available and had a hard time with the same dependecy injection principles that the C++ and .NET devs had. It was just too cumbersome to make the code testable, but eventually the infa team at the company had made the decision to take a couple of weeks and make all the infra stuff replaceable for testing purposes. they did not regret that decision.&lt;/p&gt;  &lt;p&gt;So the java group had the most success with testable designs, but they still had a hard time doing it. in fact, only the infra team at that group took the plunge. the other (higher level) devs in the java group didn’t grok it. and don’t use it today.&lt;/p&gt;  &lt;p&gt;Why was this adoption been such a failure? They were willing to learn, but they didn’t like what they learned. It didn’t fit their needs in the real world. Or the way they worked, or the way they knew how to do things. &lt;/p&gt;  &lt;p&gt;Think what you will ,but 99% of the dev worlds aren’t ready for the “testability” message. and that is a fact that is hard to realize for most of us, which just can’t grasp why isn’t that any sensible human being isn’t willing to do everything much better than they are doing today.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Spending the past week running around the Microsoft Campus in Redmond had made several things clearer for me. I’ve been &lt;em&gt;feeling &lt;/em&gt;them for a while, but this week these abstract feelings materialized into something that is more coherent that I can talk about. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Why do most developers not write unit tests, still?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Reason #1: Learning curve&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;One of the main reasons most developers &lt;strong&gt;still today&lt;/strong&gt; don’t really take to unit testing (and TDD) is the really high learning curve that is forced upon them. That is not to say that learning about &lt;/p&gt;  &lt;p&gt;mocks, stubs, dependency injection, IoC containers, Extract &amp;amp; override technique, Record\Replay, AAA and more &lt;/p&gt;  &lt;p&gt;-- is not useful, but it is a &lt;em&gt;big obstacle &lt;/em&gt;to get people into the habit of doing something which they know is good for them – test their code, verify their assumptions, automate, integrate, be confident, get feedback, define behavior – all those and many other benefits are being thrown away by developers all over the world because the entry fee to this world is too high, for all the wrong reasons.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;It’s time to simplify&lt;/strong&gt;. Get back to basics. Take a good hard look at the huge spiral that we are leading people into and asking whether removing some things today can lead to those things being accepted and being easier tomorrow. or maybe they weren’t needed at all.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Say Goodbye to “mock” and “stub”&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;“mock” and “stub” have played their part in us trying to explain to ourselves what it is we are trying to do, to start learning the minute and important differences in the patterns of our test code. They helped us define what it is we are looking to do, in terms that, for lack of anything better, are now the de-facto pattern names for something that should never have been named in the first place for the casual programmer.&lt;/p&gt;  &lt;p&gt;That’s why in the new version of Isolator we’ve chosen to completely get rid of the words mock and stub, and get back into “fake”ing. You can &lt;em&gt;fake&lt;/em&gt; a method or a class instance, and you can &lt;em&gt;verify&lt;/em&gt; that something was called. You should not care whether this is a stub or a mock. &lt;/p&gt;  &lt;p&gt;We need to clean our language: mock, stub, fake, test double: They all mean something in the context of us trying to identify patterns in our test code. But as users mature and start using the frameworks, those same words increase the entry barrier, and effectively block people out. If I’m showing a simple test that fakes some dependency that a class uses to a new dev on my team, I should not have to send them over to read fowler’s “mocks arn’t stubs” article (which is enlightening, but should not be relevant to them) because it misses the point.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Less interaction testing, more state based testing&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Most crappy unit tests I’ve seen were &lt;em&gt;over specified&lt;/em&gt; in that they asserted on internal interaction with an object way too heavily, which made the tests very fragile. Getting back to basics means making it easy to enable state based testing (assert style checks) and only enabling interaction testing where it makes sense: (when your app does one-way messaging to an external component). &lt;em&gt;verifying&lt;/em&gt; that something was called should be the exception to the unit testing rule. The AAA style APis make that a more clear distinction. &lt;/p&gt;  &lt;p&gt;Record-replay APIs make it too easy to make interaction based tests when you really want a state based one (getting a result vs. checking that something was called)&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Use AAA style Apis&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;As an industry we are learning and changing all the time. The “Arrange-act-assert” pattern in the field of mock frameworks represents us trying to return to basics. Moq did that nicely by showing a way that leads there, and it is being taken gladly by Rhino and Typemock Isolator. It is taking off because we are starting to look beyond our own little echo chamber and seeing what is is that all those other 99% of devs are expecting as guidance, and in what form. &lt;/p&gt;  &lt;p&gt;AAA is guidance because there was an outcry (a silent, vote of feet) that record-replay is not cutting it – it’s too confusing for non-experts. It’s too technical. and it does not lend itself to the way people want to work. So most people didn’t use it.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Visual Basic Language Support&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Everyone &lt;/u&gt;screwed up on this one.most VB developers who will try to use one of the current frameworks will not succeed since they required anonymous methods or lambda expressions. Some frameworks use VB specific keywords which makes them VERY awkward to use. If we want broad acceptance of our practices we need to make sure whoever wants to can use the tooling we make. VB is &lt;em&gt;huge&lt;/em&gt; and its amazing how we all pretend it does not exist. But I think it’s the key to getting to those people who want to be better but all they see is a high wall instead of an entrance. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Use “Isolate” and “fake” instead of “mock”&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Don’t say ‘mock’ frameworks, say “isolation” frameworks. Because ‘Mock’ is an overloaded word it is confusing. Explaining to a developer that you can “isolate” something from its dependencies rather than “mock” its dependencies feels more natural.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Simplify,Simplify,Simplify&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Remove APIs instead of adding to them. Have single point of entries to your frameworks because &lt;strong&gt;discoverability &lt;/strong&gt;is the key to good framework use. That’s why extension methods are problematic, they mean multiple points of entry.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Be open: Realize that other tools and techniques can act as bridges to the agile world&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Design for testability is just one way to get where you want to go. it is not the only way. Sometimes it’s impossible. Discouraging the use of other ways of working (using tools like Typemock Isolator or JMockit) will only make the current echo chamber more closed and feel more un-achievable for those who need to get to the same point with a very different set of constraints than what most of the “loud” voices need to face.&lt;/p&gt;  &lt;p&gt;By “allowing” other forms of working you enable those who want to, to get a bridge to help them instead of walking by foot the whole way. Any other way would mean that we will all fail in delivering what we believe in to those who have no idea what we’re talking about. &lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6635929" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/Iserializable?a=rG3zij"&gt;&lt;img src="http://feeds.feedburner.com/~a/Iserializable?i=rG3zij" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=tElNL"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=tElNL" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=lv00L"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=lv00L" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=1ofbl"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=1ofbl" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Iserializable/~4/398093130" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/rosherove/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile/default.aspx">Agile</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/General+Software+Development/default.aspx">General Software Development</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Art+Of+Unit+Testing/default.aspx">Art Of Unit Testing</category><feedburner:origLink>http://weblogs.asp.net/rosherove/archive/2008/09/20/goodbye-mocks-farewell-stubs.aspx</feedburner:origLink></item><item><title>Thread Visualization with Typemock Racer</title><link>http://feeds.feedburner.com/~r/Iserializable/~3/389776489/thread-visualization-with-typemock-racer.aspx</link><pubDate>Thu, 11 Sep 2008 15:58:06 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6619105</guid><dc:creator>RoyOsherove</dc:creator><slash:comments>6</slash:comments><wfw:commentRss>http://weblogs.asp.net/rosherove/rsscomments.aspx?PostID=6619105</wfw:commentRss><comments>http://weblogs.asp.net/rosherove/archive/2008/09/11/thread-visualization-with-typemock-racer.aspx#comments</comments><description>&lt;p&gt;Here’s what you can find on the latest &lt;a href="http://typemock.com/requestAlpha.php"&gt;typemock racer&lt;/a&gt; build. I think it’s pretty cool.&lt;/p&gt; &lt;object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="437" height="370" id="viddler"&gt;&lt;param name="movie" value="http://www.viddler.com/player/537e814e/" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="wmode" value="transparent" /&gt;&lt;embed src="http://www.viddler.com/player/537e814e/" width="437" height="370" type="application/x-shockwave-flash" allowScriptAccess="always" allowFullScreen="true" wmode="transparent" name="viddler"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6619105" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/Iserializable?a=nyVfsb"&gt;&lt;img src="http://feeds.feedburner.com/~a/Iserializable?i=nyVfsb" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=XcLgL"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=XcLgL" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=wqarL"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=wqarL" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=cZyul"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=cZyul" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Iserializable/~4/389776489" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/rosherove/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/General+Software+Development/default.aspx">General Software Development</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Typemock/default.aspx">Typemock</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Threading/default.aspx">Threading</category><feedburner:origLink>http://weblogs.asp.net/rosherove/archive/2008/09/11/thread-visualization-with-typemock-racer.aspx</feedburner:origLink></item><item><title>Finding Deadlocks with ReaderWriterLock and Typemock Racer</title><link>http://feeds.feedburner.com/~r/Iserializable/~3/383739392/finding-deadlocks-with-readerwriterlock-and-typemock-racer.aspx</link><pubDate>Fri, 05 Sep 2008 01:06:48 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6601034</guid><dc:creator>RoyOsherove</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://weblogs.asp.net/rosherove/rsscomments.aspx?PostID=6601034</wfw:commentRss><comments>http://weblogs.asp.net/rosherove/archive/2008/09/04/finding-deadlocks-with-readerwriterlock-and-typemock-racer.aspx#comments</comments><description>&lt;p&gt;This feature was just added to the &lt;a href="http://typemock.com/requestAlpha.php"&gt;Racer Alpha&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Given the following method:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/FindingDeadlockswithReaderWriterLockandT_3920/WindowClipping%20(14)_2.jpg"&gt;&lt;img title="WindowClipping (14)" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="322" alt="WindowClipping (14)" src="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/FindingDeadlockswithReaderWriterLockandT_3920/WindowClipping%20(14)_thumb.jpg" width="517" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Can you see a potential for deadlock in this method?&amp;#160; &lt;a href="http://blog.typemock.com/2008/09/finding-deadlocks-with-readerwriterlock.html"&gt;Here’s the answer&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;I wonder if it will &lt;a href="http://www.ayende.com/Blog/archive/2008/07/05/Challenge-Find-the-deadlock.aspx"&gt;find this one as well&lt;/a&gt;..&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6601034" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/Iserializable?a=XJ99g3"&gt;&lt;img src="http://feeds.feedburner.com/~a/Iserializable?i=XJ99g3" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=JJTW4L"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=JJTW4L" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=e5vEdL"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=e5vEdL" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=hWVBSl"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=hWVBSl" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Iserializable/~4/383739392" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/rosherove/archive/tags/Unit+Testing/default.aspx">Unit Testing</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/.Net+2.0/default.aspx">.Net 2.0</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/General+Software+Development/default.aspx">General Software Development</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Typemock/default.aspx">Typemock</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/Threading/default.aspx">Threading</category><feedburner:origLink>http://weblogs.asp.net/rosherove/archive/2008/09/04/finding-deadlocks-with-readerwriterlock-and-typemock-racer.aspx</feedburner:origLink></item><item><title>Beautiful Norway</title><link>http://feeds.feedburner.com/~r/Iserializable/~3/377918718/beautiful-norway.aspx</link><pubDate>Fri, 29 Aug 2008 08:46:15 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6575154</guid><dc:creator>RoyOsherove</dc:creator><slash:comments>5</slash:comments><wfw:commentRss>http://weblogs.asp.net/rosherove/rsscomments.aspx?PostID=6575154</wfw:commentRss><comments>http://weblogs.asp.net/rosherove/archive/2008/08/29/beautiful-norway.aspx#comments</comments><description>&lt;p&gt;After finishing a wonderful week and a half in Norway, I can’t wait to get back.&lt;/p&gt;  &lt;p&gt;Thanks for the &lt;a href="http://picasaweb.google.com/royosherove/Norway08/"&gt;great memories&lt;/a&gt;! &lt;/p&gt;  &lt;p&gt;I’ll be coming back in December &lt;a href="http://www.programutvikling.no/kurskalenderoversikt.aspx?mid_1=1352&amp;amp;mid=1535&amp;amp;id=218164"&gt;for another TDD Master Class Course&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/BeautifulNorway_A55F/image_2.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="372" alt="image" src="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/BeautifulNorway_A55F/image_thumb.png" width="556" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6575154" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/Iserializable?a=Yw1H9z"&gt;&lt;img src="http://feeds.feedburner.com/~a/Iserializable?i=Yw1H9z" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=4Xq1zK"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=4Xq1zK" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=xwFu7K"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=xwFu7K" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=ZVR4gk"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=ZVR4gk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Iserializable/~4/377918718" height="1" width="1"/&gt;</description><feedburner:origLink>http://weblogs.asp.net/rosherove/archive/2008/08/29/beautiful-norway.aspx</feedburner:origLink></item><item><title>Typemock Racer Alpha Available  - Deadlock Finder</title><link>http://feeds.feedburner.com/~r/Iserializable/~3/376538344/typemock-racer-alpha-available-deadlock-finder.aspx</link><pubDate>Wed, 27 Aug 2008 21:44:28 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6572488</guid><dc:creator>RoyOsherove</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://weblogs.asp.net/rosherove/rsscomments.aspx?PostID=6572488</wfw:commentRss><comments>http://weblogs.asp.net/rosherove/archive/2008/08/27/typemock-racer-alpha-available-deadlock-finder.aspx#comments</comments><description>&lt;p&gt;We’ve released the alpha version of &lt;a href="http://www.typemock.com/requestBeta.php"&gt;Typemock Racer&lt;/a&gt;. Go register. &lt;a href="http://weblogs.asp.net/rosherove/archive/2008/07/08/a-sneak-preview-of-typemock-racer.aspx"&gt;Here’s the basic breakdown&lt;/a&gt; of what it is. We will be releasing and updating the alpha version on a monthly basis.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6572488" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/Iserializable?a=9xfNG7"&gt;&lt;img src="http://feeds.feedburner.com/~a/Iserializable?i=9xfNG7" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=bsYVcK"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=bsYVcK" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=45Z4zK"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=45Z4zK" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=XWZOik"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=XWZOik" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Iserializable/~4/376538344" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/rosherove/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/General+Software+Development/default.aspx">General Software Development</category><feedburner:origLink>http://weblogs.asp.net/rosherove/archive/2008/08/27/typemock-racer-alpha-available-deadlock-finder.aspx</feedburner:origLink></item><item><title>Kanban, anyone?</title><link>http://feeds.feedburner.com/~r/Iserializable/~3/376538345/kanban-anyone.aspx</link><pubDate>Wed, 27 Aug 2008 21:41:49 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6572481</guid><dc:creator>RoyOsherove</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://weblogs.asp.net/rosherove/rsscomments.aspx?PostID=6572481</wfw:commentRss><comments>http://weblogs.asp.net/rosherove/archive/2008/08/27/kanban-anyone.aspx#comments</comments><description>&lt;p&gt;ooh. This &lt;a href="http://en.wikipedia.org/wiki/Kanban"&gt;Kanban&lt;/a&gt; thing looks &lt;a href="http://codebetter.com/blogs/david_laribee/archive/2008/08/24/introducing-kanban-at-xclaim.aspx"&gt;nice and shiney&lt;/a&gt;.&amp;#160; Will it “meme” and die, or will it stay and flourish, to be the next “xp”?&lt;/p&gt;  &lt;p&gt;Maybe it’s time to learn from our XP-Scrum experiences and evolve. Maybe Kanban is one path to that evolution. &lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6572481" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/Iserializable?a=V2WbsU"&gt;&lt;img src="http://feeds.feedburner.com/~a/Iserializable?i=V2WbsU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=DfuubK"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=DfuubK" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=wsw5NK"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=wsw5NK" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=ZemwOk"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=ZemwOk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Iserializable/~4/376538345" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/rosherove/archive/tags/Agile+Related/default.aspx">Agile Related</category><feedburner:origLink>http://weblogs.asp.net/rosherove/archive/2008/08/27/kanban-anyone.aspx</feedburner:origLink></item><item><title>Visual vs. “Executable” Build Configurations</title><link>http://feeds.feedburner.com/~r/Iserializable/~3/376498187/visual-vs-executable-build-configurations.aspx</link><pubDate>Wed, 27 Aug 2008 20:37:51 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6572363</guid><dc:creator>RoyOsherove</dc:creator><slash:comments>7</slash:comments><wfw:commentRss>http://weblogs.asp.net/rosherove/rsscomments.aspx?PostID=6572363</wfw:commentRss><comments>http://weblogs.asp.net/rosherove/archive/2008/08/27/visual-vs-executable-build-configurations.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://codebetter.com/blogs/david_laribee/archive/2008/08/25/omg-rake.aspx"&gt;Dave wrote a really nice overview&lt;/a&gt; of how much he liked playing with Rake, the Ruby based build script. From his post I can say that it does indeed look nice in its awesomeness of clear usage and programmability. So why do I still have trouble migrating over from a “visual” build system (which we use &lt;a href="http://weblogs.asp.net/rosherove/archive/2008/08/12/build-and-continuous-integration-toolgasm-achieved.aspx"&gt;and I cover here&lt;/a&gt;) like FinalBuilder and move to something like Rake?&lt;/p&gt;  &lt;p&gt;I’ll try to think our loud and see where it leads me. Let’s compare the two approaches in several ways:&lt;/p&gt;  &lt;p&gt;The &lt;a href="http://rake.rubyforge.org/"&gt;Rake&lt;/a&gt; Way&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/Visualvs.ExecutableBuildConfigurations_14C07/WindowClipping%20(8)_2.jpg"&gt;&lt;img title="WindowClipping (8)" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="439" alt="WindowClipping (8)" src="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/Visualvs.ExecutableBuildConfigurations_14C07/WindowClipping%20(8)_thumb.jpg" width="422" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;The Visual Way (&lt;a href="http://www.finalbuilder.com"&gt;FinalBuilder&lt;/a&gt; in this case. Also check out &lt;a href="http://www.kinook.com/VisBuildPro/Manual/?overview.htm"&gt;Visual Build Pro&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/Visualvs.ExecutableBuildConfigurations_14C07/image_2.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="483" alt="image" src="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/Visualvs.ExecutableBuildConfigurations_14C07/image_thumb.png" width="706" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;What’s going on here?&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;The “what’s going on here” phase is what a developer faces when looking at the build script for the first time. I think the Rake way is very clear to understand what’s going on even if you don’t know ruby. But take a look at the visual way. It is easy not only to understand what is happening, but also &lt;strong&gt;the hierarchy &lt;/strong&gt;of steps that are being taken.&lt;/p&gt;  &lt;p&gt;I would find it much easier to explain to a new developer how the build works in a visual manner because of that. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;Authoring Experience&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;A visual build developer does not need to learn a new language (Ruby) to start authoring or maintain the build. this is a huge plus. Sure, learning ruby is a great thing in itself, but it should not be a road block to create a build system. Once you &lt;strong&gt;know&lt;/strong&gt; ruby though, what is the experience like? As I have not played with Rake myself, my assumptions about it are exactly that – assumptions. tell me if I’m wrong. &lt;/p&gt;  &lt;p&gt;Ruby is &lt;strong&gt;easy&lt;/strong&gt; to program in. Therefore the build should be &lt;strong&gt;easy&lt;/strong&gt; to author once you know Ruby. Generally. I am not talking about custom tasks (separate point later). &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;Task Discoverability&lt;/u&gt;&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt; This is really important. How do you know which tasks you have available to you? I’m not sure how you know in Rake (other than sifting through source files?), but visually there are usually easy ways to see all the possible tasks, by category. see below:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/Visualvs.ExecutableBuildConfigurations_14C07/image_6.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="344" alt="image" src="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/Visualvs.ExecutableBuildConfigurations_14C07/image_thumb_2.png" width="185" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;As you select a task, it is easy to discover what it can do and what you need to give it as inputs. Rake and Ruby have intellisense (I’m guessing).&lt;/p&gt;  &lt;p&gt;Visual authoring is really easy too, since it presents you with windows that let you know what inputs you need to put in for each task. here is an example:&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160; &lt;a href="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/Visualvs.ExecutableBuildConfigurations_14C07/image_4.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="216" alt="image" src="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/Visualvs.ExecutableBuildConfigurations_14C07/image_thumb_1.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;blockquote&gt;&lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;Managing flow and logic&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This is really important since any self respecting build script would do much more than simply compile or run tests. This is where you’d expect a programming based approach to have a mightier hand. It is &lt;strong&gt;absurdly&lt;/strong&gt; easy to do flow logic in a programming based language. and simple if, for and switch will simply work as expected.&amp;#160; &lt;/p&gt;  &lt;p&gt;In my case, FinalBuilder also has excellent flow related logic that includes all of the above. Simple click the “if-else” task and arrange under it’s node anything that should be run if it is true (or false, your choice). here is how it looks(from left to right):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/Visualvs.ExecutableBuildConfigurations_14C07/image_10.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="400" alt="image" src="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/Visualvs.ExecutableBuildConfigurations_14C07/image_thumb_4.png" width="252" border="0" /&gt;&lt;/a&gt;&amp;#160; &lt;a href="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/Visualvs.ExecutableBuildConfigurations_14C07/WindowClipping%20(9)_2.jpg"&gt;&lt;img title="WindowClipping (9)" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="333" alt="WindowClipping (9)" src="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/Visualvs.ExecutableBuildConfigurations_14C07/WindowClipping%20(9)_thumb.jpg" width="376" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;a href="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/Visualvs.ExecutableBuildConfigurations_14C07/WindowClipping%20(11)_2.jpg"&gt;&lt;img title="WindowClipping (11)" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="126" alt="WindowClipping (11)" src="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/Visualvs.ExecutableBuildConfigurations_14C07/WindowClipping%20(11)_thumb.jpg" width="350" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Some people find it silly to do such a “visual programming” thing. I think that this is good enough DSL for this medium with a balance of being easy to understand and having good flow control in an easy way.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;Using Variables and parameters&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;In Rake you define the variables in the script files:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/Visualvs.ExecutableBuildConfigurations_14C07/image_12.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="156" alt="image" src="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/Visualvs.ExecutableBuildConfigurations_14C07/image_thumb_5.png" width="336" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;in a tool like FinalBuilder you set variables in a separate window and choose their scope(or even automatically have them set as env. variables):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/Visualvs.ExecutableBuildConfigurations_14C07/image_14.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="244" alt="image" src="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/Visualvs.ExecutableBuildConfigurations_14C07/image_thumb_6.png" width="398" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;You can also declare variables that include other variables in them (your binaries location is combined of your build location + Binaries for example). &lt;/p&gt;  &lt;p&gt;So the visual way is &lt;strong&gt;at least&lt;/strong&gt; comparable in feature set.&amp;#160; Of course, you can modify, define and check for variables at runtime with the appropriate tasks.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;Sub scripts and includes&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;in Ruby you can declare sub functions in the same script or in other scripts and just call them (by “include”ing them).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/Visualvs.ExecutableBuildConfigurations_14C07/image_16.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="314" alt="image" src="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/Visualvs.ExecutableBuildConfigurations_14C07/image_thumb_7.png" width="577" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;In FinalBuilder you can create “Action Lists” that look like tabs on the top of the build editor. You can also have tasks that invoke external build scripts. Action lists can also take in parameters (like functions) if you want, and use them in their work:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/Visualvs.ExecutableBuildConfigurations_14C07/image_18.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="300" alt="image" src="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/Visualvs.ExecutableBuildConfigurations_14C07/image_thumb_8.png" width="515" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;again, comparable, and reusable.&amp;#160; although definitely more (actually, almost only) clicking (is that bad?)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;Built in Tasks&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;This is where the visual stuff wins hands down, I believe. There are hundreds of built in, easily discoverable tasks in the FB IDE, which means I almost &lt;strong&gt;never&lt;/strong&gt; have to write my own. In the four years I have used it, I can only recall a couple of times I had to create my own tasks. even then, there was always a way to do it differently if I wanted to. &lt;/p&gt;    &lt;p&gt;Anything from file handling, Multi threaded tasks, text parting and Database manipulation to COM+, Active directory, obfuscators and installer tasks. it’s all there and easy to search for. &lt;strong&gt;With integrated help&lt;/strong&gt;.&amp;#160; Here is just the list of &lt;strong&gt;categories&lt;/strong&gt; of tasks in FinalBuilder:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/Visualvs.ExecutableBuildConfigurations_14C07/image_20.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; margin: 0px 20px 0px 0px; border-left: 0px; border-bottom: 0px" height="526" alt="image" src="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/Visualvs.ExecutableBuildConfigurations_14C07/image_thumb_9.png" width="117" align="left" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;Rake has lots of stuff , &lt;/p&gt;    &lt;p&gt;but &lt;/p&gt;    &lt;p&gt;it &lt;/p&gt;    &lt;p&gt;is &lt;/p&gt;    &lt;p&gt;not &lt;/p&gt;    &lt;p&gt;even &lt;/p&gt;    &lt;p&gt;close. &lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Am &lt;/p&gt;    &lt;p&gt;I &lt;/p&gt;    &lt;p&gt;wrong?&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;u&gt;Custom Tasks and extensibility&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;You can very easily create custom tasks for Rake. You just write them. With FB you have several routes: &lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;Create a custom &lt;strong&gt;visual task&lt;/strong&gt; that has a designer and form and everything, using its own integrated Task Studio (you can program its logic in C#), &lt;/li&gt;      &lt;li&gt;Run command lines and create custom batch files of console applications. &lt;/li&gt;      &lt;li&gt;Create the task in the build script itself using Powershell, VBScript or JavaScript (the editor has intellisense)&lt;/li&gt;      &lt;li&gt;&amp;#160;&lt;a href="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/Visualvs.ExecutableBuildConfigurations_14C07/image_22.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="168" alt="image" src="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/Visualvs.ExecutableBuildConfigurations_14C07/image_thumb_10.png" width="313" border="0" /&gt;&lt;/a&gt; &lt;/li&gt;   &lt;/ul&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Ruby has some edge on ease of extensibility (it is almost frictionless). It takes longer with FB, but you almost never need it.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;Debugging&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;You can easily debug Ruby scripts. FinalBuilder allows debugging as well by putting breakpoints on tasks and checking all variables and actions (plus watch windows for variables) when you break. Also, you can easily enabled and disable tasks that will run by simply checking and unchecking its checkbox:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/Visualvs.ExecutableBuildConfigurations_14C07/image_24.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="230" alt="image" src="http://weblogs.asp.net/blogs/rosherove/WindowsLiveWriter/Visualvs.ExecutableBuildConfigurations_14C07/image_thumb_11.png" width="700" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I think they are comparable.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;Compare and Merge&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;FinalBuilder saved to an XML File. it’s not great but it is somewhat mergeable. Ruby is very easy to merge. Assuming this is a frequent task (two people working on the build) Ruby will be much easier. However, I almost never need to do this since the build is usually handled by one person (or pair) at any time anyway. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;Maintenance&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;It is easier to maintain something that is visual, where it is easy to find anything you are looking for. That is my feeling and I think the visual way is more maintainable than any Ruby or XML file.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Money&lt;/p&gt;  &lt;p&gt;Ah. FinalBuilder costs money. Ruby does not. One will cost you more than the other. I don’t think FinalBuilder is the costlier one in this regard. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;So, who wins in my book?&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I have not yet found a &lt;strong&gt;really compelling&lt;/strong&gt; reason to move to a non visual build script. I would love to hear good reasons for doing that as I am obviously missing something. Let me know what it is in the comments.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6572363" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/Iserializable?a=KxkNDZ"&gt;&lt;img src="http://feeds.feedburner.com/~a/Iserializable?i=KxkNDZ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=qDHWuK"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=qDHWuK" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=U6fTFK"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=U6fTFK" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=NHnI6k"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=NHnI6k" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Iserializable/~4/376498187" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/rosherove/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/rosherove/archive/tags/General+Software+Development/default.aspx">General Software Development</category><feedburner:origLink>http://weblogs.asp.net/rosherove/archive/2008/08/27/visual-vs-executable-build-configurations.aspx</feedburner:origLink></item></channel></rss>
