<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" 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:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Test Driven Developer</title>
    <link>http://testdrivendeveloper.com/</link>
    <description>You got a TEST for that?</description>
    <language>en-us</language>
    <copyright>John E. Boal</copyright>
    <lastBuildDate>Sat, 15 Nov 2008 21:08:59 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.1.8102.813</generator>
    <managingEditor>web_master1@TestDrivenDeveloper.com</managingEditor>
    <webMaster>web_master1@TestDrivenDeveloper.com</webMaster>
    <item>
      <trackback:ping>http://testdrivendeveloper.com/Trackback.aspx?guid=e36a37f3-53c9-460d-8042-ee50090f0ad0</trackback:ping>
      <pingback:server>http://testdrivendeveloper.com/pingback.aspx</pingback:server>
      <pingback:target>http://testdrivendeveloper.com/PermaLink,guid,e36a37f3-53c9-460d-8042-ee50090f0ad0.aspx</pingback:target>
      <dc:creator>John E. Boal</dc:creator>
      <wfw:comment>http://testdrivendeveloper.com/CommentView,guid,e36a37f3-53c9-460d-8042-ee50090f0ad0.aspx</wfw:comment>
      <wfw:commentRss>http://testdrivendeveloper.com/SyndicationService.asmx/GetEntryCommentsRss?guid=e36a37f3-53c9-460d-8042-ee50090f0ad0</wfw:commentRss>
      <title>Unit Testing and Test Driven Development - a Practical Guide</title>
      <guid isPermaLink="false">http://testdrivendeveloper.com/PermaLink,guid,e36a37f3-53c9-460d-8042-ee50090f0ad0.aspx</guid>
      <link>http://TestDrivenDeveloper.com/2008/11/15/UnitTestingAndTestDrivenDevelopmentAPracticalGuide.aspx</link>
      <pubDate>Sat, 15 Nov 2008 21:08:59 GMT</pubDate>
      <description>&lt;div&gt;Here is a presentation I wrote on what Unit Testing is all about, and how TDD fits into the ATDD cycle.&lt;br&gt;&lt;br&gt;There are specific things here on testing the UI code with Selenium and JSUnit, and recommendations on how to do unit testing on your database code.&lt;br&gt;&lt;br&gt;This presentation is in PDF format, but I can post the PPTX format also if needed.&lt;br&gt;&lt;p&gt;&lt;/p&gt;&lt;a href="http://testdrivendeveloper.com/content/binary/A%20Practical%20Guide%20to%20Unit%20Testing1.pdf"&gt;A Practical Guide to Unit Testing1.pdf (503.29 KB)&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;img width="0" height="0" src="http://testdrivendeveloper.com/aggbug.ashx?id=e36a37f3-53c9-460d-8042-ee50090f0ad0"/&gt;&lt;/div&gt;</description>
      <comments>http://testdrivendeveloper.com/CommentView,guid,e36a37f3-53c9-460d-8042-ee50090f0ad0.aspx</comments>
      <category>ATDD</category>
      <category>Mocks</category>
      <category>Refactoring</category>
      <category>Selenium</category>
      <category>TDD</category>
      <category>Testing</category>
      <category>Unit Tests</category>
      <category>SQL</category>
    </item>
    <item>
      <trackback:ping>http://testdrivendeveloper.com/Trackback.aspx?guid=e0963ca0-a741-4795-b40f-c1e8f0f5e038</trackback:ping>
      <pingback:server>http://testdrivendeveloper.com/pingback.aspx</pingback:server>
      <pingback:target>http://testdrivendeveloper.com/PermaLink,guid,e0963ca0-a741-4795-b40f-c1e8f0f5e038.aspx</pingback:target>
      <dc:creator>John E. Boal</dc:creator>
      <wfw:comment>http://testdrivendeveloper.com/CommentView,guid,e0963ca0-a741-4795-b40f-c1e8f0f5e038.aspx</wfw:comment>
      <wfw:commentRss>http://testdrivendeveloper.com/SyndicationService.asmx/GetEntryCommentsRss?guid=e0963ca0-a741-4795-b40f-c1e8f0f5e038</wfw:commentRss>
      <title>November Agile Beer Night is Nov 20</title>
      <guid isPermaLink="false">http://testdrivendeveloper.com/PermaLink,guid,e0963ca0-a741-4795-b40f-c1e8f0f5e038.aspx</guid>
      <link>http://TestDrivenDeveloper.com/2008/11/15/NovemberAgileBeerNightIsNov20.aspx</link>
      <pubDate>Sat, 15 Nov 2008 21:06:29 GMT</pubDate>
      <description>&lt;div&gt;For all of you who enjoy beer and talking about Agile Software Development... Agile Beer Night is for you! See the &lt;a href="http://AgileBUG.com"&gt;Agile Beer Users Group web site&lt;/a&gt; for more information about the meeting location. It's at Daman's Pub from 5PM-7PM.&lt;br&gt;&lt;p&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://testdrivendeveloper.com/aggbug.ashx?id=e0963ca0-a741-4795-b40f-c1e8f0f5e038"/&gt;&lt;/div&gt;</description>
      <comments>http://testdrivendeveloper.com/CommentView,guid,e0963ca0-a741-4795-b40f-c1e8f0f5e038.aspx</comments>
      <category>ABN</category>
    </item>
    <item>
      <trackback:ping>http://testdrivendeveloper.com/Trackback.aspx?guid=729dde91-6a43-4e82-88ec-356af2667b62</trackback:ping>
      <pingback:server>http://testdrivendeveloper.com/pingback.aspx</pingback:server>
      <pingback:target>http://testdrivendeveloper.com/PermaLink,guid,729dde91-6a43-4e82-88ec-356af2667b62.aspx</pingback:target>
      <dc:creator>John E. Boal</dc:creator>
      <wfw:comment>http://testdrivendeveloper.com/CommentView,guid,729dde91-6a43-4e82-88ec-356af2667b62.aspx</wfw:comment>
      <wfw:commentRss>http://testdrivendeveloper.com/SyndicationService.asmx/GetEntryCommentsRss?guid=729dde91-6a43-4e82-88ec-356af2667b62</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <title>Test-Driven Process Improvement with Refactoring, Value Stream Mapping, and Windows Workflow</title>
      <guid isPermaLink="false">http://testdrivendeveloper.com/PermaLink,guid,729dde91-6a43-4e82-88ec-356af2667b62.aspx</guid>
      <link>http://TestDrivenDeveloper.com/2008/10/30/TestDrivenProcessImprovementWithRefactoringValueStreamMappingAndWindowsWorkflow.aspx</link>
      <pubDate>Thu, 30 Oct 2008 20:47:03 GMT</pubDate>
      <description>&lt;div&gt;Value Stream Mapping [VSM] is a lean concept that helps us improve our processes by focusing on the whole process and making stepwise refinements on smaller parts of the process, to gain improvement for the whole. It is in a sense, "Refactoring" a process.&lt;br&gt;&lt;br&gt;In an ideal case, a process can be thought of as a workflow, and perhaps we might be able to represent it using the WF Windows Workflow Foundation code delivered in .NET 3.5. It would be nice to show a code example here of how we can represent a process with workflow steps, but I didn't have time to write up an example as of yet.&lt;br&gt;&lt;br&gt;With VSM, we are trying to improve a process by mapping it into parts, each of which we can study. We can gather metrics on each of the process steps, and metrics on how long things wait between steps. The waiting between steps is usually far more significant time-wise than any of the steps themselves. WF can be instrumental in providing an automated framework for collecting and reporting these metrics.&lt;br&gt;&lt;br&gt;Indeed there are also other workflow alternatives of course. BizTalk Server 2006 R2 is a fine candidate for workflow representation as well, when adapters are available for systems that interoperate. I have a specific Microsoft focus in my career, but I have used CapeClear as a Java-based workflow system, and there are others in the ESB space which have features that would allow us to collect metrics on an automated representation of our processes.&lt;br&gt;&lt;br&gt;Automation is key to refactoring, as in any development mechanism. We can't fix what we don't know is broken. With VSM, we focus on the entire process as a whole, so we need to collect measurements on where it is today, and then we can see total improvement on the whole as we make small changes (refactoring the process).&lt;br&gt;&lt;br&gt;Many enterprises today use Service-Oriented Architecture [SOA] as a design pattern for the construction of enterprise systems. This architecture lends itself well to the use of WF or BizTalk (substiitute your favorite flavor here) workflow components. SOA helps us to map the entire process to blocks of functionality that we can measure and monitor easily, contributing to our VSM overall picture.&lt;br&gt;&lt;br&gt;My theory is that like with software development, process improvement can also have a test-driven, scientific approach. VSM is a tool that helps us change the right things to improve our overall process, but it typically has measurements in large units - days, even weeks. With the right automation framework contributing to very rapid feedback with the metrics collected on processes, we can write tests that indicate Red or Green for not only each component being analyzed, but for the entire process as well.&lt;br&gt;&lt;br&gt;Tests don't have to be in the form of an NUnit DLL or test fixture. We can use simple reports actually to give us the feedback we need to make decisions on how we refactor. Think of it as moving test-driven concepts a couple elevations higher in the plan view. From the 500 foot view to the 5000 foot view if you will. It's the exact same concept, just applied at a somewhat higher level of abstraction.&lt;br&gt;&lt;br&gt;For each of our services we monitor the time taken in the process and the time between processes, and compare them to our initial baseline. We might even be able to get real-time data on a visible dashboard in the best of cirumstances. When we are better than our initial baseline, we are Green, if not, then we're Red. There is no yellow - same result means we haven't improved so it's still red. This concept is brutally simple, but it can be very effective, especially if the Red/Green report is made visible on a web-based report.&lt;br&gt;&lt;br&gt;Mapping the workflow using WF, BizTalk, or other tools gives us a way to take automated measurements and compare them to our baseline to render a decision on whether our process has improved or not, and whether we are reaching our overall goal of total improvement. Individual portions of the whole can still be red as long as we achieve green for the overall process.&lt;br&gt;&lt;br&gt;A business process really is a workflow, we just need to map it as such using software and automation. In this way we can apply the fine concepts of test-driven and refactoring to process improvement, once again using automation and measurement as our top key tools for leveraging our own technologies to help us improve them.&lt;br&gt;&lt;br&gt;Code examples here would be good of course... Stay tuned for future posts with WF code examples of a process flow that has metrics and baseline comparisons for Red/Green.&lt;br&gt;&lt;p&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://testdrivendeveloper.com/aggbug.ashx?id=729dde91-6a43-4e82-88ec-356af2667b62"/&gt;&lt;/div&gt;</description>
      <comments>http://testdrivendeveloper.com/CommentView,guid,729dde91-6a43-4e82-88ec-356af2667b62.aspx</comments>
      <category>Automation</category>
      <category>Refactoring</category>
      <category>TDD</category>
      <category>Tools</category>
    </item>
    <item>
      <trackback:ping>http://testdrivendeveloper.com/Trackback.aspx?guid=10a8368d-9191-4f9c-bc29-ca957bb111e5</trackback:ping>
      <pingback:server>http://testdrivendeveloper.com/pingback.aspx</pingback:server>
      <pingback:target>http://testdrivendeveloper.com/PermaLink,guid,10a8368d-9191-4f9c-bc29-ca957bb111e5.aspx</pingback:target>
      <dc:creator>John E. Boal</dc:creator>
      <wfw:comment>http://testdrivendeveloper.com/CommentView,guid,10a8368d-9191-4f9c-bc29-ca957bb111e5.aspx</wfw:comment>
      <wfw:commentRss>http://testdrivendeveloper.com/SyndicationService.asmx/GetEntryCommentsRss?guid=10a8368d-9191-4f9c-bc29-ca957bb111e5</wfw:commentRss>
      <title>More Tips for Unit Testing in Iron Python</title>
      <guid isPermaLink="false">http://testdrivendeveloper.com/PermaLink,guid,10a8368d-9191-4f9c-bc29-ca957bb111e5.aspx</guid>
      <link>http://TestDrivenDeveloper.com/2008/10/07/MoreTipsForUnitTestingInIronPython.aspx</link>
      <pubDate>Tue, 07 Oct 2008 16:09:49 GMT</pubDate>
      <description>&lt;div&gt;Do you ever wonder why there is an extra "False" printed at the end of each run for unit tests?&lt;br&gt;&lt;br&gt;&lt;font face="Courier New"&gt;C:\Code\sample&amp;gt;ipy UnitTests.py&lt;br&gt;.....&lt;br&gt;----------------------------------------------------------------------&lt;br&gt;Ran 5 tests in 0.395s&lt;br&gt;&lt;br&gt;OK&lt;br&gt;False&lt;/font&gt;&lt;br&gt;&lt;br&gt;It looks like there is an exit statement buried inside the unit test framework. We can eliminate the problem pretty easily with the addition of a try/except around the unit test execution. Here is the code to put at the end of your unit test script:&lt;br&gt;&lt;br&gt;&lt;font face="Courier New"&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt; __name__ &lt;font color="#0000ff"&gt;==&lt;/font&gt; '&lt;font color="#a9a9a9"&gt;__main__&lt;/font&gt;':&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;try&lt;/font&gt;:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unittest.main&lt;font color="#0000ff"&gt;()&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;except&lt;/font&gt; SystemExit:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#0000ff"&gt;pass&lt;/font&gt;&lt;br&gt;&lt;/font&gt;&lt;br&gt;This catches and eats the SystemExit exception, and runs without printing the "False" at the end of the execution:&lt;br&gt;&lt;br&gt;&lt;font face="Courier New"&gt;C:\Code\sample&amp;gt;ipy UnitTests.py&lt;br&gt;.....&lt;br&gt;----------------------------------------------------------------------&lt;br&gt;Ran 5 tests in 0.387s&lt;br&gt;&lt;br&gt;OK&lt;br&gt;&lt;/font&gt;&lt;br&gt;cheers!&lt;br&gt;&lt;p&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://testdrivendeveloper.com/aggbug.ashx?id=10a8368d-9191-4f9c-bc29-ca957bb111e5"/&gt;&lt;/div&gt;</description>
      <comments>http://testdrivendeveloper.com/CommentView,guid,10a8368d-9191-4f9c-bc29-ca957bb111e5.aspx</comments>
      <category>Python</category>
      <category>Testing</category>
      <category>Unit Tests</category>
    </item>
    <item>
      <trackback:ping>http://testdrivendeveloper.com/Trackback.aspx?guid=9c73a72b-9654-4976-83b5-e3f9b6b67e3f</trackback:ping>
      <pingback:server>http://testdrivendeveloper.com/pingback.aspx</pingback:server>
      <pingback:target>http://testdrivendeveloper.com/PermaLink,guid,9c73a72b-9654-4976-83b5-e3f9b6b67e3f.aspx</pingback:target>
      <dc:creator>John E. Boal</dc:creator>
      <wfw:comment>http://testdrivendeveloper.com/CommentView,guid,9c73a72b-9654-4976-83b5-e3f9b6b67e3f.aspx</wfw:comment>
      <wfw:commentRss>http://testdrivendeveloper.com/SyndicationService.asmx/GetEntryCommentsRss?guid=9c73a72b-9654-4976-83b5-e3f9b6b67e3f</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <title>Unit Testing in Python</title>
      <guid isPermaLink="false">http://testdrivendeveloper.com/PermaLink,guid,9c73a72b-9654-4976-83b5-e3f9b6b67e3f.aspx</guid>
      <link>http://TestDrivenDeveloper.com/2008/09/30/UnitTestingInPython.aspx</link>
      <pubDate>Tue, 30 Sep 2008 13:26:26 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;I have been using IronPython lately, and am having a good time testing code with its built-in unit test framework. Here is a brief example of how to write some unit tests for &lt;a target=_ipy href="http://www.codeplex.com/IronPython"&gt;IronPython&lt;/a&gt; (or CPython if that's your flavor). These unit tests&amp;nbsp;leverage the "unittest" module available in Python 2.2 and above.&lt;/P&gt;
&lt;P&gt;Here is a short test class:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;class&lt;/FONT&gt; TestCode:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; localInt = &lt;FONT color=#ff0000&gt;1&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @classmethod&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;def&lt;/FONT&gt; &lt;FONT color=#ff1493&gt;Method1&lt;/FONT&gt;(self):&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;return&lt;/FONT&gt; &lt;FONT color=#ff0000&gt;100&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;def&lt;/FONT&gt; &lt;FONT color=#ff1493&gt;Method2&lt;/FONT&gt;(self, a, b):&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.localInt = a * b&lt;BR&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Here are&amp;nbsp;some sample&amp;nbsp;unit tests for it, using the unittest framework:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;import&lt;/FONT&gt; unittest&lt;BR&gt;&lt;FONT color=#0000ff&gt;class&lt;/FONT&gt; UnitTests(unittest.TestCase):&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;def&lt;/FONT&gt; &lt;FONT color=#ff1493&gt;testMethod1&lt;/FONT&gt;(self):&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cut = TestCode()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; actual = cut.Method1()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.assertEqual(&lt;FONT color=#ff0000&gt;100&lt;/FONT&gt;, actual)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;def&lt;/FONT&gt; &lt;FONT color=#ff1493&gt;teststaticInt&lt;/FONT&gt;(self):&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.assertEqual(&lt;FONT color=#ff0000&gt;1&lt;/FONT&gt;, TestCode.localInt)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;def&lt;/FONT&gt; &lt;FONT color=#ff1493&gt;testMethod2&lt;/FONT&gt;(self):&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cut = TestCode()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cut.Method2(&lt;FONT color=#ff0000&gt;7&lt;/FONT&gt;, &lt;FONT color=#ff0000&gt;4&lt;/FONT&gt;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.assertEqual(&lt;FONT color=#ff0000&gt;28&lt;/FONT&gt;, cut.localInt)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;if&lt;/FONT&gt; __name__ == '&lt;FONT color=#808080&gt;__main__&lt;/FONT&gt;':&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; unittest.main()&lt;BR&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;This example should illustrate that we can write some unit tests for our Python code fairly easily and quickly. It's nice to have a built-in framework for unit testing. There is also a "doctest" module available for doing more like system testing. I am pretty new to Python, so I haven't got examples of this as yet.&lt;/P&gt;
&lt;P&gt;If anyone has any suggestions on tools&amp;nbsp;or experience with &lt;A href="http://blogs.msdn.com/aaronmar/archive/2006/02/16/533273.aspx"&gt;integration with Visual Studio&lt;/A&gt;&amp;nbsp;those comments would be appreciated.&lt;/P&gt;&lt;img width="0" height="0" src="http://testdrivendeveloper.com/aggbug.ashx?id=9c73a72b-9654-4976-83b5-e3f9b6b67e3f"/&gt;&lt;/div&gt;</description>
      <comments>http://testdrivendeveloper.com/CommentView,guid,9c73a72b-9654-4976-83b5-e3f9b6b67e3f.aspx</comments>
      <category>TDD</category>
      <category>Testing</category>
      <category>Tools</category>
      <category>Python</category>
    </item>
    <item>
      <trackback:ping>http://testdrivendeveloper.com/Trackback.aspx?guid=64ecd9d5-5c44-48ac-b3b5-b900d7c4ecd0</trackback:ping>
      <pingback:server>http://testdrivendeveloper.com/pingback.aspx</pingback:server>
      <pingback:target>http://testdrivendeveloper.com/PermaLink,guid,64ecd9d5-5c44-48ac-b3b5-b900d7c4ecd0.aspx</pingback:target>
      <dc:creator>John E. Boal</dc:creator>
      <wfw:comment>http://testdrivendeveloper.com/CommentView,guid,64ecd9d5-5c44-48ac-b3b5-b900d7c4ecd0.aspx</wfw:comment>
      <wfw:commentRss>http://testdrivendeveloper.com/SyndicationService.asmx/GetEntryCommentsRss?guid=64ecd9d5-5c44-48ac-b3b5-b900d7c4ecd0</wfw:commentRss>
      <title>Organizing Test Code</title>
      <guid isPermaLink="false">http://testdrivendeveloper.com/PermaLink,guid,64ecd9d5-5c44-48ac-b3b5-b900d7c4ecd0.aspx</guid>
      <link>http://TestDrivenDeveloper.com/2008/09/22/OrganizingTestCode.aspx</link>
      <pubDate>Mon, 22 Sep 2008 17:21:35 GMT</pubDate>
      <description>&lt;div&gt;&lt;P&gt;Shawn Neal has a &lt;A href="http://blog.sneal.net/blog/2008/09/02/OrganizeYourTestCode.aspx"&gt;great post&lt;/A&gt; (ok it might be a rant) on organizing test code. I agree with his article, on the separation of different kinds of tests into separate assemblies that perhaps can be run at different times (not always with the build). Only the true unit tests should probably be running with each build, and for each developer. If there are other tests that run very fast (by my definition,&amp;nbsp;a fast test either passes or fails in under 1/10 second [100ms]) they too could be included in per-build and per-developer runs, provided that they don't bog down the total test time too much, and&amp;nbsp;provided that they are in separate assemblies.&lt;/P&gt;
&lt;P&gt;Someday, when technology allows for it, we should even be able to run our tests in parallel threads or parallel processes (see the &lt;A href="http://nunit.com/index.php?p=releaseNotes&amp;amp;r=2.5"&gt;2.5&amp;nbsp;target features for NUnit&lt;/A&gt;). Speed is truly important. If your development team has 10 developers, every minute they wait for a build to complete or a test run to complete is 10 minutes a day of development time wasted. If they build and test 6 times a day each (that's not very much BTW) that is one team development hour per day. Realistically it's likely to be more like 5 or 6 development hours a day.&lt;/P&gt;
&lt;P&gt;So if someone is paying attention to how time is spent, we could say perhaps that spending a couple of development hours on the tests to make them run faster, and save one minute per execution would more than pay for itself in a single day.&lt;/P&gt;
&lt;P&gt;The moral of this story is keep the tests fast, and when they aren't, fix them or move them out of the main test path.&lt;/P&gt;&lt;img width="0" height="0" src="http://testdrivendeveloper.com/aggbug.ashx?id=64ecd9d5-5c44-48ac-b3b5-b900d7c4ecd0"/&gt;&lt;/div&gt;</description>
      <comments>http://testdrivendeveloper.com/CommentView,guid,64ecd9d5-5c44-48ac-b3b5-b900d7c4ecd0.aspx</comments>
      <category>Testing</category>
    </item>
    <item>
      <trackback:ping>http://testdrivendeveloper.com/Trackback.aspx?guid=734346b7-6fa7-46b2-8725-4e92be3a6725</trackback:ping>
      <pingback:server>http://testdrivendeveloper.com/pingback.aspx</pingback:server>
      <pingback:target>http://testdrivendeveloper.com/PermaLink,guid,734346b7-6fa7-46b2-8725-4e92be3a6725.aspx</pingback:target>
      <dc:creator>John E. Boal</dc:creator>
      <wfw:comment>http://testdrivendeveloper.com/CommentView,guid,734346b7-6fa7-46b2-8725-4e92be3a6725.aspx</wfw:comment>
      <wfw:commentRss>http://testdrivendeveloper.com/SyndicationService.asmx/GetEntryCommentsRss?guid=734346b7-6fa7-46b2-8725-4e92be3a6725</wfw:commentRss>
      <title>Acceptance Criteria is Critical for Test Driven Development</title>
      <guid isPermaLink="false">http://testdrivendeveloper.com/PermaLink,guid,734346b7-6fa7-46b2-8725-4e92be3a6725.aspx</guid>
      <link>http://TestDrivenDeveloper.com/2008/09/20/AcceptanceCriteriaIsCriticalForTestDrivenDevelopment.aspx</link>
      <pubDate>Sat, 20 Sep 2008 23:38:33 GMT</pubDate>
      <description>&lt;div&gt;Acceptance criteria are the real key to being able to develop software in the agile model. Acceptance criteria is not really adequately represented by a use case, even with several alternate path scenarios... I have seen this and it just doesn't do the trick. A scenario is good, but it's really not acceptance criteria. We can however, analyze these scenarios and alternate paths, and usually come up with a pretty good set of criteria.&lt;br&gt;&lt;br&gt;Beware of the incomplete criteria. It's darn hard to get it all. We know this. But, make an attempt anyway. Use the thinking that if it isn't in the criteria it won't be delivered, and that the developers can implement it any way they want... This thought should be scary enough for a customer that they will be forced to think hard about what they really want the software to do.&lt;br&gt;&lt;br&gt;When we think we know what we are doing, we can write some tests, write some code. We think we have the idea, only to find out later that we had misunderstood or didn't have all the requirements. Acceptance criteria are absolutely the must-have thing for agile processes to succeed. We need the Customer or product owner [PO] to provide clear, concise, and specific criteria for our software.&lt;br&gt;&lt;br&gt;I'm not saying that generating/gathering acceptance criteria is easy. It takes practice. It takes cooperation. It takes understanding on both the development team and the customer/PO that "if it isn't requested or specified in the acceptance criteria, it isn't going to be delivered." It's really kind of harsh actually to practice this, so I wouldn't advocate it. However, it might be a good idea to talk about it in those kind of terms while in the sprint planning or story negotiation phase.&lt;br&gt;&lt;br&gt;Without the ability to know that we are doing the right thing, surely we will fail to deliver it. The customer knows exactly what they want. OK, most customers really don't know what they want. It is up to us as a development team to be able to know this, and help them out by asking lots of questions, and examining exactly what we propose to deliver. After all, that is why they hired us right?&lt;br&gt;&lt;br&gt;Train your team. Let them know that the ancient role of "Business Analyst" is no place to be found in an agile team, and the whole team is really responsible for making sure to ask the right questions. I do like the whole user story concept, but it is far more practical in sprint planning to capture some of the actual acceptance criteria and store it attached to the story somehow, so that it is accessible by the team and can be implemented as automated tests.&lt;br&gt;&lt;br&gt;Test automation is critical, mandatory, required, and not optional. Did I mention that test automation is required. Perhaps I should mention it again, in case my previous sentences weren't clear. Automate, Automate, Automate. Double-click run test suite, should be the demo in the sprint review and customer demonstration at the end of the sprint. This is really and truly the only way that agile teams can operate successfully.&lt;br&gt;&lt;br&gt;If you have people doing any kind of manual testing (other than exploratory), this is a great opportunity to get the team to be far more productive by assisting the manual testers to get these tasks automated. Sometimes it is not practical to automate some manual tests. But in my experience - NOT OFTEN. If it looks hard to automate, someone should be asking why the code is so "untestable"... In most cases, the three or four dev or test hours it takes to automate the most difficult manual test case scenario is more than paid back in the number of times the automation can be run from then on. The number of bugs and breaks that it will prevent is a definite value add to the organization, and in my opinion, money in the bank.&lt;br&gt;&lt;p&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://testdrivendeveloper.com/aggbug.ashx?id=734346b7-6fa7-46b2-8725-4e92be3a6725"/&gt;&lt;/div&gt;</description>
      <comments>http://testdrivendeveloper.com/CommentView,guid,734346b7-6fa7-46b2-8725-4e92be3a6725.aspx</comments>
      <category>Acceptance Criteria</category>
    </item>
    <item>
      <trackback:ping>http://testdrivendeveloper.com/Trackback.aspx?guid=5a017eb7-e72b-4a9f-97ad-9457c7b54bcd</trackback:ping>
      <pingback:server>http://testdrivendeveloper.com/pingback.aspx</pingback:server>
      <pingback:target>http://testdrivendeveloper.com/PermaLink,guid,5a017eb7-e72b-4a9f-97ad-9457c7b54bcd.aspx</pingback:target>
      <dc:creator>John E. Boal</dc:creator>
      <wfw:comment>http://testdrivendeveloper.com/CommentView,guid,5a017eb7-e72b-4a9f-97ad-9457c7b54bcd.aspx</wfw:comment>
      <wfw:commentRss>http://testdrivendeveloper.com/SyndicationService.asmx/GetEntryCommentsRss?guid=5a017eb7-e72b-4a9f-97ad-9457c7b54bcd</wfw:commentRss>
      <title>September Agile Beer Night</title>
      <guid isPermaLink="false">http://testdrivendeveloper.com/PermaLink,guid,5a017eb7-e72b-4a9f-97ad-9457c7b54bcd.aspx</guid>
      <link>http://TestDrivenDeveloper.com/2008/09/12/SeptemberAgileBeerNight.aspx</link>
      <pubDate>Fri, 12 Sep 2008 15:22:57 GMT</pubDate>
      <description>&lt;div&gt;The next &lt;a href="http://agilebug.com/2008/09/11/SeptemberAgileBeerNight.aspx"&gt;Agile Beer Night&lt;/a&gt; is coming up on Tuesday September 30, at the Celtic Bayou pub in Redmond from 5PM to 7PM. Be there or be square...&lt;br&gt;&lt;br&gt;&lt;p&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://testdrivendeveloper.com/aggbug.ashx?id=5a017eb7-e72b-4a9f-97ad-9457c7b54bcd"/&gt;&lt;/div&gt;</description>
      <comments>http://testdrivendeveloper.com/CommentView,guid,5a017eb7-e72b-4a9f-97ad-9457c7b54bcd.aspx</comments>
      <category>ABN</category>
    </item>
    <item>
      <trackback:ping>http://testdrivendeveloper.com/Trackback.aspx?guid=5872ed9c-4504-4cef-909d-4e2efe0d7269</trackback:ping>
      <pingback:server>http://testdrivendeveloper.com/pingback.aspx</pingback:server>
      <pingback:target>http://testdrivendeveloper.com/PermaLink,guid,5872ed9c-4504-4cef-909d-4e2efe0d7269.aspx</pingback:target>
      <dc:creator>John E. Boal</dc:creator>
      <wfw:comment>http://testdrivendeveloper.com/CommentView,guid,5872ed9c-4504-4cef-909d-4e2efe0d7269.aspx</wfw:comment>
      <wfw:commentRss>http://testdrivendeveloper.com/SyndicationService.asmx/GetEntryCommentsRss?guid=5872ed9c-4504-4cef-909d-4e2efe0d7269</wfw:commentRss>
      <title>Sample Code for Selenium and WatiN tests</title>
      <guid isPermaLink="false">http://testdrivendeveloper.com/PermaLink,guid,5872ed9c-4504-4cef-909d-4e2efe0d7269.aspx</guid>
      <link>http://TestDrivenDeveloper.com/2008/08/26/SampleCodeForSeleniumAndWatiNTests.aspx</link>
      <pubDate>Tue, 26 Aug 2008 15:03:11 GMT</pubDate>
      <description>&lt;div&gt;I posted a simple sample of accepance test code in Selenium and WatiN along with a sample web site to test. You can download the zip file &lt;a href="http://agilebug.com/ct.ashx?id=f4b673d3-cdfe-4a3d-b740-907c1b2cb362&amp;amp;url=http%3a%2f%2fagilebug.com%2fcontent%2fbinary%2fATDDdemo.zip"&gt;here&lt;/a&gt;.&lt;br&gt;&lt;br&gt;I also have posted a Fitnesse fixture in that zip file that illustrates how we can create a simple test fixture for Fitnesse acceptance testing. The Fitnesse tests aren't in the set, but here is the page wiki code that makes use of the fixture:&lt;br&gt;&lt;br&gt;&lt;font face="Courier New" size="2"&gt;!define COMMAND_PATTERN {%m %p}&lt;br&gt;!define TEST_RUNNER {dotnet\FitServer.exe}&lt;br&gt;!define PATH_SEPARATOR {;}&lt;br&gt;!path dotnet\*.dll&lt;br&gt;&lt;br&gt;Here is an acceptance test using our BusinessObjectTestFixture test class:&lt;br&gt;&lt;br&gt;!|FitnesseFixture.BusinessObjectTestFixture|&lt;br&gt;|UserId|Password|Authenticate()|&lt;br&gt;|administrator|secret0|ADMIN|&lt;br&gt;|admin|secret0|NONE|&lt;br&gt;|administrator|secret|NONE|&lt;br&gt;|user11|secret11|USER|&lt;br&gt;|user11|secret0|NONE|&lt;br&gt;|user|secret|NONE|&lt;br&gt;&lt;/font&gt;&lt;br&gt;&lt;br&gt;I also created some STIQ tests, here is the code for the tests and components. Extract this zip file under repository\ProjectRoot folder and it should be able to test the sample site also.&lt;br&gt;&lt;br&gt;&lt;a href="http://testdrivendeveloper.com/content/binary/ATDDSTIQ.zip"&gt;ATDDSTIQ.zip (3.57 KB)&lt;/a&gt;&lt;img width="0" height="0" src="http://testdrivendeveloper.com/aggbug.ashx?id=5872ed9c-4504-4cef-909d-4e2efe0d7269"/&gt;&lt;/div&gt;</description>
      <comments>http://testdrivendeveloper.com/CommentView,guid,5872ed9c-4504-4cef-909d-4e2efe0d7269.aspx</comments>
      <category>ATDD</category>
      <category>Automation</category>
      <category>Selenium</category>
      <category>TDD</category>
      <category>Testing</category>
      <category>Tools</category>
      <category>WatiN</category>
    </item>
    <item>
      <trackback:ping>http://testdrivendeveloper.com/Trackback.aspx?guid=08d711e8-6e7b-4701-81b6-df843a72fa12</trackback:ping>
      <pingback:server>http://testdrivendeveloper.com/pingback.aspx</pingback:server>
      <pingback:target>http://testdrivendeveloper.com/PermaLink,guid,08d711e8-6e7b-4701-81b6-df843a72fa12.aspx</pingback:target>
      <dc:creator>John E. Boal</dc:creator>
      <wfw:comment>http://testdrivendeveloper.com/CommentView,guid,08d711e8-6e7b-4701-81b6-df843a72fa12.aspx</wfw:comment>
      <wfw:commentRss>http://testdrivendeveloper.com/SyndicationService.asmx/GetEntryCommentsRss?guid=08d711e8-6e7b-4701-81b6-df843a72fa12</wfw:commentRss>
      <slash:comments>6</slash:comments>
      <title>List of Tools for Developers</title>
      <guid isPermaLink="false">http://testdrivendeveloper.com/PermaLink,guid,08d711e8-6e7b-4701-81b6-df843a72fa12.aspx</guid>
      <link>http://TestDrivenDeveloper.com/2008/08/05/ListOfToolsForDevelopers.aspx</link>
      <pubDate>Tue, 05 Aug 2008 05:29:38 GMT</pubDate>
      <description>&lt;div&gt;I have been asked recently about tools I prefer to use in my every-day development. Here is a list of tools, and where to get them.&lt;br&gt;&lt;br&gt;Visual Studio 2008&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  Development IDE&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://msdn.microsoft.com/en-us/vstudio/products/aa700831.aspx"&gt;Microsoft&lt;/a&gt;&lt;br&gt;TestDriven.net&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp; Test Runner&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;a href="http://TestDriven.net"&gt;TestDriven.net&lt;/a&gt;&lt;br&gt;WinMerge&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp; Diff / Merge tool&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;a href="http://winmerge.org/downloads/index.php"&gt;WinMerge.org&lt;/a&gt; integrates with VS and Tortoise too!&lt;br&gt;nUnit&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  Unit Testing Framework&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;a href="http://nunit.org/?p=download"&gt;nUnit.org&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Also see &lt;a href="http://www.mbunit.com/"&gt;mbUnit&lt;/a&gt; and &lt;a href="http://www.gallio.org"&gt;Gallio&lt;/a&gt;&lt;br&gt;Selenium&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;&amp;nbsp; UI test framework&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp; &lt;a href="http://selenium.openqa.org/"&gt;OpenQA&lt;/a&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  Also see &lt;a href="http://watin.sourceforge.net/"&gt;WatiN&lt;/a&gt;&lt;br&gt;ReSharper&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp; Integrated toolkit for VS&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp; &lt;a href="http://www.jetbrains.com/resharper/download/"&gt;JetBrains&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  (OK I don't actually use it but it's good.)&lt;br&gt;Tortoise SVN&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp; Shell Integration with SVN&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp; &lt;a href="http://tortoisesvn.net/downloads"&gt;Tigris&lt;/a&gt;&lt;br&gt;Ankh SVN&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  Visual Studio Plugin for SVN&amp;nbsp;&amp;nbsp;  &amp;nbsp; &lt;a href="http://ankhsvn.open.collab.net/servlets/ProjectProcess?pageID=3794"&gt;CollabNet&lt;/a&gt;&lt;br&gt;Subversion (Server)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Version Control System&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;a href="http://www.visualsvn.com/server/"&gt;VisualSVN&lt;/a&gt;&lt;br&gt;Cruise Control.net&amp;nbsp; &amp;nbsp;&amp;nbsp;  &amp;nbsp; CI system&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET"&gt;ThoughtWorks&lt;/a&gt;&lt;br&gt;RhinoMocks&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;&amp;nbsp;  Mock Object System&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;a href="http://www.ayende.com/projects/rhino-mocks/downloads.aspx"&gt;Ayende&lt;/a&gt;&lt;br&gt;nAnt&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;&amp;nbsp; .NET Build Tool&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &lt;a href="http://nant.sourceforge.net/"&gt;nAnt&lt;/a&gt;&lt;br&gt;Fitnesse&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp; Acceptance Test Tool&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp; &lt;a href="http://fitnesse.org/"&gt;Fitnesse&lt;/a&gt;&lt;br&gt;STIQ&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;&amp;nbsp; Story Test Tool&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;a href="http://storytestiq.solutionsiq.com/wiki/Main_Page"&gt;Solutions IQ&lt;/a&gt;&lt;br&gt;GIMP&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;&amp;nbsp;  GNU Image Manipulation Prog. &lt;a href="http://gimp-win.sourceforge.net/"&gt;SourceForge&lt;/a&gt;&lt;br&gt;Notepad++&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp; Smart Text Editor&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp; &lt;a href="http://notepad-plus.sourceforge.net/uk/download.php"&gt;SourceForge UK&lt;/a&gt; when Visual Studio just won't do...&lt;br&gt;&lt;br&gt;Not development tools exactly, but extremely handy:&lt;br&gt;Process Explorer&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;&amp;nbsp;  Smarter Task Manager&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp; &lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx"&gt;SysInternals&lt;/a&gt;&lt;br&gt;FileZilla&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;&amp;nbsp;  Upload/FTP client&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &lt;a href="http://filezilla-project.org/download.php"&gt;FileZilla&lt;/a&gt;&lt;br&gt;DivX&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp; Decoder&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &lt;a href="http://DivX.com"&gt;DivX&lt;/a&gt;&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp; Because sometimes we need to watch movies...&lt;br&gt;&lt;br&gt;That's all I can think of at the moment, but am probably missing some
things. I'm sure you'll all (please) chime in with what I forgot... :-)&lt;br&gt;
&lt;br&gt;
&lt;br&gt;&lt;img width="0" height="0" src="http://testdrivendeveloper.com/aggbug.ashx?id=08d711e8-6e7b-4701-81b6-df843a72fa12"/&gt;&lt;/div&gt;</description>
      <comments>http://testdrivendeveloper.com/CommentView,guid,08d711e8-6e7b-4701-81b6-df843a72fa12.aspx</comments>
      <category>Automation</category>
      <category>Mocks</category>
      <category>Selenium</category>
      <category>Testing</category>
      <category>WatiN</category>
      <category>Tools</category>
    </item>
    <item>
      <trackback:ping>http://testdrivendeveloper.com/Trackback.aspx?guid=eb23c920-3a3b-4287-ac47-b12f55edd465</trackback:ping>
      <pingback:server>http://testdrivendeveloper.com/pingback.aspx</pingback:server>
      <pingback:target>http://testdrivendeveloper.com/PermaLink,guid,eb23c920-3a3b-4287-ac47-b12f55edd465.aspx</pingback:target>
      <dc:creator>John E. Boal</dc:creator>
      <wfw:comment>http://testdrivendeveloper.com/CommentView,guid,eb23c920-3a3b-4287-ac47-b12f55edd465.aspx</wfw:comment>
      <wfw:commentRss>http://testdrivendeveloper.com/SyndicationService.asmx/GetEntryCommentsRss?guid=eb23c920-3a3b-4287-ac47-b12f55edd465</wfw:commentRss>
      <title>Avoid Large Methods</title>
      <guid isPermaLink="false">http://testdrivendeveloper.com/PermaLink,guid,eb23c920-3a3b-4287-ac47-b12f55edd465.aspx</guid>
      <link>http://TestDrivenDeveloper.com/2008/08/04/AvoidLargeMethods.aspx</link>
      <pubDate>Mon, 04 Aug 2008 19:41:20 GMT</pubDate>
      <description>&lt;div&gt;500 lines of code in one method? uh... U R DOING IT WRONG!&lt;br&gt;&lt;br&gt;Long methods are a code smell. And a loud one at that. Methods should be focused on doing ONE thing. That thing can be simple or complex, but inner complexity should be refactored out into other (small) methods, keeping them each small and focused on a single task. A method with 4 nested levels of for/foreach/while statements is just so wrong in so many ways... Keep it simple. Keep it straightforward. Did I mention keep it simple?&lt;br&gt;&lt;br&gt;Jeremy Miller posted a nice &lt;a href="http://codebetter.com/blogs/jeremy.miller/archive/2005/04/26/129549.aspx" target="_jm"&gt;article&lt;/a&gt; a while back about short methods, and Ward Cunningham has another on &lt;a href="http://c2.com/cgi/wiki?FewShortMethodsPerClass" target="_c2"&gt;C2&lt;/a&gt; that Jeremy references.&lt;br&gt;We
definitely need a Visual Studio plug-in to turn the background yellow
when a method exceeds 20 lines, and turn red when it goes over 40
lines...&lt;br&gt;&lt;br&gt;Here is a simple example. Code by intent means writing code by declaring what it does by well named (and usually long-named) methods. This method is only three lines long, but it conveys that there are two steps to be done, the second with the result of the first. This should be clear to anyone reading it. Further, the XML comment summary (missing from this example) should provide the reader with any information needed not conveyed with the title.&lt;br&gt;&lt;pre&gt;&lt;span style="color: Black; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;public&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;void&lt;/span&gt; DoOneThing()&lt;br&gt;{&lt;br&gt;   &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; n &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; 0;&lt;br&gt;   n &lt;span style="color: Red; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;=&lt;/span&gt; DoStep1ReturnNumber(n);&lt;br&gt;   DoStep2WithResultOfStep1(n);&lt;br&gt;}&lt;br&gt;&lt;br&gt;&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;void&lt;/span&gt; DoStep1ReturnNumber(&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; number)&lt;br&gt;{&lt;br&gt;   &lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;// simple method&lt;/span&gt;
}

&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;private&lt;/span&gt; &lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;void&lt;/span&gt; DoStep2WithResultOfStep1(&lt;span style="color: Blue; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;int&lt;/span&gt; number)&lt;br&gt;{&lt;br&gt;   &lt;span style="color: Green; background-color: transparent; font-family: Courier New; font-size: 11px;"&gt;// more simple stuff&lt;/span&gt;
}&lt;/span&gt;&lt;/pre&gt;&lt;br&gt;Seriously, if there is something out there already that does this, please let me know! If not, I am going to have to write one...&lt;br&gt;&lt;p&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://testdrivendeveloper.com/aggbug.ashx?id=eb23c920-3a3b-4287-ac47-b12f55edd465"/&gt;&lt;/div&gt;</description>
      <comments>http://testdrivendeveloper.com/CommentView,guid,eb23c920-3a3b-4287-ac47-b12f55edd465.aspx</comments>
      <category>C#</category>
    </item>
  </channel>
</rss>