<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	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/"
		>
<channel>
	<title>Comments on: Crashing Your Way to Great Legacy C Tests</title>
	<atom:link href="http://www.renaissancesoftware.net/blog/archives/27/feed" rel="self" type="application/rss+xml" />
	<link>http://www.renaissancesoftware.net/blog/archives/27</link>
	<description>Blogging about Agile Development, especially embedded.  Follow me on twitter: jwgrenning</description>
	<lastBuildDate>Sun, 29 Nov 2009 06:18:45 -0700</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: Jooyung Han</title>
		<link>http://www.renaissancesoftware.net/blog/archives/27/comment-page-1#comment-472</link>
		<dc:creator>Jooyung Han</dc:creator>
		<pubDate>Fri, 27 Mar 2009 10:46:48 +0000</pubDate>
		<guid isPermaLink="false">http://www.renaissancesoftware.net/blog/?p=27#comment-472</guid>
		<description>I translated this post into Korean (&lt;a href=&quot;http://jooyunghan.da.to/blog/?p=104&quot; rel=&quot;nofollow&quot;&gt;Clich here&lt;/a&gt;) . Thanks again :)</description>
		<content:encoded><![CDATA[<p>I translated this post into Korean (<a href="http://jooyunghan.da.to/blog/?p=104" rel="nofollow">Clich here</a>) . Thanks again <img src='http://www.renaissancesoftware.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>By: jwgrenning</title>
		<link>http://www.renaissancesoftware.net/blog/archives/27/comment-page-1#comment-275</link>
		<dc:creator>jwgrenning</dc:creator>
		<pubDate>Mon, 22 Dec 2008 15:21:14 +0000</pubDate>
		<guid isPermaLink="false">http://www.renaissancesoftware.net/blog/?p=27#comment-275</guid>
		<description>Rick

Your top level algorithm nicely shows that the first test is very different than subsequent tests.  I like you explanation of makeTestMoreMeaningful() and application of SRP.

Nice job refactoring my refactoring steps!

James</description>
		<content:encoded><![CDATA[<p>Rick</p>
<p>Your top level algorithm nicely shows that the first test is very different than subsequent tests.  I like you explanation of makeTestMoreMeaningful() and application of SRP.</p>
<p>Nice job refactoring my refactoring steps!</p>
<p>James</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Rick Shim</title>
		<link>http://www.renaissancesoftware.net/blog/archives/27/comment-page-1#comment-274</link>
		<dc:creator>Rick Shim</dc:creator>
		<pubDate>Mon, 22 Dec 2008 03:28:38 +0000</pubDate>
		<guid isPermaLink="false">http://www.renaissancesoftware.net/blog/?p=27#comment-274</guid>
		<description>Thanks James,

It was great time for us to work with you and to build feasible solution for our own environments. We couldn&#039;t do it without you. 

In this article, you quite clearly summarized lots of lesson learned we&#039;ve figured out. Thanks. ;-)


The followings are my idea.


1) Adding top-most algorithm

In my oppinion, why don&#039;t you put the top-most algorithm on the beginning of this article something like below:

attackLegacyCTests() // active and aggressive attitude
{
    addNewLegacyCtest();
    addMoreLegacyCtests();
}


2) Describing makeTestMoreMeaningful()

You skip to describe makeTestMoreMeaningFul(). But, in this step, I think that there are good noticeable points what we usually passed over.


---
makeTestMoreMeaningful()

Don&#039;t use arbitary, unmeaningful, name such as Test1(), FirstTest(). The name of tests should be taken to show what&#039;s exactly supposed to do. If it is hard to give a simple and concrete name on the test, it might have more than one responsibilities. If so, it&#039;s time to break it by SingleResponsibilityPrinciple.
---

3) Refactoring long addMoreLegacyCTests() algorithm

I think that extracting refactoring steps as another function helps more clear. :-)

addMoreLegacyCtests()
{
    while (!testsAreSufficientForCurrntNeeds())
    {
        copyPasteTweakTheLastTest();
        refactorTests();
    }
}

refactorTests() // or keepTestsClean()
{
    while (!testDifferenncesAreEvident())
    {
      inspectTheCopyPastedTests();
      if (setupStepsAreSimilar())
      {
        extractAndParameterizeTheCommonSetup();
        extractAndParameterizeTheCommonAssertions();        
      } 
      else
        ;//Maybe a new test case group is needed
    }
}

Thanks again, James. :-D</description>
		<content:encoded><![CDATA[<p>Thanks James,</p>
<p>It was great time for us to work with you and to build feasible solution for our own environments. We couldn&#8217;t do it without you. </p>
<p>In this article, you quite clearly summarized lots of lesson learned we&#8217;ve figured out. Thanks. <img src='http://www.renaissancesoftware.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>The followings are my idea.</p>
<p>1) Adding top-most algorithm</p>
<p>In my oppinion, why don&#8217;t you put the top-most algorithm on the beginning of this article something like below:</p>
<p>attackLegacyCTests() // active and aggressive attitude<br />
{<br />
    addNewLegacyCtest();<br />
    addMoreLegacyCtests();<br />
}</p>
<p>2) Describing makeTestMoreMeaningful()</p>
<p>You skip to describe makeTestMoreMeaningFul(). But, in this step, I think that there are good noticeable points what we usually passed over.</p>
<p>&#8212;<br />
makeTestMoreMeaningful()</p>
<p>Don&#8217;t use arbitary, unmeaningful, name such as Test1(), FirstTest(). The name of tests should be taken to show what&#8217;s exactly supposed to do. If it is hard to give a simple and concrete name on the test, it might have more than one responsibilities. If so, it&#8217;s time to break it by SingleResponsibilityPrinciple.<br />
&#8212;</p>
<p>3) Refactoring long addMoreLegacyCTests() algorithm</p>
<p>I think that extracting refactoring steps as another function helps more clear. <img src='http://www.renaissancesoftware.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>addMoreLegacyCtests()<br />
{<br />
    while (!testsAreSufficientForCurrntNeeds())<br />
    {<br />
        copyPasteTweakTheLastTest();<br />
        refactorTests();<br />
    }<br />
}</p>
<p>refactorTests() // or keepTestsClean()<br />
{<br />
    while (!testDifferenncesAreEvident())<br />
    {<br />
      inspectTheCopyPastedTests();<br />
      if (setupStepsAreSimilar())<br />
      {<br />
        extractAndParameterizeTheCommonSetup();<br />
        extractAndParameterizeTheCommonAssertions();<br />
      }<br />
      else<br />
        ;//Maybe a new test case group is needed<br />
    }<br />
}</p>
<p>Thanks again, James. <img src='http://www.renaissancesoftware.net/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Doug Bradbury</title>
		<link>http://www.renaissancesoftware.net/blog/archives/27/comment-page-1#comment-273</link>
		<dc:creator>Doug Bradbury</dc:creator>
		<pubDate>Mon, 22 Dec 2008 02:35:15 +0000</pubDate>
		<guid isPermaLink="false">http://www.renaissancesoftware.net/blog/?p=27#comment-273</guid>
		<description>Nice Algorithm James!  I&#039;m especially glad that you put the refactor bit in at the end.  I&#039;ve left my share of those Copy-Paste-Tweak tests in my wake.  I know understand how hard they make the code to change.  You ought to be able to read only one or two lines of code to understand what they test does.  Ok, so we are talking C here so maybe 5 or 6 lines!</description>
		<content:encoded><![CDATA[<p>Nice Algorithm James!  I&#8217;m especially glad that you put the refactor bit in at the end.  I&#8217;ve left my share of those Copy-Paste-Tweak tests in my wake.  I know understand how hard they make the code to change.  You ought to be able to read only one or two lines of code to understand what they test does.  Ok, so we are talking C here so maybe 5 or 6 lines!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jooyung Han</title>
		<link>http://www.renaissancesoftware.net/blog/archives/27/comment-page-1#comment-272</link>
		<dc:creator>Jooyung Han</dc:creator>
		<pubDate>Sat, 20 Dec 2008 09:52:19 +0000</pubDate>
		<guid isPermaLink="false">http://www.renaissancesoftware.net/blog/?p=27#comment-272</guid>
		<description>The algorithm you present here looks like TDD. 

Knowing that it will crash and accepting it as a progress relieved us a lot. Without it we might have exit(FAILURE) :-) Thank you for clarifying this process and your guidance which kept us in the right way.</description>
		<content:encoded><![CDATA[<p>The algorithm you present here looks like TDD. </p>
<p>Knowing that it will crash and accepting it as a progress relieved us a lot. Without it we might have exit(FAILURE) <img src='http://www.renaissancesoftware.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Thank you for clarifying this process and your guidance which kept us in the right way.</p>
]]></content:encoded>
	</item>
</channel>
</rss>
