<?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>HCoder.org &#187; testing</title>
	<atom:link href="http://hcoder.org/tag/testing/feed/" rel="self" type="application/rss+xml" />
	<link>http://hcoder.org</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Sun, 15 Apr 2012 21:43:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Unit testing advice for seasoned hackers (2/2)</title>
		<link>http://hcoder.org/2012/02/15/unit-testing-advice-for-seasoned-hackers-22/</link>
		<comments>http://hcoder.org/2012/02/15/unit-testing-advice-for-seasoned-hackers-22/#comments</comments>
		<pubDate>Wed, 15 Feb 2012 22:24:42 +0000</pubDate>
		<dc:creator>emanchado</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[automated tests]]></category>
		<category><![CDATA[free software]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[tests]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tor]]></category>
		<category><![CDATA[unit]]></category>

		<guid isPermaLink="false">http://hcoder.org/?p=1322</guid>
		<description><![CDATA[This is the second part of my unit testing advice. See the first part on this blog. If you need any introduction you should really read the first part. I&#8217;ll just present the other three ideas I wanted to cover. Focusing on common cases This consists of testing only/mostly common cases. These tests rarely fail [...]]]></description>
			<content:encoded><![CDATA[<p><em>This is the second part of my unit testing advice. See the <a href="http://hcoder.org/2012/02/13/unit-testing-advice-for-seasoned-hackers-12/">first part</a> on this blog.</em></p>
<p>If you need any introduction you should really read the first part. I&#8217;ll just present the other three ideas I wanted to cover.</p>
<h2>Focusing on common cases</h2>
<p>This consists of testing only/mostly common cases. These tests rarely fail and give a false sense of security. Thus, tests are better when they also include less common cases, as they&#8217;re much more likely to break inadvertently. Common cases not only break far less often, but will probably be caught reasonably fast once someone tries to use the buggy code, so testing them has comparatively <em>less value</em> than testing less common cases.</p>
<p>The best example I found was in the <a href="https://github.com/emanchado/tor/commit/46bbf6c015fac412b47ca56279002129a1c2b278#L0L720"><code class="syntax c">wrap_string</code> tests</a>. The relevant example was adding the string &#8220;A test of string wrapping&#8230;&#8221;, which wraps not to two lines, but three (the wrapping is done only on spaces, so &#8220;wrapping&#8230;&#8221; is taken as a single unit; in this sense, my test case could have been clearer and use a very long word, instead of a word followed by ellipsis). Most of the cases we&#8217;ll deal with will simply wrap a given word in two lines, but wrapping in three must work, too, and it&#8217;s much more likely to break if we decide to refactor or rewrite the code in that function, with the intention to keep the functionality intact.</p>
<p>See other examples of this in <a href="https://github.com/emanchado/tor/commit/aa20bce8006c9dccd8213db789855b59aee33ef4#L0L2084">aa20bce</a> (no tests with more than one consecutive newline, no tests with lines of only non-printable characters), <a href="https://github.com/emanchado/tor/commit/b248b3f#L0L1665">b248b3f</a> (no tests with just dots, no valid cases with more than one consecutive slash, no invalid cases with content other than slashes), <a href="https://github.com/emanchado/tor/commit/5e771ab4f3b3f91f1aaff8db0284d4a1700954a7#L0L1606">5e771ab</a> (no directories or hidden files), <a href="https://github.com/emanchado/tor/commit/f8ecac5#L0L303">f8ecac5</a> (invalid hex characters don&#8217;t fail, but produce strange behaviour instead; this test actually discovered a bug), <a href="https://github.com/emanchado/tor/commit/7856643#L0R321">7856643</a> (broken escaped content) and <a href="https://github.com/emanchado/tor/commit/87e9f89#L0R256">87e9f89</a> (trailing garbage).</p>
<h2>Not trying to make the tests fail</h2>
<p>This is related to the previous one, but the emphasis is on trying to choose tests that we think will fail (either now or in the future). My impression is that people often fail to do this because they are trying to prove that the code <em>works</em>, which misses the point of testing. The point is trying to prove the code <em>doesn&#8217;t</em> work. And <em>hope</em> that you fail at it, if you will.</p>
<p>The only example I could find was in the <a href="https://github.com/emanchado/tor/commit/03876f0a721ced6ffebb0c61134d5b8396d7600e#L0L616"><code class="syntax c">strcasecmpend</code> tests</a>. Note how there&#8217;s a test that checks that the last three characters of string &#8220;abcDEf&#8221; (ie. &#8220;DEf&#8221;) is less than &#8220;deg&#8221; when compared case-insensitively. That&#8217;s almost pointless, because if we made that same comparison case-sensitively (in other words, if the &#8220;case&#8221; part of the function breaks) the test still passes! Thus it&#8217;s much better to compare the strings &#8221;abcdef&#8221; and &#8220;Deg&#8221;.</p>
<h2>Addendum: trying to cover all cases in the tests</h2>
<p>There&#8217;s another problem I wanted to mention. I have seen several times before, although not in the Tor tests. The problem is making complicated tests that try to cover many/all cases. This seems to stem from the idea that having more test cases is good <em>by itself</em>, when actually more tests are only useful when they <em>increase the chances</em> to catch bugs. For example, if you write tests for a &#8220;sum&#8221; function and you&#8217;re <em>already</em> testing <code class="syntax python">[5, 6, 3, 7]</code>, it&#8217;s probably pointless to add a test for <code class="syntax python">[1, 4, 6, 5]</code>. A test that would increase the chances of catching bugs would probably look more like <code class="syntax python">[-4, 0, 4, 5.6]</code> or <code class="syntax python">[]</code>.</p>
<p>So what&#8217;s wrong with having more tests than necessary? The problem is they make the test suite slower, harder to understand at a glance and harder to review. If they don&#8217;t contribute anything to the chance of catching bugs anyway, why pay that price? But the biggest problem is when we try to cover so many test cases than the code <em>produces</em> the test data. In this cases, we have all the above problems, <em>plus</em> that the test suite becomes almost as complex as production code. Such tests become much easier to introduce bugs in, harder to follow the flow of, etc. The tests are our safety net, so we should be fairly sure that they work as expected.</p>
<p>And that&#8217;s the end of the tips. I hope they were useful :-)</p>
 <p><a href="http://hcoder.org/?flattrss_redirect&amp;id=1322&amp;md5=9727c1870ad1435396033a337cef555b" title="Flattr" target="_blank"><img src="http://hcoder.org/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://hcoder.org/2012/02/15/unit-testing-advice-for-seasoned-hackers-22/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=30124&amp;popout=1&amp;url=http%3A%2F%2Fhcoder.org%2F2012%2F02%2F15%2Funit-testing-advice-for-seasoned-hackers-22%2F&amp;language=en_GB&amp;category=text&amp;title=Unit+testing+advice+for+seasoned+hackers+%282%2F2%29&amp;description=This+is+the+second+part+of+my+unit+testing+advice.+See+the+first+part+on+this+blog.+If+you+need+any+introduction+you+should+really+read+the+first+part.+I%26%238217%3Bll...&amp;tags=automated+tests%2Cfree+software%2Copen+source%2Cprojects%2Csoftware%2Ctesting%2Ctests%2Ctips%2Ctor%2Cunit%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Unit testing advice for seasoned hackers (1/2)</title>
		<link>http://hcoder.org/2012/02/13/unit-testing-advice-for-seasoned-hackers-12/</link>
		<comments>http://hcoder.org/2012/02/13/unit-testing-advice-for-seasoned-hackers-12/#comments</comments>
		<pubDate>Mon, 13 Feb 2012 23:48:23 +0000</pubDate>
		<dc:creator>emanchado</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[automated tests]]></category>
		<category><![CDATA[free software]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[tests]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tor]]></category>
		<category><![CDATA[unit]]></category>

		<guid isPermaLink="false">http://hcoder.org/?p=1301</guid>
		<description><![CDATA[When reviewing tests written by other people I see patterns in the improvements I would make. As I realise that these &#8220;mistakes&#8221; are also made by experienced hackers, I thought it would be useful to write about them. The extra push to write about this now was having concrete examples from my recent involvement in Tor, [...]]]></description>
			<content:encoded><![CDATA[<p>When reviewing tests written by other people I see patterns in the improvements I would make. As I realise that these &#8220;mistakes&#8221; are also made by experienced hackers, I thought it would be useful to write about them. The extra push to write about this <em>now</em> was having concrete examples from my recent involvement in <a href="http://torproject.org/">Tor</a>, that will hopefully illustrate these ideas.</p>
<p>These ideas are presented in no particular order. Each of them has a brief explanation, a concrete example from the Tor tests, and, if applicable, pointers to other commits that illustrate the same idea. Before you read on, let me explicitly acknowledge that (1) I know that many people know these principles, but writing about them is a nice reminder; and (2) I&#8217;m fully aware that sometimes <em>I</em> need that reminder, too.</p>
<p><strong>Edit:</strong>  see the <a href="http://hcoder.org/2012/02/15/unit-testing-advice-for-seasoned-hackers-22/">second part</a> of this blog.</p>
<h2>Tests as spec</h2>
<p>Tests are more useful if they can show how the code is supposed to behave, including safeguarding against future misunderstandings. Thus, it doesn&#8217;t matter if you <em>know</em> the current implementation will pass those tests or that those test cases won&#8217;t add more or different &#8220;edge&#8221; cases. If those test cases show better how the code behaves (and/or could catch errors if you rewrite the code from scratch with a different design), they&#8217;re good to have around.</p>
<p>I think the clearest example were the <a href="https://github.com/emanchado/tor/commit/8db0f914bfa1aeebed463dc2aa438ca8c87f73a0#L0L2279">tests for the <code class="syntax c">eat_whitespace*</code> functions</a>. Two of those functions end in <code class="syntax c">_no_nl</code>, and they only eat initial whitespace (except newlines). The other two functions eat initial whitespace, including newlines&#8230; but also eat comments. The tests from line 2280 on are clearly targeted at the second group, as they don&#8217;t really represent an interesting use case for the first. However, without those tests, a future maintainer could have thought that the <code class="syntax c">_no_nl</code> functions were supposed to eat whitespace too, and break the code. That produces confusing errors and bugs, which in turn make people fear touching the code.</p>
<p>See other examples in commits <a href="https://github.com/emanchado/tor/commit/b7b3b99acbeb29258e071b8f6c2a7d257a94ad99#L0L1552">b7b3b99</a> (escaped &#8216;%&#8217;, negative numbers, %i format string), <a href="https://github.com/emanchado/tor/commit/618836b3bb643db4af457a32cd8f2338153b5e88#L0L1516">618836b</a> (should an empty string be found at the beginning, or not found at all? does &#8220;\n&#8221; count as beginning of a line? can &#8220;\n&#8221; be found by itself? what about a string that expands more than one line? what about a line including the &#8220;\n&#8221;, with and without the haystack having the &#8220;\n&#8221; at the end?), <a href="https://github.com/emanchado/tor/commit/63b018eecea37ea5a09381157624a507a4a9187a">63b018ee</a> (how are errors handled? what happens when a %s gets part of a number?), <a href="https://github.com/emanchado/tor/commit/2210f18cee86cf17817b386aeca1af2cd0b1f249#L0L1131">2210f18</a> (is a newline only \r\n or \n, or any combination or \r and \n?) and <a href="https://github.com/emanchado/tor/commit/46bbf6c015fac412b47ca56279002129a1c2b278#L0L654">46bbf6c</a> (check that all non-printable characters are escaped in octal, even if they were originally in hex; check that characters in octal/hex, when they&#8217;re printable, appear directly and not in octal).</p>
<h2>Testing boundaries</h2>
<p>Boundaries of different kinds are a typical source of bugs, and thus are among the best points of testing we have. It&#8217;s also good to test <em>both</em> sides of the boundaries, both as an example and because bugs can appear on both sides (and not necessarily at once!).</p>
<p>The best example are the <a href="https://github.com/emanchado/tor/commit/770fd9f#L0R1484">tor_strtok_r_impl tests</a> (a function that is supposed to be compatible with <code class="syntax c">strtok_r</code>, that is, it chops a given string into &#8220;tokens&#8221;, separated by one of the given separator characters). In fact, these extra tests discovered an actual bug in the implementation (ie. an incompatibility with <code class="syntax c">strtok_r</code>). Those extra tests asked a couple of interesting questions, including &#8220;when a string <em>ends</em> in the token separator, is there an empty token in the end?&#8221; in the &#8220;howdy!&#8221; example. This test can also be considered valuable as in &#8220;tests as spec&#8221;, if you consider that the answer to be above question is not obvious and both answers could be considered correct.</p>
<p>See other examples in commits <a href="https://github.com/emanchado/tor/commit/5740e0fc1f00fa91be107ee6c4315d114c5ffdc4#L0L598">5740e0f</a> (checking if <code class="syntax c">tor_snprintf</code> correctly counts the number of bytes, as opposed the characters, when calculating if something can fit in a string; also note my embarrassing mistake of testing <code class="syntax c">snprintf</code>, and not <code class="syntax c">tor_snprintf</code>, later in the same commit), <a href="https://github.com/emanchado/tor/commit/46bbf6c015fac412b47ca56279002129a1c2b278#L0L637">46bbf6c</a> (check that character 21 doesn&#8217;t make a difference, but 20 does) and <a href="https://github.com/emanchado/tor/commit/725d6ef37909080a3d2c5bc25245ea0e951882f2#L0L2217">725d6ef</a> (testing 129 is very good, but even better with 128—or, in this case, 7 and 8).</p>
<h2>Testing implementation details</h2>
<p>Testing implementation details tends to be a bad idea. You can usually argue you&#8217;re testing implementation details if you&#8217;re not getting the test information from the APIs provided by whatever you&#8217;re testing. For example, if you test some API that inserts data in a database by checking the database directly, or if you test the result of a method call was correct by checking the object&#8217;s internals or calling protected/private methods. There are two reasons why this is a bad idea: first, the more implementation details you tests depend on, the less implementation details you can change without breaking your tests; second, your tests are typically less readable because they&#8217;re cluttered with details, instead of <em>meaningful</em> code.</p>
<p>The only example I encountered of this in Tor were the <a href="https://github.com/emanchado/tor/commit/c4c1d56d96623a45775ec2544c0c6951fbfa2d9f#L0L968">compression tests</a>. In this case it wasn&#8217;t a big deal, really, but I have seen this before in much worse situations and I feel this illustrates the point well enough. The problem with that deleted line is that it&#8217;s not clear what&#8217;s it&#8217;s purpose (it needs a comment), plus it uses a magic number, meaning if someone ever changes that number by mistake, it&#8217;s not obvious if the problem is the code or the test. Besides, <em>we are already checking that the magic number is correct</em>, by calling the <code class="syntax c">detect_compression_method</code>. Thus, the deleted <code class="syntax c">memcmp</code> doesn&#8217;t add any value, and makes our tests harder to read. Verdict: delete!</p>
<p><em>I hope you liked the examples so far. My next post will contain the second half of the tips.</em></p>
 <p><a href="http://hcoder.org/?flattrss_redirect&amp;id=1301&amp;md5=f51edc2b2e4df2bc4e424b096b2bbe01" title="Flattr" target="_blank"><img src="http://hcoder.org/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://hcoder.org/2012/02/13/unit-testing-advice-for-seasoned-hackers-12/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=30124&amp;popout=1&amp;url=http%3A%2F%2Fhcoder.org%2F2012%2F02%2F13%2Funit-testing-advice-for-seasoned-hackers-12%2F&amp;language=en_GB&amp;category=text&amp;title=Unit+testing+advice+for+seasoned+hackers+%281%2F2%29&amp;description=When+reviewing+tests+written+by+other+people+I+see+patterns+in+the+improvements+I+would+make.+As+I+realise+that+these+%26%238220%3Bmistakes%26%238221%3B+are+also+made+by+experienced+hackers%2C+I+thought...&amp;tags=automated+tests%2Cfree+software%2Copen+source%2Cprojects%2Csoftware%2Ctesting%2Ctests%2Ctips%2Ctor%2Cunit%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Facebook privacy scanner (ReclaimPrivacy)</title>
		<link>http://hcoder.org/2010/09/05/facebook-privacy-scanner-reclaimprivacy/</link>
		<comments>http://hcoder.org/2010/09/05/facebook-privacy-scanner-reclaimprivacy/#comments</comments>
		<pubDate>Sun, 05 Sep 2010 12:52:48 +0000</pubDate>
		<dc:creator>emanchado</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Freedom]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[privacy]]></category>
		<category><![CDATA[refactoring]]></category>
		<category><![CDATA[testability]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://hcoder.org/?p=486</guid>
		<description><![CDATA[Summary: there&#8217;s a simple tool that will tell you which Facebook sharing options are &#8220;too open&#8221; in your account. I&#8217;d like you to help me by trying it out and telling me what you think (if you had problems using it, if you would like extra/other information to be shown, if you found any bugs, [...]]]></description>
			<content:encoded><![CDATA[<p><em>Summary: there&#8217;s a simple tool that will tell you which Facebook sharing options are &#8220;too open&#8221; in your account. I&#8217;d like you to <strong>help me</strong> by trying it out and telling me what you think (if you had problems using it, if you would like extra/other information to be shown, if you found any bugs, etc.). Skip to &#8220;how to use it&#8221; below if you&#8217;re not interested in the details for developers. Thanks!</em></p>
<p>Some time ago I discovered a neat Javascript tool called <a href="http://www.reclaimprivacy.org/">ReclaimPrivacy</a>. It was a very simple program that scanned your Facebook privacy settings and told you if you had &#8220;too open&#8221; settings so you could review and fix them. I really liked the tool and thought it was a great idea, but after Facebook changed the layout of the privacy settings, the tool stopped working.</p>
<p>Weeks passed and the tool didn&#8217;t get any update, so I decided to step in and try to help the original programmer adapt the tool so it worked again. The <a href="http://github.com/mjpizz/reclaimprivacy">ReclaimPrivacy code</a> is in GitHub so it was pretty easy to make <a href="http://github.com/emanchado/reclaimprivacy">my own fork</a> and start hacking away. It didn&#8217;t take me long to adapt the first things to the new privacy settings layout, and after some more time I was much more comfortable with the code, had made more things work, added tests and even added new features. Now that it&#8217;s <em>starting</em> to get close to something we could release as the new official ReclaimPrivacy version, I&#8217;d like your feedback.</p>
<p><strong>How to use it</strong>: add a new bookmark for <a href="javascript:(function(){var%20script=document.createElement('script');script.src='http://hcoder.org/wp-content/uploads/2010/09/privacyscanner.js';document.getElementsByTagName('head')[0].appendChild(script);})()">this link</a>. You usually just have to drag and drop it to your browser toolbar, or alternatively add a new bookmark (typically you can do that by pressing Ctrl-D) and make sure the address is the above link. Go to the <a href="http://www.reclaimprivacy.org/help">ReclaimPrivacy help page</a> if you have trouble (but use my link, not the one provided there!). Once you have the bookmark, go to Facebook and click on the bookmark. It will show you some information about your Facebook privacy settings on top of the page. Just leave a comment here or drop me an e-mail with your opinion, thanks! You can skip the rest of the post if you are not interested in Javascript programming and/or software automated testing ;-)</p>
<p>During my hacking I made a lot of different changes: I split the source file into several different files, I made the code (more) testable, I added tests, and I added more features. I&#8217;m really into testing and testability, so one of the first things I did with the code was trying to decouple it from the network calls so I could write tests for it. As you may know, I think that code that doesn&#8217;t have tests is very hard to work with, and I even consider it&#8217;s not &#8220;<a href="http://hcoder.org/2010/08/10/from-pseudo-code-to-code/">true code</a>&#8220;. Now, <strong>I&#8217;m no Javascript expert</strong>, so some of my techniques might not be very&#8230; idiomatic. That said, some of the code change highlights you may be interested in:</p>
<ul>
<li> The <a href="http://github.com/mjpizz/reclaimprivacy/blob/master/javascripts/privacyscanner.js#LID7619">getInformationDropdownSettings</a> method, renamed to <a href="http://github.com/emanchado/reclaimprivacy/blob/advanced-settings/javascripts/scanning.js#LID204">getSettingInformation</a>, is now shorter, more readable, more testable and has more features. The changes are: (1) making it receive an object with the relevant part of the DOM, instead of a window object; (2) supporting, in principle, any kind of setting, not only dropdowns; (3) allowing each setting to have its own idea of what &#8220;too open&#8221; means (see <a href="http://github.com/emanchado/reclaimprivacy/blob/advanced-settings/javascripts/scanning.js#LID46">the settings array</a>); (4) allowing the caller of the method to specify its own list of recognised settings and acceptable privacy levels; (5) passing the number of open and total sections to the handler, instead of just a boolean stating whether or not there&#8217;s any &#8220;too open&#8221; setting.</li>
<li>I made the <a href="http://github.com/mjpizz/reclaimprivacy/blob/master/javascripts/privacyscanner.js#LID7425">old getUrlForV2Section</a> more testable by extracting the most <em>interesting</em> (read: likely to break or need maintenance) code to its own method, <a href="http://github.com/emanchado/reclaimprivacy/blob/master/javascripts/utils.js#LID26">_extractUrlsFromPrivacySettingsPage</a>, and making the <a href="http://github.com/emanchado/reclaimprivacy/blob/master/javascripts/utils.js#LID42">new getUrlForV2Section</a> work with both real URLs (checking Facebook with an Ajax call) and fake HTML dumps representing what those URLs would return.</li>
<li>I made the <a href="http://github.com/mjpizz/reclaimprivacy/blob/master/javascripts/privacyscanner.js#LID7387">old withFramedPageOnFacebook</a>, a very important method used in several places, more flexible by accepting not just URLs, but also functions or data structures (<a href="http://github.com/emanchado/reclaimprivacy/blob/advanced-settings/javascripts/utils.js#LID71">new withFramedPageOnFacebook</a>).</li>
<li>Now we have some <a href="http://github.com/emanchado/reclaimprivacy/blob/master/tests/unittest.html">basic tests</a> (with <a href="http://github.com/emanchado/reclaimprivacy/blob/master/tests/fixtures/privacy-pages.js">fixtures</a> even), without which doing some of these changes would have been such a pain, I wouldn&#8217;t have bothered making them in the first place.</li>
</ul>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 666px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">http://github.com/emanchado/reclaimprivacy/blob/master/javascripts/utils.js#LID42</div>
 <p><a href="http://hcoder.org/?flattrss_redirect&amp;id=486&amp;md5=b1a5ef4c1f236ebc1e8941e0fd781abd" title="Flattr" target="_blank"><img src="http://hcoder.org/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://hcoder.org/2010/09/05/facebook-privacy-scanner-reclaimprivacy/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=30124&amp;popout=1&amp;url=http%3A%2F%2Fhcoder.org%2F2010%2F09%2F05%2Ffacebook-privacy-scanner-reclaimprivacy%2F&amp;language=en_GB&amp;category=text&amp;title=Facebook+privacy+scanner+%28ReclaimPrivacy%29&amp;description=Summary%3A+there%26%238217%3Bs+a+simple+tool+that+will+tell+you+which+Facebook+sharing+options+are+%26%238220%3Btoo+open%26%238221%3B+in+your+account.+I%26%238217%3Bd+like+you+to+help+me+by+trying+it+out+and...&amp;tags=facebook%2Cjavascript%2Cprivacy%2Crefactoring%2Ctestability%2Ctesting%2Cblog" type="text/html" />
	</item>
		<item>
		<title>From pseudo-code to code</title>
		<link>http://hcoder.org/2010/08/10/from-pseudo-code-to-code/</link>
		<comments>http://hcoder.org/2010/08/10/from-pseudo-code-to-code/#comments</comments>
		<pubDate>Tue, 10 Aug 2010 20:45:16 +0000</pubDate>
		<dc:creator>emanchado</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[automated tests]]></category>
		<category><![CDATA[science]]></category>
		<category><![CDATA[testability]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[tests]]></category>

		<guid isPermaLink="false">http://hcoder.org/?p=416</guid>
		<description><![CDATA[This post is probably not about what you&#8217;re thinking. It&#8217;s actually about automated testing. Different stuff I&#8217;ve been reading or otherwise been exposed to in the last weeks has made me reach a sort of funny comparison: code is (or can be) like science. You come up with some &#8220;theory&#8221; (your code) that explains something [...]]]></description>
			<content:encoded><![CDATA[<p><em>This post is probably not about what you&#8217;re thinking. It&#8217;s actually about automated testing.</em></p>
<p>Different stuff I&#8217;ve been reading or otherwise been exposed to in the last weeks has made me reach a sort of funny comparison: code is (or can be) like science. You come up with some &#8220;theory&#8221; (your code) that explains something (solves a problem)&#8230; and you make sure you can <em>measure</em> it and <em>test</em> it for people to believe your theory and build on top of it.</p>
<p>I mean, something claiming to be science that can&#8217;t be easily measured, compared or peer-reviewed would be ridiculous. Scientists wouldn&#8217;t believe in it and would certainly not build anything on top of it because the foundation is not reliable.</p>
<p>I claim that software should be the same way, and thus it&#8217;s ridiculous to trust software that doesn&#8217;t have a good test suite, or even worse, that may not even be particularly testable. Trusting software without a test suite is not <em>that</em> different from taking the word of the developer that it &#8220;works on my machine&#8221;. Scientists would call untested science <em>pseudo-science</em>, so <em>I</em> am tempted to call code without tests <em>pseudo-code</em>.</p>
<p>Don&#8217;t get me wrong: sure you can test by hand, and hand-made tests are useful and necessary, but that only proves that the exact code you tested, without any changes, works as expected. But you know what? <em>Software changes all the time</em>, so that&#8217;s not a great help. If you don&#8217;t have a way to <strong>quickly</strong> and <strong>reliably</strong> measure how your code behaves, <em>every time you make a change</em> you are taking a leap of faith. And the more leaps of faith you take, the less credible your code is.</p>
 <p><a href="http://hcoder.org/?flattrss_redirect&amp;id=416&amp;md5=8e86f84ff69bb4fefc237936a785bd85" title="Flattr" target="_blank"><img src="http://hcoder.org/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://hcoder.org/2010/08/10/from-pseudo-code-to-code/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=30124&amp;popout=1&amp;url=http%3A%2F%2Fhcoder.org%2F2010%2F08%2F10%2Ffrom-pseudo-code-to-code%2F&amp;language=en_GB&amp;category=text&amp;title=From+pseudo-code+to+code&amp;description=This+post+is+probably+not+about+what+you%26%238217%3Bre+thinking.+It%26%238217%3Bs+actually+about+automated+testing.+Different+stuff+I%26%238217%3Bve+been+reading+or+otherwise+been+exposed+to+in+the+last+weeks+has+made...&amp;tags=automated+tests%2Cscience%2Ctestability%2Ctesting%2Ctests%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Feeling the pressure produces better code?</title>
		<link>http://hcoder.org/2009/12/06/feeling-the-pressure-produces-better-code/</link>
		<comments>http://hcoder.org/2009/12/06/feeling-the-pressure-produces-better-code/#comments</comments>
		<pubDate>Sun, 06 Dec 2009 16:10:00 +0000</pubDate>
		<dc:creator>emanchado</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[automated]]></category>
		<category><![CDATA[exploratory]]></category>
		<category><![CDATA[qa]]></category>
		<category><![CDATA[teams]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[tests]]></category>
		<category><![CDATA[unit]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[The other day I was in a conversation with some developer that was complaining about some feature. He claimed that it was too complex and that it had led to tons of bugs. In the middle of the conversation, the developer said that the feature had been so buggy that he ended up writing a [...]]]></description>
			<content:encoded><![CDATA[<p>The other day I was in a conversation with some developer that was complaining about some feature. He claimed that it was too complex and that it had led to tons of bugs. In the middle of the conversation, the developer said that the feature had been so buggy that he ended up writing a lot of unit tests for it. To be honest I don&#8217;t think there were a lot of bugs <em>after</em> those tests were written, so that made me think:</p>
<blockquote><p>Maybe the testers in his team are doing too good of a job?</p></blockquote>
<p>
Because, you know, if testers are finding enough of &#8220;those bugs&#8221; (the ones that should be caught and controlled by unit tests and not by testers <em>weeks</em> after the code was originally written), maybe some developers are just not &#8220;feeling the pressure&#8221; and can&#8217;t really get that they should be writing tests for their code. If testers are very good, things just work out fine in the end&#8230; sort of. And of course, the problem here is the trailing &#8220;sort of&#8221;.<br />
I know I&#8217;m biased, but in my view there is a <strong>ton</strong> of bugs that should never be seen by someone that is not the developer itself. Testers should deal with more complex, interesting, user-centred bugs. Non-trivial cases. Suboptimal UIs. Implementation disagreements between developers and stakeholders. That kind of thing. It&#8217;s simply a waste of time and resources that testers have to deal with silly, easy-to-avoid bugs on a daily basis. Not to mention that teams shouldn&#8217;t have to wait for days or weeks until they find <em>basic</em> bugs via exploratory testing. Or that a lot of those are much, much quicker to test with unit tests than having to create the whole fixture/environment for them to be found with exploratory testing.<br />
My current conclusion is that pushing on the UI/usability side is not only good for the user, but it&#8217;s likely to produce better code as it will be, on average, more complex and will have to be better controlled by QA (code review, less ad-hoc design, &#8230;) and automated tests. Maybe developers will start hating me for that, but hopefully <em>users</em> will thank me.</p>
 <p><a href="http://hcoder.org/?flattrss_redirect&amp;id=81&amp;md5=51f8ccaa005170cc7a643f0cb4c2a30c" title="Flattr" target="_blank"><img src="http://hcoder.org/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://hcoder.org/2009/12/06/feeling-the-pressure-produces-better-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=30124&amp;popout=1&amp;url=http%3A%2F%2Fhcoder.org%2F2009%2F12%2F06%2Ffeeling-the-pressure-produces-better-code%2F&amp;language=en_GB&amp;category=text&amp;title=Feeling+the+pressure+produces+better+code%3F&amp;description=The+other+day+I+was+in+a+conversation+with+some+developer+that+was+complaining+about+some+feature.+He+claimed+that+it+was+too+complex+and+that+it+had+led+to...&amp;tags=automated%2Cexploratory%2Cqa%2Cteams%2Ctesting%2Ctests%2Cunit%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Slides for several talks now published</title>
		<link>http://hcoder.org/2009/09/20/slides-for-several-talks-now-published/</link>
		<comments>http://hcoder.org/2009/09/20/slides-for-several-talks-now-published/#comments</comments>
		<pubDate>Sun, 20 Sep 2009 15:25:00 +0000</pubDate>
		<dc:creator>emanchado</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Other]]></category>
		<category><![CDATA[automated]]></category>
		<category><![CDATA[courses]]></category>
		<category><![CDATA[packaging]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[slides]]></category>
		<category><![CDATA[talks]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[tests]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[I had said that I was going to publish the slides for a couple of talks I had given over the last couple of months, and I just got around to actually do it, so here they are: Software automated testing 123, an entry-level talk about software automated testing. Why you should be doing it [...]]]></description>
			<content:encoded><![CDATA[<p>I had said that I was going to publish the slides for a couple of talks I had given over the last couple of months, and I just got around to actually do it, so here they are:</p>
<ul>
<li><a href="http://www.demiurgo.org/charlas/testing-123/">Software automated testing 123</a>, an entry-level talk about software automated testing. Why you should be doing it (if you&#8217;re not already), some advice for test writing, some basic concepts and some basic examples (in Perl, but I trust it shouldn&#8217;t be too hard to follow even if you don&#8217;t know the language).</li>
<li><a href="http://www.demiurgo.org/charlas/python-unittesting/">Taming the Snake: Python unit tests</a>, another entry-level talk, but this time about Python unit testing specifically. How to write xUnit style tests with <code>unittest</code>, some advice and conventions and some notes on how to use the excellent <code>nosetests</code> tool.</li>
<li>Introduction to Debian packaging, divided in four sessions: <a href="http://www.demiurgo.org/charlas/debian/1-introduction/slides.html">Introduction</a>, <a href="http://www.demiurgo.org/charlas/debian/2-simple_packaging/slides.html">Packaging a simple app</a>, <a href="http://www.demiurgo.org/charlas/debian/3-backporting_software/slides.html">Backporting software</a> and <a href="http://www.demiurgo.org/charlas/debian/4-packaging_tools/slides.html">Packaging tools</a>.</li>
</ul>
<p>Just a quick note about them: the slides shouldn&#8217;t be too hard to understand without me talking, but of course you&#8217;ll lose some stuff that is not written down, some twists, clarifications of what I mean exactly by different things and whatnot. In particular, the &#8220;They. don&#8217;t. make. sense. Don&#8217;t. write. them&#8221; stuff refers to tests that don&#8217;t have a reliable/controlled environment to run into. I feel really strong about them, so I wanted to dedicate a few more seconds to smashing the idea that they&#8217;re ok, hence the extra slides :-)</p>
<p>Enjoy them, and please send me any comments you have about them!</p>
 <p><a href="http://hcoder.org/?flattrss_redirect&amp;id=78&amp;md5=3d3c7f5943c585db1237d52f7f0d5504" title="Flattr" target="_blank"><img src="http://hcoder.org/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://hcoder.org/2009/09/20/slides-for-several-talks-now-published/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=30124&amp;popout=1&amp;url=http%3A%2F%2Fhcoder.org%2F2009%2F09%2F20%2Fslides-for-several-talks-now-published%2F&amp;language=en_GB&amp;category=text&amp;title=Slides+for+several+talks+now+published&amp;description=I+had+said+that+I+was+going+to+publish+the+slides+for+a+couple+of+talks+I+had+given+over+the+last+couple+of+months%2C+and+I+just+got+around...&amp;tags=automated%2Ccourses%2CDebian%2Cpackaging%2Cpython%2Cslides%2Ctalks%2Ctesting%2Ctests%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Link&#246;ping trip</title>
		<link>http://hcoder.org/2009/09/13/linkoping-trip/</link>
		<comments>http://hcoder.org/2009/09/13/linkoping-trip/#comments</comments>
		<pubDate>Sun, 13 Sep 2009 21:43:00 +0000</pubDate>
		<dc:creator>emanchado</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[automated]]></category>
		<category><![CDATA[linköping]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[opera]]></category>
		<category><![CDATA[qa]]></category>
		<category><![CDATA[sweden]]></category>
		<category><![CDATA[talks]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[trips]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[I spent the whole last week (or this week; after all it&#8217;s Sunday&#8230; and Sunday is obviously the last day of the week, not the first, right?) in Linköping, Sweden. The idea was repeating some Debian course I gave here in Oslo, giving two more talks about automated testing since I was there anyway, and [...]]]></description>
			<content:encoded><![CDATA[<p>I spent the whole last week (or <em>this</em> week; after all it&#8217;s Sunday&#8230; and Sunday is obviously the <em>last</em> day of the week, not the <em>first</em>, right?) in <a href="http://en.wikipedia.org/wiki/Linköping">Linköping</a>, Sweden. The idea was repeating some Debian course I gave here in Oslo, giving two more talks about automated testing since I was there anyway, and attend two more talks. It was lots of fun, partly thanks to my &#8220;host&#8221; (thanks Gerald!), and surprisingly I found a bunch of things that seemed plain weird to me&#8230; or at least quite different from Oslo.</p>
<p>The talks themselves went pretty good I think, although I&#8217;d have preferred more people attending. I guess it was normal that there were less people than I&#8217;m used to, since the Linköping office is much smaller. But anyway. The Debian course went quite well and some people got started packaging stuff almost right away. The other talks were an introduction to automated testing (advocacy and arguments for it, advice, basic examples and small rant about a different kind of QA), which went ok, and an entry-level talk about unit testing in Python (thanks Ask and Batiste for the information and reviewing the slides!), which went very well. I&#8217;ll try to get the slides for all the talks available somewhere.</p>
<p>About the city itself, it&#8217;s a charming little part of Sweden where:</p>
<ul>
<li>Restaurants have <strong>insanely</strong> different prices for food whether it&#8217;s for lunch or dinner. Typical prices for lunch are 80 <span class="caps">SEK</span> (around 8 <span class="caps">EUR</span>) and typical prices for dinner are around 250 <span class="caps">SEK</span> <em>just the main course</em>!</li>
<li>Restaurants usually serve some Swedish dish for lunch&#8230; and I mean every restaurant, meaning all the Greek, Vietnamese, etc. Considering &#8220;real&#8221; Swedish restaurants are very expensive, you usually go to those foreign cuisine ones when you actually want to eat Swedish food.</li>
<li>Restaurants typically have some salad (that you have to take yourself) while you wait for the food&#8230; and some coffee, tea and cookies (that obviously you have to take yourself) for the end.</li>
<li>Related to this, restaurants are usually very self-service. I thought service in Norway sucked, but boy was I wrong, at least there is <em>some</em> service. And: there were typically long but pretty-fast-moving queues, and there was this one place where you didn&#8217;t even get the food on the table after ordering at the bar; instead, you were given some gadget with some wireless receiver, and when your food was ready it&#8217;d beep so you knew you had to go to some special place and fetch your food. Is it really cheaper maintaining some gadgets than hiring a waiter? I guess so.</li>
<li>The restrictions on the amount of alcohol that can be bought outside the special Government booze stores are even harder than in Norway. You can only buy booze with up to 3.5% alcohol outside &#8220;<a href="http://en.wikipedia.org/wiki/Systembolaget">Systembolaget</a>&#8221;. Now <em>that</em> is sad. And I was complaining about Norway&#8217;s 5%.</li>
<li>Partly because of that (I assume/hope) the Swedish &#8220;cider&#8221; you get in Sweden is even sweeter and worse and the <em>Swedish</em> cider you get in Norway.</li>
<li>We went to this nice student pub&#8230; which was literally <em>for</em> students. They actually <em>checked</em> your student id, but each student could bring <em>one</em> non-student along. Once you were &#8220;identified&#8221; as a non-student-coming-with-a-student, you&#8217;d get a stamp on your hand so you wouldn&#8217;t have to bring along the student when you ordered again. Also, the place was so very slow it was <em>almost</em> funny. One of the good sides was that they had what I thought it was the only decent Swedish cider&#8230; but after checking just now, it seems it&#8217;s actually American. Bummer. And the name of it was funny too: &#8220;Hardcore Cider&#8221;.</li>
<li>Right before leaving the office on Friday there was a small gathering in the canteen (the &#8220;Friday Beer&#8221;), where they had a Dreamcast with one of the most awesome games I&#8217;ve seen in a long while: <a href="http://en.wikipedia.org/wiki/Typing_of_the_Dead">The Typing of the Dead</a>, a version of <a href="http://en.wikipedia.org/wiki/The_House_of_the_Dead_2">The House of the Dead 2</a> in which you kill the zombies by typing words that appear on the screen, instead of aiming and shooting with a gun:</li>
</ul>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/sNfQ_B6_xy8&#038;hl=es&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/sNfQ_B6_xy8&#038;hl=es&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>
 <p><a href="http://hcoder.org/?flattrss_redirect&amp;id=77&amp;md5=1e5aa3ee567b50c997f24a9f4f10af44" title="Flattr" target="_blank"><img src="http://hcoder.org/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://hcoder.org/2009/09/13/linkoping-trip/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=30124&amp;popout=1&amp;url=http%3A%2F%2Fhcoder.org%2F2009%2F09%2F13%2Flinkoping-trip%2F&amp;language=en_GB&amp;category=text&amp;title=Link%26%23246%3Bping+trip&amp;description=I+spent+the+whole+last+week+%28or+this+week%3B+after+all+it%26%238217%3Bs+Sunday%26%238230%3B+and+Sunday+is+obviously+the+last+day+of+the+week%2C+not+the+first%2C+right%3F%29+in+Link%C3%B6ping%2C+Sweden....&amp;tags=automated%2Clink%26%23246%3Bping%2Clinux%2Copera%2Cqa%2Csweden%2Ctalks%2Ctesting%2Ctrips%2Cblog" type="text/html" />
	</item>
		<item>
		<title>The shoemaker&#8217;s son always goes barefoot</title>
		<link>http://hcoder.org/2008/10/21/the-shoemakers-son-always-goes-barefoot/</link>
		<comments>http://hcoder.org/2008/10/21/the-shoemakers-son-always-goes-barefoot/#comments</comments>
		<pubDate>Tue, 21 Oct 2008 19:25:00 +0000</pubDate>
		<dc:creator>emanchado</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[dhelp]]></category>
		<category><![CDATA[qa]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[I admit it. I&#8217;m a terrible developer. I write code, sometimes even write tests. But. I. don&#8217;t. test. my. programs. By hand, that is. And sometimes (usually) the coverage is not enough, and I end up making embarrassing mistakes. It usually happens outside of work, although at work I also have my share. The last [...]]]></description>
			<content:encoded><![CDATA[<p>I admit it. I&#8217;m a terrible developer. I write code, sometimes even write tests.</p>
<p>But. I. don&#8217;t. test. my. programs.</p>
<p>By hand, that is. And sometimes (usually) the coverage is not enough, and I end up making embarrassing mistakes. It usually happens outside of work, although at work I also have my share. The last one was with the Debian package <code>dhelp</code>, where trying to fix an issue before Lenny is released, I ended up making it even worse. The story goes like this:</p>
<p>There was some problem with the indexing of documents on installation/upgrade (namely, it would take <strong>ages</strong> for most people upgrading to Lenny, and they would think the upgrade process had hung). So, I go and change the indexing code so it ignores documents on installation/upgrade. Also, as suggested by someone, I created some small example utility to reindex documentation for certain packages. I test installation, upgrades, upgrade of the <code>dhelp</code> package itself, the utility, searching for keywords before and after all that&#8230; and everything worked.</p>
<p>Only that I made a typo. A typo that would make all indexing to be ignored (except for the example utility, because it was a bit lower level). And I didn&#8217;t realise, because it &#8220;only&#8221; broke some cronjob, a completely different part of the package. And it happens that the cronjob reindexed everything weekly, to make sure that you had reasonably up-to-date search indices. And it also happens that, given that the documentation reindexing was being ignored on package installation/upgrade, the weekly total reindex process was the <strong>only</strong> thing that could provide the user with indexed documentation. But I screwed up. Oh well.</p>
<p>Someone filed a <a href="http://bugs.debian.org/502813">bug</a> yesterday, and I fixed more or less right away. But this time I spent a couple of hours thinking of test paths and ways to make it fail, and actually doing all that testing. Thanks to that, I found some potential bug in the example utility, that I fixed just in case. So hopefully everything is fine now, if I can convince the Release Masters to allow the new, less broken update to <code>dhelp</code> to be accepted for Lenny.</p>
<p>I think I need personal QA. Anyone up to the task?</p>
 <p><a href="http://hcoder.org/?flattrss_redirect&amp;id=43&amp;md5=c642aac3e21938a43bee98013d88947f" title="Flattr" target="_blank"><img src="http://hcoder.org/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://hcoder.org/2008/10/21/the-shoemakers-son-always-goes-barefoot/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=30124&amp;popout=1&amp;url=http%3A%2F%2Fhcoder.org%2F2008%2F10%2F21%2Fthe-shoemakers-son-always-goes-barefoot%2F&amp;language=en_GB&amp;category=text&amp;title=The+shoemaker%26%238217%3Bs+son+always+goes+barefoot&amp;description=I+admit+it.+I%26%238217%3Bm+a+terrible+developer.+I+write+code%2C+sometimes+even+write+tests.+But.+I.+don%26%238217%3Bt.+test.+my.+programs.+By+hand%2C+that+is.+And+sometimes+%28usually%29+the+coverage+is...&amp;tags=developer%2Cdhelp%2Cqa%2Ctesting%2Cblog" type="text/html" />
	</item>
	</channel>
</rss>

