<?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"
	>

<channel>
	<title>Ruminations</title>
	<atom:link href="http://www.testobsessed.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://testobsessed.com</link>
	<description>Elisabeth Hendrickson's Thoughts on Testing, Agile, and Agile Testing</description>
	<pubDate>Tue, 08 Jul 2008 00:04:50 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5</generator>
	<language>en</language>
			<item>
		<title>Unintentionally Hard Tests</title>
		<link>http://testobsessed.com/2008/07/07/unintentionally-hard-tests/</link>
		<comments>http://testobsessed.com/2008/07/07/unintentionally-hard-tests/#comments</comments>
		<pubDate>Tue, 08 Jul 2008 00:04:50 +0000</pubDate>
		<dc:creator>Elisabeth Hendrickson</dc:creator>
		
		<category><![CDATA[Running the Business]]></category>

		<category><![CDATA[Thinking Like a Tester]]></category>

		<guid isPermaLink="false">http://testobsessed.com/?p=186</guid>
		<description><![CDATA[I finally decided that too many of the things on my To Do list are things that I probably should not be handling personally, like dealing with getting business cards and routine invoicing.  And too many of the things that I should be handling personally, and quickly, are being left undone too long.
So I [...]]]></description>
			<content:encoded><![CDATA[<p>I finally decided that too many of the things on my To Do list are things that I probably should not be handling personally, like dealing with getting business cards and routine invoicing.  And too many of the things that I should be handling personally, and quickly, are being left undone too long.</p>
<p>So I posted an ad for a part time assistant on Craig&#8217;s List.  And being test obsessed, I devised a test to give me a good indication of whether a given candidate had enough of the skills I needed to bring in for an in-person interview.</p>
<p>I asked the candidates who wrote an articulate reply to the job posting (and there were a lot of them!) to do a little research and find out what conference I&#8217;m speaking at in August, where the conference is, and what the titles of my presentations are.</p>
<p>It seemed to me like this was a pretty easy test that would weed out anyone who couldn&#8217;t do basic research on the web.  But I made the test harder than I intended by asking about conferences in August.  I forgot that there are two conferences listed on my web site for August: Agile2008 (where I am not speaking), and STANZ (where I am giving two talks).  </p>
<p>When I realized my mistake, I thought &#8220;No problem.  Good candidates will search for my name in the Agile2008 program and realize I am not speaking there.&#8221;  Then I tried it myself and discovered that searching for a specific speaker is apparently a use case that the Agile conference organizers didn&#8217;t think about when they published the program this year.  Even I found it difficult to determine absolutely that I am not on the program.  There are too many places to look, and even the PDF program is a little difficult to search for a given speaker&#8217;s name.</p>
<p>Sometimes what seems like a simple test - whether of software or of a person - turns out to be much more difficult than we intended or imagined.  Although I suppose that as long as none of the job candidates crash as readily as software, we&#8217;ll all be OK.</p>
<p>And if any of them manage the task without giving up, I will definitely know something about their ability to find information on the web!</p>
]]></content:encoded>
			<wfw:commentRss>http://testobsessed.com/2008/07/07/unintentionally-hard-tests/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Where Am I?</title>
		<link>http://testobsessed.com/2008/06/06/where-am-i/</link>
		<comments>http://testobsessed.com/2008/06/06/where-am-i/#comments</comments>
		<pubDate>Fri, 06 Jun 2008 16:07:05 +0000</pubDate>
		<dc:creator>Elisabeth Hendrickson</dc:creator>
		
		<category><![CDATA[Non Sequiturs]]></category>

		<category><![CDATA[Ruminations]]></category>

		<guid isPermaLink="false">http://testobsessed.com/?p=185</guid>
		<description><![CDATA[Thanks to the cool Travel Map Widget from Blogabond, here&#8217;s where I am and will be for the next few weeks&#8230;

]]></description>
			<content:encoded><![CDATA[<p>Thanks to the cool <a href="http://www.blogabond.com/Promo/GetABlogMap.aspx">Travel Map Widget from Blogabond</a>, here&#8217;s where I am and will be for the next few weeks&#8230;</p>
<p><iframe src='http://www.blogabond.com/BlogMap.aspx?tripID=2806' width=500 height=300 frameborder=0 scrolling=no></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://testobsessed.com/2008/06/06/where-am-i/feed/</wfw:commentRss>
		</item>
		<item>
		<title>A Place to Put Things</title>
		<link>http://testobsessed.com/2008/05/31/a-place-to-put-things/</link>
		<comments>http://testobsessed.com/2008/05/31/a-place-to-put-things/#comments</comments>
		<pubDate>Sat, 31 May 2008 17:13:52 +0000</pubDate>
		<dc:creator>Elisabeth Hendrickson</dc:creator>
		
		<category><![CDATA[Ruminations]]></category>

		<category><![CDATA[Test Automation]]></category>

		<guid isPermaLink="false">http://testobsessed.com/?p=184</guid>
		<description><![CDATA[At the AA-FTT workshop last October, I did this lightning talk titled &#8220;A Place to Put Things.&#8221; 
 
In it, I propose standardizing on places to put different kinds of information associated with automated functional tests. 
It seems to me that one of the key success factors for the xUnit family of unit testing frameworks [...]]]></description>
			<content:encoded><![CDATA[<p>At the AA-FTT workshop last October, I did this lightning talk titled &#8220;A Place to Put Things.&#8221; </p>
<p><embed id="VideoPlayback" style="width:400px;height:326px" flashvars="" src="http://video.google.com/googleplayer.swf?docid=-781851039597332214&#038;hl=en" type="application/x-shockwave-flash"> </embed></p>
<p>In it, I propose standardizing on places to put different kinds of information associated with automated functional tests. </p>
<p>It seems to me that one of the key success factors for the xUnit family of unit testing frameworks is that they gave us just 5 places to put code related to unit tests: setup, test, teardown, suite setup, suite teardown. That simple organization has a powerful focusing effect, enabling (or, perhaps, forcing) developers to narrow their attention down to just the code needed to create one little itty bitty unit test at a time. </p>
<p>Functional testing frameworks have no such common, standardized structure.</p>
<p>FIT has given us something close with the notion of a test in natural language in a table and fixture code to hook that test to the software under test.  If we extend that model a little to include the idea that we may well be testing against an external interface, like a web interface, where a driver, like Watir or SeleniumRC, would be handy, we end up with 3 big categories of things:</p>
<ul>
<li><b>Tests</b>: scenarios describing the actions and expectations, expressed in natural language with keywords</li>
<li><b>Fixtures</b>: code that connects the keywords in the test to actions in the software under test</li>
<li><b>Drivers</b>: libraries like Watir, SeleniumRC, Perl&#8217;s Win32::GUI, etc. that know how to address external interfaces such as Web interfaces, thick client GUIs, command line interfaces, soap/XML calls, etc.</li>
</ul>
<p>That&#8217;s the direction I think test automation tools in general are headed, and it&#8217;s an important evolution with profound implications.  However, I&#8217;m still figuring out how to explain how this structure differs from what traditional tools offer, and the significance of those differences.</p>
<p>At the very end of the &#8220;A Place to Put Things&#8221; video, there&#8217;s a little exchange between two of the participants in the workshop.  A woman&#8217;s voice says, &#8220;She just pulled that together in like a minute!&#8221;  That&#8217;s Jennitta Andrea speaking.  She was the co-organizer of the AA-FTT workshop.</p>
<p>In response, Ward Cunningham says, &#8220;Oh, no. I think she&#8217;s been pulling that together for the last 3 years.&#8221;</p>
<p>Ward&#8217;s right.  And I&#8217;m still pulling together my ideas and figuring out how to articulate them.  So while you don&#8217;t see much evidence of it on my blog, I am actually spending a fair amount of time writing, and rewriting.  More soon.  I hope.</p>
]]></content:encoded>
			<wfw:commentRss>http://testobsessed.com/2008/05/31/a-place-to-put-things/feed/</wfw:commentRss>
		</item>
		<item>
		<title>So You&#8217;re Trying to Automate Tests for a Legacy Web Application&#8230;</title>
		<link>http://testobsessed.com/2008/05/15/so-youre-trying-to-automate-tests-for-a-legacy-web-application/</link>
		<comments>http://testobsessed.com/2008/05/15/so-youre-trying-to-automate-tests-for-a-legacy-web-application/#comments</comments>
		<pubDate>Thu, 15 May 2008 21:50:02 +0000</pubDate>
		<dc:creator>Elisabeth Hendrickson</dc:creator>
		
		<category><![CDATA[Ruminations]]></category>

		<category><![CDATA[Test Automation]]></category>

		<guid isPermaLink="false">http://testobsessed.com/?p=182</guid>
		<description><![CDATA[&#8230;and it isn&#8217;t cooperating?
I sympathize.
I recently fought my way through the process of automating a test to reproduce a bug on a legacy(*) web application that had no IDs on any of the elements that I wanted to address.  And I thought it might be helpful to capture some of my lessons learned here [...]]]></description>
			<content:encoded><![CDATA[<p><span id="footref"><b><i>&#8230;and it isn&#8217;t cooperating?</i></b></span></p>
<p>I sympathize.</p>
<p>I recently fought my way through the process of automating a test to reproduce a bug on a legacy(<a href="#footnote"><b>*</b></a>) web application that had no IDs on any of the elements that I wanted to address.  And I thought it might be helpful to capture some of my lessons learned here in case they help someone else.  Also, I&#8217;m putting this here so I remember what I did.</p>
<h3>Lesson 1: SeleniumRC Rocks!</h3>
<p>I&#8217;ve been extolling the virtues of <a href="http://selenium-rc.openqa.org/">SeleniumRC</a> for quite a while.  This project gave me the perfect opportunity to refresh my Selenium skills.  And I&#8217;m delighted to report that SeleniumRC is even better than I remember it being.  First, I can write my tests in my programming language of choice (Ruby).  Second, it has a wide variety of ways to locate these pesky non-ID&#8217;d elements.  Third, every time I ran up against a road block, I discovered that the smart folks who make Selenium had already anticipated the problem and found a solution.</p>
<h3>Lesson 2: Selenium Server Flags can Solve Common Execution Problems</h3>
<p>In my particular case, the app I was testing didn&#8217;t play nicely in IFrames.  This is a problem: by default Selenium runs the web app in an IFrame in the same browser window where it displays its own status.  Fortunately, it turns out that there is a -multiWindow flag to solve exactly this problem.  I solved the IFrame problem by running the Selenium Server like so:</p>
<p><code>java -jar selenium-server.jar -multiWindow</code></p>
<p>There are a variety of other Selenium Server flags that address other common problems.  See the <a href="http://selenium-rc.openqa.org/options.html">Server Command Line Options documentation</a> for a full list.</p>
<h3>Lesson 3: &#8216;Permission Denied&#8217; Errors Probably Mean the App Violates the &#8216;Same Origin Policy&#8217;</h3>
<p>Once I&#8217;d gotten to the point where I could launch the app, I started encountering very puzzling Permission Denied errors.  I vaguely recalled that such errors probably meant there was some problem with the domain names changing and browser security and cross-site scripting something-or-other.  </p>
<p>So I checked the domains.  Sure enough, the home page was at &#8220;www.example.com.&#8221;  From there, when you log in, it goes to &#8220;app.example.com.&#8221;  Bingo!  The domain was changing in the middle of my test.  I experimented a little and discovered there was no way around it: the app was going to redirect to a different domain no matter what.</p>
<p>It turns out I&#8217;m not the first person to have this problem.  Fortunately, Selenium has a strategy for addressing the issue: <a href="http://selenium-rc.openqa.org/experimental.html">experimental browsers</a>. I tried the chrome browser for testing on FireFox and it worked perfectly.</p>
<h3>Lesson 4: Firefox Rocks!</h3>
<p>At this point I could launch the app and log in, but now I had another problem.  After the login page, all the things I needed to click, check, or otherwise manipulate were buried deep in convoluted HTML.  I realized that figuring out how to address these things was going to be non-trivial.</p>
<p>The most basic strategy for discovering the locator for an element is to view the HTML source.  You can view the source for the whole page, but Firefox has a great feature that allows you to see just the source for just a selection.  To use it: highlight a selection on the page, then right-click.  One of the available menu options is View Selection Source. Choose it, and you get a window with just the relevant HTML.</p>
<p>However, if you&#8217;re dealing with something complex, viewing the source isn&#8217;t enough.  You really need to look at the Document Object Model (DOM).  The best way I know to do that is with the DOM Viewer included with the <a href="https://addons.mozilla.org/en-US/firefox/addon/60">Web Developer plugin</a> by Chris Pederick.</p>
<p>Web Developer also includes a feature that lets you see all the attributes for a given element.  From the Information menu, choose &#8220;Display Element Information.&#8221;  Now you can get the attributes for any element just by clicking on it.  I love that feature.</p>
<p>Finally, the <a href="https://addons.mozilla.org/en-US/firefox/addon/1095 ">XPath Checker plugin</a> by Brian Slesinsky is a very helpful tool for figuring out how to address those pesky non-ID&#8217;d elements.  More on xpath in the next section.</p>
<h3>Lesson 5: xpath Is Now My Good Friend</h3>
<p>One of the hallmarks of legacy web apps is the annoying lack of IDs on important elements.  Of course, web apps aren&#8217;t the first place where a lack of IDs is problematical.  I recall struggling with Windows apps that lacked field IDs back in the 1990s.</p>
<p>The good news is that this is a much more tractable problem in web apps than in Windows apps.  Xpath to the rescue!</p>
<p>Let&#8217;s take just one example.  I needed to verify the text associated with a particular image.  The image served as a kind of custom bullet in a bulleted list, so there were several identical ones.  The text itself did not appear in the DOM immediately next to the graphic.  Rather, its parent was a peer to the parent element of the image.  (Got that straight? Yeah, me either. Seriously, this one took me a while.)  In brief, the HTML around this thing looked kinda like this:</p>
<p><code>&lt;div&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;span&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;img src='/path/to/images/check.gif'&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;span&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;font&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/font&gt;<br />
&lt;/div&gt;<br />
&lt;div&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;span&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;img src='/path/to/images/check.gif'&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;span&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;font&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item 2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/font&gt;<br />
&lt;/div&gt;</code></p>
<p>Mind you, the HTML didn&#8217;t look that clean.  There was a lot of other random stuff in there, and every tag had a gazillion attributes, and there were hard-coded styles everywhere.  But I digress.  And I&#8217;m probably whining.  I&#8217;ll stop that now.</p>
<p>So it turns out the only way I could grab the text associated with the second bullet in the list was with the following Selenium command:</p>
<p><code>get_text("xpath=(//img[contains(@src,'check.gif')])[2]/../../font")</code></p>
<p>Let&#8217;s all say it as a group: &#8220;EWWWWW!&#8221;</p>
<p>But let&#8217;s also appreciate that doing such a thing is actually possible.  Selenium has a wide range of  <a href="http://release.openqa.org/selenium-remote-control/0.9.0/doc/dotnet/html/Selenium.DefaultSelenium.html">locator styles</a>, and even allows you to add your own locator strategies.  (I haven&#8217;t needed to do that yet, so I&#8217;m not quite sure how to use the feature, but I noticed from the documentation that it&#8217;s there.)</p>
<p>(For more on using xpaths with Selenium, I found the <a href="http://wiki.openqa.org/display/SEL/Help+With+XPath ">Help with XPath</a> article on the openqa.org site useful.  It&#8217;s hard not to like an article with headings like &#8220;How the $%^@$ do I locate an element?&#8221;)</p>
<p>Mind you, the world might be a better place if we couldn&#8217;t write such code.  Every time I figure out how to automate tests against an untestable application, I feel a twinge of guilt.  By automating tests against an untestable interface, I become an enabler of more untestable interfaces.  For the sake of improved collaboration and more testable applications, perhaps it&#8217;s better if those of us who automate tests avoid resorting to using our xpath superpowers except in the service of wrapping legacy apps with tests so they can be refactored for testability.</p>
<p>But once again, I digress.</p>
<p>The point I really want to make is that SeleniumRC gives us the power to automate tests even against icky hard-to-test legacy apps, and to do it with real programming languages (pick your favorite: C#, VB.Net, Perl, PHP, Ruby, Java).  And that means we can write maintainable automated tests using good programming practices.  And *that* means we can automate regression tests for faster feedback.  And ultimately, *that* means we can make changes to the legacy app to improve testability and maintainability.</p>
<p>So rock on, SeleniumRC. And huge thanks to everyone who&#8217;s ever worked on SeleniumRC or Selenium.  Also, huge thanks to the Selenium community as a whole.  When I went looking for answers to my questions I found numerous blog posts and forum messages with tips and tricks.  This post would not have been possible without such a community that&#8217;s so open about sharing knowledge.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p id="footnote">* Here I mean &#8220;Legacy&#8221; as Michael Feathers defines it: code that lacks automated unit tests.  Web developers, please take note: if you write good unit tests for your web app, including JSUnit tests for the JavaScript bits, the application will be MUCH more testable and the QA people will stop whining at you so much. <a href="#footref"><i>return to footnote reference</i></a></p>
]]></content:encoded>
			<wfw:commentRss>http://testobsessed.com/2008/05/15/so-youre-trying-to-automate-tests-for-a-legacy-web-application/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Agile-Friendly Test Automation Tools/Frameworks</title>
		<link>http://testobsessed.com/2008/04/29/agile-friendly-test-automation-toolsframeworks/</link>
		<comments>http://testobsessed.com/2008/04/29/agile-friendly-test-automation-toolsframeworks/#comments</comments>
		<pubDate>Tue, 29 Apr 2008 22:58:45 +0000</pubDate>
		<dc:creator>Elisabeth Hendrickson</dc:creator>
		
		<category><![CDATA[Agile]]></category>

		<category><![CDATA[Ruminations]]></category>

		<category><![CDATA[Test Automation]]></category>

		<guid isPermaLink="false">http://testobsessed.com/?p=181</guid>
		<description><![CDATA[Several people have asked me recently why I&#8217;m not a fan of the traditional test automation tools for Agile projects.  &#8220;Why should I use something like Fit or Fitnesse?&#8221; they ask.  &#8220;We already have &#60;insert Big Vendor Tool name here&#62;.  I don&#8217;t want to have to learn some other tool.&#8221;
Usually the people [...]]]></description>
			<content:encoded><![CDATA[<p>Several people have asked me recently why I&#8217;m not a fan of the traditional test automation tools for Agile projects.  &#8220;Why should I use something like <a href="http://fit.c2.com">Fit</a> or <a href="http://www.fitnesse.org/">Fitnesse</a>?&#8221; they ask.  &#8220;We already have &lt;<i>insert Big Vendor Tool name here</i>&gt;.  I don&#8217;t want to have to learn some other tool.&#8221;</p>
<p>Usually the people asking the question, at least in this particular way, are test automation specialists.  They have spent much of their career becoming experts in a particular commercial tool.  They know how to make their commercial tool of choice jump through hoops, sing, and make toast on command.  </p>
<p>Then they find themselves in a newly Agile context struggling to use the same old tool to support a whole new way of working.  They&#8217;re puzzled when people like me tell them that there are better alternatives for Agile teams.</p>
<p>So if you are trying to make a traditional, heavyweight, record-and-playback test automation solution work in an Agile context, or if you are trying to help those other people understand why their efforts are almost certainly doomed to fail, this post is for you.</p>
<h3>Why Traditional, Record-and-Playback, Heavyweight, Commercial Test Automation Solutions Are Not Agile</h3>
<p>Three key reasons:</p>
<ol>
<li>The test-last workflow encouraged by such tools is all wrong for Agile teams. </li>
<li>The unmaintainable scripts created with such tools become an impediment to change.
</li>
<li>Such specialized tools create a need for Test Automation Specialists and thus foster silos.
</li>
</ol>
<p>Let&#8217;s look at each of these concerns in turn, then look at how Agile-friendly tools address them.</p>
<h3>Test-Last Automation</h3>
<p>Traditional, heavyweight, record-and-playback tools force teams to wait until after the software is done - or at least the interface is done - before automation can begin.  After all, it&#8217;s hard to record scripts against an interface that doesn&#8217;t exist yet.  So the usual workflow for automating tests with a traditional test automation tool looks something like this:</p>
<ol>
<li>Test analysts design and document the tests
</li>
<li>Test executors execute the tests and report the bugs
</li>
<li>Developers fix the bugs
</li>
<li>Test executors re-execute the tests and verify the fixes (repeating as needed)
</li>
<li>&#8230;time passes&#8230;
</li>
<li>Test automation specialists automate the regression tests using the test documents as specifications
</li>
</ol>
<p>Looking at the workflow this way, it&#8217;s surprising to me that this particular test automation strategy ever works, even in traditional environments with long release cycles and strict change management practices. By the time we get around to automating the tests, the software is done and ready to ship.  So those tests are not going to uncover much information that we don&#8217;t already know.  </p>
<p>Sure, automated regression tests are theoretically handy for the next release.  But usually the changes made for the next release break those automated tests (see concern #2, maintainability, coming up next).  The result for most contexts: high cost, limited benefit.  In short, such a workflow is a recipe for failure on any project, not just for Agile teams.  The teams that have made this workflow work well in their context have had to work very, very hard at it.</p>
<p>However, this workflow is particularly bad in an Agile context where it results in an intolerably high level of waste and too much feedback latency.  </p>
<ul>
<li><b>Waste</b>: the same information is duplicated in both the manual and automated regression tests. Actually, it&#8217;s duplicated elsewhere too.  But for now, let&#8217;s just focus on the duplication in the manual and automated tests.
</li>
<li><b>Feedback Latency</b>: the bulk of the testing in this workflow is manual, and that means it takes days or weeks to discover the effect of a given change.  If we&#8217;re working in 4 week sprints, waiting 3 - 4 weeks for regression test results just does not work.</li>
</ul>
<p>Agile teams need the fast feedback that automated system/acceptance tests can provide.  Further, test-last tools cannot support Acceptance Test Driven Development (ATDD).  Agile teams need tools that support starting the test automation effort immediately, using a test-first approach.</p>
<h3>Unmaintainable Piles of Spaghetti Scripts</h3>
<p>Automated scripts created with record-and-playback tools usually contain a messy combination of at least three different kinds of information:</p>
<ul>
<li>Expectations about the behavior of the software under test given a set of conditions.
</li>
<li>Implementation-specific details about the interface.
</li>
<li>Code to drive the application to the desired state for testing.
</li>
</ul>
<p>So a typical script will have statements to click buttons identified by hard-coded button ids followed by statements that verify the resulting window title followed by statements to verify the calculated value in a field identified by another hard-coded id, like so:</p>
<p><code>field("item_1").enter_value("12345")<br />
button("lookup_item_1").click<br />
field("price_1").verify_value("$7.00")<br />
field("qty_1").enter_value("6")<br />
button("total_next").click<br />
active_window.verify_title("Checkout")<br />
field("purchase_total").verify_value("$42.00")<br />
</code></p>
<p>The essence of the test was to verify that ordering 6 items at $7 each results in a shopping cart total of $42.  But because the script has a mixture of expectations and UI-specific details, we end up with a whole bunch of extraneous implementation details obfuscating the real test.</p>
<p>(If you&#8217;re nodding along, thinking to yourself, &#8220;Yup, looks like our test scripts,&#8221; then you have my sympathies.  My deep, deep sympathies.  Good, maintainable, automated test scripts do not look like that.)</p>
<p>All that extraneous stuff doesn&#8217;t just obscure the essence of the test.  It also makes such scripts hard to maintain. Every time a button id changes, or the workflow changes, say with a &#8220;Shipping Options&#8221; screen inserted before the Checkout screen, the script has to be updated.  But that value $42.00?  That only changes if the underlying business rules change, say during the &#8220;Buy 5, get a 6th free!&#8221; sale week.</p>
<p>Of course, there are teams that have poured resources, time, and effort into creating maintainable tests using traditional test automation tools.  They use data-driven test strategies to pull the test data into files or databases.  They create reusable libraries of functions for common action sequences like logging in.  They create an abstract layer (a GUI map) between the GUI elements and the tests.  They use good programming practices, have coding standards in place, and know about refactoring techniques to keep code DRY.  I know about these approaches.  I&#8217;ve done them all.</p>
<p>But I had to fight the tools the whole way.  The traditional heavyweight test automation tools are optimized for record-and-playback, not for writing maintainable test code.  One of the early commercial tools I used even made it impossible to create a separate reusable library of functions: you had to put any general-use functions into a library file that shipped with the tool (making tool upgrades a nightmare).  That&#8217;s just EVIL.</p>
<p>Agile teams need tools that separate the essence of the test from the implementation details.  Such a separation is a hallmark of good design and increases maintainability.  Agile teams also need tools that support and encourage good programming practices for the code portion of the test automation.  And that means they need to write the test automation code using real, general use languages, with real IDEs, not vendor script languages in hamstrung IDEs.</p>
<h3>Silos of Test Automation Specialists</h3>
<p>Traditional QA departments working in a traditional waterfall/phased context, and automating tests, usually have a dedicated team of test automation specialists.  This traditional structure addresses several forces:</p>
<ol>
<li>Many &#8220;black-box&#8221; testers don&#8217;t code, don&#8217;t want to code, and don&#8217;t have the necessary technical skills to do effective test automation.  Yes, they can click the &#8220;Record&#8221; button in the tool.  But most teams I talk to these days have figured out that having non-technical testers record their actions is not a viable test automation strategy.
</li>
<li>The license fees for traditional record-and-playback test automation tools are insanely expensive.  Most organizations simply do not have the budget to buy licenses for everyone.  Thus only the anointed few are allowed to use the tools.
</li>
<li>Many developers view the specialized QA tools with disdain.  They want to write code in real programming languages, not in some wacky vendorscript language using a hamstrung IDE.
</li>
</ol>
<p>Thus, the role of the Test Automation Specialist was born.  These specialists usually work in relative isolation.  They don&#8217;t do day-to-day testing, and they don&#8217;t have their hands in the production code.  They have limited interactions with the testers and developers.  Their job is to turn manual tests into automated tests.  </p>
<p>That isolation means that if the production code isn&#8217;t testable, these specialists have to find a workaround because testability enhancements are usually low on the priority list for the developers.  I&#8217;ve been one of these specialists, and I&#8217;ve fought untestable code to get automated tests in place.  It&#8217;s frustrating, but oddly addictive.  When I managed to automate tests against an untestable interface, I felt like I&#8217;d slain <a href="http://en.wikipedia.org/wiki/Grendel">Grendel</a>, Grendel&#8217;s mother, all the Grendel cousins, and the horse they rode in on.  I felt like a superhero.</p>
<p>But Agile teams increase their effectiveness and efficiency by breaking down silos, not by creating test automation superheroes.  That means the test automation effort becomes a collaboration.  Business stakeholders, analysts, and black box testers contribute tests expressed in an automatable form (e.g. a Fit table) while the programmers write the code to hook the tests up to the implementation.</p>
<p>Since the programmers write the code to hook the tests to the implementation while implementing the user stories, they naturally end up writing more testable code.  They&#8217;re not going to spend 3 days trying to find a workaround to address a field that doesn&#8217;t have a unique ID when they could spend 5 minutes adding the unique ID.  Collaborating means that automating tests becomes a routine part of implementing code instead of an exercise in slaying Grendels.  Less fun for test automation superheroes, but much more sensible for teams that actually want to get stuff done.</p>
<p>So that means Agile teams need tools that foster collaboration rather than tools that encourage a whole separate silo of specialists.</p>
<h3>Characteristics of Effective Agile Test Automation Tools</h3>
<p>Reviewing the problems with traditional test automation tools, we find that Agile teams need test automation tools/frameworks that:</p>
<ul>
<li>Support starting the test automation effort immediately, using a test-first approach.
</li>
<li>Separate the essence of the test from the implementation details.
</li>
<li>Support and encourage good programming practices for the code portion of the test automation.
</li>
<li>Support writing test automation code using real languages, with real IDEs.
</li>
<li>Foster collaboration.
</li>
</ul>
<p>Fit, Fitnesse, and related tools (see the list at the end of the post for more) do just that.</p>
<p>Testers or business stakeholders express expectations about the business-facing, externally visible behavior in a table using keywords or a Domain Specific Language (DSL).  Programmers encapsulate all the implementation details, the button-pushing or API-calling bits, in a library or fixture.</p>
<p>So our Shopping Cart example from above might be expressed like this:</p>
<p><code>Choose item by sku 12345<br />
Item price should be $7.00<br />
Set quantity to 6<br />
Shopping cart total should be $42.00<br />
</code></p>
<p>See, no button IDs.  No field IDs.  Nothing except the essence of the test. </p>
<p>And by writing our test in that kind of stripped-down-to-the-essence way makes it no longer just a test.  As <a href="http://www.exampler.com/blog/">Brian Marick</a> would point out, it&#8217;s an example of how the software should behave in a particular situation.  It&#8217;s something we can articulate, discuss, and explore while we&#8217;re still figuring out the requirements.  The team as a whole can collaborate on creating many such examples as part of the effort to gain a shared understanding of the real requirements for a given user story.</p>
<p>Expressing tests this way makes them automatable, not automated.  Automating the test happens later, when the user story is implemented.  That&#8217;s when the programmers write the code to hook the test up to the implementation, and that&#8217;s when the test becomes an executable specification.  </p>
<p>Before it is automated, that same artifact can serve as a manual test script.  However, unlike the traditional test automation workflow where manual tests are translated into automated tests, here there is no wasteful translation of one artifact into another.  Instead, the one artifact is leveraged for multiple purposes.</p>
<p>For that matter, because we&#8217;re omitting implementation-specific details from the test, the test can be re-used if the system were ported to a completely different technology.  There is nothing specific to a Windows or Web-based interface in the test.  The test would be equally valid for a green screen, a Web services interface, a command line interface, or even a punch-card interface.  Leverage.  It&#8217;s all about the leverage.</p>
<h3>Traditional Tools Solve Traditional Problems in Traditional Contexts.  Agile Is Not Traditional.</h3>
<p>Traditional, heavyweight, record-and-playback tools address the challenges faced by teams operating in a traditional context with specialists and silos.  They address the challenge of having non-programmers automate tests by having record-and-playback features, a simplified editing environment, and a simplified programming language. </p>
<p>But Agile teams don&#8217;t need tools optimized for non-programmers.  Agile teams need tools to solve an entirely different set of challenges related to collaborating, communicating, reducing waste, and increasing the speed of feedback.  And that&#8217;s the bottom line: <b><i>Traditional test automation tools don&#8217;t work for an Agile context because they solve traditional problems, and those are different from the challenges facing Agile teams.</i></b></p>
<p>&#8230;</p>
<h3>Related Links</h3>
<p>A bunch of us are discussing the next generation of functional testing tools for Agile teams on the <a href="http://groups.yahoo.com/group/aa-ftt/">AA-FTT Yahoo! group</a>.  It&#8217;s a moderated list and membership is required.  However, I&#8217;m one of the moderators, so I can say with some authority that we&#8217;re an open community.  We welcome anyone with a personal interest in the next generation of functional tools for Agile teams.  We&#8217;re also building lists of resources.  In the Links section of the AA-FTT Yahoo! group, you&#8217;ll find a list of Agile-related test automation tools and frameworks.  And the discussion archives are interesting.</p>
<p>Brian Marick wrote a lovely essay on <a href="http://www.exampler.com/blog/2008/03/23/an-alternative-to-business-facing-tdd/">An Alternative to Business-Facing TDD</a>. </p>
<p>I discussed some of the ideas in this article in previous blog posts, most notably:</p>
<ul>
<li>
<a href="http://testobsessed.com/2007/02/16/functional-test-tools-the-next-generation/">Functional Test Tools: the Next Generation (part 1 of 2)</a>
</li>
<li>
<a href="http://testobsessed.com/2007/02/19/functional-test-tools-the-next-generation-part-2-of-2/">Functional Test Tools: the Next Generation (part 2 of 2)</a>
</li>
<li>
<a href="http://testobsessed.com/2007/02/22/what-problem-would-next-generation-functional-testing-tools-solve/">What Problem Would Next-Generation Functional Testing Tools Solve?</a>
</li>
<li>
<a href="http://testobsessed.com/2007/02/25/and-while-im-at-it-i-want-a-platypus-too/">And While I’m at It, I Want a Platypus Too!</a>
</li>
</ul>
<p>A small sampling of Agile-friendly tools and frameworks:</p>
<ul>
<li>Ward Cunningham&#8217;s original <a href="http://fit.c2.com">Fit</a> has inspired a whole bunch of related tools/frameworks/libraries including <a href="http://www.fitnesse.org">Fitnesse</a>, <a href="http://www.zibreve.com">ZiBreve</a>, <a href="www.greenpeppersoftware.com">Green Pepper</a>, and <a href="http://storytestiq.solutionsiq.com">StoryTestIQ</a>.</li>
<li><a href="http://www.concordion.org/">Concordion</a> takes a slightly different approach to creating executable specifications where the test hooks are embedded in attributes in HTML, so the specification is in natural language rather than a table.</li>
<li><a href="http://selenium-rc.openqa.org/">SeleniumRC</a> and <a href="http://wtr.rubyforge.org/">Watir</a> tests are expressed in <a href="http://www.ruby-lang.org">Ruby</a>; Ruby makes good DSLs.
</li>
</ul>
<p><i>Are you the author or vendor of a tool that you think should be listed here?  Drop a note in the comments with a link.  Please note however that comment moderation is turned on, and I will only approve the comment if I am convinced that the tool addresses the concerns of Agile teams doing functional/system/acceptance test automation.</i></p>
]]></content:encoded>
			<wfw:commentRss>http://testobsessed.com/2008/04/29/agile-friendly-test-automation-toolsframeworks/feed/</wfw:commentRss>
		</item>
		<item>
		<title>&#8220;Normal&#8221; in Context</title>
		<link>http://testobsessed.com/2008/04/22/normal-in-context/</link>
		<comments>http://testobsessed.com/2008/04/22/normal-in-context/#comments</comments>
		<pubDate>Tue, 22 Apr 2008 16:46:58 +0000</pubDate>
		<dc:creator>Elisabeth Hendrickson</dc:creator>
		
		<category><![CDATA[Ruminations]]></category>

		<guid isPermaLink="false">http://testobsessed.com/?p=179</guid>
		<description><![CDATA[It was my first week in Bangalore, and I was still adjusting to the time difference.  I was actually a little proud that I was functional and awake given that it was something like 1AM my time.
&#8220;Want some coffee?&#8221; my host asked.
&#8220;No thanks, I&#8217;m fully caffeinated for now.&#8221; I replied.
&#8220;Even if you don&#8217;t want [...]]]></description>
			<content:encoded><![CDATA[<p>It was my first week in Bangalore, and I was still adjusting to the time difference.  I was actually a little proud that I was functional and awake given that it was something like 1AM my time.</p>
<p>&#8220;Want some coffee?&#8221; my host asked.</p>
<p>&#8220;No thanks, I&#8217;m fully caffeinated for now.&#8221; I replied.</p>
<p>&#8220;Even if you don&#8217;t want a coffee, you should come see how it&#8217;s prepared,&#8221; my host grinned at me expectantly.</p>
<p>&#8220;Um, OK.&#8221; I relented.  I dutifully followed him through twisting and turning corridors until we arrived at the coffee counter.</p>
<p>There were three men at the counter.  I watched as they made coffee for all the people in line in front of us.  It was quite a production.</p>
<p>The first man reached up to a shelf for a ceramic cup and placed it on the counter.  The cups were bigger than a demitasse, but much smaller than my typical ginormous supersized vat-o-coffee mug.</p>
<p>The second man then flipped the valve on the coffee maker allowing a dark, rich liquid &#8212; thicker than espresso &#8212; to flow into a small metal pitcher.  He then upended the metal pitcher into the cup.</p>
<p>The third man had the best job of all.  He was the real showman.  This was what my host wanted me to see.  He began by dipping a saucepan into a huge steaming pot of milk sunk into the counter.  He then lifted it high and poured it back in a long stream.  Dip.  Pour.  Dip.  Pour.  As he poured the milk back into the pot, it frothed.  </p>
<p>When the third man judged the milk sufficiently foamy, he poured it into the prepared cup, careful to let just the milk out.  No foam.  Not yet.  Once the level in the cup reached an invisible boundary, he poured the rest of the liquid back into the steaming pot, leaving just the foam in the saucepan.  Then he gently tilted the saucepan over the cup, allowing just the right amount of foam to cover the center of the near-caramel-colored coffee mixture.  The result was a foamy white top surrounded by a ring of darker froth around the edges.  As he placed the dipper back across the pot of milk, the second man ceremoniously handed the patron their coffee mug, handle first.</p>
<p>Several people were in line, so I got to see the performance several times.  Each time the team of three executed with precision.  The resulting cups of coffee were identical in appearance: same volume in the cup, same amount of foam on top, same colors.  </p>
<p>The milk pourer also seemed to have a quality control role.  If he decided the color wasn&#8217;t quite dark enough, he would signal - almost imperceptibly - to the metal pitcher guy, who would then add a little more of the thick, dark coffee.</p>
<p>Of course, after such a performance, I had to have one of my own.  Receiving my mug reverently, I took a sip.  The drink was nothing like the coffee I usually get at home.  The froth tickled a little. The drink tasted sweet and rich and just a little exotic.  It was a bit like a latte, but richer and sweeter.  I was hooked.</p>
<p>Visiting the coffee counter became a ritual for me.  I drank many, many of those coffees while in India.</p>
<p>One day toward the end of my visit, the person in front of me requested unsweetened milk in his coffee.  When it was my turn and I stepped up to the counter, the first man confirmed what I wanted: &#8220;Normal coffee, madam?&#8221; he asked.</p>
<p>&#8220;Yes,&#8221; I replied, smiling.  &#8220;Normal coffee please.&#8221;  Even if the beverage I was enjoying was not normal coffee to me, it was normal here.  Sweet.  Rich.  Foamy.  Normal.  Once again, <a href="http://testobsessed.com/2007/11/27/normal-is-in-the-eye-of-the-beholder/">normal is in the eye of the beholder</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://testobsessed.com/2008/04/22/normal-in-context/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Same Blog, New Host</title>
		<link>http://testobsessed.com/2008/04/21/same-blog-new-host/</link>
		<comments>http://testobsessed.com/2008/04/21/same-blog-new-host/#comments</comments>
		<pubDate>Tue, 22 Apr 2008 00:08:49 +0000</pubDate>
		<dc:creator>Elisabeth Hendrickson</dc:creator>
		
		<category><![CDATA[Ruminations]]></category>

		<category><![CDATA[Running the Business]]></category>

		<guid isPermaLink="false">http://testobsessed.com/?p=178</guid>
		<description><![CDATA[So I woke up this morning to an email from alert reader Michael Ludgate notifying me that when he tried to access any page on my site, he got the following message:
WordPress database error: [Can't create/write to file '/tmp/mysqltmp/#sql_11b6_0.MYI' (Errcode: 2)]

&#8220;Oh, joy,&#8221; I thought to myself as I began investigating.  I knew that the [...]]]></description>
			<content:encoded><![CDATA[<p>So I woke up this morning to an email from alert reader Michael Ludgate notifying me that when he tried to access any page on my site, he got the following message:</p>
<p><code>WordPress database error: [Can't create/write to file '/tmp/mysqltmp/#sql_11b6_0.MYI' (Errcode: 2)]<br />
</code></p>
<p>&#8220;Oh, joy,&#8221; I thought to myself as I began investigating.  I knew that the problem could not have been caused by anything I did.  First, my most recent update to the site was back on April 2, that was just a content posting, and I was 100% certain my site had been alive and well much more recently than that.  Second, I don&#8217;t even have shell access, so I couldn&#8217;t make a file in /tmp/&#8230; disappear if I tried.  That meant the problem had to be with my ISP, and was probably outside my control.</p>
<p>After poking around for a little while in the vain hope that if I messed with stuff the tmp file would spontaneously regenerate, I sent a missive off to tech support.  The auto-responder helpfully told me that I could expect to wait 24 - 48 hours for a response.  Even if this is just a blog, that&#8217;s too much downtime.  So I decided a phone call was in order.</p>
<p>A baffled tech support rep suggested I uninstall and reinstall WordPress.  When I pushed him on how this problem happened to begin with, the tech support rep backpedalled a little and said he&#8217;d escalate the issue.  I now had an incident number for tracking purposes, and a promise that &#8220;someone would get back to me.&#8221;</p>
<p>At this point I evaluated my options.</p>
<p>I&#8217;ve been growing annoyed with godaddy.com anyway. Every time I log into my admin account, they try to upsell me. They don&#8217;t let me have shell access. They don&#8217;t support Ruby on Rails well - or not as well as I would like. I find their admin UI clunky. These are little annoyances; they&#8217;re not enough to push me to change hosts. But now that I had a down site and no ETA for a fix, I decided that changing hosts was actually the path of least resistance.</p>
<p>So my adventures began.  I bought 3 months of hosting on A2hosting.com, a host I&#8217;d been contemplating for RoR hosting anyway.  I managed to get a backup of my content from my godaddy.com site.  (Note to self: I need to revisit my blog backup strategy.  I happened to get lucky today - the catastrophic error that made my site unusable mercifully did not prevent me from exporting the data.  But that was sheer luck.  My previous backup was a couple months old.  But I digress.)  </p>
<p>I then put up a &#8220;pardon the mess&#8221; notification on both the old and new sites and changed my DNS entries to point to the DNS servers at the new location on A2.  And I installed WordPress on the new site.</p>
<p>I had to wait for the DNS changes to propagate before I could do more because every attempt to log into the WordPress admin interface in the new location redirected me to the old site.  Fortunately, I had to go to an appointment anyway.  By the time I got back I could see the new IP address when I pinged testobsessed.com.</p>
<p>I then began migrating the content.  That meant restoring the content from the SQL backup through a MySQL admin interface, upgrading the tables, panicking when it looked like the schema wasn&#8217;t going to upgrade cleanly, and finally breathing a sigh of relief when I saw the old content in the new site.</p>
<p>But wait!  There was still more to do.  I uploaded the theme files and other resources (including images and pdfs and such).  I fixed the permalink settings.  I tested.  I fixed glitches.  I tested again.  I swore.  </p>
<p>And finally I got the old site up on a new host.</p>
<p>This is, quite frankly, NOT how I expected to spend my day.  I was supposed to be doing paperwork - invoices, expense reports, contracts, that sort of thing.  This was a geekier, and possibly more exciting way to spend my day, but it was not at all what I had planned.  And in my haste it is certainly possible that I missed some detail.</p>
<p>I think everything is working now.  Please let me know if you find anything strange - missing content, broken links, whatever.  (No, I don&#8217;t have a full set of automated regression tests to cover every link I publish.  I&#8217;ve considered it, but the cost of maintaining such a suite of tests seems a little high for a non-revenue-generating blog.)</p>
<p>And that escalated trouble ticket filed with godaddy?  Still not handled.  I&#8217;m not particularly surprised.  My suspicion is that the problem I encountered is somehow related to the fact that I had not migrated my WordPress to their whiz-bang new Hosting Connection application management console thingy.  That first tech support rep was probably right: I could have solved my problem by uninstalling and re-installing WordPress.  </p>
<p>But I don&#8217;t think that would have been any easier than moving hosts - the only saved step would have been the DNS change.  And I&#8217;m happier having migrated.  And - as an extra bonus - the site even seems to be responding a little zippier.</p>
<p>This little digression will probably boost another back-burner project to the foreground: I&#8217;ve been meaning to change the way I manage my main company site.  Other alert readers have pointed out to me that my calendar at qualitytree.com is more than a year out of date.  It&#8217;s embarrassing.  But I haven&#8217;t fixed it because I publish that site using an obscure little Windows-based CMS.  Since I&#8217;ve gone all-Mac, updating qualitytree.com means I have to boot up my old Windows laptop, and I hate doing that.  </p>
<p>I&#8217;m going to see how things go with the new host for a while before migrating everything.  But it looks like I&#8217;ll be migrating my other website sooner rather than later.  </p>
<p>And now I&#8217;d better start on that paperwork I meant to take care of today.</p>
]]></content:encoded>
			<wfw:commentRss>http://testobsessed.com/2008/04/21/same-blog-new-host/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Effective Test Automation Isn&#8217;t Created in a Vacuum</title>
		<link>http://testobsessed.com/2008/04/02/effective-test-automation-isnt-created-in-a-vacuum/</link>
		<comments>http://testobsessed.com/2008/04/02/effective-test-automation-isnt-created-in-a-vacuum/#comments</comments>
		<pubDate>Thu, 03 Apr 2008 00:50:02 +0000</pubDate>
		<dc:creator>Elisabeth Hendrickson</dc:creator>
		
		<category><![CDATA[Agile]]></category>

		<category><![CDATA[Ruminations]]></category>

		<category><![CDATA[Teamwork]]></category>

		<category><![CDATA[Test Automation]]></category>

		<guid isPermaLink="false">http://www.testobsessed.com/2008/04/02/effective-test-automation-isnt-created-in-a-vacuum/</guid>
		<description><![CDATA[&#8220;They never give us enough time to automate our tests, and then they
complain at us that we don&#8217;t test fast enough!&#8221; J. shook her head.
&#8220;And when I want to hire more people to help automate, they tell me I
have too many people already!  Management blames me because testing
takes too long, but they won&#8217;t support [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;They never give us enough time to automate our tests, and then they<br />
complain at us that we don&#8217;t test fast enough!&#8221; J. shook her head.<br />
&#8220;And when I want to hire more people to help automate, they tell me I<br />
have too many people already!  Management blames me because testing<br />
takes too long, but they won&#8217;t support me in fixing the problem.<br />
What&#8217;s wrong with them!?!&#8221;</p>
<p>J. is a QA manager in an organization that&#8217;s adopting Scrum.  She&#8217;s<br />
frustrated, and understandably so.  From her point of view, she&#8217;s<br />
being squeezed in all directions.  The developers are producing<br />
releasable code every month.  But for her team to run a regression<br />
test cycle - mostly manual - takes 6 weeks.  That&#8217;s too long.  Just<br />
one test cycle exceeds the sprint length by 2 weeks.  J. feels<br />
tremendous pressure to reduce the time it takes to test the software.<br />
Yet at the same time, she feels like she&#8217;s not getting any support to<br />
do the one thing she can see that will help reduce the test cycle<br />
time: automate the regression tests.</p>
<p>I&#8217;ve had some visibility into J.&#8217;s situation for some time now.  J.&#8217;s<br />
team has been trying - and failing - to automate the regression suite<br />
for the last two years.  They aren&#8217;t making any headway because as<br />
soon as they get one script working, another one breaks.  The<br />
automation is brittle, error-prone, and incredibly expensive to create<br />
and maintain.  That&#8217;s in part because they&#8217;ve been using a cumbersome<br />
commercial tool that doesn&#8217;t support creating maintainable tests.<br />
It&#8217;s also because the user interface was not designed with test<br />
automation in mind.  Many UI elements don&#8217;t have IDs, and the ones<br />
that do use automatically generated IDs that change with each build.<br />
In short, the combination of the tool and the software under test<br />
equals a test automation nightmare.  It&#8217;s no wonder J.&#8217;s team is not<br />
making headway.</p>
<p>Yet J. persists.  Doing more of the same kind of test automation<br />
that&#8217;s already failing doesn&#8217;t make much sense to me, but she<br />
disagrees.  &#8220;We just need more time!&#8221; she says.</p>
<p>The problem is that J. is still thinking in terms of silos.  She<br />
thinks all testing tasks must be done by QA people using specialized<br />
QA tools.  It simply would not occur to her to suggest that<br />
development help automate tests.  Nor does she suggest that developers<br />
and testers collaborate on making the UI more testable.  Instead, she<br />
says, &#8220;QA can&#8217;t go that fast.  Slow down.&#8221;</p>
<p>J. doesn&#8217;t want to acknowledge that <b><i>test automation created by a<br />
siloed QA team working in isolation to reverse-engineer existing<br />
software and automate tests against an untestable UI using proprietary<br />
tools accessible only to a few select team members is guaranteed to be<br />
incredibly expensive both to create and to maintain, and also<br />
ridiculously fragile.</i></b>  In short, her approach just isn&#8217;t going<br />
to work.</p>
<p>Unfortunately, J.&#8217;s story is likely to have an unhappy ending - at<br />
least for J. and her team.  Her strategy of trying to get development<br />
to slow down, and telling management that they can&#8217;t release monthly,<br />
is backfiring.  The development team is already bypassing QA for small<br />
changes and getting good results.  But J. is undeterred.  My past<br />
observations tell me that no matter what the reaction of the people<br />
around her, she will keep doing the same thing and expect different<br />
results.</p>
<p>But maybe, just maybe, by telling J.&#8217;s story here, I can help someone,<br />
somewhere.</p>
<p>So allow me to repeat the moral of this story:</p>
<p>When QA works in isolation, creating automated tests after the<br />
software is theoretically &#8220;done,&#8221; using proprietary tools that are<br />
available only to a select few team members, the results will be a<br />
fragile, unmaintainable mess.</p>
<p>For test automation to work well, it must be created in collaboration<br />
with the whole team and the resulting test automation code must be<br />
treated as code.  That means it should be versioned with the source<br />
code, executed with each and every build, and created and maintained<br />
as part of the overall development cycle rather than as an afterthought.</p>
<p>And when a Test/QA group insists on keeping within their silo when the<br />
rest of the organization adopts Agile practices, they will end up<br />
bypassed and irrelevant as the rest of the organization finds ways to<br />
move forward without their help.</p>
]]></content:encoded>
			<wfw:commentRss>http://testobsessed.com/2008/04/02/effective-test-automation-isnt-created-in-a-vacuum/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Bugs on the Road</title>
		<link>http://testobsessed.com/2008/03/16/bugs-on-the-road/</link>
		<comments>http://testobsessed.com/2008/03/16/bugs-on-the-road/#comments</comments>
		<pubDate>Sun, 16 Mar 2008 14:18:58 +0000</pubDate>
		<dc:creator>Elisabeth Hendrickson</dc:creator>
		
		<category><![CDATA[Ruminations]]></category>

		<guid isPermaLink="false">http://www.testobsessed.com/2008/03/16/bugs-on-the-road/</guid>
		<description><![CDATA[I&#8217;ve run across numerous bugs in my travels.  
Some have been really real, like the time I found a 4 inch long dragonfly (seriously, the live flying kind) hanging from the projection screen in a conference room in a hotel in Florida.  I was supposed to be teaching a software testing class, projecting [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve run across numerous bugs in my travels.  </p>
<p>Some have been really real, like the time I found a 4 inch long dragonfly (seriously, the live flying kind) hanging from the projection screen in a conference room in a hotel in Florida.  I was supposed to be teaching a software testing class, projecting slides onto that screen, so I found the presence of the dragonfly more than a little distracting.  (The hotel wanted to spray it dead with insecticide, but I couldn&#8217;t let them do that.  The class participants worked together to capture the beast in a water pitcher and released it, unharmed, outside.)</p>
<p>Other bugs have been of the software variety.  Like when I needed to get a receipt from a travel website and it consistently gave me an error message instead.  (Frustrating, that.)</p>
<p>This last trip yielded more bug sightings than most.</p>
<p>First, there were strange limitations that inhibited my travels.  Trying to arrange plane tickets revealed a constraint imposed by the flight reservation system.  It seems that you can only fly through any given city 3 times on one ticket.  So the fact that I needed to transfer planes 4 times, and wanted to transfer in Frankfurt each time, kept resulting in fatal error messages when I tried to book the tickets online.  The helpful airline desk agent explained the limitation to me (though she couldn&#8217;t explain why it exists) and was able to book my ticket - with a stop in Warsaw instead of Frankfurt for one of the transfers.</p>
<p>Similarly, I was unable to book my train tickets myself online.  Each time I did, I received a helpful error message: &#8220;CH.enrolled java.lang.Except.&#8221;  Someone at my host site was able to book tickets for me, and I still don&#8217;t know why I couldn&#8217;t book the tickets myself.  </p>
<p>(For the curious: I tried with different browsers and still had the same problem - not surprising, since it was a java error and thus most likely server related.  I had guessed that the problem was with my data - perhaps my passport number was in an unexpected format, being a US passport rather than one issued by an EU country.  But since my host was able to book the tickets, that wasn&#8217;t it either.  Perhaps it had to do with my machine being in the US?  Or with my keyboard being a US keyboard?  Or with the way I entered the data?  Who knows.) </p>
<p>Then, once I reached the Frankfurt airport (on transfer #1 for those who are counting), I found that one of the internet kiosks had crashed.  <img id="frabuggykiosk" border="0px" style="padding: 10px 0px 10px 10px" src="http://testobsessed.com/wordpress/wp-content/uploads/2008/03/fra_buggy_kiosk.jpg" alt="Blue Screen on Kiosk" /></p>
<p>Based on the Blue Screen of Death displaying on the monitor, my guess is that there&#8217;s Windows under the covers of these kiosks.<br />
<img id="frabuggycloseup" border="0px" style="padding: 10px 0px 10px 10px" src="http://testobsessed.com/wordpress/wp-content/uploads/2008/03/fra_buggy_closeup.jpg" alt="Closeup of Blue Screen" /></p>
<p>And once I got to Poland, I discovered that they have seriously big bugs there.   Bigger even than in Florida.  The bottom picture is one I found hanging off the side of a building in Wroclaw.<br />
<img id="wroclawbug" border="0px" style="padding: 10px 0px 10px 10px" src="http://testobsessed.com/wordpress/wp-content/uploads/2008/03/wroclaw_bug.jpg" alt="Bug in Wroclaw" /></p>
<p>After this trip I could only conclude that I am truly a bug magnet.</p>
]]></content:encoded>
			<wfw:commentRss>http://testobsessed.com/2008/03/16/bugs-on-the-road/feed/</wfw:commentRss>
		</item>
		<item>
		<title>A Duck by Any Other Name&#8230;</title>
		<link>http://testobsessed.com/2008/03/07/a-duck-by-any-other-name/</link>
		<comments>http://testobsessed.com/2008/03/07/a-duck-by-any-other-name/#comments</comments>
		<pubDate>Sat, 08 Mar 2008 04:50:35 +0000</pubDate>
		<dc:creator>Elisabeth Hendrickson</dc:creator>
		
		<category><![CDATA[Ruminations]]></category>

		<guid isPermaLink="false">http://www.testobsessed.com/2008/03/07/a-duck-by-any-other-name/</guid>
		<description><![CDATA[&#8220;See, there&#8217;s always a duck,&#8221; I said to my colleague.   I&#8217;m from the US; he&#8217;s from Finland; and we were both in Portugal on business.  We&#8217;d taken a break from work to take a walking tour in the mild weather.  I&#8217;d already told him how my youngest daughter had had declared [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;See, there&#8217;s always a duck,&#8221; I said to my colleague.  <img align="right" id="image168" border="0px" style="padding: 10px 0px 10px 10px" src="http://testobsessed.com/wordpress/wp-content/uploads/2008/03/portuduck.jpg" alt="Duck in Portugal" /> I&#8217;m from the US; he&#8217;s from Finland; and we were both in Portugal on business.  We&#8217;d taken a break from work to take a walking tour in the mild weather.  I&#8217;d already told him how my youngest daughter had <a title="had declared the ubiquitousness of water fowl" href="http://www.testobsessed.com/2007/02/14/theres-always-a-duck/" id="i5dp">had declared the ubiquitousness of water fowl</a>.  As we were walking, I spotted a duck.  I thought he would appreciate the joke.</p>
<p>&#8220;That&#8217;s not a duck,&#8221; he replied.</p>
<p>&#8220;Yes it is,&#8221; I said.</p>
<p>&#8220;No, it&#8217;s not,&#8221; he replied.</p>
<p>It occurred to me that maybe ducks in Finland look different.  &#8220;OK,&#8221; I said.  &#8220;If that&#8217;s not a duck, what does a duck look like?&#8221;</p>
<p>&#8220;White,&#8221; he said.  &#8220;And bigger.  That&#8217;s not a duck, it&#8217;s a <i>sorsa</i>,&#8221; he gave me the Finnish name.</p>
<p>Certainly, the duck we were looking at was not white.  It had the colorful markings of a male mallard.  &#8220;Right,&#8221; I said.  &#8220;There are white ducks and colored ducks.  But they&#8217;re both ducks.  A <i>sorsa</i> is a kind of duck, right?&#8221;</p>
<p>&#8220;No,&#8221; he insisted.  &#8220;Ducks are white and have bigger beaks than this.&#8221;</p>
<p>I began to sense that we might be talking about two entirely different things.  &#8220;Big white water bird,&#8221; I mused.  &#8220;with a bigger beak.  Do you mean a goose?&#8221;</p>
<p>As we sorted out the difference between ducks and geese and <i>sorsa</i>, it dawned on me that this English-Finnish discussion offered a good example of the difficulty in sorting out a common language on software projects. </p>
<p>I started remembering all the conversations in which someone used an overloaded term like &#8220;server.&#8221;  Or &#8220;test.&#8221;  Or &#8220;done.&#8221;</p>
<p>For the record, it turns out that we were, indeed, looking at a <i><a title="sorsa" href="http://fi.wikipedia.org/wiki/Sorsat" id="av32">sorsa</a></i>.  And it was, indeed, what I would call a Mallard duck in English. </p>
<p>But just contemplating how much effort it took to establish this simple basis of understanding about something we could see and hear, I am astonished that business stakeholders and technologists on software projects - something truly intangible - are ever able to achieve any kind of shared understanding about what we&#8217;re building and how it should function.</p>
]]></content:encoded>
			<wfw:commentRss>http://testobsessed.com/2008/03/07/a-duck-by-any-other-name/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
