<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Software Configuration Management and Agile Software Development &#187; unit testing</title>
	<atom:link href="http://accurev.com/blog/tag/unit-testing/feed/" rel="self" type="application/rss+xml" />
	<link>http://accurev.com/blog</link>
	<description>SCM and Agile Software Development Blog</description>
	<lastBuildDate>Fri, 03 Feb 2012 19:28:17 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Best Practices for Agile Software Development Defined</title>
		<link>http://accurev.com/blog/2010/08/23/agile-software-development-defined/</link>
		<comments>http://accurev.com/blog/2010/08/23/agile-software-development-defined/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 13:34:04 +0000</pubDate>
		<dc:creator>damonpoole</dc:creator>
				<category><![CDATA[AccuRev]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[Educational Webinars]]></category>
		<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[agile software development]]></category>
		<category><![CDATA[collocation]]></category>
		<category><![CDATA[Damon Poole]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[refactoring]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[unit testing]]></category>

		<guid isPermaLink="false">http://www.accurev.com/blog/?p=2290</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2010/08/23/agile-software-development-defined/' addthis:title='Best Practices for Agile Software Development Defined ' ><a href="//addthis.com/bookmark.php?v=250&#38;username=xa-4d2b47597ad291fb" class="addthis_button_compact">Share</a><span class="addthis_separator">&#124;</span><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a></div>In the last post I defined two Agile software development best practices I believe provide value to a wide variety of development teams.   Here I define three more practices that I believe are also important when transitioning to Agile Software Development; collocation, unit testing, and refactoring. Best Practice for Agile Software Development: Collocation Collocation [...]<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2010/08/23/agile-software-development-defined/' addthis:title='Best Practices for Agile Software Development Defined '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2010/08/23/agile-software-development-defined/' addthis:title='Best Practices for Agile Software Development Defined ' ><a href="//addthis.com/bookmark.php?v=250&amp;username=xa-4d2b47597ad291fb" class="addthis_button_compact">Share</a><span class="addthis_separator">|</span><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a></div><p>In the last post I defined two Agile software development best practices I believe provide value to a wide variety of development teams.   Here I define three more practices that I believe are also important when transitioning to Agile Software Development; collocation, unit testing, and refactoring.</p>
<h2>Best Practice for Agile Software Development: Collocation</h2>
<p><strong>Collocation</strong> is simply having everybody on a cross functional team in close proximity to each other. This compounds the coordination benefit of cross functional teams. This is orthogonal to outsourcing. Whether you are outsourcing or not, collocation only refers to whether a particular cross functional team is sitting near each other.</p>
<h2>Best Practice for Agile Software Development: Unit Testing</h2>
<p><strong>Unit tests</strong> are simply tests that exercise small amounts of isolated functionality. That is, if you have a function that adds two numbers, instead of depending on running a user function that eventually calls the function, exercise the function directly. This often requires the use of mock objects that pretend to be things that the function needs in order to test the function in isolation from other functions that it depends on.</p>
<p>The cost of unit tests is in writing the tests themselves and refactoring code as new functionality is introduced to keep the unit tests testing at the right level. The benefit is that you can easily test changes quickly to find simple problems before doing more thorough and slower testing. It also provides a good safety net for refactoring, gets developers more involved in testing, and usually improves the design of the software.</p>
<h2>Best Practice for Agile Software Development: Refactoring</h2>
<p><strong>Refactoring</strong> is the practice of continuously improving the usability, maintainability, and adaptability of code without changing its behavior. That makes it much easier to add new and unanticipated functionality. Refactoring has the disadvantage that it takes extra effort and requires changing the code. Any change has the potential to reduce the maturity and stability of the product, especially if you don&#8217;t have adequate testing in place. That’s why refactoring is usually paired up with unit testing and together these are frequently combined with continuous integration.</p>
<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2010/08/23/agile-software-development-defined/' addthis:title='Best Practices for Agile Software Development Defined '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>]]></content:encoded>
			<wfw:commentRss>http://accurev.com/blog/2010/08/23/agile-software-development-defined/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Something&#8217;s A-Twitter in My Backing Stream</title>
		<link>http://accurev.com/blog/2010/06/22/twitter-backing-stream/</link>
		<comments>http://accurev.com/blog/2010/06/22/twitter-backing-stream/#comments</comments>
		<pubDate>Tue, 22 Jun 2010 13:49:02 +0000</pubDate>
		<dc:creator>amonty</dc:creator>
				<category><![CDATA[AccuRev]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[agile team]]></category>
		<category><![CDATA[backing stream]]></category>
		<category><![CDATA[change packages]]></category>
		<category><![CDATA[issue tracking]]></category>
		<category><![CDATA[promote]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[stream]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[trigger]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[unit testing]]></category>

		<guid isPermaLink="false">http://www.accurev.com/blog/?p=1917</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2010/06/22/twitter-backing-stream/' addthis:title='Something&#8217;s A-Twitter in My Backing Stream ' ><a href="//addthis.com/bookmark.php?v=250&#38;username=xa-4d2b47597ad291fb" class="addthis_button_compact">Share</a><span class="addthis_separator">&#124;</span><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a></div>One of the cornerstones of any successful organization is communication. On Agile teams, we often meet to share information, update one another on progress, to reflect on that progress and discuss how the process can be improved. These interactions, be they stand-up or retrospective meetings, provide this information at regular intervals. But what if you [...]<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2010/06/22/twitter-backing-stream/' addthis:title='Something&#8217;s A-Twitter in My Backing Stream '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2010/06/22/twitter-backing-stream/' addthis:title='Something&#8217;s A-Twitter in My Backing Stream ' ><a href="//addthis.com/bookmark.php?v=250&amp;username=xa-4d2b47597ad291fb" class="addthis_button_compact">Share</a><span class="addthis_separator">|</span><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a></div><p>One of the cornerstones of any successful organization is communication. On Agile teams, we often meet to share information, update one another on progress, to reflect on that progress and discuss how the process can be improved. These interactions, be they stand-up or retrospective meetings, provide this information at regular intervals. But what if you need &#8220;real-time&#8221;  information sharing?</p>
<p>Consider the concept of &#8220;one piece flow&#8221;, often treated as the holy grail of engineering process purists. Lean/Kanban fan boys live to talk about this at conferences, and in the isle outside my cube. The idea is that a single &#8220;workpiece&#8221; at a time moves through the workflow. In the software development process, this is rarely limited to a single item, but instead is throttled by WIP limits to minimize the bottlenecks in the process. For example, the number of items worked on by developers is limited so that the count of items designated &#8220;ready for test&#8221; is kept at a manageable level. As a tester on an agile team, I&#8217;d like to know as soon as an item is moved from the &#8220;wip/development&#8221; phase to the &#8220;test/validation&#8221; phase.</p>
<p>Consider the following basic stream structure -</p>
<p style="text-align: center;"><img class="size-medium wp-image-1931 aligncenter" title="Simple stream structure" src="http://www.accurev.com/blog/wp-content/uploads/2010/06/Screenshot-300x171.png" alt="Simple Stream Structure" width="300" height="171" /></p>
<p>In an ideal model, testers would be notified as soon as an issue is promoted from the <em>WIP</em> stream to the <em>Validation</em> stream. This model assumes that the project is utilizing <a href="http://www.accurev.com/" target="_blank">AccuRev</a> <em>change packages</em> to track work items as issues. Having a distinct stream for validation purposes simplifies the job of the tester. All issues that exist in this stream have been unit tested by developers, passed basic regression tests, and are ready to be explored, validated, and promoted to the next stage in the workflow.</p>
<p>So, how can this level of communication be achieved? <strong>AccuRev triggers!</strong> The rest of this post will demonstrate how the <em>server post-promote</em> trigger could be used to provide updates using arguably the king of &#8220;What&#8217;s Happening?&#8221; &#8211; <a href="http://twitter.com">Twitter</a>.</p>
<h2>Why use Twitter in your Backing Stream?</h2>
<p>Why not? Sure, you could use e-mail. But who wants more e-mail? Tweet it, and let them aggregate the information for you. Team members can follow the account, or not. Pointy-haired managers that dream of pie charts and love visibility can subscribe to an RSS feed, that you don&#8217;t have to manage. Lastly, if you&#8217;re an agilista, you&#8217;re already hip and trendy, (and let&#8217;s face it, you probably  already tweeted about the awesome presentation on Lean that you saw at the latest Agile conference).</p>
<h2>The Server Post-Promote Trigger</h2>
<p>I am not going to go into the gory details of the <a href="http://www.accurev.com/developer-training-advanced.html" target="_blank">AccuRev trigger system</a>. Here&#8217;s what you need to know.</p>
<ol>
<li>The trigger can be written in whatever language you like. In this example, I use Ruby.</li>
<li>The trigger needs to be registered with the AccuRev server, and associated with the depot for your software project.</li>
</ol>
<p>For this exercise, I wrote a quick script called <em>tweet_post_promote.rb</em>. The first step is to register this script with AccuRev.</p>
<p><em>&gt;accurev mktrig -p SoftwareProject server-post-promote-trig ~/dev/ruby/tweet_post_promote.rb</em></p>
<p>Once registered, the trigger will now fire for all promotes in the SoftwareProject depot. Let&#8217;s take a look at the contents of the script.</p>
<p><em>#!/usr/bin/env ruby</em></p>
<p><em>require &#8216;rubygems&#8217;</em></p>
<p><em>require &#8216;crack&#8217;</em></p>
<p><em>require &#8216;twitter&#8217;</em></p>
<p><em>ACCUREV_DIR = &#8220;/sandbox/amonty/accurev/&#8221;</em></p>
<p><em>ACCUREV_STORAGE = &#8220;#{ACCUREV_DIR}storage/&#8221;</em></p>
<p><em>ACCUREV_SITE_SLICE = &#8220;#{ACCUREV_STORAGE}site_slice/&#8221;</em></p>
<p><em>USER = &#8216;ValidationBot&#8217;</em></p>
<p><em>PASS = &#8216;password&#8217;</em></p>
<p><em><br />
</em></p>
<p><em>def load_trigger_data(file)</em></p>
<p style="padding-left: 30px;"><em>xml = &#8221;</em></p>
<p style="padding-left: 30px;"><em>File.open(&#8220;#{ACCUREV_SITE_SLICE}#{file}&#8221;) do |f|</em></p>
<p style="padding-left: 60px;"><em>xml = f.read</em></p>
<p style="padding-left: 30px;"><em>end</em></p>
<p style="padding-left: 30px;"><em>Crack::XML.parse(xml)</em></p>
<p><em>end</em></p>
<p><em><br />
</em></p>
<p><em>def twitter_get_auth(user, pass)</em></p>
<p style="padding-left: 30px;"><em>httpauth = Twitter::HTTPAuth.new(user, pass)</em></p>
<p style="padding-left: 30px;"><em>Twitter::Base.new(httpauth)</em></p>
<p><em>end</em></p>
<p><em><br />
</em></p>
<p><em>def main()</em></p>
<p style="padding-left: 30px;"><em>hash = load_trigger_data ARGV[1]</em></p>
<p style="padding-left: 30px;"><em>if hash["triggerInput"]["stream1"] == &#8220;Validation&#8221; then</em></p>
<p style="padding-left: 60px;"><em>changePackageIssue = hash["triggerInput"]["changePackages"]["changePackageID"]</em></p>
<p style="padding-left: 60px;"><em>update_string = &#8220;Issue #{changePackageIssue} just promoted to stream #{hash["triggerInput"]["stream1"]}&#8221;</em></p>
<p style="padding-left: 60px;"><em>twitter = twitter_get_auth(USER, PASS)</em></p>
<p style="padding-left: 60px;"><em>twitter.update update_string</em></p>
<p style="padding-left: 30px;"><em>end</em></p>
<p><em>end</em></p>
<p><em>main if __FILE__ == $0</em></p>
<p>This script is very simple. It makes use of the Ruby gems crack and Twitter. Essentially, the script takes the XML trigger file (provided as <em>ARGV[1]</em>) and loads it into a hash. Then the script checks to see if the stream being promoted to is our <em>Validation</em> stream. If so, it uses the twitter gem to update the status on our <em>ValidationBot</em> account.</p>
<p style="text-align: center;"><img class="size-medium wp-image-1945  aligncenter" title="Something's a-Twitter in my Backing Stream" src="http://www.accurev.com/blog/wp-content/uploads/2010/06/Screenshot-2-300x43.png" alt="Something's a-Twitter in my backing stream" width="300" height="43" /></p>
<p>A more useful example is to provide a link to the AccuRev Web UI Issue screen.</p>
<p style="text-align: center;"><a href="http://www.accurev.com/blog/wp-content/uploads/2010/06/Screenshot-3.png"><img class="size-medium wp-image-1949  aligncenter" title="Something's a-Twitter in my Backing Stream" src="http://www.accurev.com/blog/wp-content/uploads/2010/06/Screenshot-3-300x80.png" alt="Something's a-Twitter in My Backing Stream" width="300" height="80" /></a></p>
<p>This way, anyone subscribing to the feed can click on the link and open the issue in the AccuRev Web UI.</p>
<p style="text-align: center;"><a href="http://www.accurev.com/blog/wp-content/uploads/2010/06/Screenshot-4.png"><img class="size-medium wp-image-1950  aligncenter" title="Something's a-Twitter in my Backing Stream- anyone subscribing to the feed can click on the link and open the issue in the AccuRev Web UI." src="http://www.accurev.com/blog/wp-content/uploads/2010/06/Screenshot-4-300x249.png" alt="Something's A-Twitter in My Backing Stream" width="300" height="249" /></a></p>
<p>This is a small example of how AccuRev triggers can be used to increase communication on your team. Testers can follow the <em>ValidationBot</em> account and be notified via their favorite Twitter client whenever an issue is promoted to the validation stream and they need to begin work on it. This could obviously be extended to include additional information (actual file changes, for example). That is, of course, if you can fit it into 140 characters. <img src='http://accurev.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' title="Somethings A Twitter in My Backing Stream" /> </p>
<p>For more information on AccuRev triggers, please see the <a href="http://www.accurev.com/download/docs/4.7.4b_books/AccuRev_4_7_Admin.pdf">Administrator&#8217;s Guide</a>.</p>
<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2010/06/22/twitter-backing-stream/' addthis:title='Something&#8217;s A-Twitter in My Backing Stream '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>]]></content:encoded>
			<wfw:commentRss>http://accurev.com/blog/2010/06/22/twitter-backing-stream/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting Benefits of Agile Software Development, Without &#8220;Going Agile&#8221;</title>
		<link>http://accurev.com/blog/2010/06/15/benefits-agile-without-going-agile/</link>
		<comments>http://accurev.com/blog/2010/06/15/benefits-agile-without-going-agile/#comments</comments>
		<pubDate>Tue, 15 Jun 2010 13:28:38 +0000</pubDate>
		<dc:creator>damonpoole</dc:creator>
				<category><![CDATA[AccuRev]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[continuous integration]]></category>
		<category><![CDATA[Educational Webinars]]></category>
		<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[agile resource center]]></category>
		<category><![CDATA[agile techniques]]></category>
		<category><![CDATA[benefits of agile]]></category>
		<category><![CDATA[JUnit]]></category>
		<category><![CDATA[lean software development]]></category>
		<category><![CDATA[refactoring]]></category>
		<category><![CDATA[time-boxing]]></category>
		<category><![CDATA[unit testing]]></category>
		<category><![CDATA[user stories]]></category>

		<guid isPermaLink="false">http://www.accurev.com/blog/?p=1804</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2010/06/15/benefits-agile-without-going-agile/' addthis:title='Getting Benefits of Agile Software Development, Without &#8220;Going Agile&#8221; ' ><a href="//addthis.com/bookmark.php?v=250&#38;username=xa-4d2b47597ad291fb" class="addthis_button_compact">Share</a><span class="addthis_separator">&#124;</span><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a></div>While many experts push for Agile adoption throughout organizations, a different trend within organizations is emerging.  Organizations are taking smaller steps towards Agile by focusing on specific Agile techniques and applying them to their individual development processes. By adopting certain techniques, organizations still receive some benefits of Agile without &#8220;going Agile&#8221;.  After all, it is [...]<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2010/06/15/benefits-agile-without-going-agile/' addthis:title='Getting Benefits of Agile Software Development, Without &#8220;Going Agile&#8221; '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2010/06/15/benefits-agile-without-going-agile/' addthis:title='Getting Benefits of Agile Software Development, Without &#8220;Going Agile&#8221; ' ><a href="//addthis.com/bookmark.php?v=250&amp;username=xa-4d2b47597ad291fb" class="addthis_button_compact">Share</a><span class="addthis_separator">|</span><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a></div><p style="text-align: justify;">While many experts push for Agile adoption throughout organizations, a different trend within organizations is emerging.  Organizations are taking smaller steps towards Agile by focusing on specific Agile techniques and applying them to their individual development processes.  By adopting certain techniques, organizations still receive some benefits of Agile without &#8220;going Agile&#8221;.  After all, it is possible to do <a href="http://www.accurev.com/continuous-integration.html" target="_blank">Continuous Integration</a> without time-boxing and still reduce integration problems.</p>
<p style="text-align: center;">
<h2>Getting Benefits of Agile Software Development</h2>
<p style="text-align: justify;">For those interested in gaining the benefits of Agile through smaller and more targeted techniques, there are a number of possibilities.  Below are recommended readings on Agile techniques, each focusing on one specific area, while detailing the processes and outlining the benefits.  Here is a great place to start when looking to gain the benefits of <a href="http://www.accurev.com/agile-software-development.html" target="_blank">Agile software developmen</a>t.  <strong><img class="size-full wp-image-1843 alignleft" title="Getting Benefits of Agile Without Going Agile" src="http://www.accurev.com/blog/wp-content/uploads/2010/06/book2.jpg" alt="Getting Benefits of Agile Without Going Agile" width="180" height="200" /></strong> <strong> </strong></p>
<p style="text-align: justify;"><strong>User Stories Applied: For Agile Software Development</strong>, by Mike Cohn.</p>
<p style="text-align: justify;">The Agile equivalent of requirements is User Stories, and this book is the definitive guide to creating and using them.  Readers will not be disappointed with Mike Cohn&#8217;s practical advice on User Stories, as the information offered is easy to read and apply. Valuable topics discussed include why to use User Stories, when they are appropriate, and how to monitor progress.</p>
<p style="padding-left: 210px;"><a href="http://www.accurev.com/blog/wp-content/uploads/2010/06/Book11.jpg"><img class="alignright size-full wp-image-1856" title="Getting Benefits of Agile Without Going Agile" src="http://www.accurev.com/blog/wp-content/uploads/2010/06/Book11-e1276550945534.jpg" alt="Getting Benefits of Agile Without Going Agile" width="162" height="209" /></a><strong>Continuous Integration: Improving Software Quality and Reducing Risk</strong>, by Paul M. Duvall, Steve Matyas and Andrew Glover.</p>
<p style="text-align: justify;">This is a great resource for Continuous Integration.  The authors stress the importance of integrating early and often using CI practices and provide detailed results of a successful CI implementation (including reducing risks, better visibility and reducing repetitive manual processes).  Another important element of this book is its companion Web site, <a href="http://www.integratebutton.com/" target="_blank">www.integratebutton.com</a>, which provides updates and code examples.</p>
<p><img class="alignright size-full wp-image-1807" title="Getting Benefits of Agile Without Going Agile" src="http://www.accurev.com/blog/wp-content/uploads/2010/06/book3-e1276551668365.jpg" alt="Getting Benefits of Agile Without Going Agile" width="180" height="224" /></p>
<p style="padding-left: 120px;"><strong>The Art of Unit Testing: With Examples in .Net</strong>,  by Roy Osherove.</p>
<p style="text-align: justify;">This is one of the best on the topic of Unit Testing, partly because of RoyOsherove&#8217;s experience and passion about the subject, and partly because of his practical delivery.  His book covers important areas of Unit Testing, including writing maintainable test code, code review and adopting Unit Testing in an organization.</p>
<p><a href="http://www.accurev.com/blog/wp-content/uploads/2010/06/book5.jpg"><img class="alignleft size-full wp-image-1811" title="Getting Benefits of Agile Without Going Agile" src="http://www.accurev.com/blog/wp-content/uploads/2010/06/book5-e1276551843627.jpg" alt="Getting Benefits of Agile Without Going Agile" width="180" height="232" /></a></p>
<p><strong>Refactoring: Improving the Design of Existing Code,</strong> by Martin Fowler, Kent Beck, John Brant, &amp; William Opdyke</p>
<p style="text-align: justify;">This book offers important technical insight into the process of changing code to improve internal structures without changing external behavior and is a highly recommended resource on refactoring and improving design of existing code.</p>
<p style="padding-left: 210px; text-align: justify;">To get more benefits of Agile without going Agile, try <em>JUnit Recipes: Practical Methods for Programmer Testing</em> by J.B. Rainsberger, and <em>Implementing Lean Software Development: From Concept to Cash </em>by Mary and Tom Poppendieck or visit AccuRev&#8217;s <a href="http://www.accurev.com/agile-resource-center.html" target="_blank">Agile Resource Center</a>.</p>
<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2010/06/15/benefits-agile-without-going-agile/' addthis:title='Getting Benefits of Agile Software Development, Without &#8220;Going Agile&#8221; '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>]]></content:encoded>
			<wfw:commentRss>http://accurev.com/blog/2010/06/15/benefits-agile-without-going-agile/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Force Testing</title>
		<link>http://accurev.com/blog/2007/10/19/force-testing/</link>
		<comments>http://accurev.com/blog/2007/10/19/force-testing/#comments</comments>
		<pubDate>Fri, 19 Oct 2007 20:10:00 +0000</pubDate>
		<dc:creator>dave</dc:creator>
				<category><![CDATA[Humor]]></category>
		<category><![CDATA[AccuRev]]></category>
		<category><![CDATA[force testing]]></category>
		<category><![CDATA[funcional testing]]></category>
		<category><![CDATA[functional test]]></category>
		<category><![CDATA[mocks]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[unit test]]></category>
		<category><![CDATA[unit testing]]></category>
		<category><![CDATA[white box]]></category>

		<guid isPermaLink="false">http://accurev.wordpress.com/2007/10/19/force-testing/</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2007/10/19/force-testing/' addthis:title='Force Testing ' ><a href="//addthis.com/bookmark.php?v=250&#38;username=xa-4d2b47597ad291fb" class="addthis_button_compact">Share</a><span class="addthis_separator">&#124;</span><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a></div>There are a variety of testing methods: White Box. TDD. Mocks. Unit. Stress. Functional. Taste. Flight. Load. and more&#8230; It&#8217;s Friday&#8230; Here&#8217;s my favorite test courtesy of Boeing&#8230; check out the 777 Wing Force Test. /happy testing/ &#8211; dave<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2007/10/19/force-testing/' addthis:title='Force Testing '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2007/10/19/force-testing/' addthis:title='Force Testing ' ><a href="//addthis.com/bookmark.php?v=250&amp;username=xa-4d2b47597ad291fb" class="addthis_button_compact">Share</a><span class="addthis_separator">|</span><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a></div><p>There are a variety of testing methods: White Box. TDD. Mocks. Unit. Stress. Functional. Taste. Flight. Load. and more&#8230;</p>
<p>It&#8217;s Friday&#8230; Here&#8217;s my favorite test courtesy of Boeing&#8230; check out the <a href="http://www.youtube.com/watch?v=Ai2HmvAXcU0" target="_blank">777 Wing Force Test</a>.</p>
<p>/happy testing/ &#8211; dave</p>
<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2007/10/19/force-testing/' addthis:title='Force Testing '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>]]></content:encoded>
			<wfw:commentRss>http://accurev.com/blog/2007/10/19/force-testing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cleanly CM Transient Test Results &#8211; with AccuRev</title>
		<link>http://accurev.com/blog/2007/10/04/cleanly-cm-transient-test-results/</link>
		<comments>http://accurev.com/blog/2007/10/04/cleanly-cm-transient-test-results/#comments</comments>
		<pubDate>Thu, 04 Oct 2007 20:00:18 +0000</pubDate>
		<dc:creator>dave</dc:creator>
				<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[configuration management]]></category>
		<category><![CDATA[nightly unit testing]]></category>
		<category><![CDATA[scheduled system testing]]></category>
		<category><![CDATA[SCM]]></category>
		<category><![CDATA[Software Configuration Management]]></category>
		<category><![CDATA[source configurations]]></category>
		<category><![CDATA[source control]]></category>
		<category><![CDATA[system test]]></category>
		<category><![CDATA[transient test]]></category>
		<category><![CDATA[unit testing]]></category>
		<category><![CDATA[version control]]></category>

		<guid isPermaLink="false">http://accurev.wordpress.com/2007/10/04/cleanly-cm-transient-test-results/</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2007/10/04/cleanly-cm-transient-test-results/' addthis:title='Cleanly CM Transient Test Results &#8211; with AccuRev ' ><a href="//addthis.com/bookmark.php?v=250&#38;username=xa-4d2b47597ad291fb" class="addthis_button_compact">Share</a><span class="addthis_separator">&#124;</span><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a></div>I recently consulted with a company that had a requirement to version control their test results because generating the results took hours and, in some cases, days to produce. Having the ability to compare results between specific source configurations over time was critical. However, the engineers found it cumbersome (and ultimately unnecessary) to include the [...]<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2007/10/04/cleanly-cm-transient-test-results/' addthis:title='Cleanly CM Transient Test Results &#8211; with AccuRev '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2007/10/04/cleanly-cm-transient-test-results/' addthis:title='Cleanly CM Transient Test Results &#8211; with AccuRev ' ><a href="//addthis.com/bookmark.php?v=250&amp;username=xa-4d2b47597ad291fb" class="addthis_button_compact">Share</a><span class="addthis_separator">|</span><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a></div><p>I recently consulted with a company that had a requirement to version control their test results because generating the results took<br />
hours and, in some cases, days to produce. Having the ability to compare results between specific source configurations over time was critical. However, the engineers found it cumbersome (and ultimately unnecessary) to include the vast amounts of test output within the <em>actual </em>release configuration.</p>
<p>Lets consider a typical development scenario that includes both <strong>nightly unit testing</strong> and <strong>scheduled system testing</strong>. <a target="_blank" href="http://www.accurev.com/blog/wp-content/uploads/2007/05/cm_transient_test_results_streams.jpg"><img src="http://www.accurev.com/images/cm-trasient-tb1.jpg" alt="CM Transient Test Results - Stream Structure" style="float:right;border:#cccccc 1px solid;margin:10px 0 5px 10px" title="Cleanly CM Transient Test Results   with AccuRev" /></a>This first picture is a screenshot of an Accu<em>Rev</em> stream structure showing the streams involved in the workflow. Nightly testing of new development is captured by creating snapshots from <em>Integration</em>. Each snapshot then serves as a new root of development for committing the subsequent test results. A <em>Nightly_Testing</em> stream is created from the snapshot to store the test results. After promoting the test results, a new <em>Nightly_Results </em>snapshot is created to capture both the source code and test results. A similar pattern is (re)used for managing test results from <em>SystemTest</em>.</p>
<p>This second picture is the same picture but annotated to describe how to version control the transient test results. <a target="_blank" href="http://www.accurev.com/blog/wp-content/uploads/2007/05/cm_transient_test_results_streams_annotated.jpg"><img src="http://www.accurev.com/images/cm-trasient-tb2.jpg" alt="CM Transient Test Results - Stream Structure Annotated" style="float:left;border:#cccccc 1px solid;margin:10px 10pt 5px 0" title="Cleanly CM Transient Test Results   with AccuRev" /></a>One way to absolutely prevent test results from being promoted higher up is to set incl/excl rules for the results directory. In this example, the <em>SystemTest </em>stream sets an <code>incldo \.\test\results</code> to exclude any relative files or subdirectories for the entire stream hierarchy (due to rule inheritance). However, each <em>NightlyTesting </em>stream sets <code>incl \.\test\results</code> so the results can be stored locally. Setting these incl/excl rules is an easy way to control the visibility and location of code throughout the stream structure.</p>
<p>Storing transient test results in isolated sub-stream hierarchies provides the ability to do stream-diff comparisons of test results. Furthermore, the golden <em>Release </em>snapshots are not cluttered with interstitial test results. In fact, if you need to backtrace the test results, you have them&#8230; afterall, they are now safely organized in CM.</p>
<p>/happy testing/ &#8211; dave</p>
<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2007/10/04/cleanly-cm-transient-test-results/' addthis:title='Cleanly CM Transient Test Results &#8211; with AccuRev '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>]]></content:encoded>
			<wfw:commentRss>http://accurev.com/blog/2007/10/04/cleanly-cm-transient-test-results/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

