<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" 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/"><channel><title>Chris Garty's Weblog : Testability</title><link>http://blogs.msdn.com/chrisgarty/archive/tags/Testability/default.aspx</link><description>Tags: Testability</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Behavior Driven Development</title><link>http://blogs.msdn.com/chrisgarty/archive/2007/12/03/behavior-driven-development.aspx</link><pubDate>Tue, 04 Dec 2007 04:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:6648250</guid><dc:creator>chrisgarty</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/chrisgarty/comments/6648250.aspx</comments><wfw:commentRss>http://blogs.msdn.com/chrisgarty/commentrss.aspx?PostID=6648250</wfw:commentRss><description>&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;At the last &lt;A href="http://fmdevelopers.com/" mce_href="http://fmdevelopers.com/"&gt;&lt;SPAN style="COLOR: purple; mso-bidi-font-size: 11.0pt"&gt;Fargo Moorhead&amp;nbsp;Developers&lt;/SPAN&gt;&lt;/A&gt; meeting we had a great presentation from &lt;A href="http://www.codesqueeze.com/" mce_href="http://www.codesqueeze.com/"&gt;&lt;SPAN style="COLOR: #0066cc; mso-bidi-font-size: 11.0pt"&gt;Max Pool&lt;/SPAN&gt;&lt;/A&gt;&amp;nbsp;about Behavior Driven Development. It sounded strangely like TDD.&amp;nbsp;After the meeting I jumped online and researched it some. I wanted to post the links and important excerpts that provided me the most insight into this concept:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;B&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Dan North - Introducing BDD&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;A href="http://dannorth.net/introducing-bdd" mce_href="http://dannorth.net/introducing-bdd"&gt;&lt;SPAN style="COLOR: purple; mso-bidi-font-size: 11.0pt"&gt;http://dannorth.net/introducing-bdd&lt;/SPAN&gt;&lt;/A&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;...&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;I started using the word “behaviour” in place of “test” in my dealings with TDD and found that not only did it seem to fit but also that a whole category of coaching questions magically dissolved.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;...&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;I found the shift from thinking in tests to thinking in behaviour so profound that I started to refer to TDD as BDD, or behaviour- driven development.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;...&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;B&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Wikipedia&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;A href="http://en.wikipedia.org/wiki/Behavior_driven_development" mce_href="http://en.wikipedia.org/wiki/Behavior_driven_development"&gt;&lt;SPAN style="COLOR: #0066cc; mso-bidi-font-size: 11.0pt"&gt;http://en.wikipedia.org/wiki/Behavior_driven_development&lt;/SPAN&gt;&lt;/A&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;...&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;Behavioral tests use the techniques of Test-Driven Development but have a more specific goal. The purpose is to define the behavior of an application rather than the implementation.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;...&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;Testing before implementing is a crucial aspect of Behavior Driven Development.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;...&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;B&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;Behavior Driven Development&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;A href="http://behaviour-driven.org/" mce_href="http://behaviour-driven.org/"&gt;&lt;SPAN style="COLOR: #0066cc; mso-bidi-font-size: 11.0pt"&gt;http://behaviour-driven.org/&lt;/SPAN&gt;&lt;/A&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;...&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;It must be stressed that BDD is a rephrasing of existing good practice, it is not a radically new departure. Its aim is to bring together existing, well-established techniques under a common banner and with a consistent and unambiguous terminology. BDD is very much focused on “Getting the words right” and this focus is intended to produce a vocabulary that is accurate, accessible, descriptive and consistent. &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;In fact “Getting the words right” was the starting point for the development of BDD, and is still very much at its core, but the power of getting the words right has led to some insights and extrapolations that have helped us to better understand our approach and to extend it. &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;...&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;B&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;NSpec&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;A href="http://nspec.tigris.org/" mce_href="http://nspec.tigris.org/"&gt;&lt;SPAN style="COLOR: #0066cc; mso-bidi-font-size: 11.0pt"&gt;http://nspec.tigris.org/&lt;/SPAN&gt;&lt;/A&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;...&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;Test Driven Development isn't brilliantly named, it hides the fact that TDD is a specification process, not a testing process.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;...&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;BDD and NSpec have shed the test oriented terminology in favour of a specification friendly nomenclature.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;...&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;[Context]&lt;BR&gt;public class Example&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; [Specification]&lt;BR&gt;&amp;nbsp; public void BooleanSpecificationExample()&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Specify.That( someObj.SomeMethod() ).ShouldBeFalse();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //...&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;...&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;B&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-size: 11.0pt"&gt;NBehave&lt;/SPAN&gt;&lt;/B&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;A href="http://nbehave.org/" mce_href="http://nbehave.org/"&gt;&lt;SPAN style="COLOR: #0066cc; mso-bidi-font-size: 11.0pt"&gt;http://nbehave.org/&lt;/SPAN&gt;&lt;/A&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;...&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;Behaviour-driven development (BDD) is an evolution of test-driven development (TDD) and acceptance-test driven design, and is intended to make these practices more accessible and intuitive to newcomers and experts alike.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;...&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;It shifts the vocabulary from being test-based to behaviour-based, and positions itself as a design philosophy. &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;...&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;A class="" href="http://www.danpink.com/" target=_blank mce_href="http://www.danpink.com/"&gt;Dan Pink&lt;/A&gt; (author of "A Whole New Mind") has coined the phrase "A metaphor can be worth a thousand pictures". My memory isn't that great so I like to distill things down to a concept or metaphor.&amp;nbsp;BDD is all about getting the words and metaphors right. It is a language that I'll take a while to get used to, but&amp;nbsp;after doing my best to explain TDD numerous times I can see the advantages of the behavior metaphor over the test one.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Verdana','sans-serif'; mso-fareast-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"&gt;I'm really interested in using the specification language that Dan North was talking about... I'm going to have to give that a go...&lt;/SPAN&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6648250" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/chrisgarty/archive/tags/Testability/default.aspx">Testability</category></item><item><title>Ward Cunningham on Patterns and XP</title><link>http://blogs.msdn.com/chrisgarty/archive/2004/12/09/278794.aspx</link><pubDate>Thu, 09 Dec 2004 10:21:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:278794</guid><dc:creator>chrisgarty</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/chrisgarty/comments/278794.aspx</comments><wfw:commentRss>http://blogs.msdn.com/chrisgarty/commentrss.aspx?PostID=278794</wfw:commentRss><description>&lt;p&gt;&lt;a href="http://www.theserverside.net/talks/videos/WardCunningham/interview.tss?bandwidth=dsl"&gt;&lt;font face="Verdana" size="2"&gt;Ward Cunningham recently did a great interview with TSS.Net&lt;/font&gt;&lt;/a&gt;&lt;font face="Verdana" size="2"&gt;. In the interview he talks at length on some great topics including XP, patterns, team development, communication, simplicity,&amp;nbsp;testing, and feedback.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;If you haven't seen it already, it is definitely worth the bandwidth. It is available in two sizes for &lt;/font&gt;&lt;a href="http://www.theserverside.net/talks/videos/WardCunningham/interview.tss?bandwidth=56k"&gt;&lt;font face="Verdana" size="2"&gt;56k&lt;/font&gt;&lt;/a&gt;&lt;font face="Verdana" size="2"&gt; or &lt;/font&gt;&lt;a href="http://www.theserverside.net/talks/videos/WardCunningham/interview.tss?bandwidth=dsl"&gt;&lt;font face="Verdana" size="2"&gt;DSL &lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=278794" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/chrisgarty/archive/tags/Testability/default.aspx">Testability</category><category domain="http://blogs.msdn.com/chrisgarty/archive/tags/Community/default.aspx">Community</category></item><item><title>Spring has arrived!</title><link>http://blogs.msdn.com/chrisgarty/archive/2004/10/05/237865.aspx</link><pubDate>Tue, 05 Oct 2004 19:42:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:237865</guid><dc:creator>chrisgarty</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/chrisgarty/comments/237865.aspx</comments><wfw:commentRss>http://blogs.msdn.com/chrisgarty/commentrss.aspx?PostID=237865</wfw:commentRss><description>&lt;p&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"&gt;In the land down-under,&amp;nbsp;it is springtime. The birds are chirping louder, the days are getting longer, and the sun is getting hotter. I even got sunburnt playing soccer on Sunday :).&lt;/span&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"&gt;And for .Net developers Spring in another form has arrived in joyous splendor... &lt;a href="http://www.springframework.net/"&gt;Spring.Net 0.6 RC1 has been released&lt;/a&gt;.&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt; &lt;p&gt;&lt;span lang="EN" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-AU"&gt;The arrival of &lt;/span&gt;&lt;span lang="EN" style="mso-ansi-language: EN-AU"&gt;&lt;a href="http://www.springframework.net/"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"&gt;Spring.Net&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span lang="EN" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-AU"&gt; gives .Net developers another solid choice on the road to more loosely coupled component-based systems. &lt;/span&gt;&lt;span lang="EN" style="mso-ansi-language: EN-AU"&gt;&lt;a href="http://www.springframework.net/"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"&gt;Spring.Net&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span lang="EN" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-AU"&gt; will soon be &lt;/span&gt;&lt;span lang="EN" style="mso-ansi-language: EN-AU"&gt;&lt;a href="http://www.springframework.org/docs/reference/aop.html"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"&gt;MUCH more than just a lightweight container&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span lang="EN" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-AU"&gt;, but even just as a lightweight dependency injection container it is an excellent offering for the .Net development community.&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt; &lt;p&gt;&lt;span lang="EN" style="mso-ansi-language: EN-AU"&gt;&lt;a href="http://www.martinfowler.com/"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"&gt;Martin Fowler’s&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span lang="EN" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-AU"&gt; recent article on &lt;/span&gt;&lt;span lang="EN" style="mso-ansi-language: EN-AU"&gt;&lt;a href="http://www.martinfowler.com/articles/injection.html"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"&gt;lightweight containers and dependency injection&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span lang="EN" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-AU"&gt; highlighted two excellent Java offerings; &lt;/span&gt;&lt;span lang="EN" style="mso-ansi-language: EN-AU"&gt;&lt;a href="http://www.springframework.org/"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"&gt;Spring&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span lang="EN" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-AU"&gt; and &lt;/span&gt;&lt;span lang="EN" style="mso-ansi-language: EN-AU"&gt;&lt;a href="http://www.picocontainer.org/"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"&gt;PicoContainer&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span lang="EN" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-AU"&gt;. Now both of these alternatives are available to the .Net world.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span lang="EN" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-AU"&gt;Whether you use a dedicated dependency injection container like &lt;/span&gt;&lt;span lang="EN" style="mso-ansi-language: EN-AU"&gt;&lt;a href="http://www.picocontainer.org/"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"&gt;PicoContainer&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span lang="EN" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-AU"&gt;, a service locator offering like .Net's own &lt;/span&gt;&lt;span lang="EN" style="mso-ansi-language: EN-AU"&gt;&lt;a href="http://www.theserverside.net/blogs/showblog.tss?id=pluginArchitectures"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"&gt;System.ComponentModel namespace&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span lang="EN" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-AU"&gt;, a pluggable model&amp;nbsp;like the &lt;/span&gt;&lt;span lang="EN" style="mso-ansi-language: EN-AU"&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspnet/html/asp04212004.asp"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"&gt;provider pattern&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span lang="EN" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-AU"&gt;, or a dependency injection container ‘&lt;/span&gt;&lt;span lang="EN" style="mso-ansi-language: EN-AU"&gt;&lt;a href="http://www.springframework.org/docs/reference/aop.html"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"&gt;with more&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span lang="EN" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-AU"&gt;’ like &lt;/span&gt;&lt;span lang="EN" style="mso-ansi-language: EN-AU"&gt;&lt;a href="http://www.springframework.net/"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"&gt;Spring.Net&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span lang="EN" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-AU"&gt; the important goal of &lt;/span&gt;&lt;span lang="EN" style="mso-ansi-language: EN-AU"&gt;&lt;a href="http://www.martinfowler.com/articles/injection.html#SeparatingConfigurationFromUse"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"&gt;separating configuration from use&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span lang="EN" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-AU"&gt; during .Net software development has never been more widely supported or easier to achieve.&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=237865" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/chrisgarty/archive/tags/Testability/default.aspx">Testability</category><category domain="http://blogs.msdn.com/chrisgarty/archive/tags/Community/default.aspx">Community</category><category domain="http://blogs.msdn.com/chrisgarty/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://blogs.msdn.com/chrisgarty/archive/tags/Lightweight+Containers/default.aspx">Lightweight Containers</category></item><item><title>Dependency Injection: World changing concept or nothing special?</title><link>http://blogs.msdn.com/chrisgarty/archive/2004/08/19/216533.aspx</link><pubDate>Thu, 19 Aug 2004 09:23:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:216533</guid><dc:creator>chrisgarty</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/chrisgarty/comments/216533.aspx</comments><wfw:commentRss>http://blogs.msdn.com/chrisgarty/commentrss.aspx?PostID=216533</wfw:commentRss><description>&lt;p&gt;&lt;font face="Verdana" size="2"&gt;That was the question that I got asked about a month ago. My response was "something in the middle". I like &lt;a href="http://www.martinfowler.com/articles/injection.html"&gt;Dependency Injection&lt;/a&gt;. It facilitates testing, it facilitates change, and it facilitates clean design.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;I have been thinking about container assisted dependency injection lately&amp;nbsp;and&amp;nbsp;have been&amp;nbsp;playing around with &lt;a href="http://www.picocontainer.org/"&gt;PicoContainer&lt;/a&gt;. I've been trying to justify the use of PicoContainer to facilitate dependency injection versus&amp;nbsp;just&amp;nbsp;injecting dependencies manually. My primary aim was to facilitate testing and good design, so the manual passing of dependencies was sufficient, but there was&amp;nbsp;this nagging voice in my head telling me that the design would be more open to change if the rigidity of the dependency injections was placed in just one spot. However, I couldn't quite articulate that idea and had just left it hanging for a little while.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="3"&gt;&lt;font face="Verdana" size="2"&gt;Enter Mr Oberg. &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;&lt;a href="http://jroller.com/page/rickard"&gt;Rickard Oberg&lt;/a&gt; is a very smart guy that I first found out&amp;nbsp;about when he did an &lt;/font&gt;&lt;a href="http://www.theserverside.com/talks/library.tss#oberg"&gt;&lt;font face="Verdana" size="2"&gt;interview on TheServerSide.com&lt;/font&gt;&lt;/a&gt;&lt;font face="Verdana" size="2"&gt; back in 2001 when he was a core architect and developer on the JBoss (then version 2.0) J2EE server. Rickard has made some great posts on &lt;a href="http://jroller.com/page/rickard"&gt;his blog&lt;/a&gt;&amp;nbsp;over the past year&amp;nbsp;that have helped me better understand&amp;nbsp;&lt;a href="http://www.aosd.net/"&gt;Aspect Oriented Programming&lt;/a&gt; (I'm watching the development of &lt;a href="http://www.springframework.net"&gt;Spring.Net&lt;/a&gt;&amp;nbsp;with some interest) and the value it can bring to software development.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;Rickard just made a great &lt;/font&gt;&lt;/font&gt;&lt;font face="Verdana" size="2"&gt;post on "&lt;/font&gt;&lt;a href="http://jroller.com/page/rickard/20040814"&gt;&lt;font face="Verdana" size="2"&gt;Dependency injection and open vs. closed designs&lt;/font&gt;&lt;/a&gt;&lt;font face="Verdana" size="2"&gt;" that has helped bring clarity to my thoughts on dependency injection and design. Go read&amp;nbsp;&lt;a href="http://jroller.com/page/rickard/20040814"&gt;his post&lt;/a&gt;&amp;nbsp;for the full story, but I had a number of 'oh yeah' moments while I read&amp;nbsp;this part:&lt;/font&gt;&lt;/p&gt; &lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;So, is an "open design preferable to a "closed" design? Well, I like to compare this to house building. Using a "closed" design is like building a house where the rooms have no doors. Whenever you decide that there needs to be a door between two rooms you punch out the wall and insert a door. It's not something you would do easily. On the other hand, using an entirely "open" design is like building a house where the rooms have no walls, only doors. This makes for great flexibility, but don't be surprised if the roof comes crashing down. The conclusion of this analogy is that you'd probably want both: the rigidity of walls combined with the flexibility of doors. In Pico terms, the foundation of the house is provided by the Container, while the rigidity is provided by a ContainerComposer. The composer is the place where all decisions are made, and essentially it has to know about all the things that Foo knew in the "closed" design version: whether Bar is a class or interface, how to instantiate Bar, and what parameters to provide to it. If you let it do this for all components in the system, then all of our assumptions have been put into one place, and if any assumption would be wrong, that is the only place which would be affected by it.&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;Got it?&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;Dependency injection = 'open'. Specific injection decisions = 'closed'. Pico + ContainerComposer = isolate the 'closed' parts in one 'easy to maintain' place. Biggest value of a Dependency Injection container = maintainability.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Verdana" size="2"&gt;Got it.&lt;/font&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=216533" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/chrisgarty/archive/tags/Testability/default.aspx">Testability</category><category domain="http://blogs.msdn.com/chrisgarty/archive/tags/Architecture/default.aspx">Architecture</category></item><item><title>Presentation: Agile .Net Development - Part 1 - Tools and Basics</title><link>http://blogs.msdn.com/chrisgarty/archive/2004/06/30/169381.aspx</link><pubDate>Wed, 30 Jun 2004 21:18:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:169381</guid><dc:creator>chrisgarty</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/chrisgarty/comments/169381.aspx</comments><wfw:commentRss>http://blogs.msdn.com/chrisgarty/commentrss.aspx?PostID=169381</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Last night I gave &lt;A href="http://www.ip3systems.com/chrisgarty/presentations/2004/Agile%20.Net%20Development%20-%20Part%201%20-%20Tools%20and%20Basics.ppt"&gt;a presentation&lt;/A&gt; at the &lt;A href="http://groups.yahoo.com/group/melbourne_XP_enthusiasts/"&gt;Melbourne Agile Developer Group (MXPEG)&lt;/A&gt;&amp;nbsp;about agile .Net development. The group has a higher proportion of Java developers, so I had volunteered to give a view of agile from a .Net perspective. &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;I only got through half of my material last night, so I'll be talking again next month.&amp;nbsp;Last night I presented information about a set of tools that can help if you are trying to follow some of the &lt;A href="http://www.extremeprogramming.org/"&gt;Extreme Programming&lt;/A&gt;&amp;nbsp;practices while using .Net. Next month I'll be focusing on design decisions in .Net that have helped me create applications with a simple and testable design.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;The practices covered were: &lt;A href="http://www.extremeprogramming.org/rules/standards.html"&gt;Coding Standards&lt;/A&gt;, &lt;A href="http://www.extremeprogramming.org/rules/integrateoften.html"&gt;Continuous Integration&lt;/A&gt;, &lt;A href="http://www.extremeprogramming.org/rules/refactor.html"&gt;Refactoring&lt;/A&gt;, and &lt;A href="http://www.extremeprogramming.org/rules/unittests.html"&gt;Testing&lt;/A&gt;.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;The technologies covered included: &lt;A href="http://www.nunit.org/"&gt;NUnit&lt;/A&gt;, &lt;A href="http://nunitasp.sourceforge.net/"&gt;NUnitAsp&lt;/A&gt;, &lt;A href="http://sourceforge.net/projects/nunitaddin"&gt;NUnitAddin&lt;/A&gt;, &lt;A href="http://www.nmock.org/"&gt;NMock&lt;/A&gt;, &lt;A href="http://www.picocontainer.org/"&gt;PicoContainer&lt;/A&gt;,&amp;nbsp;&lt;A href="http://www.gotdotnet.com/team/fxcop/"&gt;FxCop&lt;/A&gt;, &lt;A href="http://ccnet.thoughtworks.com/"&gt;CruiseControl.Net&lt;/A&gt;, &lt;A href="http://nant.sourceforge.net/"&gt;NAnt&lt;/A&gt;, &lt;A href="http://workspaces.gotdotnet.com/ncover"&gt;NCover&lt;/A&gt;,&amp;nbsp;and Microsoft's yet-to-be-released &lt;A href="http://msdn.microsoft.com/vstudio/teamsystem/"&gt;Visual Studio Team System&lt;/A&gt;.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;The presentation is available &lt;A href="http://www.ip3systems.com/chrisgarty/presentations/2004/Agile%20.Net%20Development%20-%20Part%201%20-%20Tools%20and%20Basics.ppt"&gt;here&lt;/A&gt;.&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=169381" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/chrisgarty/archive/tags/Visual+Studio+2005/default.aspx">Visual Studio 2005</category><category domain="http://blogs.msdn.com/chrisgarty/archive/tags/VS+Team+System/default.aspx">VS Team System</category><category domain="http://blogs.msdn.com/chrisgarty/archive/tags/Testability/default.aspx">Testability</category><category domain="http://blogs.msdn.com/chrisgarty/archive/tags/Community/default.aspx">Community</category><category domain="http://blogs.msdn.com/chrisgarty/archive/tags/My+Presentations/default.aspx">My Presentations</category></item><item><title>VSTS: Getting coded web tests to run</title><link>http://blogs.msdn.com/chrisgarty/archive/2004/06/04/148102.aspx</link><pubDate>Fri, 04 Jun 2004 19:23:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:148102</guid><dc:creator>chrisgarty</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/chrisgarty/comments/148102.aspx</comments><wfw:commentRss>http://blogs.msdn.com/chrisgarty/commentrss.aspx?PostID=148102</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Verdana size=2&gt;The coded web tests&amp;nbsp;supported by the &lt;A href="http://msdn.microsoft.com/vstudio/teamsystem/tester/default.aspx"&gt;VSTS test tools&lt;/A&gt; really excite me. There are so many&amp;nbsp;web test scenarios that I can now create very easily with a combination of recording and scripting. This will nicely&amp;nbsp;complement&amp;nbsp;the ASP.Net testing capabilities I already have thanks to &lt;A href="http://nunitasp.sourceforge.net/"&gt;NUnitAsp&lt;/A&gt;.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;However when I&amp;nbsp;recorded a web test, generated the code from the test, and then tried to use that test the test runner wasn't able to&amp;nbsp;load my assembly. &lt;/FONT&gt;&lt;FONT face=Verdana size=2&gt;It gave me an error similar to this: &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;&lt;EM&gt;WebTestCoded&amp;nbsp;Coded Web Test&amp;nbsp;Error&amp;nbsp;Could not run web test 'WebTestCoded' on agent 'MyComputer': Could not create instance of class 'WebTestCoded' :File or assembly name 'WebTestProject1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null', or one of its dependencies, was not found.&amp;nbsp;&lt;/EM&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;So I jumped on the &lt;A href="http://communities.microsoft.com/newsgroups/default.asp?icp=whidbey&amp;amp;slcid=us"&gt;Microsoft newsgroups&lt;/A&gt;&amp;nbsp;and just got a reply to my query: You have to &lt;STRONG&gt;copy the assembly to VSDIR\Common7\IDE\PrivateAssemblies&lt;/STRONG&gt;. &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;To help with this process, add a post build event similar to the one below to all projects with coded web tests: &lt;/FONT&gt;&lt;FONT face=Verdana size=2&gt;&lt;EM&gt;copy WebTestProject1.dll "C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\PrivateAssemblies"&lt;/EM&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Thanks to Eric Adams (PM - &lt;A href="http://msdn.microsoft.com/vstudio/teamsystem/"&gt;VSTS&lt;/A&gt; Test) for this solution!&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=148102" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/chrisgarty/archive/tags/Visual+Studio+2005/default.aspx">Visual Studio 2005</category><category domain="http://blogs.msdn.com/chrisgarty/archive/tags/VS+Team+System/default.aspx">VS Team System</category><category domain="http://blogs.msdn.com/chrisgarty/archive/tags/Testability/default.aspx">Testability</category></item><item><title>Safer C# Constructor-based Dependency Injection with readonly</title><link>http://blogs.msdn.com/chrisgarty/archive/2004/05/31/144753.aspx</link><pubDate>Mon, 31 May 2004 23:25:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:144753</guid><dc:creator>chrisgarty</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/chrisgarty/comments/144753.aspx</comments><wfw:commentRss>http://blogs.msdn.com/chrisgarty/commentrss.aspx?PostID=144753</wfw:commentRss><description>&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Most people would have used the const keyword while doing C# development, but I had never heard of the readonly keyword before. Well, this weekend I had a friend point out this keyword and the first usage that came to mind was &lt;A href="http://www.martinfowler.com/articles/injection.html#ConstructorInjectionWithPicocontainer"&gt;constructor-based &lt;/A&gt;&lt;/FONT&gt;&lt;FONT face=Verdana size=2&gt;&lt;A href="http://www.martinfowler.com/articles/injection.html#ConstructorInjectionWithPicocontainer"&gt;dependency&amp;nbsp;injection&lt;/A&gt;&lt;/FONT&gt;&lt;FONT face=Verdana size=2&gt;.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Here is the clarification of the &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/csref/html/vclrfreadonlypg.asp"&gt;differences between readonly and const&amp;nbsp;from MSDN&lt;/A&gt;:&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;&lt;EM&gt;The &lt;B&gt;readonly&lt;/B&gt; keyword is different from the &lt;?XML:NAMESPACE PREFIX = MSHelp NS = "http://msdn.microsoft.com/mshelp" /&gt;&lt;MSHelp:link tabIndex=0 keywords="79EB447C-117B-4418-933F-97C50AA472DB"&gt;const&lt;/MSHelp:link&gt; keyword. A &lt;B&gt;const&lt;/B&gt; field can only be initialized at the declaration of the field. A &lt;B&gt;readonly&lt;/B&gt; field can be initialized either at the declaration or in a constructor. Therefore, &lt;B&gt;readonly&lt;/B&gt; fields can have different values depending on the constructor used. Also, while a &lt;B&gt;const&lt;/B&gt; field is a compile-time constant, the &lt;B&gt;readonly&lt;/B&gt; field can be used for runtime constants e.g&lt;/EM&gt;. &lt;EM&gt;public static readonly DateTime&amp;nbsp;_creationTime = DateTime.Now;&lt;/EM&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;So now I can create a class with a dependency (reference) that is injected in the constructor and I can be sure that no method in the class will change that injected dependency.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;Using &lt;A href="http://www.martinfowler.com/"&gt;Martin Fowler's&lt;/A&gt; &lt;A href="http://www.martinfowler.com/articles/injection.html#ANaiveExample"&gt;MovieLister example&lt;/A&gt;, I can now have this:&lt;/FONT&gt;&lt;/P&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;public&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt; &lt;FONT color=#0000ff&gt;class&lt;/FONT&gt; &lt;B&gt;&lt;FONT color=#000080&gt;MovieLister&lt;BR&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face=Verdana size=2&gt;{&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;readonly&lt;/FONT&gt; &lt;B&gt;&lt;FONT color=#000080&gt;MovieFinder&lt;/B&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face=Verdana size=2&gt; finder;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public&lt;/FONT&gt; &lt;B&gt;&lt;FONT color=#000080&gt;MovieLister&lt;/B&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;(&lt;B&gt;&lt;FONT color=#000080&gt;MovieFinder&lt;/B&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face=Verdana size=2&gt; finder)&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face=Verdana size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this&lt;/FONT&gt;&lt;FONT face=Verdana&gt;.finder = finder;&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face=Verdana size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;And if anyone tries to change that readonly local member variable in a method like...&lt;/FONT&gt;&lt;/P&gt;
&lt;P dir=ltr style="MARGIN-RIGHT: 0px"&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;FONT color=#0000ff&gt;public&lt;FONT face=Verdana&gt;&lt;FONT size=2&gt;&lt;FONT color=#000000&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff&gt;class&lt;/FONT&gt;&lt;FONT color=#000000&gt; &lt;/FONT&gt;&lt;B&gt;&lt;FONT color=#000080&gt;MovieLister...&lt;BR&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;void&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face=Verdana&gt; MethodThatWontCompile()&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face=Verdana size=2&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;{&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face=Verdana&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this&lt;/FONT&gt;.finder = &lt;FONT color=#0000ff&gt;null&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face=Verdana&gt;; &lt;FONT color=#008000 size=2&gt;//Error because a readonly field cannot be assigned to&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face=Verdana size=2&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;...they'll get an error on compilation: &lt;/FONT&gt;&lt;FONT face=Verdana size=2&gt;&lt;EM&gt;'A readonly field cannot be assigned to (except in a constructor or a variable initializer)'&lt;/EM&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Verdana size=2&gt;So in summary, the readonly keyword provides us with a facility for ensuring that&amp;nbsp;our &lt;A href="http://www.martinfowler.com/articles/injection.html#ConstructorInjectionWithPicocontainer"&gt;constructor injected dependencies&lt;/A&gt; are not tampered with by other methods in the class.&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=144753" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/chrisgarty/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.msdn.com/chrisgarty/archive/tags/Testability/default.aspx">Testability</category></item></channel></rss>