<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Behavior Driven Development</title>
        <link>http://geekswithblogs.net/Podwysocki/category/7459.aspx</link>
        <description>Behavior Driven Development</description>
        <language>en-US</language>
        <copyright>Matthew Podwysocki</copyright>
        <managingEditor>matthew.podwysocki@gmail.com</managingEditor>
        <generator>Subtext Version 0.0.0.0</generator>
        <item>
            <title>Covering NUnit 2.4.7</title>
            <link>http://geekswithblogs.net/Podwysocki/archive/2008/04/01/120934.aspx</link>
            <description>It's interesting that a flurry of releases of testing frameworks have been released lately with &lt;a href="http://www.gallio.org/"&gt;Gallio&lt;/a&gt;, &lt;a href="http://codeplex.com/xunit"&gt;xUnit.net&lt;/a&gt; and of course &lt;a href="http://nunit.com/index.php"&gt;NUnit&lt;/a&gt;.&lt;a href="http://blogs.nunit.com/"&gt;  Charlie Poole&lt;/a&gt; recently announced on a lot of the discussion boards I belong to recently that &lt;a href="http://nunit.com/index.php?p=download"&gt;NUnit 2.4.7&lt;/a&gt; was recently released.  You can read all about what's been added &lt;a href="http://nunit.com/index.php?p=releaseNotes&amp;amp;r=2.4.7"&gt;here &lt;/a&gt;with the release notes.  &lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;What's New and Interesting?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
What's interesting about this release?  Well, NUnit no longer depends on log4net, thus getting rid of some dependency issues with regards to the applications under test.  What's also interesting is that addition of the RowTest extension to allow  multiple sets of arguments to be given to a test.  This is the first one that's ever been incorporated into the core of NUnit.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Static Tests in NUnit?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
As &lt;a href="http://weblogs.asp.net/astopford/"&gt;Andy Stopford&lt;/a&gt; noted in my blog yesterday regarding xUnit.net, &lt;a href="http://sourceforge.net/mailarchive/forum.php?thread_name=004401c887ad%249e816030%246501a8c0%40ferrari&amp;amp;forum_name=nunit-developer"&gt;Charlie recently checked in code&lt;/a&gt; to allow static methods for static methods to be tests as well as Setup and TearDown to be static as well.  Jim Newkirk, the man behind NUnit and co-creator of xUnit.net, favors that approach of allowing statics.  To me, I don't care as much with regards to Startup and TearDown with statics as most of my statics for testing F# is side effect free programming.  As it should be with functional programming.  Anyhow, what I'd like to see in NUnit is the support for something that I can do in xUnit.net:&lt;br /&gt;
&lt;br /&gt;
&lt;!--
{\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Monaco;}}{\colortbl;??\red255\green255\blue255;\red40\green40\blue40;\red255\green128\blue0;}??\fs16 \cf1\cb2\highlight2 #light\par ??\par ??\cf3 let\cf1  \cf3 rec\cf1  fib n = \par ??  \cf3 match\cf1  n \cf3 with\par ??\cf1   | 0 \cf3 -&amp;gt;\cf1  1\par ??  | 1 \cf3 -&amp;gt;\cf1  1\par ??  | x \cf3 -&amp;gt;\cf1  fib(n - 2) + fib(n - 1)\par ??  \par ??print_any (fib (-1))}
--&gt;
&lt;div style="background: rgb(40, 40, 40) none repeat scroll 0% 50%; font-family: Monaco; font-size: 8pt; color: white; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;
&lt;p style="margin: 0px;"&gt;#light&lt;br /&gt;
&lt;br /&gt;
#R &lt;span style="color: rgb(0, 255, 0);"&gt;@"D:\Program Files\NUnit 2.4.7\bin\nunit.core.dll"&lt;/span&gt;&lt;br /&gt;
#R &lt;span style="color: rgb(0, 255, 0);"&gt;@"D:\Program Files\NUnit 2.4.7\bin\nunit.framework.dll"&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: rgb(255, 128, 0);"&gt;open&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt; &lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;/span&gt;NUnit.Framework&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: rgb(255, 128, 0);"&gt;let&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt; &lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;rec&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt; &lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;/span&gt;fib n =&lt;br /&gt;
  &lt;span style="color: rgb(255, 128, 0);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;match&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt; &lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;/span&gt;n &lt;span style="color: rgb(255, 128, 0);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;with&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt; &lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
  | 0 | 1 &lt;span style="color: rgb(255, 128, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt; &lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;&lt;/span&gt; 0&lt;br /&gt;
  | n &lt;span style="color: rgb(255, 128, 0);"&gt;-&amp;gt;&lt;/span&gt; fib(n-2) + fib(n-1)&lt;br /&gt;
  | n &lt;span style="color: rgb(255, 128, 0);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;when&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;/span&gt; n &amp;lt; 0 &lt;span style="color: rgb(255, 128, 0);"&gt;-&amp;gt;&lt;/span&gt; failwith &lt;span style="color: rgb(0, 255, 0);"&gt;"Cannot be less than zero"&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
[&amp;lt;TestFixture&amp;gt;]&lt;br /&gt;
&lt;span style="color: rgb(255, 128, 0);"&gt;let&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt; &lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;&lt;/span&gt;FibOfOneShouldReturnZero() =&lt;br /&gt;
  &lt;span style="color: rgb(255, 128, 0);"&gt;let&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt; &lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;&lt;/span&gt;fibResult = fib(1)&lt;br /&gt;
  Assert.AreEqual(fibResult, 0)&lt;br /&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;br /&gt;
If I saw something like this, I'd be a happy man.  But until then, I can dream...&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Go ahead and pick up your copy today of NUnit.  It's been the old standby for many of my projects throughout my career and served me quite well.  Next time I'll cover Gallio a little bit as I have neglected it, but it's a huge release.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http://geekswithblogs.net/Podwysocki/archive/2008/04/01/120934.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://geekswithblogs.net/Podwysocki/archive/2008/04/01/120934.aspx" /&gt;&lt;/a&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=120934"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=120934" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/Podwysocki/aggbug/120934.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Matthew Podwysocki</dc:creator>
            <guid>http://geekswithblogs.net/Podwysocki/archive/2008/04/01/120934.aspx</guid>
            <pubDate>Tue, 01 Apr 2008 21:34:37 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/Podwysocki/comments/120934.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/Podwysocki/archive/2008/04/01/120934.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/Podwysocki/comments/commentRss/120934.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/Podwysocki/services/trackbacks/120934.aspx</trackback:ping>
        </item>
        <item>
            <title>XUnit.net RC2 Released</title>
            <link>http://geekswithblogs.net/Podwysocki/archive/2008/03/31/120904.aspx</link>
            <description>&lt;span style="font-weight: bold;"&gt;UPDATE: More posts on the subject&lt;br /&gt;
&lt;/span&gt;
&lt;ul&gt;
    &lt;li style="font-weight: bold;"&gt;&lt;a href="http://weblogs.asp.net/podwysocki/archive/2008/04/10/xunit-net-rc3-just-released.aspx"&gt;xUnit.net RC3 Just Released&lt;/a&gt;&lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;a href="http://weblogs.asp.net/podwysocki/archive/2008/04/04/relooking-at-xunit-net-rc2.aspx" style="font-weight: bold;"&gt;Relooking at xUnit.net RC2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;
UPDATE: xUnit.NET RC2 New Drop includes ASP.NET MVC support and better GUI runner.  Details &lt;a href="http://bradwilson.typepad.com/blog/2008/04/xunitnet-rc2--1.html"&gt;here&lt;/a&gt;.&lt;br /&gt;
UPDATE: Added Static Methods mention and F# - Thanks to &lt;a href="http://devhawk.net"&gt;DevHawk&lt;/a&gt;!&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
I've been a big fan of such testing frameworks as &lt;a href="http://www.nunit.org/"&gt;NUnit&lt;/a&gt; and &lt;a href="http://www.mbunit.com/"&gt;MbUnit&lt;/a&gt;, but recently I've found myself getting pulled more towards &lt;a href="http://codeplex.com/xunit"&gt;xUnit.net&lt;/a&gt; at least to play around with for any of my code samples that I write for this blog and on my own time.  I'm not really a fan of MSTest and many I think would agree about its deficiencies.  I won't go as far as say &lt;a href="http://jayflowers.com/joomla/"&gt;Jay Flowers&lt;/a&gt; and wear the shirt though...&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Another Release?&lt;/span&gt;&lt;br style="font-weight: bold;" /&gt;
&lt;br /&gt;
Recently, &lt;a href="http://bradwilson.typepad.com/"&gt;Brad Wilson&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/jamesnewkirk/default.aspx"&gt;Jim Newkirk&lt;/a&gt; recently announced the release of &lt;a href="http://codeplex.com/xunit"&gt;xUnit.net RC2&lt;/a&gt; on CodePlex.  I'd encourage you download the latest bits &lt;a href="http://www.codeplex.com/xunit/Release/ProjectReleases.aspx?ReleaseId=9681"&gt;here&lt;/a&gt;.  For those wondering what changes happened between RC1 and RC2, Brad has a good writeup on his blog &lt;a href="http://bradwilson.typepad.com/blog/2008/03/xunitnet-10-rc2.html"&gt;here&lt;/a&gt;.  What's interesting about this is the removal of the Assert class methods which take a user defined message should it fail.  I was never really a fan of those in the first place though.  &lt;br /&gt;
&lt;br /&gt;
Another interesting added features was the IUserFixture&amp;lt;T&amp;gt; which allows you to have a startup and teardown for your fixtures in a separate class and therefore reusable, unlike the current way of using no parameter constructors as your startup and the IDisposable.Dispose for your teardown.  See the tests in the FixtureExample for details.  But here's a snipped version of that code:&lt;br /&gt;
&lt;br /&gt;
&lt;!--
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Monaco;}}{\colortbl;??\red255\green255\blue255;\red40\green40\blue40;\red255\green128\blue0;\red255\green255\blue0;\red43\green145\blue175;\red0\green255\blue0;\red163\green21\blue21;}??\fs16 \cf1\cb2\highlight2     \cf3 public\cf1  \cf3 class\cf1  \cf4 DatabaseFixture\cf1  : \cf5 IDisposable\par ??\cf1     \{\par ??        \cf4 SqlConnection\cf1  connection;\par ??        \cf3 int\cf1  fooUserID;\par ??\par ??        \cf3 public\cf1  DatabaseFixture()\par ??        \{\par ??            \cf3 string\cf1  connectionString = \cf4 ConfigurationManager\cf1 .ConnectionStrings[\cf6 "DatabaseFixture"\cf1 ].ConnectionString;\par ??            connection = \cf3 new\cf1  \cf4 SqlConnection\cf1 (connectionString);\par ??            connection.Open();\par ??\par ??            \cf3 string\cf1  sql = \cf7 @"INSERT INTO Users VALUES ('foo', 'bar'); SELECT SCOPE_IDENTITY();"\cf1 ;\par ??\par ??            \cf3 using\cf1  (\cf4 SqlCommand\cf1  cmd = \cf3 new\cf1  \cf4 SqlCommand\cf1 (sql, connection))\par ??                fooUserID = \cf4 Convert\cf1 .ToInt32(cmd.ExecuteScalar());\par ??        \}\par ??\par ??        \cf3 public\cf1  \cf4 SqlConnection\cf1  Connection\par ??        \{\par ??            \cf3 get\cf1  \{ \cf3 return\cf1  connection; \}\par ??        \}\par ??\par ??        \cf3 public\cf1  \cf3 int\cf1  FooUserID\par ??        \{\par ??            \cf3 get\cf1  \{ \cf3 return\cf1  fooUserID; \}\par ??        \}\par ??\par ??        \cf3 public\cf1  \cf3 void\cf1  Dispose()\par ??        \{\par ??            \cf3 string\cf1  sql = \cf7 @"DELETE FROM Users WHERE ID = @id;"\cf1 ;\par ??\par ??            \cf3 using\cf1  (\cf4 SqlCommand\cf1  cmd = \cf3 new\cf1  \cf4 SqlCommand\cf1 (sql, connection))\par ??            \{\par ??                cmd.Parameters.AddWithValue(\cf6 "@id"\cf1 , fooUserID);\par ??                cmd.ExecuteNonQuery();\par ??            \}\par ??\par ??            connection.Close();\par ??        \}\par ??    \}}
--&gt;
&lt;div style="background: rgb(40, 40, 40) none repeat scroll 0% 50%; font-family: Monaco; font-size: 8pt; color: white; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;
&lt;p style="margin: 0px;"&gt;    &lt;span style="color: rgb(255, 128, 0);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(255, 128, 0);"&gt;class&lt;/span&gt; &lt;span style="color: yellow;"&gt;DatabaseFixture&lt;/span&gt; : &lt;span style="color: rgb(43, 145, 175);"&gt;IDisposable&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;    {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;        &lt;span style="color: yellow;"&gt;SqlConnection&lt;/span&gt; connection;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;        &lt;span style="color: rgb(255, 128, 0);"&gt;int&lt;/span&gt; fooUserID;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt; &lt;/p&gt;
&lt;p style="margin: 0px;"&gt;        &lt;span style="color: rgb(255, 128, 0);"&gt;public&lt;/span&gt; DatabaseFixture()&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;        {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;            &lt;span style="color: rgb(255, 128, 0);"&gt;string&lt;/span&gt; connectionString = &lt;span style="color: yellow;"&gt;ConfigurationManager&lt;/span&gt;.ConnectionStrings[&lt;span style="color: lime;"&gt;"DatabaseFixture"&lt;/span&gt;].ConnectionString;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;            connection = &lt;span style="color: rgb(255, 128, 0);"&gt;new&lt;/span&gt; &lt;span style="color: yellow;"&gt;SqlConnection&lt;/span&gt;(connectionString);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;            connection.Open();&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;            &lt;span style="color: rgb(255, 128, 0);"&gt;string&lt;/span&gt; sql = &lt;span style="color: rgb(163, 21, 21);"&gt;@"INSERT INTO Users VALUES ('foo', 'bar'); SELECT SCOPE_IDENTITY();"&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt; &lt;/p&gt;
&lt;p style="margin: 0px;"&gt;            &lt;span style="color: rgb(255, 128, 0);"&gt;using&lt;/span&gt; (&lt;span style="color: yellow;"&gt;SqlCommand&lt;/span&gt; cmd = &lt;span style="color: rgb(255, 128, 0);"&gt;new&lt;/span&gt; &lt;span style="color: yellow;"&gt;SqlCommand&lt;/span&gt;(sql, connection))&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;                fooUserID = &lt;span style="color: yellow;"&gt;Convert&lt;/span&gt;.ToInt32(cmd.ExecuteScalar());&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;        }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt; &lt;/p&gt;
&lt;p style="margin: 0px;"&gt;        &lt;span style="color: rgb(255, 128, 0);"&gt;public&lt;/span&gt; &lt;span style="color: yellow;"&gt;SqlConnection&lt;/span&gt; Connection&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;        {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;            &lt;span style="color: rgb(255, 128, 0);"&gt;get&lt;/span&gt; { &lt;span style="color: rgb(255, 128, 0);"&gt;return&lt;/span&gt; connection; }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;        }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt; &lt;/p&gt;
&lt;p style="margin: 0px;"&gt;        &lt;span style="color: rgb(255, 128, 0);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(255, 128, 0);"&gt;int&lt;/span&gt; FooUserID&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;        {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;            &lt;span style="color: rgb(255, 128, 0);"&gt;get&lt;/span&gt; { &lt;span style="color: rgb(255, 128, 0);"&gt;return&lt;/span&gt; fooUserID; }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;        }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt; &lt;/p&gt;
&lt;p style="margin: 0px;"&gt;        &lt;span style="color: rgb(255, 128, 0);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(255, 128, 0);"&gt;void&lt;/span&gt; Dispose()&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;        {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;            &lt;span style="color: rgb(255, 128, 0);"&gt;string&lt;/span&gt; sql = &lt;span style="color: rgb(163, 21, 21);"&gt;@"DELETE FROM Users WHERE ID = @id;"&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt; &lt;/p&gt;
&lt;p style="margin: 0px;"&gt;            &lt;span style="color: rgb(255, 128, 0);"&gt;using&lt;/span&gt; (&lt;span style="color: yellow;"&gt;SqlCommand&lt;/span&gt; cmd = &lt;span style="color: rgb(255, 128, 0);"&gt;new&lt;/span&gt; &lt;span style="color: yellow;"&gt;SqlCommand&lt;/span&gt;(sql, connection))&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;            {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;                cmd.Parameters.AddWithValue(&lt;span style="color: lime;"&gt;"@id"&lt;/span&gt;, fooUserID);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;                cmd.ExecuteNonQuery();&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;            }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt; &lt;/p&gt;
&lt;p style="margin: 0px;"&gt;            connection.Close();&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;        }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;    }&lt;/p&gt;
&lt;/div&gt;
&lt;br /&gt;
What the above code allows us to do is to define a class that holds the data from the initialization of the first test, to the cleanup after the last test.  Our state is therefore maintained in a reusable manner.  As you will note, the startup logic resides in the default no parameter constructor and all teardown logic is in the IDisposable.Dispose method.&lt;br /&gt;
&lt;br /&gt;
&lt;!--
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Monaco;}}{\colortbl;??\red255\green255\blue255;\red40\green40\blue40;\red255\green128\blue0;\red255\green255\blue0;\red43\green145\blue175;\red0\green255\blue0;}??\fs16 \cf1\cb2\highlight2     \cf3 public\cf1  \cf3 class\cf1  \cf4 FixtureTests\cf1  : \cf5 IUseFixture\cf1 &amp;lt;\cf4 DatabaseFixture\cf1 &amp;gt;\par ??    \{\par ??        \cf4 DatabaseFixture\cf1  database;\par ??\par ??        \cf3 public\cf1  \cf3 void\cf1  SetFixture(\cf4 DatabaseFixture\cf1  data)\par ??        \{\par ??            database = data;\par ??        \}\par ??\par ??        [\cf4 Fact\cf1 ]\par ??        \cf3 public\cf1  \cf3 void\cf1  ConnectionIsEstablished()\par ??        \{\par ??            \cf4 Assert\cf1 .NotNull(database.Connection);\par ??        \}\par ??\par ??        [\cf4 Fact\cf1 ]\par ??        \cf3 public\cf1  \cf3 void\cf1  FooUserWasInserted()\par ??        \{\par ??            \cf3 string\cf1  sql = \cf6 "SELECT COUNT(*) FROM Users WHERE ID = @id;"\cf1 ;\par ??\par ??            \cf3 using\cf1  (\cf4 SqlCommand\cf1  cmd = \cf3 new\cf1  \cf4 SqlCommand\cf1 (sql, database.Connection))\par ??            \{\par ??                cmd.Parameters.AddWithValue(\cf6 "@id"\cf1 , database.FooUserID);\par ??\par ??                \cf3 int\cf1  rowCount = \cf4 Convert\cf1 .ToInt32(cmd.ExecuteScalar());\par ??\par ??                \cf4 Assert\cf1 .Equal(1, rowCount);\par ??            \}\par ??        \}\par ??    \}}
--&gt;
&lt;div style="background: rgb(40, 40, 40) none repeat scroll 0% 50%; font-family: Monaco; font-size: 8pt; color: white; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;
&lt;p style="margin: 0px;"&gt;    &lt;span style="color: rgb(255, 128, 0);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(255, 128, 0);"&gt;class&lt;/span&gt; &lt;span style="color: yellow;"&gt;FixtureTests&lt;/span&gt; : &lt;span style="color: rgb(43, 145, 175);"&gt;IUseFixture&lt;/span&gt;&amp;lt;&lt;span style="color: yellow;"&gt;DatabaseFixture&lt;/span&gt;&amp;gt;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;    {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;        &lt;span style="color: yellow;"&gt;DatabaseFixture&lt;/span&gt; database;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt; &lt;/p&gt;
&lt;p style="margin: 0px;"&gt;        &lt;span style="color: rgb(255, 128, 0);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(255, 128, 0);"&gt;void&lt;/span&gt; SetFixture(&lt;span style="color: yellow;"&gt;DatabaseFixture&lt;/span&gt; data)&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;        {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;            database = data;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;        }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;   &lt;/p&gt;
&lt;p style="margin: 0px;"&gt;        [&lt;span style="color: yellow;"&gt;Fact&lt;/span&gt;]&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;        &lt;span style="color: rgb(255, 128, 0);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(255, 128, 0);"&gt;void&lt;/span&gt; FooUserWasInserted()&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;        {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;            &lt;span style="color: rgb(255, 128, 0);"&gt;string&lt;/span&gt; sql = &lt;span style="color: lime;"&gt;"SELECT COUNT(*) FROM Users WHERE ID = @id;"&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0px;"&gt; &lt;/p&gt;
&lt;p style="margin: 0px;"&gt;            &lt;span style="color: rgb(255, 128, 0);"&gt;using&lt;/span&gt; (&lt;span style="color: yellow;"&gt;SqlCommand&lt;/span&gt; cmd = &lt;span style="color: rgb(255, 128, 0);"&gt;new&lt;/span&gt; &lt;span style="color: yellow;"&gt;SqlCommand&lt;/span&gt;(sql, database.Connection))&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;            {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;                cmd.Parameters.AddWithValue(&lt;span style="color: lime;"&gt;"@id"&lt;/span&gt;, database.FooUserID);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;                &lt;span style="color: rgb(255, 128, 0);"&gt;int&lt;/span&gt; rowCount = &lt;span style="color: yellow;"&gt;Convert&lt;/span&gt;.ToInt32(cmd.ExecuteScalar());&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;                &lt;span style="color: yellow;"&gt;Assert&lt;/span&gt;.Equal(1, rowCount);&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;            }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;        }&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;    }&lt;/p&gt;
&lt;/div&gt;
&lt;br /&gt;
Then we can go ahead with our tests, while using the SqlConnection as defined on our DatabaseFixture.  After we're done with our test, it goes ahead and calls Dispose on the fixture.  I tend to like this approach and it's definitely growing on me.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Why xUnit.net?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
For those new to xUnit.net, there are some decent links to help you along.  Some of the more interesting ones can be found here:&lt;br /&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a href="http://www.codeplex.com/xunit/Wiki/View.aspx?title=Comparisons&amp;amp;referringTitle=Home"&gt;Comparison to MbUnit, NUnit and MSTest&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://www.codeplex.com/xunit/Wiki/View.aspx?title=HowToUseResharper&amp;amp;referringTitle=Home"&gt;Running Resharper with xUnit.net&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://blog.benhall.me.uk/2008/01/introduction-to-xunit.html"&gt;An introduction to xUnit.net&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://blog.benhall.me.uk/2008/01/introduction-to-xunitnet-extensions.html"&gt;An introduction to xUnit.net extensions&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://blog.benhall.me.uk/2008/01/creating-your-own-xunit-extension.html"&gt;Create your own xUnit.net extension&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
But, why am I interested in it?  Well, let's just say that I think it tackles things in a slightly different manner.  I think one of the key pieces that I really like is the Assert.Throws instead of the clumsy ExpectedExceptionAttribute which you must clutter your tests with on the top.  I would rather assert that such a thing happened programmatically, so that I may analyze the exception.  I can also specify which line I expect during my test will throw the exception, instead of taking on blind faith that my test threw an exception.  It may be of the right type, but that may not have been the one you wanted, thus giving a false sense of security.&lt;br /&gt;
&lt;br /&gt;
To use this, just simply use the Assert.Throws&amp;lt;TException&amp;gt;(Assert.ThrowsDelegate) which I've found to be very helpful.  Let's look at a quick test of that being used.&lt;br /&gt;
&lt;br /&gt;
&lt;!--
{\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Monaco;}}{\colortbl;??\red255\green255\blue255;\red40\green40\blue40;\red255\green255\blue0;\red255\green128\blue0;}??\fs16 \cf1\cb2\highlight2     [\cf3 Fact\cf1 ]\par ??    \cf4 public\cf1  \cf4 void\cf1  PopEmptyStack()\par ??    \{\par ??        \cf3 Stack\cf1 &amp;lt;\cf4 string\cf1 &amp;gt; stack = \cf4 new\cf1  \cf3 Stack\cf1 &amp;lt;\cf4 string\cf1 &amp;gt;();\par ??        \cf3 Assert\cf1 .Throws&amp;lt;\cf3 InvalidOperationException\cf1 &amp;gt;(() =&amp;gt; stack.Pop());\par ??    \}}
--&gt;
&lt;div style="background: rgb(40, 40, 40) none repeat scroll 0% 50%; font-family: Monaco; font-size: 8pt; color: white; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;
&lt;p style="margin: 0px;"&gt;    [&lt;span style="color: yellow;"&gt;Fact&lt;/span&gt;]&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;    &lt;span style="color: rgb(255, 128, 0);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(255, 128, 0);"&gt;void&lt;/span&gt; PopEmptyStack()&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;    {&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;        &lt;span style="color: yellow;"&gt;Stack&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(255, 128, 0);"&gt;string&lt;/span&gt;&amp;gt; stack = &lt;span style="color: rgb(255, 128, 0);"&gt;new&lt;/span&gt; &lt;span style="color: yellow;"&gt;Stack&lt;/span&gt;&amp;lt;&lt;span style="color: rgb(255, 128, 0);"&gt;string&lt;/span&gt;&amp;gt;();&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;        &lt;span style="color: yellow;"&gt;Assert&lt;/span&gt;.Throws&amp;lt;&lt;span style="color: yellow;"&gt;InvalidOperationException&lt;/span&gt;&amp;gt;(() =&amp;gt; stack.Pop());&lt;/p&gt;
&lt;p style="margin: 0px;"&gt;    }&lt;/p&gt;
&lt;/div&gt;
&lt;br /&gt;
As you can see, we're pretty explicit about what line will throw the exception, and that's really the key to this scenario.  There are a good number of samples provided on the releases page that you should check out.  As always with most products that I talk about, I highly recommend reading the tests to really fully understand what's going on underneath the covers.  Not only does it help you understand the intent of the program, but you can learn about good coding techniques, design patterns, testing patterns and so on.&lt;br /&gt;
&lt;br /&gt;
Another point that xUnit.net separates itself from the pack is the ability to decorate static methods as facts.  This frees you from having to create an instance of your test class in order to call them.  Harry Pierson, aka DevHawk, demonstrates its use with regards to F# and testing the parse buffer &lt;a href="http://devhawk.net/2007/12/12/Practical+F+Parsing+Unit+Testing.aspx"&gt;here&lt;/a&gt;.  It definitely opened my eyes and a few more avenues as I pursue more F# related work items in the future.  Here's just a quick and dirty sample of showing how you can use xUnit.net with F# quite easily, just as Harry's post did.&lt;br /&gt;
&lt;br /&gt;
&lt;!--
{\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Monaco;}}{\colortbl;??\red255\green255\blue255;\red40\green40\blue40;\red255\green128\blue0;}??\fs16 \cf1\cb2\highlight2 #light\par ??\par ??\cf3 let\cf1  \cf3 rec\cf1  fib n = \par ??  \cf3 match\cf1  n \cf3 with\par ??\cf1   | 0 \cf3 -&amp;gt;\cf1  1\par ??  | 1 \cf3 -&amp;gt;\cf1  1\par ??  | x \cf3 -&amp;gt;\cf1  fib(n - 2) + fib(n - 1)\par ??  \par ??print_any (fib (-1))}
--&gt;
&lt;div style="background: rgb(40, 40, 40) none repeat scroll 0% 50%; font-family: Monaco; font-size: 8pt; color: white; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;
&lt;p style="margin: 0px;"&gt;#light&lt;br /&gt;
&lt;br /&gt;
#R @&lt;span style="color: rgb(0, 255, 0);"&gt;"E:\Tools\xunit-build-1223-samples\Samples\xunit\xunit.dll" &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: rgb(255, 128, 0);"&gt;open&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt; &lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;/span&gt;System&lt;br /&gt;
&lt;span style="color: rgb(255, 128, 0);"&gt;open&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt; &lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;/span&gt;System.Collections.Generic&lt;br /&gt;
&lt;span style="color: rgb(255, 128, 0);"&gt;open&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt; &lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;/span&gt;Xunit&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: rgb(255, 128, 0);"&gt;type &lt;/span&gt;Stack&amp;lt;'t&amp;gt; = &lt;span style="color: rgb(255, 128, 0);"&gt;class&lt;/span&gt;&lt;br /&gt;
  &lt;span style="color: rgb(255, 128, 0);"&gt;val&lt;/span&gt; elements : LinkedList&amp;lt;'t&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  new() = { elements = &lt;span style="color: rgb(255, 128, 0);"&gt;new &lt;/span&gt;LinkedList&amp;lt;'t&amp;gt;() }&lt;br /&gt;
  &lt;br /&gt;
  &lt;span style="color: rgb(255, 128, 0);"&gt;member&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt; &lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;/span&gt;x.IsEmpty&lt;br /&gt;
    &lt;span style="color: rgb(255, 128, 0);"&gt;with &lt;/span&gt;get() = x.elements.Count = 0&lt;br /&gt;
    &lt;br /&gt;
  &lt;span style="color: rgb(255, 128, 0);"&gt;member&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt; &lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;/span&gt;x.Push element =&lt;br /&gt;
    x.elements.AddFirst(element:'t)&lt;br /&gt;
    &lt;br /&gt;
  &lt;span style="color: rgb(255, 128, 0);"&gt;member&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt; &lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;/span&gt;x.Top&lt;br /&gt;
    &lt;span style="color: rgb(255, 128, 0);"&gt;with &lt;/span&gt;get() =&lt;br /&gt;
      &lt;span style="color: rgb(255, 128, 0);"&gt;if &lt;/span&gt;x.elements.Count = 0 &lt;span style="color: rgb(255, 128, 0);"&gt;then&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
        raise (InvalidOperationException(&lt;span style="color: rgb(0, 255, 0);"&gt;"cannot top an empty stack"&lt;/span&gt;))&lt;br /&gt;
      x.elements.First.Value&lt;br /&gt;
      &lt;br /&gt;
  &lt;span style="color: rgb(255, 128, 0);"&gt;member&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt; &lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;/span&gt;x.Pop = &lt;br /&gt;
    &lt;span style="color: rgb(255, 128, 0);"&gt;let&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt; &lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;/span&gt;top = x.Top&lt;br /&gt;
    x.elements.RemoveFirst()&lt;br /&gt;
    top&lt;br /&gt;
&lt;span style="color: rgb(255, 128, 0);"&gt;end&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
[&amp;lt;Fact&amp;gt;]   &lt;br /&gt;
&lt;span style="color: rgb(255, 128, 0);"&gt;let&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt; &lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;/span&gt;NoElementsShouldBeEmpty () =&lt;br /&gt;
  &lt;span style="color: rgb(255, 128, 0);"&gt;let&lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt; &lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;/span&gt;stack = new Stack&amp;lt;string&amp;gt;()&lt;br /&gt;
  Assert.True(stack.IsEmpty)&lt;br /&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;br /&gt;
If you notice, the FactAttribute is placed on a static method called NoElementsShouldBeEmpty and sure enough it works like a champ through xUnit.net.  I like this approach instead of the pomp and circumstance required for creating classes as shown above with my Stack class.  Note the use of the empty parans which forces it to be a void method with no values passed either.  But if you run it through the xunit.console sure enough it succeeds like a champ.&lt;br /&gt;
&lt;br /&gt;
What are we missing though?  Well, I'm in favor of having a standalone GUI Test Runner much like NUnit and MbUnit have.  In fact, Brad has started this and you can get these features from the latest commits &lt;a href="http://www.codeplex.com/xunit/SourceControl/ListDownloadableCommits.aspx"&gt;here&lt;/a&gt;.  Mind you I haven't gotten it to work just right yet, but it's a work in progress.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
There is a lot to like about xUnit.net and takes a lot of lessons learned from the use of NUnit, MbUnit and others and I think they're doing a good job incorporating issues.  This project isn't as active as MbUnit and NUnit, but it's definitely one to keep an eye on.  Recent releases of NUnit and Gallio Automation Platform will probably be also covered in the short while as well as they have a lot to offer.  Until next time... &lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http://geekswithblogs.net/Podwysocki/archive/2008/03/31/120904.aspx"&gt;&lt;img border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://geekswithblogs.net/Podwysocki/archive/2008/03/31/120904.aspx" alt="kick it on DotNetKicks.com" /&gt;&lt;/a&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=120904"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=120904" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/Podwysocki/aggbug/120904.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Matthew Podwysocki</dc:creator>
            <guid>http://geekswithblogs.net/Podwysocki/archive/2008/03/31/120904.aspx</guid>
            <pubDate>Mon, 31 Mar 2008 23:31:06 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/Podwysocki/comments/120904.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/Podwysocki/archive/2008/03/31/120904.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/Podwysocki/comments/commentRss/120904.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/Podwysocki/services/trackbacks/120904.aspx</trackback:ping>
        </item>
        <item>
            <title>Coming to Terms with Behavior Driven Development</title>
            <link>http://geekswithblogs.net/Podwysocki/archive/2008/03/03/120174.aspx</link>
            <description>A while ago, I posted about Behavior Driven Development (BDD) while using the &lt;a href="http://nbehave.org/"&gt;NBehave&lt;/a&gt;, and I think I went too far into the tool without going into the whole thought process instead.  I've had a series of these blog posts in my head but have been fighting writers block in order to get them out the door.&lt;br /&gt;
&lt;br style="font-weight: bold;" /&gt;
&lt;span style="font-weight: bold;"&gt;BDD Introduction&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Anyhow, there has been a lot of &lt;a href="http://tech.groups.yahoo.com/group/altdotnet/message/3685"&gt;discussion around BDD&lt;/a&gt; lately on the &lt;a href="http://tech.groups.yahoo.com/group/altdotnet/"&gt;altdotnet mailing list&lt;/a&gt; around the definition and applicability of BDD in regards to Test Driven Development (TDD).  Subsequently, this led to forming a new group on &lt;a href="http://groups.google.com/group/behaviordrivendevelopment"&gt;Google Groups about Behavior Driven Development&lt;/a&gt;.  It's great to see the community start to gain momentum and talk about it more.  I've been following &lt;a href="http://dannorth.net/"&gt;Dan North&lt;/a&gt;, &lt;a href="http://www.lostechies.com/blogs/joe_ocampo/"&gt;Joe Ocampo&lt;/a&gt;, Scott Bellware, &lt;a href="http://codebetter.com/blogs/jean-paul_boodhoo/default.aspx"&gt;JP Boodhoo&lt;/a&gt; and &lt;a href="http://codebetter.com/blogs/david_laribee/default.aspx"&gt;Dave Laribee&lt;/a&gt; on this for a while, but now to come to a centralized place for that knowledge sharing has been invaluable.  I've seen too many times that there is a high noise to information ratio out there and we need to clarify a few things before it can really take hold.&lt;br /&gt;
&lt;br /&gt;
Getting back to the subject at hand, if you're unfamiliar with BDD, you should check out Dan North's explanation &lt;a href="http://dannorth.net/introducing-bdd"&gt;here&lt;/a&gt;.   There are a good number of links inside to whet your appetite.  To put things succinctly, BDD aims to bridge the gap between Domain Driven Design and Test Driven Development.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.daveastels.com/"&gt;Dave Astels&lt;/a&gt;, also has a great video on Google Video on BDD you can find &lt;a href="http://video.google.com/videoplay?docid=8135690990081075324"&gt;here&lt;/a&gt;.  It's a great video which talks about how TDD differs and evolved from BDD.  It also delves into the subject of &lt;a href="http://rspec.info/"&gt;rSpec&lt;/a&gt;, the BDD framework in Ruby.  Very worth your time to check it out.&lt;br /&gt;
&lt;br /&gt;
Dave's summation of BDD comes down to the following bullet points:&lt;br /&gt;
&lt;ul&gt;
    &lt;li&gt;Don't talk about Units in regards to Unit Testing, instead talk about Behaviors&lt;/li&gt;
    &lt;li&gt;All software we write has behaviors&lt;/li&gt;
    &lt;li&gt;There should be no correlation between public methods on a class and test classes&lt;/li&gt;
    &lt;li&gt;Structure your tests around the behavior of your application&lt;/li&gt;
    &lt;li&gt;Put emphasis on behaviors (How do I get it to do what I want it to)&lt;/li&gt;
    &lt;li&gt;Get rid of state based testing and look at interactions instead&lt;/li&gt;
    &lt;li&gt;Get rid of tests and instead use specifications of behavior (specs)&lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;Get rid of assertions and instead set up expectations&lt;/li&gt;
&lt;/ul&gt;
&lt;span style="font-weight: bold;"&gt;More Places To Turn&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;I agree with &lt;a href="http://www.lostechies.com/blogs/jimmy_bogard/archive/2008/01/10/converting-tests-to-specs-is-a-bad-idea.aspx"&gt;Jimmy Bogard&lt;/a&gt;, that going to TDD to BDD in one fell swoop by just renaming your tests.  Instead, we should focus on those interactions between the systems and less on the physical implementations of the code.  We should also focus on the expectations inside our code as well.  Mocking and the use of &lt;a href="http://www.ayende.com/projects/rhino-mocks/downloads.aspx"&gt;Rhino Mocks&lt;/a&gt; or your other mocking framework will do nicely in here.  &lt;a href="http://persistall.com/"&gt;Brian Donahue&lt;/a&gt; also has some nice stabs at BDD as well &lt;a href="http://persistall.com/archive/2007/11/02/bdd-with-just-nunit---a-first-attempt.aspx"&gt;here&lt;/a&gt;, &lt;a href="http://persistall.com/archive/2007/11/05/further-thoughts-on-bdd-in-c.aspx"&gt;here &lt;/a&gt;and &lt;a href="http://persistall.com/archive/2007/11/29/jp-solves-my-bdd-woes.aspx"&gt;here&lt;/a&gt;.  If you're up in the Philly area soon, Brian will be making the rounds doing BDD presentations...&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://codebetter.com/blogs/david_laribee/"&gt;Dave Laribee&lt;/a&gt; has also put some thought into BDD as well with a particular set of classes he has written to help with BDD that you can check out &lt;a href="http://codebetter.com/blogs/david_laribee/archive/2007/12/17/approaching-bdd.aspx"&gt;here&lt;/a&gt;.  Also if you've paid attention to the BDD mailing list on Google Groups, you will note that Scott Bellware also has a framework up on Google Code called &lt;a href="http://code.google.com/p/specunit-net/"&gt;SpecUnit &lt;/a&gt;which is an extension to NUnit to support naming conventions of BDD inside of the xUnit type frameworks.  Very cool ideas coming out!&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Wrapping It Up&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
I encourage you to join the BDD list, read the links, and learn more.  I find it's a more intuitive way of proving the behavior of your application (Note that I didn't say test).  I find that it bridges the gap between Domain Driven Design and Test Driven Development quite handily especially in regard to using the ubiquitous language.  It's important that naming and ubiquitous language comes into play when using BDD, because you can share your specs and they should be able to read them as well.  It's a great gap between user stories and the code you write.  If you need help with user stories, check out Mike Cohn's &lt;a href="http://www.amazon.com/User-Stories-Applied-Development-Addison-Wesley/dp/0321205685"&gt;User Stories Applied book&lt;/a&gt;.  Anyhow, I hope you found this useful as an introduction to some of my many upcoming BDD posts.
&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http://geekswithblogs.net/Podwysocki/archive/2008/03/03/120174.aspx"&gt;&lt;img border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://geekswithblogs.net/Podwysocki/archive/2008/03/03/120174.aspx" alt="kick it on DotNetKicks.com" /&gt;&lt;/a&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=120174"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=120174" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/Podwysocki/aggbug/120174.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Matthew Podwysocki</dc:creator>
            <guid>http://geekswithblogs.net/Podwysocki/archive/2008/03/03/120174.aspx</guid>
            <pubDate>Mon, 03 Mar 2008 23:25:41 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/Podwysocki/comments/120174.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/Podwysocki/archive/2008/03/03/120174.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/Podwysocki/comments/commentRss/120174.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/Podwysocki/services/trackbacks/120174.aspx</trackback:ping>
        </item>
        <item>
            <title>Fluency in Fluent Interfaces</title>
            <link>http://geekswithblogs.net/Podwysocki/archive/2008/02/01/119215.aspx</link>
            <description>&lt;a href="http://www.hanselman.com/blog"&gt;Scott Hanselman's&lt;/a&gt; recent post about the &lt;a href="http://www.hanselman.com/blog/TheWeeklySourceCode14FluentInterfaceEdition.aspx"&gt;Daily Source Code 14 - Fluent Interface Edition&lt;/a&gt; got me to think more on &lt;a href="http://martinfowler.com/bliki/FluentInterface.html"&gt;fluent interfaces&lt;/a&gt; and a previous post of mine on &lt;a href="http://geekswithblogs.net/Podwysocki/archive/2008/01/08/118362.aspx"&gt;ObjectMother versus Test Data Builders&lt;/a&gt;.  Also, it comes to mind in regards to DSLs, both internal and external that has me intrigued.  Partially due to my latest involvement with Ruby and F#.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Test Data Builder Example&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
So, let's revisit that simple example:&lt;br /&gt;
&lt;br /&gt;
public class ClaimBuilder&lt;br /&gt;
{&lt;br /&gt;
     private DateTime claimDate;&lt;br /&gt;
     private Provider provider = ProviderBuilder.StartRecording().Build();&lt;br /&gt;
     private Recipient recipient = RecipientBuilder.StartRecording().Build();&lt;br /&gt;
     private ClaimLineCollection claimLines = ClaimLinesBuilder.StartRecording.Build();&lt;br /&gt;
&lt;br /&gt;
     public static ClaimBuilder StartRecording()&lt;br /&gt;
     {&lt;br /&gt;
          return new ClaimBuilder();&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     public ClaimBuilder WithClaimDate(DateTime claimDate)&lt;br /&gt;
     {&lt;br /&gt;
          this.claimDate = claimDate;&lt;br /&gt;
          return this;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     public ClaimBuilder WithProvider(Provider provider)&lt;br /&gt;
     {&lt;br /&gt;
          this.provider = provider;&lt;br /&gt;
          return this;&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     public ClaimBuilder WithRecipient(Recipient recipient)&lt;br /&gt;
     {&lt;br /&gt;
          this.recipient = recipient;&lt;br /&gt;
          return this;&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     public ClaimBuilder WithClaimLines(ClaimLineCollection claimLines)&lt;br /&gt;
     {&lt;br /&gt;
          this.claimLines = claimLines;&lt;br /&gt;
          return this;&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     public static implicit operator Claim(ClaimBuilder builder)&lt;br /&gt;
     {&lt;br /&gt;
          return new Claim(builder.claimDate, builder.provider, builder.recipient, builder.claimLines);&lt;br /&gt;
     }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
As you may note I changed the Build method from the previous post to an implicit operator to save me some coding time when it comes to my builders.  This is one of the very very few places where I'd recommend using this operator.  Anyhow, then we'd have the calling code to look similar to this for my unit tests.&lt;br /&gt;
&lt;br /&gt;
Claim claim = ClaimBuilder.StartRecording()&lt;br /&gt;
     .WithClaimDate(new DateTime(2008, 1, 1))&lt;br /&gt;
     .WithProvider(ProviderBuilder.StartRecording()&lt;br /&gt;
          .WithName("Robert", "Jones")&lt;br /&gt;
          .WithAddress(AddressBuilder.StartRecording()&lt;br /&gt;
               .WithStreetAddress("1800 28th St, NW")&lt;br /&gt;
               .WithCity("Washington")&lt;br /&gt;
               .WithState("DC"))))&lt;br /&gt;
     .WithRecipient(RecipientBuilder.StartRecording()&lt;br /&gt;
          .WithName(James", "Smith")&lt;br /&gt;
          .WithAddress(AddressBuilder.StartRecording()&lt;br /&gt;
               .WithStreetAddress("1210 14th St, SE",)&lt;br /&gt;
               .WithCity("Washington")&lt;br /&gt;
               .WithState("DC"))))&lt;br /&gt;
     .WithClaimLines(ClaimLinesBuilder.StartRecording()&lt;br /&gt;
          .WithClaim("00308-1")));&lt;br /&gt;
&lt;br /&gt;
This is truly powerful here to make it make sense to the reader instead of the usual black box ObjectMother approach.  When building my entity objects for test, this is the main approach I use.  &lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Other Examples&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Scott Bellware has introduced the &lt;a href="http://code.google.com/p/nunit-spec/"&gt;Behavior Driven Development NUnit Extensions&lt;/a&gt; which makes heavy use of fluent interfaces.  With my deeper dive into BDD, this has been very helpful.  &lt;a href="http://codebetter.com/blogs/david_laribee/archive/2007/12/17/approaching-bdd.aspx"&gt;Dave Laribee&lt;/a&gt; also has me on the kick as well, so lots of thanks to them for pointing me in the right direction, although some may disagree with their directions.  But that's for another time and another post.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://codebetter.com/blogs/jeremy.miller/default.aspx"&gt;Jeremy Miller&lt;/a&gt; also has fluent interfaces on his &lt;a href="http://structuremap.sourceforge.net/"&gt;StructureMap &lt;/a&gt;IOC container project.   Some new parts with registration will be coming up with his new release of version 2.5 as noted &lt;a href="http://codebetter.com/blogs/jeremy.miller/archive/2008/01/23/some-new-ways-to-build-objects-in-structuremap-with-less-configuration.aspx"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Of course I can keep rattling on with others like NHibernate and the ICriteria, Castle Windsor's fluent registration interfaces and so on.  The list goes on!  Very cool stuff coming out lately...  Until next time!
&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http://geekswithblogs.net/Podwysocki/archive/2008/02/01/119215.aspx"&gt;&lt;img border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://geekswithblogs.net/Podwysocki/archive/2008/02/01/119215.aspx" alt="kick it on DotNetKicks.com" /&gt;&lt;/a&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=119215"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=119215" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/Podwysocki/aggbug/119215.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Matthew Podwysocki</dc:creator>
            <guid>http://geekswithblogs.net/Podwysocki/archive/2008/02/01/119215.aspx</guid>
            <pubDate>Fri, 01 Feb 2008 22:47:41 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/Podwysocki/comments/119215.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/Podwysocki/archive/2008/02/01/119215.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/Podwysocki/comments/commentRss/119215.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/Podwysocki/services/trackbacks/119215.aspx</trackback:ping>
        </item>
        <item>
            <title>Testing your internals inside out</title>
            <link>http://geekswithblogs.net/Podwysocki/archive/2008/01/24/118889.aspx</link>
            <description>Recently among other places it was asked on the &lt;a href="http://tech.groups.yahoo.com/group/altdotnet"&gt;altdotnet list&lt;/a&gt; about the strategies of unit testing with regards to assemblies and naming  &lt;a href="http://tech.groups.yahoo.com/group/altdotnet/message/1606"&gt;This message&lt;/a&gt; here caught my eye regarding putting your NUnit tests in the same assembly as the code under test.&lt;br /&gt;
&lt;br /&gt;
The message states about putting the tests in the same assembly :&lt;br /&gt;
&lt;br style="font-style: italic;" /&gt;
&lt;span style="font-style: italic;"&gt;There are a couple advantages to this approach:&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;
&lt;ul style="font-style: italic;"&gt;
    &lt;li&gt;The nearness of the files will make it easier (and therefore more likely) that developers will work on the test in tandem with the class under test (CUT).&lt;/li&gt;
    &lt;li&gt;One can make private methods on the CUT into internal methods and then write tests for them, if need be.&lt;/li&gt;
    &lt;li&gt;Will effectively halve the number of projects in the solution (My current solution has 40+ non test projects), making the solution explorer a little less unwieldy.&lt;/li&gt;
    &lt;li&gt;I'm thinking this will make it easier for devs unfamiliar with NUnit testing to gain experience with it faster. (I'm currently trying to introduce the concept to 10+ developers.)&lt;/li&gt;
&lt;/ul&gt;
&lt;span style="font-style: italic;"&gt;And the only disadvantage I have thought of so far:&lt;/span&gt;&lt;br style="font-style: italic;" /&gt;
&lt;ul style="font-style: italic;"&gt;
    &lt;li&gt;The production assemblies have a reference to NUnit and contain more types. Slower compilation and load time?&lt;/li&gt;
&lt;/ul&gt;
&lt;span style="font-weight: bold;"&gt;The DEBUG approach&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
I can say in the early days of my test driven development and others, I was doing this as were many others.  We'd go ahead and create a Tests folder inside our project which in turn would create a .Tests namespace.  In fact, most people were doing this with their test fixtures:&lt;br /&gt;
&lt;br /&gt;
#if DEBUG&lt;br /&gt;
&lt;br /&gt;
[TestFixture]&lt;br /&gt;
public class CustomerTestFixture&lt;br /&gt;
{&lt;br /&gt;
     ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
This would prevent of course it being compiled into your production build, had you of course used the release build type.  Many shops I worked with never did that...&lt;br /&gt;
&lt;br /&gt;
Early on, I  realized that it clutters up your assemblies quite quickly.  Throw on top of that any unit testing dll of choice (MbUnit, NUnit, xUnit.NET, MSTest) and any mocking framework as well (Rhino Mocks, TypeMock.NET).  I was weary of including any references in my assemblies that I didn't absolutely need.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Testing Internals&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
One of the main reasons many advocate this approach is that they have access to the internals of your assembly to put them under test.  I think the early versions of the Enterprise Library were this way, although I can't remember.  I'm sure someone will correct me at some point.&lt;br /&gt;
&lt;br /&gt;
By moving my unit tests to the outside in a separate .Tests assembly, I had to think long and hard about the public API I was willing to expose.  In a way, that's a good thing as it made me very clear on the boundaries of my classes and the assembly as a whole.  I also tend to have multiple tests fixtures per specification under tests as I want to test it under multiple aspects that may be cross-cutting.  I'm moving more towards a BDD way of doing things, albeit I'm in a mixed environment now of TDD with BDD.&lt;br /&gt;
&lt;br /&gt;
Ultimately, though if you need to expose some sort of internals, although should not be the case with 99% of what you do, you have the option of internals visible to attribute such as this:&lt;br /&gt;
&lt;br /&gt;
[assembly: InternalsVisibleTo("Podwysocki.Contracts")]&lt;br /&gt;
&lt;br /&gt;
But to do any more than that, well, brings up a testing code smell and a rant.  I think a better approach is to use Dependency Injection and use that to set your expectations through mocks.  Then you can test the internals quite easily, but of course testing one expectation at a time and using a double for the other dependencies.  That's another lesson I've had to learn over time is the "When to use Mocks".  Then again I could be blowing smoke...&lt;br /&gt;
&lt;br style="font-weight: bold;" /&gt;
&lt;span style="font-weight: bold;"&gt;Rant Time&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
I've noticed in MSTest that you can create private accessors for your given objects under test.  This just to me screams of being a horrid idea.  Very likely during a lot of my refactoring, the internals of my classes under test can and will change frequently.  So, that means my unit tests will break quite quickly, then I'll have to right-click on my class again and generate my proxy methods again...&lt;br /&gt;
&lt;br /&gt;
Oh, and generating your unit tests by right clicking on your class just doesn't seem very TDD to me.  I'm sure most will agree with me on this, and you wonder why there is xUnit.NET coming from Microsoft guys when MSTest already exists.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
So, at the end of the day, I'm more for testing the publicly facing API of your given assembly.  That makes you think long and hard about what you want to expose and how granular you make your specifications under test.  It's been a long road since I've started TDD and even BDD and I'll admit I still have much to learn..
&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http://geekswithblogs.net/Podwysocki/archive/2008/01/24/118889.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://geekswithblogs.net/Podwysocki/archive/2008/01/24/118889.aspx" /&gt;&lt;/a&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=118889"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=118889" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/Podwysocki/aggbug/118889.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Matthew Podwysocki</dc:creator>
            <guid>http://geekswithblogs.net/Podwysocki/archive/2008/01/24/118889.aspx</guid>
            <pubDate>Thu, 24 Jan 2008 23:55:41 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/Podwysocki/comments/118889.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/Podwysocki/archive/2008/01/24/118889.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/Podwysocki/comments/commentRss/118889.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/Podwysocki/services/trackbacks/118889.aspx</trackback:ping>
        </item>
        <item>
            <title>DC ALT.NET Meeting 1/15/2008</title>
            <link>http://geekswithblogs.net/Podwysocki/archive/2008/01/02/118175.aspx</link>
            <description>We are announcing our second meeting of &lt;a href="http://tech.groups.yahoo.com/group/dcaltnet/"&gt;DC ALT.NET&lt;/a&gt; on January 15th at 7PM.  &lt;br /&gt;
&lt;br /&gt;
The meeting this month will bring ALT.NET to &lt;a href="http://www.cmap-online.org"&gt;CMAP&lt;/a&gt;.  Are you a developer who always keeps an eye out for a better way? Do you look outside the mainstream to adopt the best practices of any development community, including Open Source, Agile, Java, and Ruby communities? Are you always looking for more elegant, more simple, more maintainable solutions? If so, then you might be an ALT.NET practitioner!&lt;br /&gt;
 &lt;br /&gt;
This group follows the &lt;a href="http://en.wikipedia.org/wiki/Open_Space_Technology"&gt;Open Space Technology&lt;/a&gt; model.  In Open Space, a facilitator explains the process and then participants are invited to co-create the agenda and host their own discussion groups. &lt;br /&gt;
 &lt;br /&gt;
This model follows the four basic principles:&lt;br /&gt;
&lt;ul&gt;
    &lt;li&gt;Whoever comes are the right people&lt;/li&gt;
    &lt;li&gt;Whatever happens is the only thing that could have&lt;/li&gt;
    &lt;li&gt;Whenever it starts is the right time&lt;/li&gt;
    &lt;li&gt;When it's over, it's over&lt;/li&gt;
&lt;/ul&gt;
Topics for discussion can include the following as well as others:&lt;br /&gt;
&lt;ul&gt;
    &lt;li&gt;Model View Controller Pattern (ASP.NET MVC/MonoRail)&lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;Inversion of Control (IoC) containers and Dependency Injection (Spring.NET/Castle Windsor/StructureMap)&lt;/li&gt;
    &lt;li&gt;O/RM Tools (NHibernate/ActiveRecord/Entity Framework/LINQ)&lt;/li&gt;
    &lt;li&gt;Test Driven Development&lt;/li&gt;
    &lt;li&gt;Domain Driven Design&lt;/li&gt;
    &lt;li&gt;Behavior Driven Development&lt;/li&gt;
    &lt;li&gt;Design by Contract and Spec#&lt;/li&gt;
    &lt;li&gt;Enterprise Design Patterns in .NET&lt;/li&gt;
&lt;/ul&gt;
&lt;span style="font-weight: bold;"&gt;Time and Location:&lt;br /&gt;
&lt;/span&gt;Tuesday, January 15, 2008 7:00 PM&lt;br /&gt;
&lt;br /&gt;
SM Consulting&lt;br /&gt;
1306 Concourse Drive&lt;br /&gt;
Suite 200&lt;br /&gt;
Linthicum, MD 21090&lt;br /&gt;
&lt;br /&gt;
Come, participate, and make your voice heard!  Come meet passionate developers like yourself in the active discussion&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=118175"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=118175" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/Podwysocki/aggbug/118175.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Matthew Podwysocki</dc:creator>
            <guid>http://geekswithblogs.net/Podwysocki/archive/2008/01/02/118175.aspx</guid>
            <pubDate>Thu, 03 Jan 2008 04:31:32 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/Podwysocki/comments/118175.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/Podwysocki/archive/2008/01/02/118175.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/Podwysocki/comments/commentRss/118175.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/Podwysocki/services/trackbacks/118175.aspx</trackback:ping>
        </item>
        <item>
            <title>Making Myself Better for 2008</title>
            <link>http://geekswithblogs.net/Podwysocki/archive/2008/01/01/118129.aspx</link>
            <description>Last year was a very good year for me, but I'm always looking for ways to learn more and better myself for the next year.  After all, it is hard to top 2007, the year in which I buy a house, get married and have a great honeymoon in Italy.  So, somehow I need to top myself yet again!&lt;br /&gt;
&lt;br /&gt;
Anyhow, these are the things I'm looking to do this year to make me a better designer, developer, etc:&lt;br /&gt;
&lt;ul&gt;
    &lt;li&gt;General
    &lt;ul&gt;
        &lt;li&gt;Read a new book a month&lt;/li&gt;
        &lt;li&gt;Run a marathon (Well, only running 5 miles a day right now)&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;General Development
    &lt;ul&gt;
        &lt;li&gt;Give more user group presentations (DC ALT.NET/CMAP/etc)&lt;br /&gt;
        &lt;/li&gt;
        &lt;li&gt;Master Ruby and Boo&lt;/li&gt;
        &lt;li&gt;Continue deep dive with MVC frameworks&lt;/li&gt;
        &lt;li&gt;Contribute more to open source&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;ALT.NET
    &lt;ul&gt;
        &lt;li&gt;Organize an ALT.NET Code Camp Track&lt;/li&gt;
    &lt;/ul&gt;
    &lt;ul&gt;
        &lt;li&gt;Stay active in the &lt;a href="http://tech.groups.yahoo.com/group/dcaltnet/"&gt;DC ALT.NET&lt;/a&gt; community and the ALT.NET community as a whole&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;Blogging
    &lt;ul&gt;
        &lt;li&gt;More posts with coding examples&lt;/li&gt;
        &lt;li&gt;More downloadable samples&lt;br /&gt;
        &lt;/li&gt;
        &lt;li&gt;Be more responsive to questions (sorry about that)&lt;/li&gt;
        &lt;li&gt;Explore BDD and DDD more&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
&lt;/ul&gt;
Rather ambitious, I know, but it's always great to look back earlier on the year to see what changed over the year and what really happened.&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=118129"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=118129" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/Podwysocki/aggbug/118129.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Matthew Podwysocki</dc:creator>
            <guid>http://geekswithblogs.net/Podwysocki/archive/2008/01/01/118129.aspx</guid>
            <pubDate>Wed, 02 Jan 2008 03:25:59 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/Podwysocki/comments/118129.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/Podwysocki/archive/2008/01/01/118129.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/Podwysocki/comments/commentRss/118129.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/Podwysocki/services/trackbacks/118129.aspx</trackback:ping>
        </item>
        <item>
            <title>Starting Junior Programmers on the Right Agile Track Guidance</title>
            <link>http://geekswithblogs.net/Podwysocki/archive/2008/01/01/118125.aspx</link>
            <description>Part of my job is not only to design and implement solutions for my customers, but also to make my customer's developers stronger as well.  During these customer engagements, there are many times when junior developers are involved.  My job is to help those on the team to be stronger and then in turn help become leaders.&lt;br /&gt;
&lt;br style="font-weight: bold;" /&gt;
&lt;span style="font-weight: bold;"&gt;Where to start?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Well, I could start with a stack of point technology books (ASP.NET, SharePoint, BizTalk, etc) that become obsolete right during their printing, so that's not where I start.  You find that many times, the books were written during the beta phase of the product and sure enough, things change, rapidly...  But, I will mention a few that earn my admiration that form a basis for a good development background.&lt;br /&gt;
&lt;br /&gt;
So, first things first, surveys are always in order to find out the comfort level with such things as:&lt;br /&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Agile_software_development"&gt;Agile Software Development &lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Scrum_(development)"&gt;Scrum&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Domain_driven_design"&gt;Domain Driven Design&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Test_Driven_Development"&gt;Test Driven Development&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Object_oriented_design"&gt;Object Oriented Design&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29"&gt;Enterprise Design Patterns&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Trustworthy_Computing_Security_Development_Lifecycle"&gt;Secure Development Lifecycle&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;Point Technologies (ASP.NET/BizTalk/SharePoint/WCF/WPF/etc)&lt;br /&gt;
    &lt;/li&gt;
&lt;/ul&gt;
So, as you can see, it's quite a list of things to cover.  But, no matter, we can come up with a list of things to know and teach and how to do it.&lt;br /&gt;
&lt;br style="font-weight: bold;" /&gt;
&lt;span style="font-weight: bold;"&gt;Topics to Know&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
When it comes to making stronger Agile Object Oriented Designers/Programmers, it's important that they know a few topics inside and out.  They can be found easily on the net and some books that I will feature later on.  Some of these include:&lt;br /&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Separation_of_concerns"&gt;Separation of Concerns&lt;br /&gt;
    &lt;/a&gt;Breaking a program into distinct features that overlap in functionality as little as possible.  A concern is any interest or focus in a program.  Concerns are synonymous with features or behaviors.&lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;a href="http://www.objectmentor.com/resources/articles/lsp.pdf"&gt;Liskov Substitution Principle&lt;/a&gt;&lt;br /&gt;
    Subtypes must be substitutable for their base types&lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Law_of_Demeter"&gt;Law of Demeter&lt;/a&gt;&lt;br /&gt;
    A given object should assume as little as possible about the structure or properties of anything else, including its subcomponents.&lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Single_responsibility_principle"&gt;Single Responsibility Principle&lt;/a&gt;&lt;br /&gt;
    Every object should have a single responsibility, and that all its services should be narrowly aligned with that responsibility.&lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Open/closed_principle"&gt;Open/Close Principle&lt;/a&gt;&lt;br /&gt;
    Software entities should be open for extension, but closed for modification.  The entity can allows its behavior to be modified without modifying the source code.&lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;a href="http://www.objectmentor.com/resources/articles/isp.pdf"&gt;Interface Segregation Principle&lt;/a&gt;&lt;br /&gt;
    Modules that encapsulate high level policy should not depend upon modules that implement details. Rather, both kinds of modules should depend upon abstractions. Abstract classes should not depend upon concrete classes and concrete classes should depend upon abstract classes.  Clients should not be forced to depend on methods that they do not use.&lt;br /&gt;
    &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;a href="http://www.objectmentor.com/resources/articles/dip.pdf"&gt;Dependency Inversion Principle&lt;/a&gt;&lt;br /&gt;
    Virtual member functions of derived classes must expect no more than the corresponding member functions of the base class; and should promise no less. It also means that virtual member functions that are present in base classes must also be present in the derived classes; and they must do useful work.&lt;/li&gt;
&lt;/ul&gt;
&lt;span style="font-weight: bold;"&gt;Stocking the Library&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Knowing these fundamentals go a long way to making a stronger object oriented programmer.  Ok, so reading just an article or two doesn't always make things sink in.  Some books may be in order to help as well:  Let's walk through some fundamental books for solid developers.  Note that these do not include any point technologies, and instead focuses on gaining strong fundamental skills.  It's not enough to pick up an ASP.NET book, and boom, you're a solid developer.  So, let's go through some of them:&lt;br /&gt;
&lt;ul&gt;
    &lt;li&gt;Agile/Development Principles
    &lt;ul&gt;
        &lt;li&gt;&lt;a href="http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670/ref=pd_bbs_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1199233200&amp;amp;sr=1-1"&gt;Code Complete: A Practical Handbook of Software Construction (Steve McConnell)&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;ul&gt;
        &lt;li&gt;&lt;a href="http://www.amazon.com/Software-Development-Principles-Patterns-Practices/dp/0135974445/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1199233133&amp;amp;sr=1-1"&gt;Agile Software Development, Principles, Patterns, and Practices (Robert C. Martin)&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;ul&gt;
        &lt;li&gt;&lt;a href="http://www.amazon.com/gp/product/0131857258/ref=pd_cp_b_1?pf_rd_p=317711001&amp;amp;pf_rd_s=center-41&amp;amp;pf_rd_t=201&amp;amp;pf_rd_i=0135974445&amp;amp;pf_rd_m=ATVPDKIKX0DER&amp;amp;pf_rd_r=0HG2ECVVCNYSHN1FR7YZ"&gt; Agile Principles, Patterns, and Practices in C# (Robert C. Martin)&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="http://www.amazon.com/Agile-Software-Development-SCRUM-Schwaber/dp/0130676349/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1199233534&amp;amp;sr=1-1"&gt;Agile Software Development with SCRUM (Ken Schwaber)&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="http://www.amazon.com/User-Stories-Applied-Development-Addison-Wesley/dp/0321205685/ref=pd_sim_b_title_2"&gt;User Stories Applied: For Agile Software Development (Mike Cohn)&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="http://www.amazon.com/Practices-Agile-Developer-Pragmatic-Programmers/dp/097451408X/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1199236912&amp;amp;sr=1-1"&gt;Practices of an Agile Developer: Working in the Real World (Andrew Hunt)&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;General Development
    &lt;ul&gt;
        &lt;li&gt;&lt;span class="sans"&gt;&lt;a href="http://www.amazon.com/Release-Production-Ready-Software-Pragmatic-Programmers/dp/0978739213/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1199233841&amp;amp;sr=1-1"&gt;Release It!: Design and Deploy Production-Ready Software (Michael Nygard)&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
        &lt;li&gt;&lt;span class="sans"&gt;&lt;a href="http://www.amazon.com/Practical-Guide-Successful-Software-Projects/dp/0974514047/ref=pd_sim_b_title_1"&gt;Ship it! A Practical Guide to Successful Software Projects (Jared Richardson)&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
        &lt;li&gt;&lt;span class="sans"&gt;&lt;a href="http://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X/ref=pd_bbs_sr_2?ie=UTF8&amp;amp;s=books&amp;amp;qid=1199237108&amp;amp;sr=1-2"&gt;The Pragmatic Programmer: From Journeyman to Master (Andrew Hunt)&lt;/a&gt;&lt;br /&gt;
        &lt;/span&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;Design Patterns
    &lt;ul&gt;
        &lt;li&gt;&lt;a href="http://www.amazon.com/Head-First-Object-Oriented-Analysis-Design/dp/0596008678/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1199233726&amp;amp;sr=1-1"&gt;Head First Object-Oriented Analysis and Design (Brett McLaughlin)&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;ul&gt;
        &lt;li&gt;&lt;a href="http://www.amazon.com/Enterprise-Application-Architecture-Addison-Wesley-Signature/dp/0321127420/ref=pd_sim_b_title_4"&gt;Patterns of Enterprise Application Architecture (Martin Fowler)&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;ul&gt;
        &lt;li&gt;&lt;a href="http://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professional/dp/0201633612/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1199232867&amp;amp;sr=1-1"&gt;Design Patterns: Elements of Reusable Object-Oriented Software (GoF)&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;ul&gt;
        &lt;li&gt;&lt;span class="sans"&gt;&lt;/span&gt;&lt;a href="http://www.amazon.com/gp/product/0596007124/ref=pd_cp_b_1?pf_rd_p=317711001&amp;amp;pf_rd_s=center-41&amp;amp;pf_rd_t=201&amp;amp;pf_rd_i=0131857258&amp;amp;pf_rd_m=ATVPDKIKX0DER&amp;amp;pf_rd_r=1K37N2EEDGV00EXDWS3N"&gt;Head First Design Patterns (Elisabeth Freeman)&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;Domain Driven Design
    &lt;ul&gt;
        &lt;li&gt;&lt;a href="http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215/ref=pd_bxgy_b_text_b"&gt;Domain-Driven Design: Tackling Complexity in the Heart of Software (Eric Evans)&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="http://www.amazon.com/gp/product/0321268202/ref=pd_cp_b_2?pf_rd_p=317711001&amp;amp;pf_rd_s=center-41&amp;amp;pf_rd_t=201&amp;amp;pf_rd_i=0131857258&amp;amp;pf_rd_m=ATVPDKIKX0DER&amp;amp;pf_rd_r=1K37N2EEDGV00EXDWS3N"&gt;Applying Domain-Driven Design and Patterns: With Examples in C# and .NET (Jimmy Nilsson)&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;Test Driven Development
    &lt;ul&gt;
        &lt;li&gt;&lt;a href="http://www.amazon.com/Test-Driven-Development-Addison-Wesley-Signature/dp/0321146530/ref=pd_bxgy_b_text_b"&gt;&lt;span class="sans"&gt;Test Driven Development: By Example (Kent Beck)&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;span class="sans"&gt;&lt;a href="http://www.amazon.com/xUnit-Test-Patterns-Refactoring-Addison-Wesley/dp/0131495054/ref=pd_sim_b_title_4"&gt;xUnit Test Patterns: Refactoring Test Code (Gerard Meszaros)&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
        &lt;li&gt;&lt;span class="sans"&gt;&lt;a href="http://www.amazon.com/Pragmatic-Unit-Testing-NUnit-2nd/dp/0977616673/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1199237007&amp;amp;sr=1-1"&gt;Pragmatic Unit Testing in C# with NUnit, 2nd Edition (Andrew Hunt)&lt;/a&gt;&lt;br /&gt;
        &lt;/span&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;span class="sans"&gt;Refactoring&lt;br /&gt;
    &lt;/span&gt;
    &lt;ul&gt;
        &lt;li&gt;&lt;span class="sans"&gt;&lt;a href="http://www.amazon.com/gp/product/0201485672/ref=pd_cp_b_2?pf_rd_p=317711001&amp;amp;pf_rd_s=center-41&amp;amp;pf_rd_t=201&amp;amp;pf_rd_i=0131495054&amp;amp;pf_rd_m=ATVPDKIKX0DER&amp;amp;pf_rd_r=1C6EE2KWZS34QERKHWY0"&gt;Refactoring: Improving the Design of Existing Code (Martin Fowler)&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;ul&gt;
        &lt;li&gt;&lt;span class="sans"&gt;&lt;a href="http://www.amazon.com/Refactoring-Patterns-Addison-Wesley-Signature-Kerievsky/dp/0321213351/ref=pd_sim_b_title_3"&gt;Refactoring to Patterns (Joshua Kerievsky)&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;span class="sans"&gt;&lt;/span&gt;     &lt;span class="sans"&gt;&lt;/span&gt;     &lt;/li&gt;
    &lt;li&gt;&lt;span class="sans"&gt;Secure Development Lifecycle&lt;br /&gt;
    &lt;/span&gt;
    &lt;ul&gt;
        &lt;li&gt;&lt;span class="sans"&gt;&lt;a href="http://www.amazon.com/Security-Development-Lifecycle-Michael-Howard/dp/0735622140/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1199240336&amp;amp;sr=8-1"&gt;The Security Development Lifecycle (Michael Howard)&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;ul&gt;
        &lt;li&gt;&lt;span class="sans"&gt;&lt;a href="http://www.amazon.com/Writing-Secure-Second-Michael-Howard/dp/0735617228/ref=pd_sim_b_title_5"&gt;Writing Secure Code, Second Edition (Michael Howard)&lt;br /&gt;
        &lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;span class="sans"&gt;&lt;/span&gt;     &lt;/li&gt;
&lt;/ul&gt;
But what about technical books diving into point technologies, well, there are some of them that come highly recommended:&lt;br /&gt;
&lt;ul&gt;
    &lt;li&gt;C#/.NET Framework
    &lt;ul&gt;
        &lt;li&gt;&lt;a href="http://www.amazon.com/CLR-via-Second-Pro-Developer/dp/0735621632/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1199236492&amp;amp;sr=8-1"&gt;CLR via C#, Second Edition (Jeffrey Richter)&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;ul&gt;
        &lt;li&gt;&lt;a href="http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321246756/ref=pd_bbs_2?ie=UTF8&amp;amp;s=books&amp;amp;qid=1199236492&amp;amp;sr=8-2"&gt;Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries (Krzysztof Cwalina)&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;/li&gt;
&lt;/ul&gt;
This by no means is an exhaustive list, but a way to get started.  By no means should they read all these books at once and should be tailored for those who need work in those related areas.  These books will get the junior developer starting to think abstractly in a more agile mindset.  But, how do you reinforce these behaviors in the development environment.  It's not enough to read a few articles, a few books and call it a day.  &lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Going to the next level&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
In order for those developers to get to that next level, paired programming is the key.  This can reinforce what they have learned in a nuturing environment and even those who are more senior programmers can still learn a thing or two.  One great way to get this kick started is to do Test Driven Development between programmers.  Have the first programmer write a unit test and have it fail.  Hand the keyboard off to the next programmer and have them make the unit test succeed.  Then work on refactoring and move onto the next.  Simple things like these go a long way.&lt;br /&gt;
&lt;br /&gt;
Mentoring is also important.  Have a mentor assigned to check how the junior developer is doing with learning these new concepts.  Follow-up from the mentors is important as you track their progress.  Make time to answer questions and challenge them.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;What about Agile?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Many organizations in the software development world don't work in an Agile mindset, so what are some of the ways to get there?  An Agile Coach is a great way to start an organization on the right step.  No, they aren't the Agile Police, nor should they be.  The Agile Coach brings quite a few things to an organization.  These can include:&lt;br /&gt;
&lt;ul&gt;
    &lt;li&gt;Ramping an organization up on agile processes and ways of thinking&lt;/li&gt;
    &lt;li&gt;Experience with the Agile Process&lt;/li&gt;
    &lt;li&gt;An effective agent of change&lt;/li&gt;
    &lt;li&gt;Environment assessment&lt;/li&gt;
    &lt;li&gt;Being a certified Scrum Master&lt;/li&gt;
&lt;/ul&gt;
Holding brown bag sessions is quite important in reinforcing learned ideas and learning new things.  Of course you must make it worth people's while to attend.  These can also get the junior developers more excited and involved and people can take turns creating these sessions and presenting.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
I hope this post gets you in the mindset of changing organizations for the better, getting junior developers to become stronger ones and creating a more dynamic atmosphere.  This of course is only the beginning on a lifetime or learning and being challenged.  Develop, mentor and inspire! &lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http://geekswithblogs.net/Podwysocki/archive/2008/01/01/118125.aspx"&gt;&lt;img border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://geekswithblogs.net/Podwysocki/archive/2008/01/01/118125.aspx" alt="kick it on DotNetKicks.com" /&gt;&lt;/a&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=118125"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=118125" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/Podwysocki/aggbug/118125.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Matthew Podwysocki</dc:creator>
            <guid>http://geekswithblogs.net/Podwysocki/archive/2008/01/01/118125.aspx</guid>
            <pubDate>Wed, 02 Jan 2008 00:53:05 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/Podwysocki/comments/118125.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/Podwysocki/archive/2008/01/01/118125.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/Podwysocki/comments/commentRss/118125.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/Podwysocki/services/trackbacks/118125.aspx</trackback:ping>
        </item>
    </channel>
</rss>