<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1359885315589854787</id><updated>2011-10-09T23:35:20.620-04:00</updated><title type='text'>Autonomicon</title><subtitle type='html'>Thoughts on software automation and software demonstrations.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>85</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-3239425314973037293</id><published>2011-01-07T21:20:00.000-05:00</published><updated>2011-01-07T21:20:42.113-05:00</updated><title type='text'>Helpful Tool: PasteCopy</title><content type='html'>Often when I'm giving demos, I'll need to type in a sentence or two into a text field. This is no big deal, I can type pretty fast, but we all have those days when we can't type to save our lives. And invariably, this happens when lots of people are watching. To help avoid this, I've been using a freeware clipboard manager called PasteCopy. This lets me store off sentences that I will use in demos, URLs to send to participants who are in webinars, or paths to files that I commonly need. I keep PasteCopy open on another monitor, and when I need to get at one of the stored strings, I just pop over to that monitor, click on the desired string in PasteCopy, and then it's ready to be pasted into the desired field. It works beautifully and has saved me lord knows how many incorrect keystrokes.&lt;br /&gt;&lt;br /&gt;PasteCopy installs in about 3 seconds and has a very light footprint. You can check it out at &lt;a href="http://www.pastecopy.net/"&gt;http://www.pastecopy.net/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-3239425314973037293?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/3239425314973037293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2011/01/helpful-tool-pastecopy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/3239425314973037293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/3239425314973037293'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2011/01/helpful-tool-pastecopy.html' title='Helpful Tool: PasteCopy'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-1136592519214477441</id><published>2010-08-30T12:42:00.002-04:00</published><updated>2010-08-30T12:52:35.924-04:00</updated><title type='text'>Alchemy, Not Magic</title><content type='html'>I once had a conversation with a tester that went something like this -&lt;br /&gt;&lt;br /&gt;"We need the automation to be able to recover from errors. I don't know what those errors will be, or what steps will need to be performed to address those errors, but the upshot is that the automation needs to get the AUT back into a good state before continuing."&lt;br /&gt;&lt;br /&gt;I explained that in order to build this kind of logic, at least some knowledge was needed of what constituted an error, and how the error was to be addressed. They rather heatedly told me that if the automation couldn't "just know" that it was not going to be helpful.&lt;br /&gt;&lt;br /&gt;Here's the thing. We need to set reasonable expectations for test automation. Automation can make testing easier, and can speed up tedious processes. However, automation is not some magical, omniscient force that can interpolate how your application works and how to best recover from problems. If it could, we wouldn't need testers or developers - all our software would write and test itself. Anyone who tells you that automated tests will just magically resolve themselves with no direction on your part (they might be cute and use the word "automagically" - watch out for those people) is someone who's selling something, or is clueless.&lt;br /&gt;&lt;br /&gt;Automation is a tool. It's not magic. It's not smarter than you are. It's only as smart as you make it, and it can only do what you tell it. Your automation can never, and will never "just know" how to test your application. The computer is a stupid box. It's just fast. If you don't tell it what to do, it will do nothing, although it will do nothing very quickly.&lt;br /&gt;&lt;br /&gt;In short, automation is not magic, it's more like alchemy. It can be complicated at times, but the end result of making the testing process smoother/easier/faster is akin to turning lead into gold.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-1136592519214477441?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/1136592519214477441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2010/08/alchemy-not-magic.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/1136592519214477441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/1136592519214477441'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2010/08/alchemy-not-magic.html' title='Alchemy, Not Magic'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-5451089491936975740</id><published>2010-08-20T07:46:00.004-04:00</published><updated>2010-08-20T08:06:33.768-04:00</updated><title type='text'>The Julia Child Approach to Demos</title><content type='html'>When you're giving live demos, it's always handy to have everything you need for that demo ready to go. Have powerpoint already loaded, have the application you're demo-ing already loaded, and have anything else ready to go, too. If you'll need to show a calculation, have Calculator already running. If you'll need to write some code in Visual Studio, have that already running &amp;amp; open to a blank project. The idea here is that your audience should never have to watch a splash screen or "Loading" dialog. Before I run a demo, I launch all the apps I need, and organize them on the Windows task bar so that they're in the order that I'll use them. Then I just click right through the task bar as I go from one activity to the next.&lt;br /&gt;&lt;br /&gt;Additionally, if you're going to demo any feature that takes longer than 10 seconds to complete, consider having a "before &amp;amp; after" of that feature, where you walk through the steps needed to perform the action (the before), and then have a finished version of the feature ready to show off (the after). &lt;br /&gt;&lt;br /&gt;(A note here - always tell your audience about how much time the operation should take to complete. You don't want to misrepresent how fast your application works, that's a sure-fire way to lose credibility in your customers' eyes. I usually say something like "This operation usually takes about 5 minutes to complete, so instead of making you stare at my hourglass for that much time, I've already got a finished sample right here")&lt;br /&gt;&lt;br /&gt;I call this the Julia Child approach, because I was first exposed to it while watching Julia Child's cooking show back when I was a kid. Julia would have all her ingredients and utensils ready, so she'd smoothly go from one prep task to the next. For example, if she needed to chop some tomatoes, she already had the tomatoes washed, and there was a cutting board and a knife right there. You didn't need to watch her hunt around for anything, she had it ready to go. Then she'd walk you through all the steps to make a cake, then put that cake in the oven. Then she'd move over to a second oven, and remove a cake that had finished cooking. It was a great way to show both the preparation and the finished product, without needing a lot of filler in the presentation.&lt;br /&gt;&lt;br /&gt;So having all the pieces of your demo ready to go will make the presentation go smoother, and having a "before &amp;amp; after" prevents awkward lapses in the presentation. All in all, this approach helps ensure a clean, smooth presentation that your customers will eat up. Bon Appetit!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-5451089491936975740?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/5451089491936975740/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2010/08/julia-child-approach-to-demos.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/5451089491936975740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/5451089491936975740'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2010/08/julia-child-approach-to-demos.html' title='The Julia Child Approach to Demos'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-2861740961498521344</id><published>2010-08-13T10:08:00.002-04:00</published><updated>2010-08-13T10:17:08.620-04:00</updated><title type='text'>Automate in Straight Lines</title><content type='html'>Everyone's heard the adage "the shortest distance between two points is a straight line." This holds true in test automation as well. I recently spoke with someone who was struggling to get a UI automation tool to run against an application. This lady had no experience with test automation before, and the application was not "automation friendly." As such, she had spent almost an entire week struggling to get tests running.&lt;br /&gt;&lt;br /&gt;I spoke with her on the phone for about 30 minutes, and during the course of the conversation, the intent of what she was doing came out. She was not testing the software, she was trying to populate a database with information, and this database would then be used for training purposes. She'd need to repopulate the db each time there was a class to teach. This GUI automation scenario she was trying to create would take hours to run, but she hoped she could start it on the night before a class and then have it be ready in the morning.&lt;br /&gt;&lt;br /&gt;I asked her why she didn't just write a plain old SQL script that would populate the db, then create a backup of the database and restore it each time she needed to teach a class. There was silence on the other end of the line.&lt;br /&gt;&lt;br /&gt;Look for the simple solutions. Databases can be written to directly, and then restored, over and over again. Webservices can be manipulated directly, methods can be called from dlls directly, the Windows Registry can be manipulated directly. If your intent is just to get data from point A to point B, do it in a straight line via script. Adding other layers of complexity (UIs, GUI tools, etc) is kind of like trying to go from New York City to Boston by way of Los Angeles.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-2861740961498521344?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/2861740961498521344/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2010/08/automate-in-straight-lines.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/2861740961498521344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/2861740961498521344'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2010/08/automate-in-straight-lines.html' title='Automate in Straight Lines'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-4964827845011880141</id><published>2010-06-14T12:48:00.003-04:00</published><updated>2010-06-14T20:51:24.804-04:00</updated><title type='text'>MS Office Automation</title><content type='html'>I've worked with a lot of people who have wanted to automate MS Office apps. Sometimes they're trying to just write results data out to a Word doc, other times, their company builds a plug-in to an Office app and they're trying to create automated tests for that plug-in. And they all start out by pointing a commercial record &amp;amp; playback tool at the app and clicking that red "record" button. At best, this results in tests that click on obscurely named objects, or at worst, tests that are driven exclusively by X/Y coordinates.&lt;br /&gt;&lt;br /&gt;You see, MS Office apps (Word, Powerpoint Excel, Outlook) are not record &amp;amp; playback friendly. I learned this the hard way a long time ago, and I'm hoping to spare others the same pain. You will not be able to create a reliable, robust set of MS Office tests via a record and playback tool. The only way I've found to effectively work with Office apps is via scripting. The Office object model lets you programmatically access any bit of text, cell or slide. For example, this code launches Word, opens a new document, and writes Hello:&lt;br /&gt;&lt;br /&gt;Set objWord = CreateObject("Word.Application")&lt;br /&gt;objWord.Visible = True&lt;br /&gt;Set objDoc = objWord.Documents.Add()&lt;br /&gt;objDoc.Selection.TypeText("Hello")&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If you try to do those same actions via record &amp;amp; replay, your results will be spotty at best. So when you need to work with Office apps, automate them via their object model. A little known fact is that MS ships help files with office that describe each app's object model, along with coding examples. The location of these files is [OfficeInstallDirectory]\[OfficeVersion]\1033&lt;br /&gt;The app's help files are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Word - VBAWD10.chm&lt;/li&gt;&lt;li&gt;Excel -VBAXL10.chm&lt;/li&gt;&lt;li&gt;Powerpoint - VBAPP10.chm&lt;/li&gt;&lt;/ul&gt;There's also an online version here: http://msdn.microsoft.com/en-us/library/y1xatbkd%28VS.80%29.aspx&lt;br /&gt;&lt;br /&gt;Keep these handy next time you're doing MS Office automation, and your automation efforts will be much more successful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-4964827845011880141?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/4964827845011880141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2010/06/ms-office-automation.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/4964827845011880141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/4964827845011880141'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2010/06/ms-office-automation.html' title='MS Office Automation'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-1589617140196778171</id><published>2010-06-11T09:10:00.004-04:00</published><updated>2010-06-11T09:35:39.526-04:00</updated><title type='text'>Silver Bullets and Snake Oil</title><content type='html'>After doing test automation for most of my professional life, I'm really tired of vendors claiming that automation is a silver bullet. I'm also tired of test managers claiming that automation is snake oil. Here's the thing. The silver bullet pitch ("Automate all tests with the click of a button; no coding knowledge or original thought needed") is snake oil. I've said before on this blog that if you want to automate, you need to learn how to write script. I still hold by that. So it's the vendors' claims that are the problem, not automation itself.&lt;br /&gt;&lt;br /&gt;Let's look at this using a different example - the microwave oven. The little cookbook that came with my microwave claims the microwave can cook any food just as good as the traditional methods. But that's really not true. While the microwave can cook just about everything, the food comes out different. Chicken comes out rubbery, for example. The button marked Popcorn cooks popcorn for too long, and often burns it. There's a recipe for cooking a small turkey, but I'm not courageous enough to try that.&lt;br /&gt;&lt;br /&gt;Now, the cookbook is making a silver bullet pitch. "The microwave cooks everything just as good as traditional means" And, based on my experience, that's not the case. However, does that mean that I should throw the microwave away, and denounce all microwave ovens as worthless? No. It means I still use the regular oven to cook chicken, and I manually key in how long to cook the popcorn. In short, I adapt the microwave to my needs and use it for what it does well. I still have a grill, a deep fryer, an oven and a stovetop. I microwave what's appropriate for me to microwave and that's it.&lt;br /&gt;&lt;br /&gt;Same thing for automation. I would never recommend (or even try) to automate 100% of your tests. I would recommend trying to automate tasks that are difficult or impossible to perform by hand. I would recommend automating "prep" tasks, like loading a database, building strings for use in boundary testing. I would recommend using tools to automatically parse log files for errors, rather than trying to read them by hand. The application of automation is the important thing here; you need to be smart about what makes sense to automate, just like you need to be smart about what you try to cook in the microwave.&lt;br /&gt;&lt;br /&gt;Silver bullets are for werewolves. Snake oil is for 19th century hucksters. Automation is neither. Automation is for testers and developers who want to put in some effort to speed up their existing processes. It's just a tool. That's all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-1589617140196778171?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/1589617140196778171/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2010/06/silver-bullets-and-snake-oil.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/1589617140196778171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/1589617140196778171'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2010/06/silver-bullets-and-snake-oil.html' title='Silver Bullets and Snake Oil'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-4770451638282732793</id><published>2010-06-09T15:36:00.002-04:00</published><updated>2010-06-09T15:48:43.714-04:00</updated><title type='text'>Ethics in Automation</title><content type='html'>Automation really shines when it's used to speed up a process or to address some tedious task. Unfortunately, some less than scrupulous individuals have asked me to do some things with automation in the past that are just flat out wrong. Case in point: someone once asked me to create an automated test to search on google, and then perform click throughs on a competitor's adwords. The theory was that, since the competitor had to pay each time that link was clicked,  it would cost the competitor a ton of money. I'm pretty sure that Google has some sort of mechanism set up to prevent click fraud, but the fact that someone would stoop to measures like this really pissed me off. I told that person no. Firmly.&lt;br /&gt;&lt;br /&gt;Another time, someone else asked me to write a script that would artificially inflate the number of times a particular page had been viewed. He felt that if people saw the page had a high number of views, it would seem "more interesting" to other viewers and they'd focus on it. Again, I said no. Firmly.&lt;br /&gt;&lt;br /&gt;I don't mean to go high-and-mighty, or holier-than-thou, but the fact of the matter is that unscrupulous business practices shouldn't be performed in the first place, and they sure as hell shouldn't be automated.&lt;br /&gt;&lt;br /&gt;Always make sure to use your automation powers for good, not evil.&lt;br /&gt;&lt;br /&gt;And now I'll get off my soapbox.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-4770451638282732793?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/4770451638282732793/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2010/06/ethics-in-automation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/4770451638282732793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/4770451638282732793'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2010/06/ethics-in-automation.html' title='Ethics in Automation'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-3721497701164067823</id><published>2010-06-03T08:07:00.001-04:00</published><updated>2010-06-03T08:09:26.272-04:00</updated><title type='text'>Cloud vs Traditional: Which Load Test Approach is Better?</title><content type='html'>Hi All&lt;br /&gt;&lt;br /&gt;I'd like to get your opinions on cloud based load testing tools like LoadStorm and BrowserMob vs more traditional tools like LoadRunner and WebPerformance. What advantage do the cloud tools provide that the traditional ones don't, and vice versa?&lt;br /&gt;&lt;br /&gt;Here's my background - I was taught how to do load testing with LoadRunner. My mentor said that you should always set up an isolated network and run tests in that environment to get your app's code running well. Once that's done, move the code to a staging/production environment and then generate load from outside the network against your production environment to see how the hardware responds.&lt;br /&gt;&lt;br /&gt;Is this still the recommended way of doing things? If so, it seems that the cloud based tools are at a disadvantage because they can't test against an isolated network. Or, can the results generated by the cloud based tools easily identify where the performance bottlenecks are?&lt;br /&gt;&lt;br /&gt;Please sound off in the comments.&lt;br /&gt;&lt;br /&gt;Thanks&lt;br /&gt;Nick&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-3721497701164067823?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/3721497701164067823/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2010/06/cloud-vs-traditional-which-load-test.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/3721497701164067823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/3721497701164067823'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2010/06/cloud-vs-traditional-which-load-test.html' title='Cloud vs Traditional: Which Load Test Approach is Better?'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-70977889467708585</id><published>2010-05-27T09:06:00.002-04:00</published><updated>2010-05-27T09:48:18.666-04:00</updated><title type='text'>Just Get On the Bike</title><content type='html'>There's an old story that goes something like this:&lt;br /&gt;&lt;br /&gt;Little Timmy is very late to school one morning. It's 10:30, and the teacher looks out the classroom window and sees Timmy just getting into the schoolyard. He's pushing his bicycle and looks very hot and out of breath. When he gets into the classroom, the teacher says:&lt;br /&gt;"Timmy, why are you so late to school?"&lt;br /&gt;Timmy replies, "Sorry teacher, I had to push my bicycle all the way here."&lt;br /&gt;The teacher, confused, says, "Why didn't you ride your bicycle?"&lt;br /&gt;Timmy replies, "Teacher, I was running so late this morning that I didn't have time to get on the bike."&lt;br /&gt;&lt;br /&gt;I hear this kind argument all the time when people put off automating. "I have too much to do," they say. "When this release settles down, I'll have time then."&lt;br /&gt;&lt;br /&gt;Bullshit.&lt;br /&gt;&lt;br /&gt;Folks, I hate to say it like this, but you're never going to have that perfect moment where you do nothing but automate. If you're a tester, then there's always something that will need testing. You have to find ways to work automation development in to your regular day. If automation is something that you throw to the back burner every time your workload heats up, you'll never get any benefits from automation.&lt;br /&gt;&lt;br /&gt;Sometimes this means explaining to your manager that automation can't be a side project and should be focused on sooner rather than later. Sometimes it means recruiting a developer to help get you jumpstarted, so you can get a test framework built up quicker. Sometimes it means hiring another person whose primary responsibility will be test automation.&lt;br /&gt;&lt;br /&gt;Point is, if you're always waiting for that perfect moment, you'll never get anything automated. So do *something*. Even if it's just a small test to start with, that's something you can build on. You won't get a comprehensive set of automated tests overnight; so get one test automated/one helpful tool written and then add to that. Even if you only automate one new test a week, over the course of a month, that's 4 tests you don't have to run by hand. Or, if you're trying to build a tool that will augment manual testing, get that to your testers as soon as it can do something useful, then continue adding features. The time savings will get more and more significant as you go along.&lt;br /&gt;&lt;br /&gt;So, long story short, just get on the bike!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-70977889467708585?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/70977889467708585/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2010/05/just-get-on-bike.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/70977889467708585'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/70977889467708585'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2010/05/just-get-on-bike.html' title='Just Get On the Bike'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-1944340599424026311</id><published>2010-05-10T10:45:00.006-04:00</published><updated>2010-05-10T11:56:54.984-04:00</updated><title type='text'>TUU: The Missing Metric</title><content type='html'>Before taking the plunge into test automation, many managers want to know how long until they see an ROI (return on investment). In the case of a commercial tool, some vendors will actually send out an Excel spreadsheet with formulas that let you plug in the amount you pay a tester per hour, and then the spreadsheet calculates how much it costs to find that bug during the test phase vs how much it costs to find it once the app has gone to the customer.&lt;br /&gt;&lt;br /&gt;While I certainly understand the need to justify an expense, I think ROI by itself is the wrong way to look at test automation, because it puts the focus on dollars rather than on utility. If you buy a $9,000 automation tool, and pay your tester $40/hour, then using the ROI approach, your test automation tool needs to run 225 hours' worth of tests before your see an ROI. If you've bought multiple copies of that tool, then you need to multiply both the total cost and the total number of hours by the number of copies you purchased. So if you bought 5 copies of the test tool, that's $45,000 you spent, and you need to run 1,125 hours' worth of tests to break even. "That's too much time or money", someone says. "Look at a cheaper tool."&lt;br /&gt;&lt;br /&gt;What I don't see people consider is how long it will take before the automation is doing something productive. So let's say that you're considering spending money on a commercial tool. Instead of saying "How long until I see an ROI", ask "How long until this lets me do something else?" Automation is implemented so that you don't have to do the same tasks over and over; you automate to get the computer doing regression tests so you can focus on other test activities. How long will it take you to create that first smoke test? How long until you are freed up to do the new tests? Let's say it takes you 2 work days to get your smoke test up and running. That means that two days after implementing automation, you start getting some of your time back. That's how long until the automation is doing something useful. I call this Time Until Useful (TUU).&lt;br /&gt;&lt;br /&gt;I think that 16 hours until your automation is doing something useful is a lot more pallatable than 1,125 hours until your automation justifies its existence. Plus, now you're working and finding bugs that you didn't have time to find before. I've never seen that time savings or "new-bugs-found-during-exploratory-testing-while-the-automation-runs-a-smoketest" line item included on an ROI sheet.&lt;br /&gt;&lt;br /&gt;If you're considering open source tools, TUU is much more a natural metric. Freed from cost concerns, a test team is given the chance to look at a bunch of tools and pick the one that's going to let them get the most done the fastest. I've seen teams where managers say 'oh, you're going open source?' and then promptly go deaf because they think that since there's no cost involved, they don't need to justify any expenses, therefore they don't care. Thing is, open source tools will have a bit of a learning curve as well, and you want to make sure that your team selects one that meets their needs and still has a good TUU. If the tool is free, but it takes 2 months before it's doing anything of value, is that worthwhile? No, you'd want them to look at a different open source tool that's going to do something sooner than that.&lt;br /&gt;&lt;br /&gt;TUU is a metric that should be considered with the same weight (or maybe with greater weight) as ROI. Whether you're going commercial or open source, you should always consider how long it will be until the automation is doing something useful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-1944340599424026311?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/1944340599424026311/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2010/05/tuu-missing-metric.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/1944340599424026311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/1944340599424026311'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2010/05/tuu-missing-metric.html' title='TUU: The Missing Metric'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-7248990203987788386</id><published>2010-05-07T12:04:00.007-04:00</published><updated>2010-05-07T12:37:05.912-04:00</updated><title type='text'>String Generator</title><content type='html'>If you've ever had to do boundary testing, you probably did what my co-workers and I used to do. You need a 400 character string, so you open MS Word, hold down the 'x' key for a few seconds, and then use the word count feature to see how many characters you've got. If you've got too many, you delete some. If you don't have enough, you mash 'x' for a few more seconds. Later, rinse and repeat until you've got it right.&lt;br /&gt;&lt;br /&gt;Some folks would even remember to save those word files for future use, but more often than not we closed them without thinking about it. (This was usually followed by the comment "Ah, crap, I shoulda saved that...")&lt;br /&gt;&lt;br /&gt;To help take some of the sting out of this, I wrote a string generator application. It lets users generate strings of predefined lengths, and then automatically puts those strings on the clipboard so that they can be pasted into fields.&lt;br /&gt;&lt;br /&gt;I wanted an easy way to know that a field could accept that number of characters, so I always had the string end with a capital Z. For example, if you needed a 10 character string, it would generate aaaaaaaaaZ. Then you'd paste that into the desired field, and if you didn't see the 'Z', you knew the field was truncating the data that was entered.&lt;br /&gt;&lt;br /&gt;The app I wrote looked like this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-ghIFmXMsLg/S-Q7bvwqunI/AAAAAAAAAAU/-w5rTsoTFaQ/s1600/stringGen.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 182px;" src="http://3.bp.blogspot.com/_-ghIFmXMsLg/S-Q7bvwqunI/AAAAAAAAAAU/-w5rTsoTFaQ/s320/stringGen.png" alt="" id="BLOGGER_PHOTO_ID_5468561195397724786" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Each of the buttons you see on the left would automatically generate a string of the specified length. If you needed a string of a different length, you could enter that length in the box next to the custom button.&lt;br /&gt;&lt;br /&gt;The string generation itself was handled by this code:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;private string prgGenerateString(int intLen)&lt;br /&gt; {&lt;br /&gt;  StringBuilder MyStringBuilder = new StringBuilder();&lt;br /&gt;  MyStringBuilder.Capacity = intLen;&lt;br /&gt;  for (int i = 1;i&amp;lt;intlen;i++)&lt;br /&gt;  {&lt;br /&gt;      MyStringBuilder.Append("a");&lt;br /&gt;  }&lt;br /&gt;  MyStringBuilder.Append("Z");&lt;br /&gt;  return MyStringBuilder.ToString();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;private void prgGenerateStatusMessage(int intLen)&lt;br /&gt; {&lt;br /&gt;  lblStatus.Text = intLen.ToString() + " character string placed on clipboard.";&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;private void prgCreateStringAndPost(int intLen)&lt;br /&gt; {&lt;br /&gt;  try&lt;br /&gt;  {&lt;br /&gt;   string txtValue = prgGenerateString(intLen);&lt;br /&gt;   txtPreview.Text = txtValue;&lt;br /&gt;   prgGenerateStatusMessage(intLen);&lt;br /&gt;   Clipboard.SetDataObject(txtValue);&lt;br /&gt;  }&lt;br /&gt;  catch(Exception except)&lt;br /&gt;  {&lt;br /&gt;   lblStatus.Text = except.Message;&lt;br /&gt;  }   &lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;Each button on the form had code like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  private void cmd129_Click(object sender, System.EventArgs e)&lt;br /&gt;  {&lt;br /&gt;      prgCreateStringAndPost(129);&lt;br /&gt;  }     &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And here's the code for the custom button:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  private void cmdCustom_Click(object sender, System.EventArgs e)&lt;br /&gt;  {&lt;br /&gt;      if (txtCustomLength.Text != "")&lt;br /&gt;      {&lt;br /&gt;          try&lt;br /&gt;          {&lt;br /&gt;              int val = Convert.ToInt32(txtCustomLength.Text);&lt;br /&gt;              prgCreateStringAndPost(val);&lt;br /&gt;          }&lt;br /&gt;&lt;br /&gt;          catch (Exception except)&lt;br /&gt;          {&lt;br /&gt;              lblStatus.Text = except.Message;&lt;br /&gt;          }&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      else&lt;br /&gt;          MessageBox.Show("Please enter a value in the box next to the Custom button");&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Feel free to take this code and build your own string generator. (If the source code got truncated in the post, just go to View Source in your browser and you can copy and paste from there)&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-7248990203987788386?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/7248990203987788386/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2010/05/string-generator.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/7248990203987788386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/7248990203987788386'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2010/05/string-generator.html' title='String Generator'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_-ghIFmXMsLg/S-Q7bvwqunI/AAAAAAAAAAU/-w5rTsoTFaQ/s72-c/stringGen.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-7852387549552498190</id><published>2010-04-30T09:47:00.006-04:00</published><updated>2010-04-30T10:05:57.210-04:00</updated><title type='text'>Time Diffs</title><content type='html'>During one cycle of performance testing, the tool I was using only logged a test's start and end time. For some reason, it didn't log duration. So you'd see start time 10:34:23 and end time 10:39:00. Now, in the case of a short test, say, one that ran in 15 or 20 mins, that wasn't a big deal, it's easy to do that kind of math in your head. But when the durations were like this: start time 10:32:23 and the end time was 13:18:54, it would take a minute or so for me to calculate how long that was.&lt;br /&gt;&lt;br /&gt;This was a frustrating experience, and one that was prone to human error. So I wrote a little C# app that allowed me to enter two times and see the difference between them. This let me note the test durations much faster and more precisely. To build your own time diff tool, fire up Visual Studio and create a form that looks like this:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-ghIFmXMsLg/S9rhIImvetI/AAAAAAAAAAM/LBMMNvNwwLc/s1600/timediff.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 108px;" src="http://4.bp.blogspot.com/_-ghIFmXMsLg/S9rhIImvetI/AAAAAAAAAAM/LBMMNvNwwLc/s320/timediff.png" alt="" id="BLOGGER_PHOTO_ID_5465928627632700114" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br /&gt;For reference, I named the Start Time field txtStart, the End time field txtStop, the Calculate button is cmdCalculate, and the Clear button is cmdClear. I was lazy and left the label that you see as 00:00:00 as label1.&lt;br /&gt;&lt;br /&gt;Now, use the following code for the calculate button:&lt;br /&gt;      &lt;pre&gt;private void cmdCalculate_Click(object sender, EventArgs e)&lt;br /&gt;      {&lt;br /&gt;          if ((txtStart.Text != "") &amp;amp;&amp;amp; (txtStop.Text!=""))&lt;br /&gt;          {&lt;br /&gt;          DateTime start = DateTime.Parse(txtStart.Text);&lt;br /&gt;          DateTime stop = DateTime.Parse(txtStop.Text);&lt;br /&gt;          TimeSpan duration = new TimeSpan();&lt;br /&gt;          duration = stop - start;&lt;br /&gt;          label1.Text = duration.ToString();&lt;br /&gt;          }&lt;br /&gt;      }&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt;Here's the code for the Clear button:&lt;br /&gt;      &lt;pre&gt;private void cmdClear_Click(object sender, EventArgs e)&lt;br /&gt;      {&lt;br /&gt;          txtStart.Text = "";&lt;br /&gt;          txtStop.Text = "";&lt;br /&gt;          label1.Text = "00:00:00";&lt;br /&gt;      }     &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And that's it. You now have a little app that will calculate the differences in time for you. One thing to note here is that the app isn't intended to diff times that are greater than 24 hours, and you have to enter the times in a 24 hour clock format. So if your test ended at 2 pm, you'd enter 14:00:00.&lt;br /&gt;&lt;br /&gt;This is a nice example of creating a tool that augments manual testing. It doesn't do any testing on its own, but it does let a tester perform a given activity faster and more efficiently. Always be looking for little opportunities like this, and your testers will thank you for them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-7852387549552498190?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/7852387549552498190/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2010/04/time-diffs.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/7852387549552498190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/7852387549552498190'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2010/04/time-diffs.html' title='Time Diffs'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_-ghIFmXMsLg/S9rhIImvetI/AAAAAAAAAAM/LBMMNvNwwLc/s72-c/timediff.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-4775900226367986961</id><published>2010-04-28T12:48:00.004-04:00</published><updated>2010-04-28T13:08:35.015-04:00</updated><title type='text'>Focus on Test Approach, Not Test Tools</title><content type='html'>There's a lot of news flying around right now about how &lt;a href="http://www.nytimes.com/2010/04/27/world/27powerpoint.html"&gt;powerpoint is making us stupid&lt;/a&gt;. Thing is, I don't think this is a powerpoint problem, I think it's a people problem. Slides probably aren't the best method to communicate this information, and that certainly needs to be remedied. So it's the approach that these presenters are taking that's the problem, not powerpoint itself.&lt;br /&gt;&lt;br /&gt;This got me thinking about some of the negativity that comes up when the honeymoon period with a test automation tool ends. I've seen teams whose intent/dream/goal was to create UI automation tests via a record and playback tool. They envisioned doing a single recording and all their tests would then be able to run at the push of a button.&lt;br /&gt;&lt;br /&gt;It's a nice dream, but in order to really get the most out of your automation efforts, you really need to know what you're doing. It's impossible to automate all your tests, and quite frankly, you probably don't need to. I once worked for a manager who insisted that all bugs have an automated regression test for them. Think about that for a minute. All bugs. Every one of them. Even the ones that were citing spelling mistakes.&lt;br /&gt;&lt;br /&gt;Needless to say, that wasn't a good use of my time, and I'm pretty sure my blood pressure was in the near fatal range for a while there.&lt;br /&gt;&lt;br /&gt;When you're thinking about automation, think about what makes the most sense to automate. Smoke test? Yep. Get that going and integrate it with your build process. Regression test? Yep, but don't go crazy. Focus on the primary workflows of your application, don't try to automate a test for every bug you've ever logged. That whizbang new functionality that Sally just rolled into the build? Probably not.&lt;br /&gt;&lt;br /&gt;That whizbang new functionality probably should not be automated yet because it's UI will change, and most likely will change a lot over the course of the release cycle. Instead, use automation to augment manual and exploratory testing for this feature. Let's say that Sally's piece is a report generator that pulls data from a database. Build some automation that sets up different data in the db, allowing you to test more types of her reports more quickly. Maybe you can set up a batch file that calls out to a diff tool and compares a report from today's build to a baseline.&lt;br /&gt;&lt;br /&gt;The approach you take will largely determine your automation effort's success. Don't assume that just because you bought a record-and-playback tool that you've got test automation covered. The test tool is a dumb computer program; you're the one with the brain. Know when to employ the tools you have, when to use something else, and your testing will go much smoother.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-4775900226367986961?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/4775900226367986961/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2010/04/focus-on-test-approach-not-test-tools.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/4775900226367986961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/4775900226367986961'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2010/04/focus-on-test-approach-not-test-tools.html' title='Focus on Test Approach, Not Test Tools'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-3872331347023380786</id><published>2010-04-09T08:01:00.000-04:00</published><updated>2010-04-09T08:01:00.657-04:00</updated><title type='text'>What's in it for me?</title><content type='html'>As a presenter, that's the question you always have to be asking yourself. Imagine yourself in your audience's position - you are taking time out of your busy workday to view a demonstration. As such, you want to know how this new product or service will benefit &lt;span style="font-weight: bold;"&gt;you&lt;/span&gt;. When you first sit down to hear the presenter speak:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You do not care about the presenter's company history.&lt;/li&gt;&lt;li&gt;You do not care about the awards the presenter's company has won.&lt;/li&gt;&lt;li&gt;You do not care about the demonstrated product's history.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Yet it's amazing how many people start their presentations off with a bunch of slides that agonizingly detail those points. When I watch a demo, I want to know if a product is going to help me do my job effectively. Once I know that it will, then it might be nice to know more about the awards and company history. But that's not what's essential.&lt;br /&gt;&lt;br /&gt;The essence of the demo should show the audience how your product will solve a problem they have. Before you present, make sure you understand the audience's pain. Are they performing a tedious task that is prone to errors? Are they trying to speed up their app's performance? Do they need a better way to communicate between mulitple departments?&lt;br /&gt;&lt;br /&gt;Once you understand the problem, you can apply your product's features and show how those features turn into benefits for the audience. And that's the key - too many people will show a cool feature in their product, but not state how that feature benefits the audience. Always make sure you state the benefit - "Cool Feature X is important because it allows you to process your data 4x faster than before, which saves you a ton of time over the course of a release."&lt;br /&gt;&lt;br /&gt;By tailoring your demos so you show how to solve your audience's problems, you'll be a much more effective presenter.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-3872331347023380786?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/3872331347023380786/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2010/04/whats-in-it-for-me.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/3872331347023380786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/3872331347023380786'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2010/04/whats-in-it-for-me.html' title='What&apos;s in it for me?'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-4773476210730558030</id><published>2010-03-26T07:51:00.001-04:00</published><updated>2010-03-26T07:51:00.657-04:00</updated><title type='text'>The Power of the Mute Button</title><content type='html'>A big challenge any remote presenter faces is that it's too darned easy for an audience participant to tune out. You're already sitting in front of your computer, watching a demo, and then an important email shows up. Or an IM pops in. Or someone drops by your cube and wants to chat. So you start typing, or chatting, and if you haven't muted your phone line, that background noise is going to come through.&lt;br /&gt;&lt;br /&gt;This is frustrating for the person presenting. Imagine if this scenario played out in a conference room. There, the presenter would politely ask to table the side discussion to later, or see if it was something he could help with. If it wasn't related to the item being presented, the people could step out of the room and not distract anyone. But when you're demoing remotely, this isn't an option. In that situation, you need to be able to mute the person remotely. If you can't, you're never going to get your message across.&lt;br /&gt;&lt;br /&gt;Case in point:&lt;br /&gt;A few months back, I attended a webinar that Microsoft was putting on about Visual Studio 2010. The presenter had to stop several times to ask people to mute their lines. Now here's the thing - if you're the person who's stopped paying attention to the call and is now typing, chatting, or playing video games, you're not going to notice the presenter asking people to mute. So he had to contend with a metric-crap ton of background noise. As an audience member, it was extremely frustrating to try and filter out the noise from the presenter's message, and to be honest, I can't remember much of what he talked about.&lt;br /&gt;&lt;br /&gt;When I give remote demos, I have the ability to mute people remotely when stuff like this happens. The program I use (GoToMeeting) also has a chat window. So if there's a lot of background noise coming from a particular participant, I'll say "Ok, folks, it sounds like -insertPersonNameHere- has a really sensitive microphone that's picking up a lot of background noise. I'm going to mute them, but if they have questions, they'll be able to let me know via the chat window, and I'll unmute them."&lt;br /&gt;&lt;br /&gt;So make sure you have the ability to mute people remotely. It will only make your presentations run smoother both for yourself, and for your audience.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-4773476210730558030?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/4773476210730558030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2010/03/power-of-mute-button.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/4773476210730558030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/4773476210730558030'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2010/03/power-of-mute-button.html' title='The Power of the Mute Button'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-6467592151991582308</id><published>2010-03-19T07:26:00.000-04:00</published><updated>2010-03-19T07:26:00.777-04:00</updated><title type='text'>Learning Regular Expressions</title><content type='html'>During the course of your automated test efforts, you'll come across regular expressions. Regular expressions are an extremely powerful tool, but they're daunting when you're first learning them. I mean, really, can you just look at this line of code and tell me what it does?&lt;br /&gt;&lt;pre&gt;re = /^((4\d{3})|(5[1-5]\d{2}))[ -]?(\d{4}[ -]?){3}$|^(3[4,7]\d{2})[ -]?\d{6}[ -]?\d{5}$/;&lt;/pre&gt;The above regular expression is used to verify that a credit card number is valid. (This is also a great example of why you should comment your code.) Such an expression is very useful, but how the heck do you write these things?&lt;br /&gt;&lt;br /&gt;Fortunately the good folks over at &lt;a href="http://www.regular-expressions.info/tutorial.html"&gt;Regular-Expressions.info&lt;/a&gt; have put together a great tutorial that explains regular expressions in detail. You'll learn what regular expressions are good for and how to write them.  This is an extremely useful skill for an automator. You can perform more robust verifications with your tests, and you can use them to do other tasks like pull particular strings out of log files, or ensure email addresses are properly formatted.&lt;br /&gt;&lt;br /&gt;It's also handy to have a tool that you can use to verify your expressions are working properly. For that, I recommend Roy Osherove's &lt;a href="http://sourceforge.net/projects/regulator/"&gt;Regulator.&lt;/a&gt; It's free, and allows you to test your regular expression against a variety of inputs, allowing you to make sure you'll correctly match the patterns you're expecting.&lt;br /&gt;&lt;br /&gt;Happy Automating!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-6467592151991582308?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/6467592151991582308/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2010/03/learning-regular-expressions.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/6467592151991582308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/6467592151991582308'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2010/03/learning-regular-expressions.html' title='Learning Regular Expressions'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-3476788443171987590</id><published>2010-03-12T07:00:00.000-05:00</published><updated>2010-03-12T07:00:09.754-05:00</updated><title type='text'>Test Workflows, Not Features</title><content type='html'>So you've got a shiny new feature in your application. Maybe it's a new button, or a new context menu item. You get your new build, load it up, and click the button. It works - Huzzah! Test passed, move on to the next feature!&lt;br /&gt;&lt;br /&gt;Whoa, slow down there, chief. You've verified that the feature works in isolation, but how will your end users be using this button? Will they be clicking this button all by itself every time? Chances are there's a whole workflow that this button will be involved with, and you need to make sure you understand what that workflow is. So figure out what your users are going to do with this feature, and how they're going to do it. What other steps will they be performing before using this feature? What options could they set that would impact how this feature behaves?&lt;br /&gt;&lt;br /&gt;Only when you have a good grasp on how the new feature will actually be used can you say whether or not it's working properly. Design your test cases to reflect real world behavior, and your application will be much more solid when it ships.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-3476788443171987590?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/3476788443171987590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2010/03/test-workflows-not-features.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/3476788443171987590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/3476788443171987590'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2010/03/test-workflows-not-features.html' title='Test Workflows, Not Features'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-2765311900710053477</id><published>2010-03-05T07:10:00.000-05:00</published><updated>2010-03-05T07:10:00.069-05:00</updated><title type='text'>Forcing a BSOD</title><content type='html'>The Blue Screen of Death is one of the most unpleasant events a person can face. It ranks right up there with doing your income taxes, the unexpected visit from your least favorite relative, and hemmorhodial flare ups. However, there are times when you actually want to have a BSOD event happen. Maybe you're doing some extreme failover testing, or maybe you want to show how your software can recover from a disastrous situation.&lt;br /&gt;&lt;br /&gt;If that's the case, then you need a consistent way to force a BSOD. The steps below show you how to do it:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Go to Start&gt;Run, and launch the Registry Editor (Regedit.exe).&lt;/li&gt;&lt;li&gt;Go to HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters.&lt;/li&gt;&lt;li&gt;Go to Edit, select New | DWORD Value and name the new value CrashOnCtrlScroll.&lt;/li&gt;&lt;li&gt;Double-click the CrashOnCtrlScroll DWORD Value, type 1 in the Value Data textbox, and click OK.&lt;/li&gt;&lt;li&gt;Close the Registry Editor and restart your system.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;When you want to force a BSOD, press and hold the [Ctrl] key on the right side of your keyboard, and then press the [ScrollLock] key twice. The BSOD will appear.&lt;br /&gt;&lt;br /&gt;Note: If your system reboots instead of displaying the BSOD, you'll have to disable the Automatically Restart setting in the System Properties dialog box. To do so, follow these steps:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Press [Windows]-Break.&lt;/li&gt;&lt;li&gt;Select the Advanced tab.&lt;/li&gt;&lt;li&gt;Click the Settings button in the Startup And Recovery panel.&lt;/li&gt;&lt;li&gt;Clear the Automatically Restart check box in the System Failure panel.&lt;/li&gt;&lt;li&gt;Click OK twice.&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-2765311900710053477?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/2765311900710053477/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2010/03/forcing-bsod.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/2765311900710053477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/2765311900710053477'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2010/03/forcing-bsod.html' title='Forcing a BSOD'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-5593221341141099106</id><published>2010-02-26T08:37:00.005-05:00</published><updated>2010-02-26T09:10:32.381-05:00</updated><title type='text'>Intepreter</title><content type='html'>In the movie "The Fifth Element" Bruce Willis turns to another character and says, "Lady, I only speak two languages - English and Bad English."&lt;br /&gt;&lt;br /&gt;And those are exactly the two languages we all need to speak in order to succeed, whether we're testers, developers, sales people or executives. The first is to ensure that we can communicate our ideas clearly and effectively to our audiences. The second is so we can understand and interpret what our customers, co-workers, and others are saying.&lt;br /&gt;&lt;br /&gt;Now understand, when I say Bad English, I'm not referring to people who use dangling modifiers, end sentences with prepositions, or any of the other Grammatical Cardinal Sins that your 10th grade teacher warned you about. I'm refering to the rambling stream of consciousness email messages that some people send; the people who speak only in acronyms; the people who use obscure regional slang. In short, I'm saying you need to speak the language of the people who *can't* communicate effectively, so that you yourself *can*.&lt;br /&gt;&lt;br /&gt;If you can read a confusing email message, interpret it correctly, clarify it, and then re-communicate it, you'll be able to help others get their messages across, and you'll be able to get your own messages across more effectively because you'll understand how these people think. How many times during a sales cycle or a development cycle have you seen other people bounce emails back and forth, never quite getting their points across, because they weren't speaking each other's languages? I've seen that more times than I can count, and it's a frustrating experience.&lt;br /&gt;&lt;br /&gt;So how do you start becoming an interpreter of Bad English? For starters, you need to understand the context of the user's message. What feature or service are they talking about? Are there keywords in their message that might shed some light on what they're looking to do? Put the message in your own words, using the simplest possible language. Once you've done that, run it by the original sender to make sure you've understood correctly. If they say yes, great. If they say no, they'll elaborate on their situation. Don't worry about getting it right the first time; people will appreciate that you're trying to help them.&lt;br /&gt;&lt;br /&gt;There are tons of reference materials out there on how to communicate effectively - just poke around on Amazon. If you want examples of Bad English, just ask your support team to show you the messages they receive every day. It's amazing how little detail or thought people will put into a message that's asking for help. It will show you how your users think, and that will help you communicate more effectively with them.&lt;br /&gt;&lt;br /&gt;This same principal applies to any actual language - French and Bad French, Spanish and Bad Spanish, etc. The important thing is that you learn to understand what people are saying, and are able to respond to them. The other piece to this is that you're able to effectively communicate and convey your own ideas. Once you can do that, you're one step farther on the path to success in your field.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-5593221341141099106?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/5593221341141099106/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2010/02/intepreter.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/5593221341141099106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/5593221341141099106'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2010/02/intepreter.html' title='Intepreter'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-8649169555280816606</id><published>2010-02-19T12:13:00.002-05:00</published><updated>2010-02-26T12:02:27.507-05:00</updated><title type='text'>Perfomance Testing 101 - 4</title><content type='html'>The last thing I want to talk for performance testing about is tools.  There are a lot of great tools out there, both commercial and open source. Do some Googling to see what's available, and what other people think of those tools.&lt;br /&gt;&lt;br /&gt;Spend some time evaluating tools before you make a decision. Make sure that the tools can provide the information you need in the format you want before you pull the trigger.&lt;br /&gt;&lt;br /&gt;While you're running your load tests, you're going to need to keep tabs on your server's behavior. Make sure that the tool you're working with can monitor the server's resources as unobtrusively as possible. If your tool of choice doesn't have server monitoring capabilities, then you can use a tool built into Windows called Perfmon. Perfmon lets you keep tabs on many things, but at the miniumum, you'll want to track CPUUsage, Available MBytes (the total amount of RAM available on the system), Bytes Sent and Bytes received. This will give you a flavor for how your system's doing overall. You can also track items related to SQL databases or the .NET framework, so look through the list of what's available and see what meets your needs.&lt;br /&gt;&lt;br /&gt;As you can see, there's a lot involved with performance testing, and these posts have just touched the surface.  The thing to remember here is that performance testing is *very* different from functional testing. You'll need to learn the difference between a 302 and a 304 http return code. You'll need to understand what parts of your application uses system resources and why. If you've never done performance testing, be ready for a pretty steep learning curve. Make sure you budget time, whether it's on or off the clock, to learn as much as you can.&lt;br /&gt;&lt;br /&gt;I'm not a performance testing expert by any means, so now I'll point you to the people who are :)&lt;br /&gt;&lt;br /&gt;Corey Goldberg has a great blog and builds performance testing tools. Definitely check him out:&lt;br /&gt;http://coreygoldberg.blogspot.com/&lt;br /&gt;Twitter: &lt;a href="http://www.twitter.com/cgoldberg"&gt;@cgoldberg&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Scott Barber is a perfomance testing guru:&lt;br /&gt;http://www.perftestplus.com/scott_blog.php&lt;br /&gt;&lt;br /&gt;Bob Dugan is an extremely smart performance tester and a great guy to work with:&lt;br /&gt;http://www.stonehill.edu/x8127.xml&lt;br /&gt;&lt;br /&gt;Here are a couple of helpful books on performance testing:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Performance Solutions: A Practical Guide to Creating Responsive, Scalable Software&lt;/span&gt;&lt;br /&gt;http://www.amazon.com/Performance-Solutions-Practical-Creating-Responsive/dp/0201722291&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Performance Testing Microsoft .NET Web Applications &lt;/span&gt;&lt;br /&gt;http://www.amazon.com/Performance-Testing-Microsoft-Applications-Pro-Developer/dp/0735615381/ref=sr_1_2?ie=UTF8&amp;amp;s=books&amp;amp;qid=1266416753&amp;amp;sr=8-2-spell&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-8649169555280816606?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/8649169555280816606/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2010/02/perfomance-testing-101-4.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/8649169555280816606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/8649169555280816606'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2010/02/perfomance-testing-101-4.html' title='Perfomance Testing 101 - 4'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-1568579022762072622</id><published>2010-02-12T08:30:00.003-05:00</published><updated>2010-02-12T08:44:49.748-05:00</updated><title type='text'>Performance Testing 101 - 3</title><content type='html'>Now that we've talked about scenarios, the next thing I want to discuss is your performance testing environment.&lt;br /&gt;&lt;br /&gt;Your environment should be an isolated, standalone network. All "normal" network activities like virus scans, automatic system updates and backups should be disabled. You don't want anything running that could skew your test results. Now, some people may question this, saying it's not a "real world" scenario. At this point, you're trying to see how fast your system can perform under the absolute best conditions. It's a way to see, "ok, we are absolutely positive we can handle this number of transactions/second." My experience with this has been if you have other things running, and the numbers come back bad, people will immediately jump on that as the cause. "Oh, you had a virus scanner running - that's probably messing up the results. Uninstall the scanner and run the tests again" If your tests take days to run, that's not what you want to hear, especially if the test results come back the same as they were before.&lt;br /&gt;&lt;br /&gt;Having your tests on an isolated network also ensures that normal day to day traffic isn't skewing your results. I once had four hours' worth of testing negated because someone three cubes down started downloading MSDN disks. I wound up having to do my tests at night after everyone had gone home in order to ensure there wasn't any rogue traffic. Again, having an isolated network will save you a lot of testing time and frustration in the long run.&lt;br /&gt;&lt;br /&gt;The other thing to keep in mind is that your tests systems should match up to what you'll be using in production. So whatever hardware your system will run in the real world is what you should be testing with. Some IT folks balk at this, citing cost as a problem. Thing is, there are issues you won't be able to find if you're just testing with a bunch of hand-me-down systems. If you're not running on a box that has the same type of processor, how will you know if you're taking full advantage of that processor's architecture? This extends beyond just the systems themselves. Switches, NICs, even the network cable involved can impact your tests' performance. Don't fall into the trap of "well, we'll be using better hardware in the field, so performance will be better", because it might not.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-1568579022762072622?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/1568579022762072622/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2010/02/performance-testing-101-3.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/1568579022762072622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/1568579022762072622'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2010/02/performance-testing-101-3.html' title='Performance Testing 101 - 3'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-1549496425629625938</id><published>2010-02-05T07:56:00.000-05:00</published><updated>2010-02-05T07:56:00.282-05:00</updated><title type='text'>Performance Testing 101 - 2</title><content type='html'>Ok, so now that we've taken care of terminology and gotten our performance baselines, it's time to start thinking about configuring our scenarios. This is where you figure out how many people will be performing a given action simultaneously. Again, if you are testing a pre-existing website, you can go through your web server's logs to see how many people typically access a given page at a time.&lt;br /&gt;&lt;br /&gt;If you're testing a never-before released site, though, this part gets tricky. You'll need to make some educated guesses around your user's behavior. Let's say we're testing an e-commerce site, and we're going to roll it out to 1,000 users. Let's further assume that these users are equally divided between the east and west coasts of the USA (500 on each coast). For test cases, we want to perform logins, searches, and purchases.&lt;br /&gt;&lt;br /&gt;Now, the knee-jerk reaction is to say that since you have 1,000 users, your system should be able to handle 1,000 simultaneous logins. That may be true, but is it a realistic scenario? In the real world, your users are separated by time zones, some of them may not be interested in purchasing a product today, some may be on vacation, some of them will only shop while they're on lunch break, and others will only shop at night after their kids have gone to bed. So in considering this, you may want to start out verifying that your system can handle  250 or 300 users logging in simultaneously. Then build up from there.&lt;br /&gt;&lt;br /&gt;The next thing to consider is the frequency of the actions. Each user logs into the site once, but once they're in, how many times do they perform a search? If you go to Amazon, how many products do you search for in a single session? Between physical books, eBooks, movies and toys, I'd say I probably search for 2 or 3 items each time I log in. So that means searches are performed 2 or 3 times as often as logins. So if you're planning on having 250 - 300 users login to start with, then you're looking at 500 - 900 searches. Also consider the purchase scenario - not everyone that logs in and searches is going to buy something; Maybe half of the people, or a third of the people who login will actually make a purchase. So you're looking at 75 - 150 purchases for a scenario there.&lt;br /&gt;&lt;br /&gt;So take some time and think about your end user's behavior when defining scenarios for load testing - don't make it strictly a numbers game.&lt;br /&gt;&lt;br /&gt;Next week, we'll talk about your performance testing environment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-1549496425629625938?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/1549496425629625938/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2010/02/performance-testing-101-2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/1549496425629625938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/1549496425629625938'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2010/02/performance-testing-101-2.html' title='Performance Testing 101 - 2'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-6298203337849360787</id><published>2010-01-29T06:08:00.000-05:00</published><updated>2010-01-28T12:00:31.491-05:00</updated><title type='text'>Performance Testing 101 - 1</title><content type='html'>I've seen a lot of people jump into performance testing recently, and they've all encountered similar problems. So each Friday for the next few weeks, I'm going to post a few tips that will hopefully help folks out.&lt;br /&gt;&lt;br /&gt;Let's start out with some basic terminology here. Performance testing is making sure that your app responds in a timely fashion. Note that this does not mean that you need to have hundreds or thousands of virtual users running in order to do a simple performance test. Consider this scenario: Let's say I'm testing a calculator application. I entered 2+2, and then pressed the = button, and got 4. From a functional testing standpoint, the test passed. However, if it took the calculator 30 seconds to return the answer, then we have a performance problem. That's all performance testing is - making sure your app responds within a user's expectations.&lt;br /&gt;&lt;br /&gt;Load testing is what most people are thinking of when they refer to "performance testing." This is where you're expecting that 500 people will be performing a given activity on a web site, so you use a tool to emulate 500 people perfoming that activity. So load testing is ensuring that an application responds in a timely fashion while an expected number of people are working on it.&lt;br /&gt;&lt;br /&gt;Stress testing is where you try to find the breaking point of your application. So if you've established that your system can handle the expected 500 users, can it handle 600? 700? More? This is where you push the system to its limits and find out what number of users make it fall over and die.&lt;br /&gt;&lt;br /&gt;Ok, so now that the terms are out of the way, the first thing you should do is figure out the scenarios you want to performance test. If you're testing a site that's already live, you can cull through your web server logs to find out which pages are being hit most frequently. Then build your scenarios based on your actual customer behavior.&lt;br /&gt;&lt;br /&gt;If you're testing a site that hasn't been released yet, then think of those activities that your users will perform most frequently. For example, if you're testing a website like Amazon, your most frequent scenarios will be things like searching for books, logging into the site, adding books to the cart and processing orders. Start with those, and then consider other activities. Remember, the point of load testing is not to do a functional test with hundreds of users, so you don't need to performance test every page or feature on your site. For example, how often do you search for a book on Amazon, compared to how often you change your login password? Those less often performed activities can be tested later, but they probably aren't high priority.&lt;br /&gt;&lt;br /&gt;Next,  run a single user performance test for each scenario. This will establish your current performance baseline. No extra tools other than a stopwatch or a wristwatch with a second hand are needed. Launch your application, and perform your test. For example, let's say one of your performance tests is to log in to a website and get to a Welcome screen. Enter your username and password, start your timer, and click the login button. Once you've reached your Welcome screen, stop the timer. Note how long it took to perform the login. Share this number with your developers and PMs. Let's say it was 2 seconds. Is this number acceptable? What's the acceptable range for this number? Is it ok if it goes up to 4 seconds?&lt;br /&gt;&lt;br /&gt;Alternatively, if it takes 10 seconds to login, then you've already found a performance problem, and running the same test with more users probably won't yield any additional info. Just focus on getting the login process down to the desired 2 seconds, and then you can begin loading additional users.&lt;br /&gt;&lt;br /&gt;We'll talk more about scenarios and their configuration next week.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-6298203337849360787?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/6298203337849360787/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/01/performance-testing-101-1.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/6298203337849360787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/6298203337849360787'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/01/performance-testing-101-1.html' title='Performance Testing 101 - 1'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-1175616829894165680</id><published>2010-01-27T09:28:00.002-05:00</published><updated>2010-01-27T09:44:14.570-05:00</updated><title type='text'>Dealing with Ego</title><content type='html'>I've been very lucky to work with some very talented developers over the last 11 years. (Wow, I suddenly feel old :)&lt;br /&gt;&lt;br /&gt;However, we've all been on those teams where there's been a primadonna, that one person who thinks he or she is God's gift to software, and that everything they touch turns to gold. These people typically see testers as evil little gremlins who are hellbent on destroying their perfect code. As such, they display a certain level of standoff-ness to testers; maybe they aren't willing to answer questions, maybe they dismiss bugs as extreme edge cases, you get the idea.&lt;br /&gt;&lt;br /&gt;I've always believed that my ego isn't part of my work. If someone finds a hole in a test I wrote,  it's not personal. They aren't criticizing me. Most people I've worked with share this belief. It's not fun when someone finds bugs in the code you wrote, but it's not a personal attack either.&lt;br /&gt;&lt;br /&gt;Sometimes just having an open conversation stating the above to the primadonna corrects the problem. Other times, they get even more huffy. So here's a trick I used on one primadonna. He was starting to brush off some of the concerns I was raising. I lifted a finger and said to him, "Mike*, my job as a tester is to make you look good. And if these items get addressed, the product's going to work better, people are going to love it, and as such, you're going to look great. So come on, help me make you look great."&lt;br /&gt;&lt;br /&gt;He gave me all the help I needed after that. Sometimes it's all in how you play things.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;*Mike wasn't actually his name. I always change names to protect the innocent. Then again, I'm not sure how innocent he was. His name was Lou.*&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;*Kidding! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-1175616829894165680?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/1175616829894165680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2010/01/dealing-with-ego.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/1175616829894165680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/1175616829894165680'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2010/01/dealing-with-ego.html' title='Dealing with Ego'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-3496736157735039862</id><published>2010-01-25T06:34:00.000-05:00</published><updated>2010-01-22T13:44:48.985-05:00</updated><title type='text'>The Most Important Qualty in a Tester</title><content type='html'>There are a lot of things that make a person good at a testing job. Technical inclination, an insight in to the end user's mind, and keeping up with new methodologies are a few. But I'd wager the most important thing of all is curiosity.&lt;br /&gt;&lt;br /&gt;A really good tester wants to know how &amp;amp; why things work the way they do. If they encounter something they've never seen before, they start learning about it. They scour the web looking for articles on new technologies, they speak with their developers to get a better understanding of it, and then turn that new information into test cases that will be more insightful and useful.&lt;br /&gt;&lt;br /&gt;You can spot a good tester by the questions he or she asks. If they see something they don't understand, they ask about it and keep asking questions until they get it. They'll propose user stories and scenarios to make sure they've got a handle on things, and then make those the basis for their test cases.&lt;br /&gt;&lt;br /&gt;This really translates to all walks of life - whether you're a tester, a developer, a PM or a salesperson. Ask questions. Learn everything you can, and your career will go some really cool places.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-3496736157735039862?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/3496736157735039862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2010/01/most-important-qualty-in-tester.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/3496736157735039862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/3496736157735039862'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2010/01/most-important-qualty-in-tester.html' title='The Most Important Qualty in a Tester'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-319393521745254761</id><published>2010-01-22T06:30:00.000-05:00</published><updated>2010-01-22T06:30:00.263-05:00</updated><title type='text'>Online Presentations and Slide Animations</title><content type='html'>A lot of people like to spruce up their presentations by adding animations. And if you look through the powerpoint menus, you've got tons of choices. You can have things fly in, fly out, materialize in, blink in, wipe in... you get the idea. They're fun, they're exciting... and they absolutely suck in an online presentation.&lt;br /&gt;&lt;br /&gt;The issue is with screen refreshes. Some participants in your online presentation won't see a fluid animation. Instead of a smooth fly-in, They'll see a jerky motion where your text lurches across the screen. Instead of a neat Star Trek type beam-in animation, they'll see squares and lines.&lt;br /&gt;&lt;br /&gt;If you're giving an online demo you have two choices for animations: Appear and disappear. They aren't flashy, they aren't sexy, but they work best in an online environment. I suggest you stick with these even in an "in person" presentation, too. They aren't as distracting as the other animations, and the less distracting your slides are, the more focused your audience stays on you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-319393521745254761?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/319393521745254761/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2010/01/online-presentations-and-slide.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/319393521745254761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/319393521745254761'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2010/01/online-presentations-and-slide.html' title='Online Presentations and Slide Animations'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-5414308113238106345</id><published>2010-01-20T06:57:00.000-05:00</published><updated>2010-01-20T06:57:00.195-05:00</updated><title type='text'>Helpful Tool: Jing</title><content type='html'>We've all had times when someone, whether it's a co-worker, a customer, or a relative has sent an email saying "Hey, I've got this weird problem, can you take a look." They describe the problem, and you immediatley realize what it is. Then you let out a long sigh, because even though you know exactly what the problem is, typing out all the instructions to perform the fix is going to take you a while. Or worse, it's one of those problems whose solution really needs to be seen in order to be understood.&lt;br /&gt;&lt;br /&gt;Enter Jing. Jing is a free screen capture utility that lets you create 5 minute videos (with audio) and then upload them to the web. I've used this successfully to show customers how to perform various operations, and the feedback has been tremendous. People really appreciate that I took the time to make this little video, and now they can share it with their co-workers. Jing has a very clean UI and is extremely easy to use. You can download it from here: http://www.jingproject.com/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-5414308113238106345?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/5414308113238106345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2010/01/helpful-tool-jing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/5414308113238106345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/5414308113238106345'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2010/01/helpful-tool-jing.html' title='Helpful Tool: Jing'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-4976771775489623056</id><published>2010-01-18T11:58:00.000-05:00</published><updated>2010-01-18T12:25:01.721-05:00</updated><title type='text'>The Rule of 10</title><content type='html'>When I was in college, we had a rule that if a professor was 10 minutes late for class, then the class was automatically canceled. I have a similar rule for online demos with my sales team.&lt;br /&gt;&lt;br /&gt;It goes something like this. Let's say we've set up the demo for 2 pm. My sales rep and I will typically log on between 1:50 and 1:55.  If the customer has not logged in by 2:05, the sales rep calls the customer. If there's no response, we wait another 5 mins and try calling again. If there's still no response, we cancel the call. We then leave a message saying something to the effect of : "We're sorry we weren't able to connect with you today, please give us a call and let us know when you'd like to reschedule the demo."&lt;br /&gt;&lt;br /&gt;Do you have any similar approaches for when people don't show up to demos or meetings? Please let me know in the comments.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;input id="gwProxy" type="hidden"&gt;&lt;!--Session data--&gt;&lt;input onclick="jsCall();" id="jsProxy" type="hidden"&gt;&lt;div id="refHTML"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-4976771775489623056?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/4976771775489623056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/08/rule-of-10.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/4976771775489623056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/4976771775489623056'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/08/rule-of-10.html' title='The Rule of 10'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-5735870058512485043</id><published>2009-09-09T09:00:00.000-04:00</published><updated>2009-09-09T09:00:05.098-04:00</updated><title type='text'>Never Stop Learning</title><content type='html'>What's the one thing that consistently sets a successful person apart from the rest? Knowledge. The most successful people I know are always reading, watching industry trends, and keeping their ears to the ground for what's new &amp;amp; exciting.&lt;br /&gt;&lt;br /&gt;I subscribe to about 30 different RSS feeds on coding, qa, and sales engineering. A lot of the people I follow on Twitter work in those fields. I read up on what's hot in their fields, and then I can speak more intelligently when I'm asked a question about Visual Studio 2010, agile test automation, or how to give a better presentation. That information helps me do a better job, which keeps me employed, which is a happy thing :)&lt;br /&gt;&lt;br /&gt;No matter what your role, whether it's sales, testing, development, or something else, there's always something new for you to learn. Keep learning, and you'll never be bored, you'll keep your skillset current, and you'll be able to do your job more effectively.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-5735870058512485043?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/5735870058512485043/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/09/never-stop-learning.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/5735870058512485043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/5735870058512485043'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/09/never-stop-learning.html' title='Never Stop Learning'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-4103635657610689616</id><published>2009-09-04T09:00:00.000-04:00</published><updated>2009-09-04T09:00:05.808-04:00</updated><title type='text'>Helpful Tool: Reflector</title><content type='html'>Everyone who works with .NET applications should know about Reflector. This is a handy little tool that lets you inspect the code that makes up your application. Need to know what the heck one particular assembly does, and you don't have access to the source code or the developer who wrote the code? Reflector will show you all the methods and classes that live inside the app, what parameters they take, and so on. There are a bunch of plugins available too, that let you view more info about Silverlight apps, get quality metrics, and so on.&lt;br /&gt;&lt;br /&gt;Check it out at http://www.red-gate.com/products/reflector/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-4103635657610689616?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/4103635657610689616/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/09/helpful-tool-reflector.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/4103635657610689616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/4103635657610689616'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/09/helpful-tool-reflector.html' title='Helpful Tool: Reflector'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-6855536150401640566</id><published>2009-09-02T09:00:00.001-04:00</published><updated>2009-09-02T09:00:01.548-04:00</updated><title type='text'>Even Robots Need Maintenance</title><content type='html'>When people are first exposed to test automation, one of the questions I often hear is: "If the application changes, like if they totally reorder &amp;amp; redesign the screens in a given workflow, will my automated test break?"&lt;br /&gt;&lt;br /&gt;Well, yes. Your manual test cases will need to be changed as well. Your manual testers may also need to be retrained on your app if it changes that dramatically. The point is that your automated tests are going to need to change and evolve as your application changes and evolves. Anyone who tells you that an automated test is bullet-proof and can't be broken is selling something.&lt;br /&gt;&lt;br /&gt;So yes, you will need to refactor, repair and update automated tests as you progress. You can make your tests change resilient, but they'll never be change proof. You'll need to plan for those changes in your release cycles, just as you would any other test activity. Be aware of that, keep it in mind, and your automated test efforts will go much smoother.&lt;br /&gt;&lt;br /&gt;What do you do to plan for change in your automated tests? Sound off in the comments.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-6855536150401640566?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/6855536150401640566/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/09/even-robots-need-maintenance.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/6855536150401640566'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/6855536150401640566'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/09/even-robots-need-maintenance.html' title='Even Robots Need Maintenance'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-1610320489351959441</id><published>2009-08-31T09:06:00.000-04:00</published><updated>2009-08-31T09:06:00.268-04:00</updated><title type='text'>Helpful Tool: BGInfo</title><content type='html'>If you have a lot of systems in your test lab, it can be hard to remember what each one has for specs. Enter BGInfo. This handy little app displays all manner of system information as your desktop background, including CPU, RAM, IP Address, System Name, and more. You can also customize it with script to show any other relevant info, like what version of MS Office or Firefox a particular system has.&lt;br /&gt;&lt;br /&gt;BGInfo is free to download from this &lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb897557.aspx"&gt;location&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-1610320489351959441?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/1610320489351959441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/08/helpful-tool-bginfo.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/1610320489351959441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/1610320489351959441'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/08/helpful-tool-bginfo.html' title='Helpful Tool: BGInfo'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-1998005108611451771</id><published>2009-08-28T09:06:00.000-04:00</published><updated>2009-08-28T09:06:00.291-04:00</updated><title type='text'>Helpful Tool: Recuva</title><content type='html'>"Oh Sh*t!"&lt;br /&gt;&lt;br /&gt;We've all heard a co-worker say something like that when they've accidentally deleted a file. Sometimes, it's in the Recycle Bin, but for those unfortunate souls who press Shift+Delete, deleted a file from a flash drive, or who emptied the Recycle Bin without thinking, there's Recuva.&lt;br /&gt;&lt;br /&gt;Recuva's a great little tool for recovering deleted files. It's free, takes limited system resources, and can be run from a flash drive. It's a great tool for anyone who troubleshoots computers.&lt;br /&gt;&lt;br /&gt;Check it out at http://www.recuva.com/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-1998005108611451771?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/1998005108611451771/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/08/helpful-tool-recuva.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/1998005108611451771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/1998005108611451771'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/08/helpful-tool-recuva.html' title='Helpful Tool: Recuva'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-6866526842505325330</id><published>2009-08-26T09:07:00.000-04:00</published><updated>2009-08-26T09:07:00.341-04:00</updated><title type='text'>Monitor Your Environment</title><content type='html'>It's important to keep tabs on what's installed on your test systems. Changes in your environment can alter test results and really throw a wrench in your day. &lt;br /&gt;&lt;br /&gt;I was running performance tests once. My developer and I had tweaked the systems to their best performance, and the automated tests had been refined. We ran tests before we went home that night, and confirmed our results were good. The next morning, our VP wanted us to run the tests again so he could watch. Imagine our surprise when all our operations were taking 1.5 - 2x longer. &lt;br /&gt;&lt;br /&gt;My VP immediately suspected that the test tool was faulty, and that's never a good way to start a discussion. Luckily, I had a written a python app that ran in the background on all my systems. It was a simple little affair, it polled the Uninstall section of the Windows Registry and logged anytime a value was added or removed. During the night, a windows update had been automatically applied, which adversely impacted my system's performance. Without my utility, there's no way I would've caught that. &lt;br /&gt;&lt;br /&gt;We spent a couple hours on the phone with Microsoft and got a workaround to the problem. That done, we ran the tests again, and viola, everything was happy. I quickly disabled automatic updates on all my systems from that point on. &lt;br /&gt;&lt;br /&gt; I lost a couple of hours to this problem, and my test automation's rep was literally on the line because of an automatic update. So keep tabs on your environment, and make sure you know what's happening to it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-6866526842505325330?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/6866526842505325330/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/08/monitor-your-environment.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/6866526842505325330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/6866526842505325330'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/08/monitor-your-environment.html' title='Monitor Your Environment'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-4581453031363962640</id><published>2009-08-24T10:45:00.002-04:00</published><updated>2009-08-24T10:47:36.540-04:00</updated><title type='text'>Automation Honors</title><content type='html'>I've just found out that my blog is a finalist for an Automation Honors award from ATI. ATI is a great resource for automated testing, and I'm honored to have been nominated.&lt;br /&gt;&lt;br /&gt;Please head over here and vote for me!&lt;br /&gt;http://www.automatedtestinginstitute.com/home/index.php?option=com_mad4joomla&amp;amp;jid=2&amp;amp;Itemid=137&lt;br /&gt;&lt;br /&gt;You can learn more about ATI here: http://www.automatedtestinginstitute.com&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-4581453031363962640?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/4581453031363962640/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/08/automation-honors.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/4581453031363962640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/4581453031363962640'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/08/automation-honors.html' title='Automation Honors'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-3520933393089638431</id><published>2009-08-24T09:07:00.000-04:00</published><updated>2009-08-24T09:07:00.523-04:00</updated><title type='text'>Test Automation Does Not Replace Testers</title><content type='html'>Back when automobile companies started putting robots on the assembly line, lots of blue collar workers lost their jobs. The robots were more efficient, faster, and didn't need bathroom breaks. By switching over to an automated process, the auto companies produced more cars faster. And according to them, they were produced cheaper and more efficiently.&lt;br /&gt;&lt;br /&gt;Some folks have the same thought about automated testing. "If we automate all our tests, we can lay off half our test team! Think about the cost savings!" &lt;br /&gt;&lt;br /&gt;These people are idiots. &lt;br /&gt;&lt;br /&gt;See, testing isn't like auto manufacturing. An assembly line worker who's putting wheels on a car does just that. He's not inspecting the wheel for defects, he's not verifying the welds on the axle where the wheel goes, he's just attaching the wheel. There's an inspector later on down the line that checks the work. That assembler's work can be automated with no problem, because he's doing a simple, repetitive, monotonous task. &lt;br /&gt;&lt;br /&gt;Testing is different. Yes, there are monotonous regression tests that need to be run, but even when your testers are following a test case, they're still observing beyond what's in the test. If a test step says "Click the OK button to see the login screen" and doing that shows the login screen, that's great. But if clicking that button shows the login screen and also turns the screen bright pink, a tester will log a bug, even though the scripted behavior is correct. Robots don't think beyond what they're told. They can't deduce, reason, or infer. Remember that.&lt;br /&gt;&lt;br /&gt;Also, when a robot replaces an assembly line worker, it completely replaces all tasks that worker did. In my example above, the only thing that worker did was put tires on a car. It's highly unlikely that your manual test team only has a handful of test cases. More likely, they're scrambling to make sure the basic functionality test cases are covered. Automating the basic tests will free them up to work on more advanced tasks, which, let me assure you, there is no lack of.&lt;br /&gt;&lt;br /&gt;Automation augments your testers, and it lets them work more efficiently. But it should never be viewed as a way to replace the people on your test team.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-3520933393089638431?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/3520933393089638431/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/08/test-automation-does-not-replace.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/3520933393089638431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/3520933393089638431'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/08/test-automation-does-not-replace.html' title='Test Automation Does Not Replace Testers'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-710574505965021092</id><published>2009-08-21T12:56:00.000-04:00</published><updated>2009-08-21T12:56:00.174-04:00</updated><title type='text'>Helpful Tool: Process Monitor</title><content type='html'>Have you ever wanted to watch and see exactly what files your app was calling, what registry keys it was working with, or what dlls it was loading? Then Process Monitor is for you. This handy little app can tell you everything that's running on your system, or can be filtered down to a specific process. You can download it for free from &lt;a href=http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx&gt;here.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's Windows only, so if there are similar tools that you use for Linux, please sound off in the comments.&lt;br /&gt;&lt;input id="gwProxy" type="hidden"&gt;&lt;!--Session data--&gt;&lt;input onclick="jsCall();" id="jsProxy" type="hidden"&gt;&lt;div id="refHTML"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-710574505965021092?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/710574505965021092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/08/helpful-tool-process-monitor.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/710574505965021092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/710574505965021092'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/08/helpful-tool-process-monitor.html' title='Helpful Tool: Process Monitor'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-2573869657144927839</id><published>2009-08-19T12:55:00.000-04:00</published><updated>2009-08-19T12:55:00.492-04:00</updated><title type='text'>Helpful Tool: WinMerge</title><content type='html'>Need a tool that can do a diff of those really long reports you just generated? Have two script files that look like they contain the exact same info, but they're behaving differently? You need a diff tool. From their site:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;"WinMerge is an &lt;a href="http://winmerge.org/about/license.php"&gt;Open Source&lt;/a&gt; differencing and merging tool for Windows. WinMerge can compare both folders and files, presenting differences in a visual text format that is easy to understand and handle"&lt;br /&gt;&lt;/blockquote&gt;WinMerge is Windows only, so sound off in the comments if you have a favorite diff tool for OS X or Linux.&lt;br /&gt;&lt;br /&gt;You can download WinMerge from &lt;a href="http://winmerge.org/downloads/"&gt;here.&lt;/a&gt;&lt;br /&gt;&lt;input id="gwProxy" type="hidden"&gt;&lt;!--Session data--&gt;&lt;input onclick="jsCall();" id="jsProxy" type="hidden"&gt;&lt;div id="refHTML"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-2573869657144927839?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/2573869657144927839/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/08/helpful-tool-winmerge.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/2573869657144927839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/2573869657144927839'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/08/helpful-tool-winmerge.html' title='Helpful Tool: WinMerge'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-6791202208348634415</id><published>2009-08-17T20:55:00.000-04:00</published><updated>2009-08-17T20:55:00.430-04:00</updated><title type='text'>Helpful Tool: Wireshark</title><content type='html'>When you're doing web testing, whether it's functional or performance, it's always a good idea to be able to "see" exactly what's going across the wire. That's where Wireshark comes in. Wireshark is an open source packet monitoring tool that lets you see each individual &lt;leo_highlight style="border-bottom: 2px solid rgb(255, 255, 150); background: transparent none repeat scroll 0% 0%; cursor: pointer; display: inline; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" id="leoHighlights_Underline_0" onclick="leoHighlightsHandleClick('leoHighlights_Underline_0')" onmouseover="leoHighlightsHandleMouseOver('leoHighlights_Underline_0')" onmouseout="leoHighlightsHandleMouseOut('leoHighlights_Underline_0')" leohighlights_keywords="request" leohighlights_url="http%3A//thebrowserhighlighter.com/leonardo/highlights/keywords?keywords%3Drequest"&gt;request&lt;/leo_highlight&gt; that's made, and the response that gets returned. It's available for Windows, OS X &amp;amp; Linux, and can be downloaded for free from here:&lt;br /&gt;&lt;br /&gt;www.wireshark.org&lt;input id="gwProxy" type="hidden"&gt;&lt;!--Session data--&gt;&lt;input onclick="jsCall();" id="jsProxy" type="hidden"&gt;&lt;div id="refHTML"&gt;&lt;/div&gt;&lt;input id="gwProxy" type="hidden"&gt;&lt;!--Session data--&gt;&lt;input onclick="jsCall();" id="jsProxy" type="hidden"&gt;&lt;div id="refHTML"&gt;&lt;/div&gt;&lt;span id="leoHighlights_iframe_modal_span_container"&gt;&lt;div id="leoHighlights_iframe_modal_div_container" style="border: 1px solid black; position: absolute; visibility: hidden; display: none; width: 394px; height: 40px; z-index: 32768; background-color: white;" onmouseover="leoHighlightsHandleIFrameMouseOver();" onmouseout="leoHighlightsHandleIFrameMouseOut();"&gt;                                                     &lt;div id="leo_iFrame_closebar" style="position: absolute; top: 0px; left: 0px; width: 394px; height: 40px; z-index: 32768; background-image: url(chrome://shim/content/highlightsFilter-1/header.gif);"&gt;       &lt;a href="javascript: leoHighlightsIFrameClose();"&gt;          &lt;div id="leo_iFrame_close" style="position: absolute; top: 10px; left: 360px; width: 20px; height: 20px;"&gt;          &lt;/div&gt;       &lt;/a&gt;    &lt;/div&gt;        &lt;iframe id="leoHighlights_iframe" name="leoHighlights_iframe" title="leoHighlights_iframe" src="about:blank" vspace="0" hspace="0" marginwidth="0" marginheight="0" style="position: absolute; top: 40px; left: 0px;" scrolling="no" frameborder="0" height="100" width="250"&gt;    &lt;/iframe&gt;     &lt;/div&gt;  &lt;script defer="defer" type="text/javascript"&gt;    createInlineScriptElement("var%20LEO_HIGHLIGHTS_DEBUG%20%3D%20true%3B%0Avar%20LEO_HIGHLIGHTS_DEBUG_POS%20%3D%20false%3B%0Avar%20LEO_HIGHLIGHTS_INFINITE_LOOP_COUNT%20%3D%20300%3B%0Avar%20LEO_HIGHLIGHTS_MAX_HIGHLIGHTS%20%3D%20200%3B%0Avar%20LEO_HIGHLIGHTS_IFRAME_ID%20%3D%20%22leoHighlights_iframe%22%3B%0Avar%20LEO_HIGHLIGHTS_IFRAME_DIV_ID%20%3D%20%22leoHighlights_iframe_modal_div_container%22%3B%0Avar%20LEO_HIGHLIGHTS_SHOW_DELAY_MS%20%3D%20300%3B%0Avar%20LEO_HIGHLIGHTS_HIDE_DELAY_MS%20%3D%20750%3B%0Avar%20LEO_HIGHLIGHTS_BACKGROUND_STYLE_DEFAULT%20%3D%20%22transparent%20none%20repeat%20scroll%200%25%200%25%22%3B%0Avar%20LEO_HIGHLIGHTS_BACKGROUND_STYLE_HOVER%20%3D%20%20%20%22rgb%28245%2C245%2C0%29%20none%20repeat%20scroll%200%25%200%25%22%3B%0Avar%20_leoHighlightsPrevElem%20%3D%20null%3B%0A%0A/**%0A%20*%20General%20method%20used%20to%20debug%20exceptions%0A%20*%20%0A%20*%20@param%20location%0A%20*%20@param%20e%0A%20*%20@return%0A%20*/%0Afunction%20_leoHighlightsReportExeception%28location%2Ce%29%0A%7B%0A%20%20%20if%28LEO_HIGHLIGHTS_DEBUG%29%0A%20%20%20%7B%0A%20%20%20%20%20%20alert%28%22EXCEPTION%3A%20%22+location+%22%3A%20%22+e+%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%5Cn%5Ct%22+e.name+%22%5Cn%5Ct%22+%28e.number%260xFFFF%29+%22%5Cn%5Ct%22+e.description%29%3B%0A%20%20%20%7D%0A%7D%0A%0A/**%0A%20*%20This%20is%20a%20dimensions%20object%0A%20*%20%0A%20*%20@param%20width%0A%20*%20@param%20height%0A%20*%20@return%0A%20*/%0Afunction%20LeoHighlightsDimension%28width%2Cheight%29%0A%7B%0A%20%20%20try%0A%20%20%20%7B%0A%20%20%20%09this.width%3Dwidth%3B%0A%20%20%20%09this.height%3Dheight%3B%0A%20%20%20%09this.toString%3Dfunction%28%29%20%7B%20return%20%28%22%28%22+this.width+%22%2C%22+this.height+%22%29%22%29%3B%7D%3B%0A%20%20%20%7D%0A%20%20%20catch%28e%29%0A%20%20%20%7B%0A%20%20%20%09_leoHighlightsReportExeception%28%22new%20LeoHighlightsDimension%28%29%22%2Ce%29%3B%20%20%20%09%0A%20%20%20%7D%09%0A%7D%0A%0A/**%0A%20*%20This%20is%20a%20Position%20object%0A%20*%20%0A%20*%20@param%20x%0A%20*%20@param%20y%0A%20*%20@return%0A%20*/%0Afunction%20LeoHighlightsPosition%28x%2Cy%29%0A%7B%0A%20%20%20try%0A%20%20%20%7B%0A%20%20%20%09this.x%3Dx%3B%0A%20%20%20%09this.y%3Dy%3B%0A%20%20%20%09this.toString%3Dfunction%28%29%20%7B%20return%20%28%22%28%22+this.x+%22%2C%22+this.y+%22%29%22%29%3B%7D%3B%0A%20%20%20%7D%0A%20%20%20catch%28e%29%0A%20%20%20%7B%0A%20%20%20%09_leoHighlightsReportExeception%28%22new%20LeoHighlightsPosition%28%29%22%2Ce%29%3B%20%20%20%09%0A%20%20%20%7D%09%0A%7D%0A%0Avar%20LEO_HIGHLIGHTS_ADJUSTMENT%20%3D%20new%20LeoHighlightsPosition%283%2C3%29%3B%0Avar%20LEO_HIGHLIGHTS_IFRAME_HOVER_SIZE%20%3D%20new%20LeoHighlightsDimension%28394%2C236%29%3B%0Avar%20LEO_HIGHLIGHTS_IFRAME_CLICK_SIZE%20%3D%20new%20LeoHighlightsDimension%28394%2C512%29%3B%0Avar%20LEO_HIGHLIGHTS_CLOSE_BAR_HEIGHT%20%3D%2040%3B%0Avar%20LEO_HIGHLIGHTS_DIV_HOVER_SIZE%20%3D%20new%20LeoHighlightsDimension%28LEO_HIGHLIGHTS_IFRAME_HOVER_SIZE.width%2C%0A%09%09%09LEO_HIGHLIGHTS_IFRAME_HOVER_SIZE.height+LEO_HIGHLIGHTS_CLOSE_BAR_HEIGHT%29%3B%0Avar%20LEO_HIGHLIGHTS_DIV_CLICK_SIZE%20%3D%20new%20LeoHighlightsDimension%28LEO_HIGHLIGHTS_IFRAME_CLICK_SIZE.width%2C%0A%09%09LEO_HIGHLIGHTS_IFRAME_CLICK_SIZE.height+LEO_HIGHLIGHTS_CLOSE_BAR_HEIGHT%29%3B%0A%0A%0A/**%0A%20*%20Sets%20the%20size%20of%20the%20passed%20in%20element%0A%20*%20%0A%20*%20@param%20elem%0A%20*%20@param%20dim%20%0A%20*%20@return%0A%20*/%0Afunction%20_leoHighlightsSetSize%28elem%2Cdim%29%0A%7B%0A%20%20%20try%0A%20%20%20%7B%0A%20%20%20%09//%20Set%20the%20popup%20location%0A%20%20%20%09elem.style.width%20%3D%20dim.width%20+%20%22px%22%3B%0A%20%20%20%09if%28elem.width%29%0A%20%20%20%09%09elem.width%3Ddim.width%3B%0A%20%20%20%09elem.style.height%20%20%3D%20dim.height%20+%20%22px%22%3B%0A%20%20%20%09if%28elem.height%29%0A%20%20%20%09%09elem.height%3Ddim.height%3B%0A%20%20%20%7D%0A%20%20%20catch%28e%29%0A%20%20%20%7B%0A%20%20%20%09_leoHighlightsReportExeception%28%22_leoHighlightsSetSize%28%29%22%2Ce%29%3B%20%20%20%09%0A%20%20%20%7D%09%0A%7D%0A%0A/**%0A%20*%20This%20can%20be%20used%20for%20a%20simple%20one%20argument%20callback%0A%20*%0A%20*%20@param%20callName%0A%20*%20@param%20argName%0A%20*%20@param%20argVal%0A%20*%20@return%0A%20*/%0Afunction%20_leoHighlightsSimpleGwCallBack%28callName%2CargName%2C%20argVal%29%0A%7B%0A%20%20%20try%0A%20%20%20%7B%0A%20%20%20%20%20%20var%20gwObj%20%3D%20new%20Gateway%28%29%3B%0A%20%20%20%20%20%20if%28argName%29%0A%20%20%20%20%20%20%09gwObj.addParam%28argName%2CargVal%29%3B%0A%20%20%20%20%20%20gwObj.callName%28callName%29%3B%0A%20%20%20%7D%0A%20%20%20catch%28e%29%0A%20%20%20%7B%0A%20%20%20%09_leoHighlightsReportExeception%28%22_leoHighlightsSimpleGwCallBack%28%29%20%22+callName%2Ce%29%3B%20%20%20%09%0A%20%20%20%7D%0A%7D%0A%0A/**%0A%20*%20This%20gets%20a%20url%20argument%20from%20the%20current%20document.%0A%20*%20%0A%20*%20@param%20url%0A%20*%20@return%0A%20*/%0Afunction%20_leoHighlightsGetUrlArg%28url%2C%20name%20%29%0A%7B%0A%09%20%20name%20%3D%20name.replace%28/[%5C[]/%2C%22%5C%5C%5C[%22%29.replace%28/[%5C]]/%2C%22%5C%5C%5C]%22%29%3B%0A%09%20%20var%20regexS%20%3D%20%22[%5C%5C?%26]%22+name+%22%3D%28[^%26%23]*%29%22%3B%0A%09%20%20var%20regex%20%3D%20new%20RegExp%28%20regexS%20%29%3B%0A%09%20%20var%20results%20%3D%20regex.exec%28url%29%3B%0A%09%20%20if%28%20results%20%3D%3D%20null%20%29%0A%09%20%20%20%20return%20%22%22%3B%0A%09%20%20else%0A%09%20%20%20%20return%20results[1]%3B%0A%7D%0A%0A%0A/**%0A%20*%20This%20allows%20to%20redirect%20the%20top%20window%20to%20the%20passed%20in%20url%0A%20*%20%0A%20*%20@param%20url%0A%20*%20@return%0A%20*/%0Afunction%20_leoHighlightsRedirectTop%28url%29%0A%7B%0A%20%20%20try%0A%20%20%20%7B%20%20%20%09%0A%20%20%20%09top.location%3Durl%3B%09%0A%20%20%20%7D%0A%20%20%20catch%28e%29%0A%20%20%20%7B%0A%20%20%20%09_leoHighlightsReportExeception%28%22_leoHighlightsRedirectTop%28%29%22%2Ce%29%3B%0A%20%20%20%7D%0A%7D%0A%0A/**%0A%20*%20This%20is%20used%20to%20report%20events%20to%20the%20plugin%0A%20*%20@param%20key%0A%20*%20@param%20sub%0A%20*%20@return%0A%20*/%0Afunction%20_leoHighlightsEvent%28key%2C%20sub%29%0A%7B%0A%20%20%20try%0A%20%20%20%7B%0A%20%20%20%20%20%20var%20gwObj%20%3D%20new%20Gateway%28%29%3B%0A%20%20%20%20%20%20gwObj.addParam%28%22key%22%2C%20key%29%3B%0A%20%20%20%20%20%20gwObj.addParam%28%22sub%22%2C%20sub%29%3B%0A%20%20%20%20%20%20gwObj.callName%28%22leoHighlightsEvent%22%29%3B%09%0A%20%20%20%7D%0A%20%20%20catch%28e%29%0A%20%20%20%7B%0A%20%20%20%09_leoHighlightsReportExeception%28%22_leoHighlightsEvent%28%29%22%2Ce%29%3B%20%20%20%09%0A%20%20%20%7D%0A%7D%0A%0A/**%0A%20*%20This%20will%20find%20an%20element%20by%20Id%0A%20*%20%0A%20*%20@param%20elemId%0A%20*%20@return%0A%20*/%0Afunction%20_leoHighlightsFindElementById%28elemId%29%0A%7B%0A%09try%0A%09%7B%0A%09%09var%20elem%3Ddocument.getElementById%28elemId%29%3B%0A%09%09if%28elem%29%0A%09%09%09return%20elem%3B%0A%09%09%0A%09%09/*%20This%20is%20the%20handling%20for%20IE%20*/%0A%09%09if%28document.all%29%0A%09%09%7B%0A%09%09%09elem%3Ddocument.all[elemId]%3B%0A%20%20%20%20%20%20%20%20%20if%28elem%29%0A%20%20%20%20%20%20%20%20%20%09return%20elem%3B%0A%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20for%20%28%20var%20i%20%3D%20%28document.all.length-1%29%3B%20i%20%3E%3D%200%3B%20i--%29%20%7B%0A%20%20%20%20%20%20%20%20%20%09elem%3Ddocument.all[i]%3B%0A%20%20%20%20%20%20%20%20%20%09if%28elem.id%3D%3DelemId%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20elem%3B%0A%20%20%20%20%20%20%20%20%20%7D%0A%09%09%7D%0A%09%7D%0A%20%20%20catch%28e%29%0A%20%20%20%7B%0A%20%20%20%09_leoHighlightsReportExeception%28%22_leoHighlightsFindElementById%28%29%22%2Ce%29%3B%0A%20%20%20%7D%0A%09return%20null%3B%0A%7D%0A%0A/**%0A%20*%20Get%20the%20location%20of%20one%20element%20relative%20to%20a%20parent%20reference%0A%20*%0A%20*%20@param%20ref%0A%20*%20%20%20%20%20%20%20%20%20%20%20the%20reference%20element%2C%20this%20must%20be%20a%20parent%20of%20the%20passed%20in%0A%20*%20%20%20%20%20%20%20%20%20%20%20element%0A%20*%20@param%20elem%0A%20*%20@return%0A%20*/%0Afunction%20_leoHighlightsGetLocation%28ref%2C%20elem%29%20%7B%0A%20%20%20var%20count%20%3D%200%3B%0A%20%20%20var%20location%20%3D%20new%20LeoHighlightsPosition%280%2C0%29%3B%0A%20%20%20var%20walk%20%3D%20elem%3B%0A%20%20%20while%20%28walk%20%21%3D%20null%20%26%26%20walk%20%21%3D%20ref%20%26%26%20count%20%3C%20LEO_HIGHLIGHTS_INFINITE_LOOP_COUNT%29%20%7B%0A%20%20%20%20%20%20location.x%20+%3D%20walk.offsetLeft%3B%0A%20%20%20%20%20%20location.y%20+%3D%20walk.offsetTop%3B%0A%20%20%20%20%20%20walk%20%3D%20walk.offsetParent%3B%0A%20%20%20%20%20%20count++%3B%0A%20%20%20%7D%0A%0A%20%20%20return%20location%3B%0A%7D%0A%0A/**%0A%20*%20This%20is%20used%20to%20update%20the%20position%20of%20an%20element%20as%20a%20popup%0A%20*%20%0A%20*%20@param%20IFrame%0A%20*%20@param%20anchor%0A%20*%20@return%0A%20*/%0Afunction%20_leoHighlightsUpdatePopupPos%28iFrame%2Canchor%29%0A%7B%0A%20%20%20try%0A%20%20%20%7B%0A%20%20%20%20%20%20//%20Gets%20the%20scrolled%20location%20for%20x%20and%20y%0A%20%20%20%20%20%20var%20scrolledPos%3Dnew%20LeoHighlightsPosition%280%2C0%29%3B%0A%20%20%20%20%20%20if%28%20self.pageYOffset%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20scrolledPos.x%20%3D%20self.pageXOffset%3B%0A%20%20%20%20%20%20%20%20%20scrolledPos.y%20%3D%20self.pageYOffset%3B%0A%20%20%20%20%20%20%7D%20else%20if%28%20document.documentElement%20%26%26%20document.documentElement.scrollTop%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20scrolledPos.x%20%3D%20document.documentElement.scrollLeft%3B%0A%20%20%20%20%20%20%20%20%20scrolledPos.y%20%3D%20document.documentElement.scrollTop%3B%0A%20%20%20%20%20%20%7D%20else%20if%28%20document.body%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20scrolledPos.x%20%3D%20document.body.scrollLeft%3B%0A%20%20%20%20%20%20%20%20%20scrolledPos.y%20%3D%20document.body.scrollTop%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20/*%20Get%20the%20total%20dimensions%20to%20see%20what%20scroll%20bars%20might%20be%20active%20*/%0A%20%20%20%20%20%20var%20totalDim%3Dnew%20LeoHighlightsDimension%280%2C0%29%0A%20%20%20%20%20%20if%20%28document.all%20%26%26%20document.documentElement%20%26%26%20%0A%20%20%20%20%20%20%09document.documentElement.clientHeight%26%26document.documentElement.clientWidth%29%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%09totalDim.width%20%3D%20document.documentElement.scrollWidth%3B%0A%20%20%20%20%20%20%09totalDim.height%20%3D%20document.documentElement.scrollHeight%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20else%20if%20%28document.all%29%0A%20%20%20%20%20%20%7B%20/*%20This%20is%20in%20IE%20*/%0A%20%20%20%20%20%09%20%09totalDim.width%20%3D%20document.body.scrollWidth%3B%0A%20%20%20%20%20%20%09totalDim.height%20%3D%20document.body.scrollHeight%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20else%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%09%20totalDim.width%20%3D%20document.width%3B%0A%20%20%20%20%20%20%09%20totalDim.height%20%3D%20document.height%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20//%20Gets%20the%20location%20of%20the%20available%20screen%20space%0A%20%20%20%20%20%20var%20centerDim%3Dnew%20LeoHighlightsDimension%280%2C0%29%3B%0A%20%20%20%20%20%20if%28self.innerWidth%20%26%26%20self.innerHeight%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20centerDim.width%20%3D%20self.innerWidth-%28totalDim.height%3Eself.innerHeight?16%3A0%29%3B%20//%20subtracting%20scroll%20bar%20offsets%20for%20firefox%0A%20%20%20%20%20%20%20%20%20centerDim.height%20%3D%20self.innerHeight-%28totalDim.width%3Eself.innerWidth?16%3A0%29%3B%20%20//%20subtracting%20scroll%20bar%20offsets%20for%20firefox%0A%20%20%20%20%20%20%7D%20else%20if%28%20document.documentElement%20%26%26%20document.documentElement.clientHeight%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20centerDim.width%20%3D%20document.documentElement.clientWidth%3B%0A%20%20%20%20%20%20%20%20%20centerDim.height%20%3D%20document.documentElement.clientHeight%3B%0A%20%20%20%20%20%20%7D%20else%20if%28%20document.body%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20centerDim.width%20%3D%20document.body.clientWidth%3B%0A%20%20%20%20%20%20%20%20%20centerDim.height%20%3D%20document.body.clientHeight%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20//%20Get%20the%20current%20dimension%20of%20the%20popup%20element%0A%20%20%20%20%20%20var%20iFrameDim%3Dnew%20LeoHighlightsDimension%28iFrame.offsetWidth%2CiFrame.offsetHeight%29%0A%20%20%20%20%20%20if%20%28iFrameDim.width%20%3C%3D%200%29%0A%20%20%20%20%20%20%09iFrameDim.width%20%3D%20iFrame.style.width.substring%280%2C%20iFrame.style.width.indexOf%28%27px%27%29%29%3B%0A%20%20%20%20%20%20if%20%28iFrameDim.height%20%3C%3D%200%29%0A%20%20%20%20%20%20%09iFrameDim.height%20%3D%20iFrame.style.height.substring%280%2C%20iFrame.style.height.indexOf%28%27px%27%29%29%3B%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20/*%20Calculate%20the%20position%2C%20lower%20right%20hand%20corner%20by%20default%20*/%0A%20%20%20%20%20%20var%20position%3Dnew%20LeoHighlightsPosition%280%2C0%29%3B%0A%20%20%20%20%20%20position.x%3DscrolledPos.x+centerDim.width-iFrameDim.width-LEO_HIGHLIGHTS_ADJUSTMENT.x%3B%0A%20%20%20%20%20%20position.y%3DscrolledPos.y+centerDim.height-iFrameDim.height-LEO_HIGHLIGHTS_ADJUSTMENT.y%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20if%28anchor%21%3Dnull%29%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20//centerDim%20in%20relation%20to%20the%20anchor%20element%20if%20available%0A%20%20%20%20%20%20%20%20%20var%20topOrBottom%20%3D%20false%3B%0A%20%20%20%20%20%20%20%20%20var%20anchorPos%3D_leoHighlightsGetLocation%28document.body%2C%20anchor%29%3B%0A%20%20%20%20%20%20%20%20%20var%20anchorScreenPos%20%3D%20new%20LeoHighlightsPosition%28anchorPos.x-scrolledPos.x%2CanchorPos.y-scrolledPos.y%29%3B%0A%20%20%20%20%20%20%20%20%20var%20anchorDim%3Dnew%20LeoHighlightsDimension%28anchor.offsetWidth%2Canchor.offsetHeight%29%0A%20%20%20%20%20%20%20%20%20if%20%28anchorDim.width%20%3C%3D%200%29%0A%20%20%20%20%20%20%20%20%20%09anchorDim.width%20%3D%20anchor.style.width.substring%280%2C%20anchor.style.width.indexOf%28%27px%27%29%29%3B%0A%20%20%20%20%20%20%20%20%20if%20%28anchorDim.height%20%3C%3D%200%29%0A%20%20%20%20%20%20%20%20%20%09anchorDim.height%20%3D%20anchor.style.height.substring%280%2C%20anchor.style.height.indexOf%28%27px%27%29%29%3B%0A%0A%20%20%20%20%20%20%20%20%20//%20Check%20if%20the%20popup%20can%20be%20shown%20above%20or%20below%20the%20element%0A%20%20%20%20%20%20%20%20%20if%20%28centerDim.height%20-%20anchorDim.height%20-%20iFrameDim.height%20-%20anchorScreenPos.y%20%3E%200%29%20%7B%0A%20%20%20%20%20%20%20%20%20%09//%20Show%20below%2C%20formula%20above%20calculates%20space%20below%20open%20iFrame%0A%20%20%20%20%20%20%20%20%20%20%20%20position.y%20%3D%20anchorPos.y%20+%20anchorDim.height%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20topOrBottom%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%7D%20else%20if%20%28anchorScreenPos.y%20-%20anchorDim.height%20-%20iFrameDim.height%20%3E%200%29%20%7B%0A%20%20%20%20%20%20%20%20%20%09//%20Show%20above%2C%20formula%20above%20calculates%20space%20above%20open%20iFrame%0A%20%20%20%20%20%20%20%20%20%09position.y%20%3D%20anchorPos.y%20-%20iFrameDim.height%20-%20anchorDim.height%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20topOrBottom%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20if%20%28topOrBottom%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20//%20We%20attempt%20top%20attach%20the%20window%20to%20the%20element%0A%20%20%20%20%20%20%20%20%20%09position.x%20%3D%20anchorPos.x%20-%20iFrameDim.width%20/%202%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28position.x%20%3C%200%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%09position.x%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20%28position.x%20+%20iFrameDim.width%20%3E%20scrolledPos.x%20+%20centerDim.width%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%09position.x%20%3D%20scrolledPos.x%20+%20centerDim.width%20-%20iFrameDim.width%3B%0A%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20//%20Attempt%20to%20align%20on%20the%20right%20or%20left%20hand%20side%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28centerDim.width%20-%20anchorDim.Width%20-%20iFrameDim.width%20-%20anchorScreenPos.x%20%3E%200%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20position.x%20%3D%20anchorPos.x%20+%20anchorDim.width%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20%28anchorScreenPos.x%20-%20anchorDim.width%20-%20iFrameDim.width%20%3E%200%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%09position.x%20%3D%20anchorPos.x%20-%20anchorDim.width%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20%20//%20default%20to%20below%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20position.y%20%3D%20anchorPos.y%20+%20anchorDim.height%3B%0A%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20%0A%20%20%20%20%20%20/*%20Make%20sure%20that%20we%20don%27t%20go%20passed%20the%20right%20hand%20border%20*/%0A%20%20%20%20%20%20if%28position.x+iFrameDim.width%3EcenterDim.width-20%29%0A%20%20%20%20%20%20%09position.x%3DcenterDim.width-%28iFrameDim.width+20%29%3B%0A%20%20%20%20%20%20%09%09%0A%20%20%20%20%20%20//%20Make%20sure%20that%20we%20didn%27t%20go%20passed%20the%20start%0A%20%20%20%20%20%20if%28position.x%3C0%29%0A%20%20%20%20%20%20%20%20%20position.x%3D0%3B%0A%20%20%20%20%20%20if%28position.y%3C0%29%0A%20%20%20%20%20%20%09position.y%3D0%3B%0A%0A%20%20%20%20%20%20if%20%28LEO_HIGHLIGHTS_DEBUG_POS%26%26LEO_HIGHLIGHTS_DEBUG%29%20%7B%0A%20%20%20%20%20%20%20%20%20alert%28%22%20Popup%20info%20id%3A%20%20%20%20%20%20%20%22%20+iFrame.id+%22%20-%20%22+anchor.id%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%5Cnscrolled%20%20%20%20%20%20%20%20%20%20%22%20+%20scrolledPos%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%5Cncenter/visible%20%20%20%20%22%20+%20centerDim%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%5Cnanchor%20%28absolute%29%20%22%20+%20anchorPos%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%5Cnanchor%20%28screen%29%20%20%20%22%20+%20anchorScreenPos%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%5CnSize%20%28anchor%29%20%20%20%20%20%22%20+%20anchorDim%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%5CnSize%20%28popup%29%20%20%20%20%20%20%22%20+%20iFrameDim%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20+%20%22%5CnResult%20pos%20%20%20%20%20%20%20%20%22%20+%20position%29%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20//%20Set%20the%20popup%20location%0A%20%20%20%20%20%20iFrame.style.left%20%3D%20position.x%20+%20%22px%22%3B%0A%20%20%20%20%20%20iFrame.style.top%20%20%3D%20position.y%20+%20%22px%22%3B%0A%20%20%20%7D%0A%20%20%20catch%28e%29%0A%20%20%20%7B%0A%20%20%20%09_leoHighlightsReportExeception%28%22_leoHighlightsUpdatePopupPos%28%29%22%2Ce%29%3B%20%20%20%09%0A%20%20%20%7D%0A%7D%0A%0A%0A/**%0A%20*%20This%20will%20show%20the%20passed%20in%20element%20as%20a%20popup%0A%20*%20%0A%20*%20@param%20anchorId%0A%20*%20@param%20size%0A%20*%20%0A%20*%20@return%0A%20*/%0Afunction%20_leoHighlightsShowPopup%28anchorId%2Csize%29%0A%7B%0A%20%20%20try%0A%20%20%20%7B%0A%20%20%20%09var%20popup%3Dnew%20LeoHighlightsPopup%28anchorId%2Csize%29%3B%0A%20%20%20%09popup.show%28%29%3B%0A%20%20%20%7D%0A%20%20%20catch%28e%29%0A%20%20%20%7B%0A%20%20%20%09_leoHighlightsReportExeception%28%22_leoHighlightsShowPopup%28%29%22%2Ce%29%3B%20%20%20%09%0A%20%20%20%7D%09%0A%7D%0A%0A%0A/**%0A%20*%20This%20will%20transform%20the%20passed%20in%20url%20to%20a%20rover%20url%0A%20*%20%0A%20*%20@param%20url%0A%20*%20@return%0A%20*/%0Afunction%20_leoHighlightsGetRoverUrl%28url%29%0A%7B%0A%09var%20rover%3D%22711-36858-13496-14%22%3B%0A%09var%20roverUrl%3D%22http%3A//rover.ebay.com/rover/1/%22+rover+%22/4?%26mpre%3D%22+encodeURI%28url%29%3B%0A%09%0A%09return%20roverUrl%3B%0A%7D%0A%0A/**%0A%20*%20Class%20for%20a%20Popup%20%0A%20*%20%0A%20*%20@param%20anchorId%0A%20*%20@param%20size%0A%20*%20%0A%20*%20@return%0A%20*/%0Afunction%20LeoHighlightsPopup%28anchorId%2Csize%29%0A%7B%0A%20%20%20try%0A%20%20%20%7B%0A%20%20%20%09this.anchorId%3DanchorId%3B%0A%20%20%20%09this.anchor%3D_leoHighlightsFindElementById%28this.anchorId%29%3B%0A%20%20%20%09this.iFrame%3D_leoHighlightsFindElementById%28LEO_HIGHLIGHTS_IFRAME_ID%29%3B%0A%20%20%20%09this.iFrameDiv%3D_leoHighlightsFindElementById%28LEO_HIGHLIGHTS_IFRAME_DIV_ID%29%3B%0A%20%20%20%09%0A%20%20%20%09var%20url%3Dunescape%28this.anchor.getAttribute%28%27leoHighlights_url%27%29%29%3B%0A%0A%20%20%20%09this.iFrame.src%3Durl%3B%0A%0A%20%20%20%09leoHighlightsSetSize%28size%29%3B%0A%20%20%20%09%0A%20%20%20%09this.updatePos%3Dfunction%28%29%20%7B%20_leoHighlightsUpdatePopupPos%28this.iFrameDiv%2Cthis.anchor%29%7D%3B%0A%20%20%20%09this.show%3Dfunction%28%29%20%7Bthis.updatePos%28%29%3B%20this.iFrameDiv.style.visibility%20%3D%20%22visible%22%3B%20this.iFrameDiv.style.display%20%3D%20%22block%22%3B%20this.updatePos%28%29%3B%7D%20%20%20%09%09%0A%20%20%20%09this.scroll%3Dfunction%28%29%20%7B%20this.updatePos%28%29%3B%7D%3B%0A%20%20%20%7D%0A%20%20%20catch%28e%29%0A%20%20%20%7B%0A%20%20%20%09_leoHighlightsReportExeception%28%22new%20LeoHighlightsPopup%28%29%22%2Ce%29%3B%20%20%20%09%0A%20%20%20%7D%0A%7D%0A%0A/**%0A*%0A*%20This%20can%20be%20used%20to%20close%20an%20iframe%0A*%0A*%20@param%20id%0A*%20@return%0A*/%0Afunction%20leoHighlightsSetSize%28size%2CclickId%29%0A%7B%0A%09try%0A%09%7B%0A%09%09/*%20Get%20the%20appropriate%20sizes%20*/%0A%20%20%09%09var%20iFrame%3D_leoHighlightsFindElementById%28LEO_HIGHLIGHTS_IFRAME_ID%29%3B%0A%20%20%09%09var%20iFrameDiv%3D_leoHighlightsFindElementById%28LEO_HIGHLIGHTS_IFRAME_DIV_ID%29%3B%0A%20%20%09%09%0A%20%20%09%09/*%20Figure%20out%20the%20correct%20sizes%20*/%0A%20%20%09%09var%20iFrameSize%3D%28size%3D%3D1%29?LEO_HIGHLIGHTS_IFRAME_CLICK_SIZE%3ALEO_HIGHLIGHTS_IFRAME_HOVER_SIZE%3B%0A%20%20%09%09var%20divSize%3D%28size%3D%3D1%29?LEO_HIGHLIGHTS_DIV_CLICK_SIZE%3ALEO_HIGHLIGHTS_DIV_HOVER_SIZE%3B%0A%0A%20%20%09%09/*%20Refresh%20the%20iFrame%27s%20url%2C%20by%20removing%20the%20size%20arg%20and%20adding%20it%20again%20*/%0A%20%20%09%09var%20url%3DiFrame.src%3B%0A%20%20%09%09var%20idx%3Durl.indexOf%28%22%26size%3D%22%29%3B%0A%20%20%09%09if%28idx%3E%3D0%29%0A%20%20%09%09%09url%3Durl.substring%280%2Cidx%29%3B%0A%09%09url+%3D%28%22%26size%3D%22+size%29%3B%0A%09%09if%28clickId%29%0A%09%09%09url+%3D%28%22%26clickId%3D%22+clickId%29%3B%0A%09%09%0A%20%20%09%09iFrame.src%3Durl%3B%0A%20%20%09%09%0A%20%20%09%09/*%20Clear%20the%20hover%20flag%2C%20if%20the%20user%20shows%20this%20at%20full%20size%20*/%0A%20%20%09%09if%28size%3D%3D1%26%26_leoHighlightsPrevElem%29%0A%20%20%09%09%09_leoHighlightsPrevElem.hover%3Dfalse%3B%0A%20%20%09%09%0A%20%20%09%09_leoHighlightsSetSize%28iFrame%2CiFrameSize%29%3B%0A%20%20%09%09_leoHighlightsSetSize%28iFrameDiv%2CdivSize%29%3B%0A%09%7D%0A%09catch%28e%29%0A%09%7B%0A%09%09_leoHighlightsReportExeception%28%22leoHighlightsSetSize%28%29%22%2Ce%29%3B%20%20%20%09%0A%09%7D%0A%7D%0A%0A/**%0A%20*%20Start%20the%20popup%20a%20little%20bit%20delayed.%0A%20*%20Somehow%20IE%20needs%20some%20time%20to%20find%20the%20element%20by%20id.%0A%20*%20%0A%20*%20@param%20anchorId%0A%20*%20@param%20size%0A%20*%20%0A%20*%20@return%0A%20*/%0Afunction%20leoHighlightsShowPopup%28anchorId%2Csize%29%0A%7B%0A%20%20%20try%0A%20%20%20%7B%0A%20%20%09%09var%20elem%3D_leoHighlightsFindElementById%28anchorId%29%3B%0A%20%20%09%09if%28_leoHighlightsPrevElem%26%26%28_leoHighlightsPrevElem%21%3Delem%29%29%0A%20%20%09%09%09_leoHighlightsPrevElem.shown%3Dfalse%3B%0A%20%20%09%09elem.shown%3Dtrue%3B%0A%09%09_leoHighlightsPrevElem%3Delem%3B%0A%20%20%20%09%0A%20%20%20%09/*%20FF%20needs%20to%20find%20the%20element%20first%20*/%0A%20%20%20%09_leoHighlightsFindElementById%28anchorId%29%3B%0A%20%20%20%09%0A%20%20%20%09setTimeout%28%22_leoHighlightsShowPopup%28%5C%27%22+anchorId+%22%5C%27%2C%5C%27%22+size+%22%5C%27%29%3B%22%2C10%29%3B%0A%20%20%20%7D%0A%20%20%20catch%28e%29%0A%20%20%20%7B%0A%20%20%20%09_leoHighlightsReportExeception%28%22leoHighlightsShowPopup%28%29%22%2Ce%29%3B%20%20%20%09%0A%20%20%20%7D%09%0A%7D%0A%0A/**%0A*%0A*%20This%20can%20be%20used%20to%20close%20an%20iframe%0A*%0A*%20@param%20id%0A*%20@return%0A*/%0Afunction%20leoHighlightsHideElem%28id%29%0A%7B%0A%09try%0A%09%7B%0A%09%09/*%20Get%20the%20appropriate%20sizes%20*/%0A%20%20%09%09var%20elem%3D_leoHighlightsFindElementById%28id%29%3B%0A%20%20%09%09if%28elem%29%0A%20%20%09%09%09elem.style.visibility%3D%22hidden%22%3B%0A%20%20%09%09%0A%20%20%09%09/*%20Clear%20the%20page%20for%20the%20next%20run%20through%20*/%0A%20%20%09%09var%20iFrame%3D_leoHighlightsFindElementById%28LEO_HIGHLIGHTS_IFRAME_ID%29%3B%0A%20%20%09%09if%28iFrame%29%0A%20%20%09%09%09iFrame.src%3D%22about%3Ablank%22%3B%0A%20%20%09%09%0A%20%20%09%09%0A%20%20%09%09if%28_leoHighlightsPrevElem%29%0A%20%20%09%09%7B%0A%20%20%09%09%09_leoHighlightsPrevElem.shown%3Dfalse%3B%0A%20%20%09%09%09_leoHighlightsPrevElem%3Dnull%3B%0A%20%20%09%09%7D%0A%09%7D%0A%09catch%28e%29%0A%09%7B%0A%09%09_leoHighlightsReportExeception%28%22leoHighlightsHideElem%28%29%22%2Ce%29%3B%20%20%20%09%0A%09%7D%0A%7D%0A%0A/**%0A*%0A*%20This%20can%20be%20used%20to%20close%20an%20iframe.%0A*%20Since%20the%20iFrame%20is%20reused%20the%20frame%20only%20gets%20hidden%0A*%0A*%20@return%0A*/%0Afunction%20leoHighlightsIFrameClose%28%29%0A%7B%0A%20%20try%0A%20%20%7B%0A%09%20%20_leoHighlightsSimpleGwCallBack%28%22LeoHighlightsHideIFrame%22%29%3B%0A%20%20%7D%0A%20%20catch%28e%29%0A%20%20%7B%0A%09%20%20_leoHighlightsReportExeception%28%22leoHighlightsIFrameClose%28%29%22%2Ce%29%3B%20%20%20%09%0A%20%20%7D%0A%7D%0A%0A/**%0A%20*%20This%20should%20handle%20the%20click%20events%0A%20*%20%0A%20*%20@param%20anchorId%0A%20*%20@return%0A%20*/%0Afunction%20leoHighlightsHandleClick%28anchorId%29%0A%7B%0A%20%20%20try%0A%20%20%20%7B%0A%20%20%09%09var%20anchor%3D_leoHighlightsFindElementById%28anchorId%29%3B%0A%20%20%09%09anchor.hover%3Dfalse%3B%0A%20%20%09%09if%28anchor.startTimer%29%0A%20%20%09%09%09clearTimeout%28anchor.startTimer%29%3B%0A%20%20%20%09%0A%20%20%09%09leoHighlightsEvent%28%22clicked%22%29%3B%0A%20%20%20%09leoHighlightsShowPopup%28anchorId%2C1%29%3B%0A%20%20%20%09return%20false%3B%0A%20%20%20%7D%0A%20%20%20catch%28e%29%0A%20%20%20%7B%0A%20%20%20%09_leoHighlightsReportExeception%28%22leoHighlightsHandleClick%28%29%22%2Ce%29%3B%20%20%20%09%0A%20%20%20%7D%09%0A%7D%0A%0A/**%0A%20*%20This%20should%20handle%20the%20hover%20events%0A%20*%20%0A%20*%20@param%20anchorId%0A%20*%20@return%0A%20*/%0Afunction%20leoHighlightsHandleHover%28anchorId%29%0A%7B%0A%20%20%20try%0A%20%20%20%7B%0A%20%20%09%09var%20anchor%3D_leoHighlightsFindElementById%28anchorId%29%3B%0A%20%20%09%09anchor.hover%3Dtrue%3B%0A%20%20%09%09%0A%20%20%09%09leoHighlightsEvent%28%22hovered%22%29%3B%0A%20%20%20%09leoHighlightsShowPopup%28anchorId%2C0%29%3B%0A%20%20%20%09return%20false%3B%0A%20%20%20%7D%0A%20%20%20catch%28e%29%0A%20%20%20%7B%0A%20%20%20%09_leoHighlightsReportExeception%28%22leoHighlightsHandleHover%28%29%22%2Ce%29%3B%20%20%20%09%0A%20%20%20%7D%09%0A%7D%0A%0A/**%0A%20*%20This%20will%20handle%20the%20mouse%20over%20setup%20timers%20for%20the%20appropriate%20timers%0A%20*%20%0A%20*%20@param%20id%0A%20*%20@return%0A%20*/%0Afunction%20leoHighlightsHandleMouseOver%28id%29%0A%7B%0A%09try%0A%09%7B%0A%09%09var%20anchor%3D_leoHighlightsFindElementById%28id%29%3B%09%09%0A%0A%09%09/*%20Clear%20the%20end%20timer%20if%20required%20*/%0A%09%09if%28anchor.endTimer%29%0A%09%09%09clearTimeout%28anchor.endTimer%29%3B%0A%09%09anchor.endTimer%3Dnull%3B%0A%09%09%0A%09%09anchor.style.background%3DLEO_HIGHLIGHTS_BACKGROUND_STYLE_HOVER%3B%0A%09%09%0A%09%09/*%20The%20element%20is%20already%20showing%20we%20are%20done%20*/%0A%09%09if%28anchor.shown%29%0A%09%09%09return%3B%0A%09%09%0A%09%09/*%20Setup%20the%20start%20timer%20if%20required%20*/%0A%09%09anchor.startTimer%3DsetTimeout%28function%28%29%7B%0A%09%09%09leoHighlightsHandleHover%28anchor.id%29%3B%0A%09%09%09anchor.hover%3Dtrue%3B%0A%09%09%09%7D%2C%0A%09%09%09LEO_HIGHLIGHTS_SHOW_DELAY_MS%29%3B%0A%09%7D%0A%09catch%28e%29%0A%09%7B%0A%09%09_leoHighlightsReportExeception%28%22leoHighlightsHandleMouseOver%28%29%22%2Ce%29%3B%20%20%20%09%0A%09%7D%0A%7D%0A%0A/**%0A%20*%20This%20will%20handle%20the%20mouse%20over%20setup%20timers%20for%20the%20appropriate%20timers%0A%20*%20%0A%20*%20@param%20id%0A%20*%20@return%0A%20*/%0Afunction%20leoHighlightsHandleMouseOut%28id%29%0A%7B%0A%09try%0A%09%7B%09%0A%09%09var%20anchor%3D_leoHighlightsFindElementById%28id%29%3B%0A%09%09%0A%09%09/*%20Clear%20the%20start%20timer%20if%20required%20*/%0A%09%09if%28anchor.startTimer%29%0A%09%09%09clearTimeout%28anchor.startTimer%29%3B%0A%09%09anchor.startTimer%3Dnull%3B%0A%09%09%0A%09%09anchor.style.background%3DLEO_HIGHLIGHTS_BACKGROUND_STYLE_DEFAULT%3B%0A%09%09if%28%21anchor.shown||%21anchor.hover%29%0A%09%09%09return%3B%0A%09%09%0A%09%09/*%20Setup%20the%20start%20timer%20if%20required%20*/%0A%09%09anchor.endTimer%3DsetTimeout%28function%28%29%7B%0A%09%09%09leoHighlightsHideElem%28LEO_HIGHLIGHTS_IFRAME_DIV_ID%29%3B%0A%09%09%09anchor.shown%3Dfalse%3B%0A%09%09%09_leoHighlightsPrevElem%3Dnull%3B%0A%09%09%09%7D%2CLEO_HIGHLIGHTS_HIDE_DELAY_MS%29%3B%0A%09%7D%0A%09catch%28e%29%0A%09%7B%0A%09%09_leoHighlightsReportExeception%28%22leoHighlightsHandleMouseOut%28%29%22%2Ce%29%3B%20%20%20%09%0A%09%7D%0A%7D%0A%0A/**%0A%20*%20This%20handles%20the%20mouse%20movement%20into%20the%20currently%20opened%20window.%0A%20*%20Just%20clear%20the%20close%20timer%0A%20*%20%0A%20*%20@return%0A%20*/%0Afunction%20leoHighlightsHandleIFrameMouseOver%28%29%0A%7B%0A%09try%0A%09%7B%0A%09%09if%28_leoHighlightsPrevElem%26%26_leoHighlightsPrevElem.endTimer%29%0A%09%09%09clearTimeout%28_leoHighlightsPrevElem.endTimer%29%3B%0A%09%7D%0A%09catch%28e%29%0A%09%7B%0A%09%09_leoHighlightsReportExeception%28%22leoHighlightsHandleIFrameMouseOver%28%29%22%2Ce%29%3B%20%20%20%09%0A%09%7D%0A%7D%0A%0A/**%0A%20*%20This%20handles%20the%20mouse%20movement%20into%20the%20currently%20opened%20window.%0A%20*%20Just%20clear%20the%20close%20timer%0A%20*%20%0A%20*%20@param%20id%0A%20*%20@return%0A%20*/%0Afunction%20leoHighlightsHandleIFrameMouseOut%28%29%0A%7B%0A%09try%0A%09%7B%0A%09%09if%28_leoHighlightsPrevElem%29%0A%09%09%09leoHighlightsHandleMouseOut%28_leoHighlightsPrevElem.id%29%3B%0A%09%7D%0A%09catch%28e%29%0A%09%7B%0A%09%09_leoHighlightsReportExeception%28%22leoHighlightsHandleIFrameMouseOut%28%29%22%2Ce%29%3B%20%20%20%09%0A%09%7D%0A%7D%0A/**%0A%20*%20This%20is%20a%20method%20is%20used%20to%20make%20the%20javascript%20within%20IE%20runnable%0A%20*/%0Avar%20leoHighlightsRanUpdateDivs%3Dfalse%3B%0Afunction%20leoHighlightsUpdateDivs%28%29%0A%7B%0A%09try%0A%09%7B%0A%09%09/*%20Check%20if%20this%20is%20an%20IE%20browser%20and%20if%20divs%20have%20been%20updated%20already%20*/%0A%09%09if%28document.all%26%26%21leoHighlightsRanUpdateDivs%29%0A%09%09%7B%0A%09%09%09leoHighlightsRanUpdateDivs%3Dtrue%3B%20//%20Set%20early%20to%20prevent%20running%20twice%0A%09%09%09for%28var%20i%3D0%3Bi%3CLEO_HIGHLIGHTS_MAX_HIGHLIGHTS%3Bi++%29%0A%09%09%09%7B%0A%09%09%09%09var%20id%3D%22leoHighlights_Underline_%22+i%3B%0A%09%09%09%09var%20elem%3D_leoHighlightsFindElementById%28id%29%3B%0A%09%09%09%09if%28elem%3D%3Dnull%29%0A%09%09%09%09%09break%3B%0A%09%09%09%09%0A%09%09%09%09if%28%21elem.leoChanged%29%0A%09%09%09%09%7B%0A%09%09%09%09%09elem.leoChanged%3Dtrue%3B%0A%09%09%09%09%0A%09%09%09%09%09/*%20This%20will%20make%20javaScript%20runnable%20*/%09%09%09%09%0A%09%09%09%09%09elem.outerHTML%3Delem.outerHTML%3B%0A%09%09%09%09%7D%0A%09%09%09%7D%0A%09%09%7D%0A%09%7D%0A%09catch%28e%29%0A%09%7B%0A%09%09_leoHighlightsReportExeception%28%22leoHighlightsUpdateDivs%28%29%22%2Ce%29%3B%20%20%20%09%0A%09%7D%0A%7D%0A%0Aif%28document.all%29%0A%09setTimeout%28leoHighlightsUpdateDivs%2C200%29%3B%0A%0A/**%0A%20*%20This%20is%20used%20to%20report%20events%20to%20the%20plugin%0A%20*%20@param%20key%0A%20*%20@param%20sub%0A%20*%20@return%0A%20*/%0Afunction%20leoHighlightsEvent%28key%2C%20sub%29%0A%7B%0A%20%20%20try%0A%20%20%20%7B%0A%20%20%20%20%20%20var%20gwObj%20%3D%20new%20Gateway%28%29%3B%0A%20%20%20%20%20%20gwObj.addParam%28%22key%22%2C%20key%29%3B%0A%20%20%20%20%20%20gwObj.addParam%28%22sub%22%2C%20sub%29%3B%0A%20%20%20%20%20%20gwObj.callName%28%22LeoHighlightsEvent%22%29%3B%09%0A%20%20%20%7D%0A%20%20%20catch%28e%29%0A%20%20%20%7B%0A%20%20%20%09_leoHighlightsReportExeception%28%22leoHighlights%28%29%22%2Ce%29%3B%20%20%20%09%0A%20%20%20%7D%0A%7D%0A%0A/*----------------------------------------------------------------------*/%0A/*%20Methods%20provided%20to%20the%20highlight%20providers...%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20*/%0A/*----------------------------------------------------------------------*/%0A%0A/**%0A%20*%20This%20will%20redirect%20the%20top%20window%20to%20the%20passed%20in%20url%0A%20*%20%0A%20*%20@param%20url%0A%20*%20@param%20parentId%0A%20*%20@return%0A%20*/%0Afunction%20leoHL_RedirectTop%28url%2CparentId%29%0A%7B%0A%20%20%20try%0A%20%20%20%7B%0A%20%20%09%09leoHighlightsEvent%28%22clicked.2eBay%22%29%3B%0A%20%20%20%09_leoHighlightsRedirectTop%28url%29%3B%0A%20%20%20%7D%0A%20%20%20catch%28e%29%0A%20%20%20%7B%0A%20%20%20%09_leoHighlightsReportExeception%28%22leoHL_RedirectTop%28%29%22%2Ce%29%3B%20%20%20%09%0A%20%20%20%7D%0A%7D%0A%0A/**%0A%20*%20This%20will%20set%20the%20size%20of%20the%20iframe%0A%20*%20%0A%20*%20@param%20url%0A%20*%20@param%20parentId%0A%20*%20%0A%20*%20@return%0A%20*/%0Afunction%20leoHl_setSize%28size%2Curl%29%0A%7B%0A%20%20%20try%0A%20%20%20%7B%0A%20%20%20%09/*%20Get%20the%20clickId%20*/%0A%20%20%20%09var%20clickId%3D_leoHighlightsGetUrlArg%28%20url%2C%22clickId%22%29%0A%20%20%20%09%0A%20%20%20%20%20%20var%20gwObj%20%3D%20new%20Gateway%28%29%3B%0A%20%20%20%20%20%20gwObj.addParam%28%22size%22%2Csize%29%3B%0A%20%20%20%20%20%20if%28clickId%29%0A%20%20%20%20%20%20%20%20%20gwObj.addParam%28%22clickId%22%2CclickId+%22_blah%22%29%3B%0A%20%20%20%20%20%20gwObj.callName%28%22LeoHighlightsSetSize%22%29%3B%0A%20%20%20%7D%0A%20%20%20catch%28e%29%0A%20%20%20%7B%0A%20%20%20%09_leoHighlightsReportExeception%28%22leoHl_setSize%28%29%22%2Ce%29%3B%20%20%20%09%0A%20%20%20%7D%0A%7D%0A"); &lt;/script&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-6791202208348634415?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/6791202208348634415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/08/helpful-tool-wireshark.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/6791202208348634415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/6791202208348634415'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/08/helpful-tool-wireshark.html' title='Helpful Tool: Wireshark'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-4216280886969771290</id><published>2009-08-13T09:03:00.000-04:00</published><updated>2009-08-13T09:06:21.468-04:00</updated><title type='text'>Simple Tests</title><content type='html'>There's a great episode of Star Trek: The Next Generation where the omnipotent Q is made human. One of the tasks facing the crew during this episode is a moon that's losing orbit and threatening to crash into its planet. Q tries to help Geordi and Data prevent this disaster, and tells them that there's a simple solution. Geordi, excited, and asks what it is. Q's response: "Change the gravitational constant of the universe." Geordi's less than thrilled with this answer to say the least, but that's how Q would have handled the situation.&lt;br /&gt;&lt;br /&gt;I see something similar when people are first evaluating automated test tools. They come up with a "simple test" and if the tool fails to perform that test, they immediately write the tool off as useless.&lt;br /&gt;&lt;br /&gt;It's true there are times when a given automated tool isn't a good fit for a particular application, but keep perspective here. You, the tester, are on the same level as an empowered Q. You see everything in your application, and know how to make it work. The test tool doesn't have your ability to reason, to identify the cause of problems or to adapt. The test tool doesn't "see" the application the same way you do - it sees your application the way a *computer* sees it. You see a button labeled OK. Your test tool sees an extended Winforms control with a dynamically generated ID like cmdOK87823, or worse, the code may be obfuscated so that a test tool can't read any information from it.&lt;br /&gt;&lt;br /&gt;The tool is operating on a much lower level playing field that you are, and it finding that dynamically generated button on an obfuscated application is just as impossible as it would be for Geordi to change the gravitational constant of the universe. So what to do in situations like this? You find ways to make the tool work with your application. In the TNG episode I mentioned, Data &amp;amp; Geordi found a way to send a warp field around the moon that would do something very similar to Q's solution. To find your dynamically generated controls, you could insert wildcards into your test scripts, so the tool would find cmdOK*, and thus match whatever identifier had been dynamically generated. You may need to run your tests against unobfuscated code. Just be aware that tasks like this may be a necessity, and you'll be much better off when it comes time to automate.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;input id="gwProxy" type="hidden"&gt;&lt;!--Session data--&gt;&lt;input onclick="jsCall();" id="jsProxy" type="hidden"&gt;&lt;div id="refHTML"&gt;&lt;/div&gt;&lt;input id="gwProxy" type="hidden"&gt;&lt;!--Session data--&gt;&lt;input onclick="jsCall();" id="jsProxy" type="hidden"&gt;&lt;div id="refHTML"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-4216280886969771290?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/4216280886969771290/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/08/simple-tests.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/4216280886969771290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/4216280886969771290'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/08/simple-tests.html' title='Simple Tests'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-7336417196111280886</id><published>2009-08-12T09:01:00.000-04:00</published><updated>2009-08-12T09:02:52.096-04:00</updated><title type='text'>Snap Decisions</title><content type='html'>Occasionally someone will contact me on a Wed afternoon and tell me that they need a demo of my software right away, because they have to make a decision whether to buy it tomorrow. Now, some people are saying this because they think they'll get attention faster, but some people legitimately plan on making a purchase within 24 hours.&lt;br /&gt;&lt;br /&gt;These calls scare the daylights out of me. My company provides a 30 day evaluation of our software so that people can try it out and make sure that it works well for them. I can show things off against sample applications, but at the end of the day what matters is that it works with their application. By relying solely on my demo, that second part is completely overlooked.&lt;br /&gt;&lt;br /&gt;I liken this to buying a car. Would you walk into a dealership and purchase a new car just based on the commercial you'd seen? No, you want to take it for a test drive. You want to know how well it corners, how loud the engine is, how comfortable the seats are.&lt;br /&gt;&lt;br /&gt;So if you have someone on your team who's pushing for a snap decision on a product, do everything you can to keep that from happening. Make sure some time has been spent ensuring that the program meets your needs. Otherwise you could end up in a bad spot where a tool has been purchased, it doesn't work, and now you have no money to get something else in place.&lt;br /&gt;&lt;input id="gwProxy" type="hidden"&gt;&lt;!--Session data--&gt;&lt;input onclick="jsCall();" id="jsProxy" type="hidden"&gt;&lt;div id="refHTML"&gt;&lt;/div&gt;&lt;input id="gwProxy" type="hidden"&gt;&lt;!--Session data--&gt;&lt;input onclick="jsCall();" id="jsProxy" type="hidden"&gt;&lt;div id="refHTML"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-7336417196111280886?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/7336417196111280886/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/08/snap-decisions.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/7336417196111280886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/7336417196111280886'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/08/snap-decisions.html' title='Snap Decisions'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-1626234287387784883</id><published>2009-08-10T09:30:00.000-04:00</published><updated>2009-08-10T09:32:38.173-04:00</updated><title type='text'>Automating Installs</title><content type='html'>A common scenario in a manual test case is something like this:&lt;br /&gt;&lt;br /&gt;1 - Uninstall old version of application&lt;br /&gt;2 - Install new build&lt;br /&gt;3 - [Perform actual test here]&lt;br /&gt;&lt;br /&gt;When people are starting out with test automation tools, they often want to automate steps 1 &amp;amp; 2. This makes complete sense, but the approach taken is almost always the wrong one. I've seen many people try to use record &amp;amp; playback tools to open the control panel, click Add/Remove programs, and uninstall.&lt;br /&gt;&lt;br /&gt;Now, conceptually, this shouldn't be a big deal, but when you figure that there are differences in the control panel in almost every version of Windows, your recorded script will break quite easily. So instead, a better option is to use command line flags to remove your application.&lt;br /&gt;&lt;br /&gt;Almost all the major install building programs allow for the creation of command line parameters. This lets you install your app with a command like "myapp.exe /AcceptLicenseAgreement /InstallToDefaultLocation" They also usually have uninstall commands as well. Installing/uninstalling your app in this fashion makes it a lot easier to get new versions of your programs loaded for use with automated tests.&lt;br /&gt;&lt;br /&gt;Talk with your build engineer to get a list of the commands available for your product, and if there aren't any, work with him or her to get some implemented. It will only make your life easier in the long run.&lt;br /&gt;&lt;input id="gwProxy" type="hidden"&gt;&lt;!--Session data--&gt;&lt;input onclick="jsCall();" id="jsProxy" type="hidden"&gt;&lt;div id="refHTML"&gt;&lt;/div&gt;&lt;input id="gwProxy" type="hidden"&gt;&lt;!--Session data--&gt;&lt;input onclick="jsCall();" id="jsProxy" type="hidden"&gt;&lt;div id="refHTML"&gt;&lt;/div&gt;&lt;input id="gwProxy" type="hidden"&gt;&lt;!--Session data--&gt;&lt;input onclick="jsCall();" id="jsProxy" type="hidden"&gt;&lt;div id="refHTML"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-1626234287387784883?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/1626234287387784883/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/08/automating-installs.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/1626234287387784883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/1626234287387784883'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/08/automating-installs.html' title='Automating Installs'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-3344239174852394030</id><published>2009-08-07T11:20:00.000-04:00</published><updated>2009-08-07T11:20:00.783-04:00</updated><title type='text'>LMGTFY</title><content type='html'>We've all had those moments where someone emails us a question that could've been answered with a simple Google search. Things like "What does IIS stand for?" "How many GB in a TB?" "What's the capital of Iceland?" (ok, I've never actually been asked that one, but you know what I mean).&lt;br /&gt;&lt;br /&gt;For those moments when you're feeling just a little snarky at someone for throwing one of these questions your way, there's Let Me Google That For You. &lt;a href="http://lmgtfy.com/"&gt;LMGTFY&lt;/a&gt; takes a question and creates a URL that you can email in response to the question. When your associate clicks the link, they'll see a vid of the question being typed into the Google home page and the Google Search button being clicked, followed by a message saying "Was that so hard?" Then the user is taken to the actual results of the search.&lt;br /&gt;&lt;br /&gt;Here's a sample with the aforementioned "&lt;a href="http://lmgtfy.com/?q=What%27s+the+capital+of+Iceland%3F"&gt;What's the capital of Iceland&lt;/a&gt;?" question. Enjoy!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;input id="gwProxy" type="hidden"&gt;&lt;!--Session data--&gt;&lt;input onclick="jsCall();" id="jsProxy" type="hidden"&gt;&lt;div id="refHTML"&gt;&lt;/div&gt;&lt;input id="gwProxy" type="hidden"&gt;&lt;!--Session data--&gt;&lt;input onclick="jsCall();" id="jsProxy" type="hidden"&gt;&lt;div id="refHTML"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-3344239174852394030?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/3344239174852394030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/08/lmgtfy.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/3344239174852394030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/3344239174852394030'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/08/lmgtfy.html' title='LMGTFY'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-3806440995017071597</id><published>2009-08-05T11:26:00.001-04:00</published><updated>2009-08-05T11:26:00.453-04:00</updated><title type='text'>Blind Faith</title><content type='html'>Your automated tests are great. They run unattended every night, and each morning, you come in and see a little report on your desktop with a bunch of green success messages.  You feel good. You know those tests are making sure the basic functionality of your app is running smooth, and there hasn't been a failure in days.&lt;br /&gt;&lt;br /&gt;Then you give the first build of the app to the test team. Within an hour, 30 high priority bugs have been logged. You review the bugs and see that close to half of them are scenarios that are covered by the automated tests. Stupid testers, you think. They must be doing something wrong. You kick off your automated suite, and it passes. Then you try to run the same test by hand, and it fails. You try it again by hand, and it fails again.&lt;br /&gt;&lt;br /&gt;Then you take a look at the automated test, and realize there's a flaw in its logic. You see that the test is configured to always pass, regardless of what's actually happening. You quickly dive into the code and fix the application, and then you go back and fix the tests.&lt;br /&gt;&lt;br /&gt;The moral of the story here is to make sure you know exactly what your automated tests are doing. Have them code reviewed just like any other part of your project. Just because a report gets spit out saying everything passed, doesn't mean everything did.&lt;br /&gt;&lt;input id="gwProxy" type="hidden"&gt;&lt;!--Session data--&gt;&lt;input onclick="jsCall();" id="jsProxy" type="hidden"&gt;&lt;div id="refHTML"&gt;&lt;/div&gt;&lt;input id="gwProxy" type="hidden"&gt;&lt;!--Session data--&gt;&lt;input onclick="jsCall();" id="jsProxy" type="hidden"&gt;&lt;div id="refHTML"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-3806440995017071597?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/3806440995017071597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/08/blind-faith.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/3806440995017071597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/3806440995017071597'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/08/blind-faith.html' title='Blind Faith'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-6095363287618793581</id><published>2009-08-03T11:09:00.000-04:00</published><updated>2009-08-03T11:58:35.327-04:00</updated><title type='text'>Ninjas or Pirates? Both.</title><content type='html'>There's an age old debate on who would win in a fight, ninjas or pirates. But as I once saw in a Nodwick comic,  if you create Ninja Pirates, then you've got something absolutely unstoppable.&lt;br /&gt;&lt;br /&gt;For some reason, this got me thinking about when I hear people argue about whether it's worth it to exclusively do automated testing, or exclusive manual testing. On their own, both techniques are powerful, but you're going to find the most bugs when you combine the two techniques. So augment your manual tests with automated tools that will let your testers do things faster and more efficiently. The end result will be well worth it.&lt;br /&gt;&lt;br /&gt;Plus, you can brag to your friends that you've got a bunch of Ninja Pirates working for you.&lt;br /&gt;&lt;input id="gwProxy" type="hidden"&gt;&lt;!--Session data--&gt;&lt;input onclick="jsCall();" id="jsProxy" type="hidden"&gt;&lt;div id="refHTML"&gt;&lt;/div&gt;&lt;input id="gwProxy" type="hidden"&gt;&lt;!--Session data--&gt;&lt;input onclick="jsCall();" id="jsProxy" type="hidden"&gt;&lt;div id="refHTML"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-6095363287618793581?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/6095363287618793581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/08/ninjas-or-pirates-both.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/6095363287618793581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/6095363287618793581'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/08/ninjas-or-pirates-both.html' title='Ninjas or Pirates? Both.'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-7368319852491973891</id><published>2009-07-13T10:40:00.000-04:00</published><updated>2009-07-13T10:50:32.887-04:00</updated><title type='text'>More than One Right Way</title><content type='html'>In testing, we often focus on there being one right way to do something. This may be known as the "happy path" where you know a particular test scenario works when all the input parameters are exactly right. Then we charge off the happy path into the dark unknown, where we expect to find bugs. But as this Lifehacker post reminded me, sometimes there's more than one right way to do something.&lt;br /&gt;&lt;br /&gt;This video (http://lifehacker.com/5311002/open-a-banana-like-a-monkey) shows how to open a banana from the bottom. This was a bit of a shock to me, as I've been using the stem of a banana like a pull tab my whole life. It's actually easier &amp;amp; cleaner to do the method shown in the vid. Either approach works, but they're both right.&lt;br /&gt;&lt;br /&gt;When you're creating your test plans,  take a few minutes and think about how many happy paths may exist. They'll help you create more thorough test cases and help you uncover more interesting bugs.&lt;br /&gt;&lt;input id="gwProxy" type="hidden"&gt;&lt;!--Session data--&gt;&lt;input onclick="jsCall();" id="jsProxy" type="hidden"&gt;&lt;div id="refHTML"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-7368319852491973891?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/7368319852491973891/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/07/more-than-one-right-way.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/7368319852491973891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/7368319852491973891'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/07/more-than-one-right-way.html' title='More than One Right Way'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-6212811203740999858</id><published>2009-07-01T15:09:00.001-04:00</published><updated>2009-07-01T15:14:45.921-04:00</updated><title type='text'>What goes down, must come up</title><content type='html'>I have to admit, I'm a soda junkie. Pepsi's my preferred beverage, but I love Jolt, Coke, Mountain Dew (especially the World of Warcraft varieties), root beer and a bunch more. But I've learned the hard way that it's a *very bad* idea to have a Pepsi at arm's reach while doing a demo. The reason? Carbonation makes you burp , and depending on how much you drank, you may be burping a lot. A second issue is that odd 'quasi burp', where your throat constricts because you can feel a burp coming, but it doesn't. Either of these makes you look less than professional, and you don't want to have various bodily noises distracting people from the message you're trying to deliver.&lt;br /&gt;&lt;br /&gt;So, avoid the carbonated beverages for about 30 mins before you give a presentation. Have a bottle of room temperature water handy in case you need a drink. (If the water's too cold, it can constrict your throat, and that's a whole different problem. )&lt;br /&gt;&lt;br /&gt;Once you've given your killer, burp-free presentation, crack open a Pepsi for me!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-6212811203740999858?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/6212811203740999858/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/07/what-goes-down-must-come-up.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/6212811203740999858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/6212811203740999858'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/07/what-goes-down-must-come-up.html' title='What goes down, must come up'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-6125248944479829699</id><published>2009-06-22T11:26:00.001-04:00</published><updated>2009-06-22T11:41:05.357-04:00</updated><title type='text'>Pull Up</title><content type='html'>Back when I was first working in automation, my AUT was a java based course player. Users could learn about how to be a good manager, how to shake hands in Australia, and a myriad of other soft skill topics. At the end of each learning session, the user would be given a 10 question multiple choice quiz on what they learned.&lt;br /&gt;&lt;br /&gt;My job was to have my automation tool launch courses, answer questions, and confirm that the scoring mechanism in the app was behaving properly.&lt;br /&gt;&lt;br /&gt;What made this particularly challenging to automate was that the questions were displayed in random order, and there were anywhere from 30 - 50 potential questions per quiz. So you never knew which questions were coming, or what order they were coming in.&lt;br /&gt;&lt;br /&gt;I voiced my concern to my team lead, and she said that I should maintain a list of every question that could be listed in the course, and the answers to those questions. Now, that might have been ok if I were only dealing with one course, but there were dozens of courses I had to work with to ensure the app was behaving properly.&lt;br /&gt;&lt;br /&gt;One of the things I learned early on was to "pull up," which is my way of saying take a breath, step back, and look at the whole picture. Is there a better way to handle this? What I realized was that somehow, the AUT knew what the right answer to any question was. If Choice C was right, then the AUT knew that. It was so blindingly obvious that I was ticked at myself for not seeing it sooner.&lt;br /&gt;&lt;br /&gt;I went over to one of my developers and spent the next 10 minutes discussing my situation, my intended solution, and what was required to implement it. By the end of that afternoon, I had a method in place that would call out to the AUT and tell me which answer was correct for any given question.&lt;br /&gt;&lt;br /&gt;It was a heck of a lot cleaner than maintaining a question/answer list, and it made for good "press" internally with automation. It also raised my developer street-cred, because folks saw that test automation was a lot more than just point&amp;amp;click record and playback.&lt;br /&gt;&lt;br /&gt;So when you face a challenge in your automation, remember to pull up and make sure that you're not missing something obvious.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-6125248944479829699?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/6125248944479829699/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/06/pull-up.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/6125248944479829699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/6125248944479829699'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/06/pull-up.html' title='Pull Up'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-175072884492535932</id><published>2009-06-11T14:50:00.000-04:00</published><updated>2009-06-12T15:27:34.125-04:00</updated><title type='text'>The Kindle</title><content type='html'>My family bought me a Kindle 2 for my birthday a couple months ago, and I am totally enamored with the device. I really do forget that I'm not reading a physical book. The electronic ink the Kindle uses is crisp, and very easy on the eyes. The only downside is how easy it's become to drop a ton of money at Amazon.&lt;br /&gt;&lt;br /&gt;Here's a brief sampling of some of the titles I've picked up so far:&lt;br /&gt;&lt;br /&gt;The Prince.  This book should be in everyone's library. Machiavelli has a bad rep, but this book is extremely insightful. I have a paperback copy, but it's getting pretty tattered.&lt;br /&gt;&lt;br /&gt;UR.  I'm a big Stephen King fan, and this novella is a story about the Kindle. He ties it in nicely with the Dark Tower and From a Buick 8.&lt;br /&gt;&lt;br /&gt;Agile Testing - A Practical Guide For Testers and Agile Teams. This is a great overview of agile testing, and what a tester's role is in an agile environment.&lt;br /&gt;&lt;br /&gt;The Little Red Book of Selling - It's marketed as a sales book, but this little gem can be applied to achieving pretty much any goal you may have.&lt;br /&gt;&lt;br /&gt;Goblin Hero - If you've ever read epic or heroic fantasy, you owe it to yourself to pick up the Goblin books by Jim C Hines. They give you a look at what it's like from the Goblin's point of view, and they're really funny.&lt;br /&gt;&lt;br /&gt;I'll post more in-depth reviews as time goes on. What are you reading these days?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-175072884492535932?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/175072884492535932/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/06/kindle.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/175072884492535932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/175072884492535932'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/06/kindle.html' title='The Kindle'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-7057621552451441868</id><published>2009-06-03T09:31:00.000-04:00</published><updated>2009-06-03T09:50:31.274-04:00</updated><title type='text'>State</title><content type='html'>One thing to remember with UI automation is that your application needs to be in the same state each time the test starts. You need to be on the right screen, with the right options enabled, and your test goes from there. This makes perfect sense to me, but I'm amazed at the people who get frustrated with that. They say "The tool should just know."&lt;br /&gt;&lt;br /&gt;Now I agree that it's good to build logic into your tests that can get you onto the right screen if you aren't there already. It's also good to build recovery scenarios into your tests so you can get back to a good state if something goes wrong. However, to assume that the tool is just going to know what to do is ludicrous. The computer is a stupid box. You are the one with the brains. You tell the box what to do and it does it.&lt;br /&gt;&lt;br /&gt;Come on, do you really want Skynet running your test efforts?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-7057621552451441868?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/7057621552451441868/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/06/state.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/7057621552451441868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/7057621552451441868'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/06/state.html' title='State'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-3485905887453866997</id><published>2009-05-13T14:33:00.001-04:00</published><updated>2009-05-13T14:44:35.670-04:00</updated><title type='text'>Stupid Password Masking</title><content type='html'>Log In/Out tests are commonplace throughout software testing. Pretty much every portal, client/server app, or web site I've worked with has required that I log in with a valid user/pass combo. Those credentials were always listed in the test plans I used. "Step1 - Log in as User1/Pass123 and click Enter."&lt;br /&gt;&lt;br /&gt;Now, there's no problem with putting the user/pass combo in the test plan, and then tacking it up on the wall. But why do the managers, whose teams are proudly displaying test user credentials alongside photos of their kids, suddenly balk if an automated tool stores passwords in plain text format?&lt;br /&gt;&lt;br /&gt;"Someone else could learn the password" they cry. "This is horrible and insecure!"&lt;br /&gt;&lt;br /&gt;OK, let's think about this, for a moment. The tests will be placed in source control. Source control can restrict who can access the tests. Boom - problem solved.  Let's look at it from another angle. Let's say that your automated tool masked the password that it entered, so that it just appeared as asterisks. How do you know what password is being entered? If you login is failing over and over, is it because the tool is entering a bum password? &lt;span style="font-weight: bold;"&gt;You'll never know.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Maybe I'm missing something here. But as a tester, I want to know what password my tests are using. Toggling a "hide password" feature on and off seems foolish too, as I can just toggle it to "show password" and bang - there it is again.&lt;br /&gt;&lt;br /&gt;What do you think? Is there something really obvious that I'm missing here?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-3485905887453866997?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/3485905887453866997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/05/stupid-password-masking.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/3485905887453866997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/3485905887453866997'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/05/stupid-password-masking.html' title='Stupid Password Masking'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-1373606292099133675</id><published>2009-05-06T17:42:00.000-04:00</published><updated>2009-05-06T17:48:57.883-04:00</updated><title type='text'>Clean Up Your Screen</title><content type='html'>When I watch demos, I always find myself distracted from the presenter's message by something on their desktop. Maybe there's an icon in the system tray I haven't seen before (or maybe something down there is blinking). Maybe they have a shortcut to World of Warcraft on their desktop, or maybe their desktop is nothing but shortcuts, giving the feeling that their Start Menu just threw up all over the screen.&lt;br /&gt;&lt;br /&gt;I've whittled my desktop down to the Recycle bin, and 3 shortcuts. One is the application I demo with, and the other 2 are apps I use during my demonstration. Everything that the audience sees has a point to being there.&lt;br /&gt;&lt;br /&gt;As for the System Tray (or notification area, if you prefer), I recently discovered there's a way to force Windows to hide icons that are displayed there.  Right click on the tray and select Properties, then click Customize on the Taskbar tab. You'll see a list of the items in your tray, and you can select if you want them to always be hidden, always shown, or only hidden if inactive. I set everything except my system's volume control and GoToMeeting to Always Hide.&lt;br /&gt;&lt;br /&gt;It's a small thing, but it helps keep people focused on the message I'm sending, rather than wondering if I'm playing Horde or Alliance.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-1373606292099133675?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/1373606292099133675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/05/clean-up-your-screen.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/1373606292099133675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/1373606292099133675'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/05/clean-up-your-screen.html' title='Clean Up Your Screen'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-4701345798919662675</id><published>2009-05-04T08:57:00.000-04:00</published><updated>2009-05-04T09:08:25.649-04:00</updated><title type='text'>Machiavellian Automation</title><content type='html'>I spoke with a colleague recently about a company whose automated test efforts had suddenly stopped. They had been using a third party resource  for all their automated testing, and the money for that resource had dried up. As such, automated test development stopped, and no one in house had the knowledge or expertise to pick up the effort.&lt;br /&gt;&lt;br /&gt;This reminded me of something I'd read in Machiavelli's &lt;span style="font-style: italic;"&gt;The Prince&lt;/span&gt;. Machiavelli argued that princes should not rely on mercenaries or auxiliaries, and instead should rely on their own people. Some of that applies here as well. I think it's great if you want to jump start or augment your efforts by bringing in third party resources, but you need to be building up your own people as well. Sooner or later, that outside resource will be unavailable, either due to funding on your part,  or lack of time on theirs. If you've built up your own team so that they can take the effort over, you'll have a smooth transition and no lost time or effort. If you haven't, your people will be scrambling to figure out how the automation works, and you'll waste time and money.&lt;br /&gt;&lt;br /&gt;So make the investment in your people. Send them to training, buy them books, encourage them to learn. The end result will be in house expertise, which will make all your efforts smoother in the long run.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-4701345798919662675?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/4701345798919662675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/05/machiavellian-automation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/4701345798919662675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/4701345798919662675'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/05/machiavellian-automation.html' title='Machiavellian Automation'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-4287087606260135787</id><published>2009-05-01T10:10:00.000-04:00</published><updated>2009-05-01T10:29:12.415-04:00</updated><title type='text'>Only Bitmap Comparisons? Bad Tester! Bad!</title><content type='html'>Many automation tools have the ability to take a screenshot of something in your AUT, and compare that to a baselined value.  The intention is that you can use this to verify that images have rendered properly in your app; so things like your company logo, a product's photo, or the like can be validated easily. But I still come across people who want to use bitmap comparisons as their only means of validation in their tests.&lt;br /&gt;&lt;br /&gt;Their reasoning seems sound enough. "If we just click through each screen of our app, and do a bitmap comparison of each full screen, then we can easily confirm the app is working. The bitmap comparison will automatically validate every value in every field, so we'll be able to create our tests even faster!"&lt;br /&gt;&lt;br /&gt;It sounds good, doesn't it? But it doesn't work that way in practice. In fact, this has to be one of the most fragile, breakable, and ineffective approaches to automation. See, bitmap comparisons are going to do a pixel by pixel comparison of each screen. That means that if a single pixel is off, the test fails. In some cases, just running the same test on a different OS is enough to cause every bitmap comparison to fail, because a dialog in WinXP may have a screen where one pixel is slightly lighter than that same pixel in Vista. To your eyes, they don't look any different, so you won't know there's a problem until it's too late. Imagine that suddenly all your tests fail, and for no good reason. If this happens, you'll wind up in a maintenance nightmare as you struggle to track down that rogue pixel and somehow convince your automation tool that this is really ok. Automation is supposed to make testing easier and faster, not the other way around.&lt;br /&gt;&lt;br /&gt;So please, take my advice. Use bitmap/region/image (or whatever your automated tool calls them) comparisons only to compare actual images. If you want to verify the contents of a field, read the actual value from that field. If you want to verify a button is enabled, check its actual Enabled property. This may require a bit more effort up front, but the payoff in the long run is well worth it. You'll have more efficient, more stable tests that will run clean, and it won't matter if that one rogue pixel off to the left is grey, a slightly darker shade of gray or a slightly lighter shade of gray than the ones around it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-4287087606260135787?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/4287087606260135787/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/05/only-bitmap-comparisons-bad-tester-bad.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/4287087606260135787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/4287087606260135787'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/05/only-bitmap-comparisons-bad-tester-bad.html' title='Only Bitmap Comparisons? Bad Tester! Bad!'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-5608044475386308878</id><published>2009-04-29T12:25:00.000-04:00</published><updated>2009-04-29T12:34:04.819-04:00</updated><title type='text'>Befuddled</title><content type='html'>I've posted previously about being honest when you deal with prospective customers. When a customer describes a scenario to me that I know my company's product isn't a good fit for, I state that. The last thing I want is for people to think I've lead them on so we can make a sale. People won't want to do repeat business with us, and hurts both my reputation and the company's.&lt;br /&gt;&lt;br /&gt;But I've encountered one particular scenario that I just can't wrap my head around. I was speaking with a test manager and his team. They outlined their scenario, and what they'd done with my product so far, and the issues they had encountered. I listened carefully, and based on what they wanted to achieve, I knew my app wasn't a good fit. I told them this, and stated my reasons why. Several of the team members voiced their agreement. And then the manager said something that flat out stunned me.&lt;br /&gt;&lt;br /&gt;"I think we can make it work. We'll buy it."&lt;br /&gt;&lt;br /&gt;I couldn't think of anything to say other than restate my previous concerns. The manager told me that his team would deal with it, and that they would purchase.&lt;br /&gt;&lt;br /&gt;How would you handle this?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-5608044475386308878?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/5608044475386308878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/04/befuddled.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/5608044475386308878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/5608044475386308878'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/04/befuddled.html' title='Befuddled'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-7936552918671529167</id><published>2009-04-23T13:32:00.001-04:00</published><updated>2009-04-24T09:20:25.430-04:00</updated><title type='text'>I Can Haz Demo?</title><content type='html'>It's funny how social media has changed our perception of language. We communicate much more informally via the emoticons and acronyms that we use in IM programs, Twitter and in-game chat programs. However, when communicating with first time customers, clients and prospects, this abbreivated means of communication strikes me as unacceptable. You're trying to portray yourself as professional, not show how hip you are.  Additionally, if you are a customer requesting help, a demonstration, or requesting license information, your sales rep probably won't take you very seriously if you send in a message like the one I received last summer:&lt;br /&gt;&lt;br /&gt;"Can u plz help in it?bcoz it is not clear from Demo how to test Web application. Waiting 4 ur reply."&lt;br /&gt;&lt;br /&gt;While this person may have been genuinely interested in my company's product, this communication came across as unprofessional. My sales team sent off a canned email response along with links to some recorded demos. If this person had listed their questions in plain English, we definitely would've put a lot more effort into helping them.&lt;br /&gt;&lt;br /&gt;I don't intend to come across as snobbish in this post. I use IM-speak a lot myself, and I abbreviate words when I'm on Twitter. But when I'm trying to solve a customer's problem, I'm not out to show what a l33t hax0r I am. And in the same vein, when someone approaches me with a problem to solve, I definitely prefer it to come in clear and concise language.&lt;br /&gt;&lt;br /&gt;Am I being too old fashioned here? What do you folks think?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-7936552918671529167?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/7936552918671529167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/04/i-can-haz-demo.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/7936552918671529167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/7936552918671529167'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/04/i-can-haz-demo.html' title='I Can Haz Demo?'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-5725318415933895761</id><published>2009-04-23T09:38:00.000-04:00</published><updated>2009-04-23T09:49:26.713-04:00</updated><title type='text'>Honesty Is the Best Policy</title><content type='html'>My dad used to have a plaque that read "If you can't dazzle 'em with brilliance, baffle 'em with bullshit." I saw this employed quite frequently when I was evaluating test tools.&lt;br /&gt;&lt;br /&gt;When I would setup demos from tool vendors, I was always up front about my needs and what I was looking for. Then I'd watch whatever they prepared and ask any questions that sprang to mind. Sometimes those questions would stump the presenter, and he or she would come up with some answer that was choc full of buzzwords that didn't mean anything. I never felt the need to call people on this - because in doing this, they answered a different question, which is how honest they are. I tend to avoid doing business with people who BS me, because I never know if I can trust what they're saying. It's hard to get work done when a trust issue is always nagging in the back of your head.&lt;br /&gt;&lt;br /&gt;I have no problem with someone telling me "I don't know", so long as that is immediately followed by "But I'll find out and get back to you." I appreciate the honesty and I respect the person more as a result of it, and I think many people share that sentiment. I would much rather work with someone who didn't know an answer and found out for me, rather than someone who'd invented something that sounded good at the time, in order to turn a quick sale.&lt;br /&gt;&lt;br /&gt;Now that I'm the one giving the demos, I always try to prepare well in advance so I can address any questions my client may have. And when they stump me, I don't follow the advice on dad's plaque.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-5725318415933895761?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/5725318415933895761/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/04/honesty-is-best-policy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/5725318415933895761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/5725318415933895761'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/04/honesty-is-best-policy.html' title='Honesty Is the Best Policy'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-9027652727717112304</id><published>2009-04-20T12:12:00.000-04:00</published><updated>2009-04-20T12:19:19.148-04:00</updated><title type='text'>Screenshots Need Accompanying Info</title><content type='html'>It's said that a picture is worth a thousand words, and quite frequently, testers attach screenshots to their bug reports to illustrate a particular issue. While this can provide additional information that's helpful to a developer, I've noticed a lot of people lately who just log screenshots as bugs, with no steps to reproduce. For example, I recently received an email saying "The tool doesn't work - see attached" The attached bitmap showed the application with a blank screen; there were no error messages, no data, nothing that told me what didn't work, nothing that told me how it had gotten into this state. The back-and-forth email chain that ensued could've been avoided completely if the person had given me the steps they were performing and what they were trying to achieve.&lt;br /&gt;&lt;br /&gt;To encourage people to provide more information in their bug reports, try this at your next team meeting. Say "My car wouldn't start this morning. Why?" Before anyone can answer, quickly add "Oh, and here's a screenshot of it" and have a photo of your car. Hopefully this drives the point home.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-9027652727717112304?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/9027652727717112304/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/04/screenshots-need-accompanying-info.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/9027652727717112304'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/9027652727717112304'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/04/screenshots-need-accompanying-info.html' title='Screenshots Need Accompanying Info'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-1667826419815301431</id><published>2009-04-10T13:33:00.000-04:00</published><updated>2009-04-10T13:49:22.389-04:00</updated><title type='text'>You Have Control</title><content type='html'>How many times have you walked out of a meeting, grinding your teeth because someone said something that upset you? I've seen this scenario happen a lot over the course of my career, and it usually ends up with the upset person venting to a friend or co-worker who had nothing to do with the situation. Nothing ever changes between the upset-ee and the upset-er, because they don't communicate with each other.&lt;br /&gt;&lt;br /&gt;I experienced this earlier this week. I left a meeting and was steaming mad at one particular participant. While this person had valuable things to say, they were rude and condescending, and their behavior really insulted me. I ranted to my family for a while, but it didn't help. So I sat down and wrote a very polite email to this person. I explained that I valued their input, and that I wanted to work with them, but that they had been condescending.&lt;br /&gt;&lt;br /&gt;I didn't demand an apology, I didn't use any harsh language. I sincerely thanked them for their comments (which I really did appreciate), and stated my issue with their behavior. Once I clicked the Send button for that email, it felt like a huge weight lifted off me, and my mood improved dramatically.&lt;br /&gt;&lt;br /&gt;So remember, you can't control other people, but you can control yourself. I tried to handle the situation with diplomacy, and while the jury's still out on what the outcome will be, I felt better because I actively did something. So next time someone gets you riled up during a meeting, step back and think about what you can do to take a measure of control in the situation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-1667826419815301431?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/1667826419815301431/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/04/you-have-control.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/1667826419815301431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/1667826419815301431'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/04/you-have-control.html' title='You Have Control'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-213967834092045082</id><published>2009-04-09T08:17:00.001-04:00</published><updated>2009-04-09T08:35:24.301-04:00</updated><title type='text'>Free Presentation Helper Tools</title><content type='html'>When I'm giving presentations &amp;amp; demos, there are a handful of tools that make things go much smoother. The best part is that all these tools are free.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb897434.aspx"&gt;ZoomIt&lt;/a&gt; - this is a magnification and annotation tool. I use it to zoom in on areas of interest within my application, and to draw callout arrows on various bits of the app I'm demonstrating.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://files.osherove.com/downloads/keyjedi.zip"&gt;Keyboard Jedi&lt;/a&gt; - this app displays any keyboard shortcuts you've pressed. For example, if you press Ctrl+Space in Visual Studio to open a code completion window, KeyboardJedi displayes Ctrl+Space. This keeps you from needing to repeat a bunch of keyboard commands to your audience as you're going through your presentation.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.harmonyhollow.net/cool_timer.shtml"&gt;CoolTimer&lt;/a&gt; - This is a simple timer application. I set it up as a count down timer to show when a presentation will begin. This is nice because my audience knows exactly when things will be starting.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.softpedia.com/get/Multimedia/Video/Other-VIDEO-Tools/QRes.shtml"&gt;QRes&lt;/a&gt; - This is a command line application that changes your screen resolution. I have a batch file set up to change my resolution from high - 1680 x 1050 to something easier to read (1280x1024). I just run this batch file before my presentation and I don't need to worry about monkeying around with display settings.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-213967834092045082?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/213967834092045082/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/04/free-presentation-helper-tools.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/213967834092045082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/213967834092045082'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/04/free-presentation-helper-tools.html' title='Free Presentation Helper Tools'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-6207317730849036552</id><published>2009-04-08T08:54:00.000-04:00</published><updated>2009-04-08T09:00:10.031-04:00</updated><title type='text'>Going Virtual</title><content type='html'>Virtual machines are a great way to try out new apps without fear of completely hosing your system. I frequently use them both when I do testing, and when I give demonstrations. I use both VMWare and VirtualPC, depending on the scenario I'm working on.&lt;br /&gt;&lt;br /&gt;One thing I've found is that Microsoft has several prebuilt virtual machines that show off some of their applications. The Visual Studio 2010 CTP is available as a VM, and there's a complete working TFS system as well.&lt;br /&gt;&lt;br /&gt;For demonstration purposes, these are perfect because they're already set up and configured properly. That means you can spend your time on developing a worthwhile presentation for your client, rather than monkeying around with setting a system up.&lt;br /&gt;&lt;br /&gt;So before you build a VM, run a quick search on Google to see if there's a pre-built one out there. It can save you lots of time and effort.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-6207317730849036552?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/6207317730849036552/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/04/going-virtual.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/6207317730849036552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/6207317730849036552'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/04/going-virtual.html' title='Going Virtual'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-9120870519915006563</id><published>2009-04-03T13:17:00.000-04:00</published><updated>2009-04-03T13:36:20.637-04:00</updated><title type='text'>Dead Air</title><content type='html'>When you give lots of presentations, sooner or later something bad will happen while you're in the middle of a demo. Either your machine will crash, or the app you're demo-ing will freeze, or one of any number of things. In times like this, you don't want to be standing in front of your audience just looking goofy. That's why it's always good to have a handful of canned conversation pieces at the ready.&lt;br /&gt;&lt;br /&gt;I typically will use the opportunity to gather more information from my audience about what they've done in the past for test automation, or what their biggest challenges are. (Normally you should learn these before you give a presentation, but sometimes that doesn't work out. If you have learned what their challenges are, this gives the audience a great chance to further elaborate on their situation.)&lt;br /&gt;&lt;br /&gt;Alternatively, you can use the time to mention certain "side notes" that may be relevant to the audience. These include things like user conferences, training resources, or books &amp;amp; blogs that may help them.&lt;br /&gt;&lt;br /&gt;Some folks like to fill this time with jokes, or anecdotes about their kids. Do this with caution. Gauge your audience and decide if that sort of filler is appropriate. I've found that the more I can keep the discussion focused on the audience and their needs the better.&lt;br /&gt;&lt;br /&gt;What sort of things have you done to help combat dead air? Drop me a note in the comments&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-9120870519915006563?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/9120870519915006563/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/04/dead-air.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/9120870519915006563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/9120870519915006563'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/04/dead-air.html' title='Dead Air'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-374131000125339760</id><published>2009-03-20T08:10:00.000-04:00</published><updated>2009-03-20T11:38:48.583-04:00</updated><title type='text'>Keep Your Automation Visible</title><content type='html'>You and your automation are only useful if people know what you're doing. It's always a good idea to make sure the tools and scripts you've created have as much visibility as any other testing activity going on. Otherwise, someday someone's going to say "Hey, what does [insertYourNameHere] do all day, anyway?"&lt;br /&gt;&lt;br /&gt;Here are a few thoughts on how you can keep people from asking that question:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Demonstrate your tools. &lt;/span&gt;Show the test &amp;amp; dev teams what you're working on. Do it during a lunch &amp;amp; learn and let them see what you've done. People may suggest  some ideas on how to improve what you've created. Others may realize they have a use for what you've created. Either way, you're keeping your team informed on what you've built and how it can benefit them.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Send out updates. &lt;/span&gt;Between demonstrations, jot off a quick note to your team when you've updated a tool or script and how it can benefit them. When they realize you've added the ability to test foreign languages, or you've made it easier to verify values have been written to the registry, they'll be excited and will put those enhancements to work right away.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Blow your own horn. &lt;/span&gt;I hate doing this, but sometimes it's necessary. Your management needs to know that what you're doing is worthwhile, so sometimes you have to send off a mail saying "Hey, that tool I wrote helped Carla find 10 bugs in an hour" or "The smoke test I wrote caught a bunch of problems before it went to the test team, which kept them from wasting their time on a broken build." Especially in these economic times, being invisible is not the way to go.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Solicit feedback.&lt;/span&gt; Communication is a two way street. Always ask your test team "How could this be better?" when they see you implemented requests they asked for, they'll be more vested in your tools, and more excited about using them.&lt;br /&gt;&lt;br /&gt;What other methods have you used to increase automation's visibility?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-374131000125339760?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/374131000125339760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/01/keep-your-automation-visible.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/374131000125339760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/374131000125339760'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/01/keep-your-automation-visible.html' title='Keep Your Automation Visible'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-7473573233483218968</id><published>2009-03-16T09:49:00.000-04:00</published><updated>2009-03-16T11:20:53.351-04:00</updated><title type='text'>Your Automated Tests Are Stupid</title><content type='html'>Yes, they are. And not because you didn't put a lot of effort into planning them, nor are they stupid because you implemented them poorly. Your tests are stupid because the computer is stupid. It' s going to check exactly what you told it to, and &lt;span style="font-weight: bold;"&gt;only&lt;/span&gt; what you told it to. Keep that in mind; if you write a test that verifies a field in your app correctly displays the sum of two numbers, then your test will make sure that the sum of 2+2 = 4. That's great, but the test will miss a lot of things that a manual tester would catch. For example, if the results are suddenly displayed in bright pink; if they're in a font size too small to see; if they're displayed offscreen. Your automated tests will also miss any spelling mistakes in fields adjacent to the field being tested, which a manual tester would (hopefully) notice.&lt;br /&gt;&lt;br /&gt;The point I'm trying to make here is that automated tests will not and should not replace your manual testers. Automation should be used to augment your manual testers; in the case above, you could have an automated test verify hundreds of thousands of various input combinations, and then have a manual tester run through once to do a spot check. That way you get the best of both worlds - you're assured that the app is functioning properly from both a technical and a human perspective.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-7473573233483218968?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/7473573233483218968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/03/your-automated-tests-are-stupid.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/7473573233483218968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/7473573233483218968'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/03/your-automated-tests-are-stupid.html' title='Your Automated Tests Are Stupid'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-7204854953103217107</id><published>2009-03-11T09:50:00.001-04:00</published><updated>2009-03-11T12:24:35.955-04:00</updated><title type='text'>Reflecting on a Demo</title><content type='html'>Last Friday I gave a TestComplete webinar to 314 people. The topic was Creating Script Extensions, which lets people extend the standard capabilities of TestComplete. I think it went really well overall, and I wanted to share a few of the things I learned/found helpful.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Let the audience know where you are in your presentation. &lt;/span&gt;I had a really short slide deck; most of the slides were used to track where I was in my agenda. This served as a transition between topics, and helped people keep track of where we were in the overall presentation.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Presenter Mode is a wonderful thing. &lt;/span&gt;PowerPoint 2007 has this great feature called Presenter Mode. This lets you have your presentation shown on one monitor, and your slides along with speaker notes and a timer on another. I was able to refer to my notes for each slide without having to print them off. This helped keep the presentation smooth, since I didn't have to go back and forth between a printout and what was displayed on screen.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Always have a cheat sheet. &lt;/span&gt;A good chunk of the demonstration involved teaching people how to write the code needed for a script extension. I had a blank Notepad++ window on the monitor I was presenting on, and on my other monitor I had the complete code I was writing, along with comments to help explain the code. This was insurance against me having a complete brain cramp while I was coding.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Load your applications ahead of time.&lt;/span&gt; No one wants to watch splash screens load or watch someone stumble through explorer windows and shortcut clicks. Have everything loaded in advance, and the demo goes smoother.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Order your applications in the taskbar. &lt;/span&gt;I used several programs during the course of the demonstration; PowerPoint, TestComplete, Notepad++, Paint.NET, Windows Explorer, and a couple of Notepad windows for my cheatsheets. It helps keep things smooth when the items in the Taskbar are ordered according to the order in which they'll be used. That way, you aren't searching for anything. There's a great little utility called TaskBar Shuffle that lets you reorder items in the Taskbar, in case you don't open apps in the order in which they'll be needed.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Poll your audience often.&lt;/span&gt; I was giving this demo remotely, so I couldn't see my audience. That meant I had no idea if they were engaged or not. I made it a point to ask them questions as I was presenting. Most of these were simple yes or no questions, but it was enough to keep them involved.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Have a wingman (or wingwoman).&lt;/span&gt; I had a co-worker riding shotgun with me during the demo. It was his job to answer questions about the telephone number needed to call in, and to alert me to any audio or visual problems that people were experiencing. This freed me up from having to respond to certain questions during the demonstration, and provided a mechanism to head trouble off before it became serious.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Breathe. &lt;/span&gt;I was really excited about giving this session. My energy level was pretty high, and I felt a little out of control in the first few minutes. I made myself slow down and take a breath, and was able to stay on a good pace for the session without rushing through things.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Record yourself.&lt;/span&gt; My wingman also recorded the demonstration. We wanted to be able to send this demo to clients who couldn't make it to the live session, but it's also a great tool for self-improvement. For example, I thought I had a really good handle on not saying "um" while presenting, but in listening to the recording I hear myself saying it, especially when I'm answering questions toward the end of the session. I'm going to keep working on that.&lt;br /&gt;&lt;br /&gt;If you'd like to take a look at the recording, you can see it &lt;a href="http://www.automatedqa.com/products/testcomplete/screencast_scriptextensions.asp"&gt;here&lt;/a&gt; (it's about 90 mins long). I'd welcome any feedback you can give.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-7204854953103217107?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/7204854953103217107/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/03/reflecting-on-demo.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/7204854953103217107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/7204854953103217107'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/03/reflecting-on-demo.html' title='Reflecting on a Demo'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-4839604241862538223</id><published>2009-03-06T08:43:00.000-05:00</published><updated>2009-03-06T11:10:23.516-05:00</updated><title type='text'>You Have to Start Somewhere</title><content type='html'>I was speaking with a client recently who asked a lot of great questions. He was the manager of a small QA team, and really had a good feel for automation. I addressed everything he asked about, and then he told me that he had one other member of his team who had just a few "quick questions."&lt;br /&gt;&lt;br /&gt;After speaking with this person for a few minutes, it was blatantly obvious that not only did he have no clue about test automation, he didn't have a clue about testing in general. To top it off, his initial attitude toward me was rather rude. My first reaction was one of mixed shock and frustration, but then I did what William Ury suggests in his negotiation book "Getting Past No" - I went to the balcony.&lt;br /&gt;&lt;br /&gt;Basically this concept  means you distance yourself from your emotions and your natural reactions - in essence, you step back from the situation and look at it with different eyes. I tried to put myself in this person's shoes. He was being asked to do something that he wasn't qualified for, and he was probably frustrated about that. Given today's economy, he was probably also scared that if he couldn't grasp these concepts, he might be out of a job.&lt;br /&gt;&lt;br /&gt;So I stepped back and listened to his concerns and what he was trying to achieve. Then I addressed each concern in turn, and gave him lots of opportunities to ask questions or get clarification. The end result was a successful session. He admitted he had a lot of learning to do, but he felt really good about his chances to succeed.&lt;br /&gt;&lt;br /&gt;My takeaway here is that everyone has to start somewhere. After doing test automation for so long, it's easy to forget that there was once a time when I didn't know a thing about it.  I've posted a note above my desk that says "You were an English Lit Major" to remind myself that I asked all those really basic questions once too, and that perspective is part of the key to making other people successful as they learn about testing and test automation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-4839604241862538223?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/4839604241862538223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/03/you-have-to-start-somewhere.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/4839604241862538223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/4839604241862538223'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/03/you-have-to-start-somewhere.html' title='You Have to Start Somewhere'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-8139076177713365740</id><published>2009-03-04T07:44:00.000-05:00</published><updated>2009-03-04T08:44:30.835-05:00</updated><title type='text'>The Automation Mantra</title><content type='html'>I love tools. I love writing them, I love learning how to make the computer do more work for me. But it's easy to get caught up in the excitement of development and lose sight of what automation's really about. That's why I've adapted a mission statement that an old boss of mine had. Whenever I find myself writing a new app, or looking for a place to apply something I've created, I take a step back and say to myself -&lt;br /&gt;&lt;br /&gt;"My job is to provide the QA team with helpful, easy to use tools. The output of these tools should be simple to understand and share."&lt;br /&gt;&lt;br /&gt;If what I'm doing doesn't meet the above criteria, then I know I'm doing something wrong. It's a simple  sanity check, but it keeps me from building things that aren't worthwhile. There are a lot of people out there who have been soured on automation because their experiences were with tools that did not follow these guidelines.&lt;br /&gt;&lt;br /&gt;So when you're building tools for others, make sure they are:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Helpful&lt;/span&gt; - don't build a solution in search of a problem. Make sure you're really filling a need.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Easy to Use&lt;/span&gt; - don't make it harder to use the tool than to run the test without it.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Easy to Understand Output &lt;/span&gt;- put human readable English in your output messages, and store those messages in a file format that's easy to read. I've found XML/HTML are usually the best bets; PDF isn't bad either.&lt;br /&gt;&lt;br /&gt;What other guidelines do you follow with your automation mantra?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-8139076177713365740?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/8139076177713365740/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/03/automation-mantra.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/8139076177713365740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/8139076177713365740'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/03/automation-mantra.html' title='The Automation Mantra'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-6101087242311815973</id><published>2009-03-03T08:43:00.000-05:00</published><updated>2009-03-03T14:32:45.805-05:00</updated><title type='text'>Be an Educator, not an Enabler</title><content type='html'>This weekend I set up a computer at a relative's house. I unboxed it, plugged it in, went through the Windows setup screen. I set the timezone, removed some of the preinstalled crap-ware and finally installed MS Office. The entire process only took about 35 mins, but when I went home that night, I was disappointed in myself; I had missed out on an opportunity to teach my family how to do something with a computer.&lt;br /&gt;&lt;br /&gt;Let's be real here folks, how hard is it to set up a new PC? This one had 3 wires. The CPU power cord, the monitor power cord, and the cable that connected the monitor to the PC. The keyboard and mouse were wireless, and just needed batteries installed. Loading Office is just a matter of inserting a DVD and clicking "Next" a few times. I could have walked them through the process and then they'd have felt smarter and more confident with the technology. Instead, I've inadvertantly fostered the belief that working on computers is hard, and borders on black magic.&lt;br /&gt;&lt;br /&gt;It's like that with test automation, too. People who don't have an understanding of what it does and how it works see it as some sort of dark art. It's up to us to educate them so that they learn the right way to do things, rather than us always doing it for them.  Good teachers help people figure out the answers for themselves, rather than give the answers to them. I'm going to try and be more like that in the future.&lt;br /&gt;&lt;br /&gt;What have you done to help educate your team/group on automation? Have you been an educator or an enabler?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-6101087242311815973?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/6101087242311815973/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/03/be-educator-not-enabler.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/6101087242311815973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/6101087242311815973'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/03/be-educator-not-enabler.html' title='Be an Educator, not an Enabler'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-8412290252662863243</id><published>2009-02-26T12:50:00.000-05:00</published><updated>2009-02-26T17:10:40.885-05:00</updated><title type='text'>Obfuscation Question</title><content type='html'>Many companies employ obfuscation to keep their code from being reverse engineered. But this leads to an interesting problem, namely, a GUI that's been obfuscated can't be automated. The only workaround I've been able to come up with for GUI automators is to write &amp;amp; run tests against non-obfuscated code. The problem arises when a manager says "But then we aren't testing the same thing that we ship to our customers"&lt;br /&gt;&lt;br /&gt;This got me thinking about how obfuscation impacts other kinds of testing. I would think that obfuscation would impact any tests that were run after the obfuscation process. So is it safe to say that companies who employ unit tests must be running those tests prior to the obfuscator running? If so, should the manager be concerned that the unit tests were run against non-obfuscated code?&lt;br /&gt;&lt;a id="publishButton" class="cssButton" href="javascript:void(0)" onclick="if (this.className.indexOf(&amp;quot;ubtn-disabled&amp;quot;) == -1) {var e = document['stuffform'].publish;(e.length) ? e[0].click() : e.click(); if (window.event) window.event.cancelBubble = true; return false;}" target=""&gt;&lt;div class="cssButtonOuter"&gt;&lt;div class="cssButtonMiddle"&gt;&lt;div class="cssButtonInner"&gt;Publish Post&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/a&gt;&lt;br /&gt;Obfuscation would also prevent any other type of post-build white box testing; so any tools I've written that call methods directly from dlls or invoke web service calls would be stopped dead.&lt;br /&gt;&lt;br /&gt;So what's the best solution here? Is it to do the bulk of your automated testing against non-obfuscated code and then do manual sanity checks against an obfuscated build? Or is there a better way that I'm not seeing? Please let me know in the comments.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-8412290252662863243?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/8412290252662863243/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/02/obfuscation-question.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/8412290252662863243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/8412290252662863243'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/02/obfuscation-question.html' title='Obfuscation Question'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-7534788890350790417</id><published>2009-02-25T09:50:00.000-05:00</published><updated>2009-02-25T09:52:02.681-05:00</updated><title type='text'>Pointers on Pointing</title><content type='html'>Gestures are a powerful part of any presentation. However, you have to be careful when you point at objects or people to ensure your body language doesn't send the wrong message. Here are a few things I've learned when pointing during presentations:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Don't use a laser.&lt;/span&gt; I love giving presentations; I get really excited when I'm in front of people. But that excited energy tends to make my hands shake a little. It's enough that I can't quite focus a laser dot on a single point without it bouncing a bit. If you're really nervous about being in front of people, the dot may dance all over the screen. That's distracting to your audience, and it takes away from the message you're trying to deliver. (Plus we've all seen those comics where the guy with the laser pointer accidentally beheads someone in his audience...)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Point at slides, point at objects, but don't point at people. &lt;/span&gt;We're all taught in school that it's not polite to point. Whether you intend it or not, pointing at people implies some measure of accusation. You want to invite your audience in to your message, not make them feel like they're on trial. So instead of pointing at someone, use an open hand with palm up and fingers out. This is a welcoming and encouraging gesture that brings people in rather than putting their backs up.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Use the mouse sparingly.&lt;/span&gt; If your mouse is bouncing around your screen throughout the presentation, people are going to get dizzy. &lt;a href="http://greatdemo.blogspot.com/2008/11/debilitating-demo-diseases-pointer.html"&gt;Peter Cohen&lt;/a&gt; calls this "Pointer Palsy", and it's extremely distracting. Perform your actions slowly, so the mouse isn't racing around the screen. If you are giving a remote demo, you can gesture with the mouse, but use these gestures sparingly. If you don't need to gesture at something, take your hand off the mouse. You'd be surprised how many of us move the mouse around without realizing it or intending to.&lt;br /&gt;&lt;br /&gt;Are there other "pointers" you've learned? If so, please share them in the comments.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-7534788890350790417?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/7534788890350790417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/02/pointers-on-pointing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/7534788890350790417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/7534788890350790417'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/02/pointers-on-pointing.html' title='Pointers on Pointing'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-8383547021289544312</id><published>2009-02-23T13:00:00.000-05:00</published><updated>2009-02-23T13:17:20.346-05:00</updated><title type='text'>Notes on Demos</title><content type='html'>I give lots of demos every day, and I'm always on the lookout for things to make them better/smoother/cleaner. So the next time you have to give a technical presentation, here are some (hopefully) helpful tips:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Turn off all unnecessary applications.&lt;/span&gt; You don't want that IM from your significant other coming in during the middle of a discussion. Turn off your email, chat, twitter and any other programs that aren't relevant to your demonstration.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Remove any potentially offensive/confidential material from your recent items.&lt;/span&gt; The pics your brother-in-law sent of his latest Vegas exploit may be cool/funny, but they're not professional. On a related note, be professional when naming your computer. During a presentation I sat in on last week, the presenter's laptop was named WideAss. And since the name of his machine was prominently displayed in several places of the app being demonstrated, it's not like you could miss it. That's just not professional, and I couldn't ignore it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Make it readable.&lt;/span&gt; If you're using slides, keep the font big. If you have to shrink the font to get everything to fit, edit, delete, or split it into multiple slides. If you're demo-ing code, keep that big, too. Scott Hanselman suggests using Lucinda Console 14 -18 pt font for all code demonstrations, and I've found that works very well. You lose your rythym as a presenter very quickly when you have to keep asking if everyone can read what's on your slides.&lt;br /&gt;&lt;br /&gt;Finally, and most importantly &lt;span style="font-weight: bold;"&gt;practice&lt;/span&gt;! Spend some time saying exactly what you're going to say. Don't go halfway on this one; sitting in front of your slides saying "ok, now I'll talk about X" will &lt;span style="font-weight: bold;"&gt;not &lt;/span&gt;make an effective presentation. Say exactly what you're going to say, exactly how you want to say it. If that means you need to retreat to a conference room or hide in your car at lunch break, then do it. The more familiar you are with what you're going to say, the more confident you'll come across as.&lt;br /&gt;&lt;br /&gt;I'll post more demo tips as I can, but what else have you done to make your presentations more effective?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-8383547021289544312?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/8383547021289544312/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/02/notes-on-demos.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/8383547021289544312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/8383547021289544312'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/02/notes-on-demos.html' title='Notes on Demos'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-2554397795050696373</id><published>2009-02-20T10:38:00.000-05:00</published><updated>2009-02-20T13:29:36.420-05:00</updated><title type='text'>Portable Tools</title><content type='html'>There are times when your test machines may not have all the tools on them that you need to perform a test effectively. Sometimes you're not allowed to install other apps on a system due to a security concern. Luckily, many applications can be run from a flash drive. This lets you get your job done while not contaminating the system. Here's a quick list of some of my most frequently used portable apps. You can download a full suite of programs from PortableApps.com, and many more from PortableFreeware.com&lt;br /&gt;&lt;br /&gt;&lt;a href="http://portableapps.com/news/2009-02-12_-_notepadpp_portable_5.2"&gt;Notepad++&lt;/a&gt; - lightweight editor for pretty much any type of script.&lt;br /&gt;&lt;a href="http://www.recuva.com/"&gt;Recuva&lt;/a&gt; - lets you quickly recover deleted files.&lt;br /&gt;&lt;a href="http://www.softpedia.com/get/PORTABLE-SOFTWARE/Network/Windows-Portable-Applications-Portable-Wireshark.shtml"&gt;Wireshark&lt;/a&gt; - packet monitoring tool useful when load/performance testing.&lt;br /&gt;&lt;a href="http://www.portablepython.com/"&gt;PortablePython&lt;/a&gt; - a full python development environment on your flash drive.&lt;br /&gt;&lt;a href="http://www.foxitsoftware.com/pdf/rd_intro.php"&gt;FoxitPDF Reader&lt;/a&gt; - because sometimes, Acrobat just isn't there.&lt;br /&gt;&lt;a href="http://www.albahari.com/queryexpress.aspx"&gt;QueryExpress.exe&lt;/a&gt; - simple SQL query analyzer look alike.&lt;br /&gt;&lt;a href="http://portableapps.com/apps/utilities/winmerge_portable"&gt;WinMerge Portable&lt;/a&gt; - lets you quickly perform a diff between two files.&lt;br /&gt;&lt;br /&gt;What other portable tools do you use?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-2554397795050696373?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/2554397795050696373/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/02/portable-tools.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/2554397795050696373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/2554397795050696373'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/02/portable-tools.html' title='Portable Tools'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-2687186633753175241</id><published>2009-02-18T08:29:00.000-05:00</published><updated>2009-02-18T09:42:47.672-05:00</updated><title type='text'>Tips on Hiring an Automation Engineer</title><content type='html'>Many QA managers don't know what to look for when hiring an automation engineer. They'll specify some generic criteria (knowledge of C#, knowledge of [insert major commercial tool name here]) and stop at that. Then, when an applicant comes in, the manager asks if they meet those criteria, and the technical side of things stops there. So here are a few tips I'd like to pass along when interviewing a candidate for an automation job.&lt;br /&gt;&lt;br /&gt;Be wary of "automation engineers" who only know how to use commercial UI automation tools. Those tools are great, and they have their place, but they are not the end-all be-all of test automation. You also want to make sure they can write their own code outside of the automation tool. For example, many commercial vendors use VBScript as a programming language. If your candidate claims they can write VBScript, ask them to describe how they would perform a scenario outside of the UI tool in that scripting language.&lt;br /&gt;&lt;br /&gt;If you already own a UI automation tool,  don't hire someone who is an "expert" on a different tool.  You're probably thinking that the candidate should be able to pick the other tool up quickly enough, and that may be true. But on a number of occasions I've seen people gripe and complain about how their favorite tool does A, B and C better, and this product is garbage. Some will even try to force a change in the department, to displace the existing tool with their preferred tool. This is disruptive and nothing but a time sink. The time spent arguing about tools is time that should be spent testing. If you've made an investment in a UI automation tool, hire people who are comfortable with that tool.&lt;br /&gt;&lt;br /&gt;Describe your development process, and the app being developed. Then ask them where they see opportunities for automation. If they focus exclusively on the UI, then you have someone who won't be as effective as someone who talks about unit tests, who talks about testing an API, or testing the backend database. The key here is that a good automation engineer will look for places throughout the software development lifecycle where automation can be applied.&lt;br /&gt;&lt;br /&gt;Ask if they've ever built their own tools, or if they've done any programming for fun. Someone who really enjoys coding will be much more effective than someone who just does it as a day job. Plus, someone who can build their own tools will be able to continue to automate in areas where commerical tool vendors don't. For example if you need to test against a beta operating system, db server or UI element, commerical tool vendors won't support you. Someone who can build their own tools will still be able to create automated tests.&lt;br /&gt;&lt;br /&gt;Finally, and this is the most important, do they know how to test? Automation folks are testers too, and you don't want to hire a script monkey. You want to make sure that, as &lt;a href="http://www.testingreflections.com/node/view/7873"&gt;Karen N Johnson&lt;/a&gt; put it "...you feel confident that [they] can be handed an application, learn at least its primary aspects at a fairly rapid pace, jump in, join this project and find bugs." You want to make sure that these people can come up with useful scenarios for automation that will add value to your team; you don't want someone who's only able to take a manual test plan and turn it into an automated UI test.&lt;br /&gt;&lt;br /&gt;What tips do you have for hiring an automation engineer?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-2687186633753175241?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/2687186633753175241/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/02/tips-on-hiring-automation-engineer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/2687186633753175241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/2687186633753175241'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/02/tips-on-hiring-automation-engineer.html' title='Tips on Hiring an Automation Engineer'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-792167702816690665</id><published>2009-02-16T08:00:00.000-05:00</published><updated>2009-02-16T10:06:55.058-05:00</updated><title type='text'>Good Coding Practices</title><content type='html'>Ben Simo (http://www.questioningsoftware.com/) mentioned via Twitter that he wanted to do a presentation on good automation coding practices. That got me thinking about the things I do to keep my code maintainable, readable and ultimately, useful as projects progress. Here's a quick list of some of my suggested coding practices:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Give functions/methods and variables descriptive names. &lt;/span&gt;When you're writing your code, don't name functions arbitrarily, like Test1. Instead, give them descriptive names so it's immediately obvious what the code is going to do. For example, "verifyAdminUserCanDeleteReport" may be a bit wordy, but you know exactly what it's going to do. Similarly, give your variables descriptive names as well. I like to prefix my variables with a shorthand representation of their type; for example, str for string, int for integer. So if I created a variable for a user name, I'd name it strUserName. This helps eliminate confusion, especially when you're dealing with a big test.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Comment everything. &lt;/span&gt;The code may seem completely clear to you as you write it, and so commenting may seem like a waste of time. But chances are when you leave it for 6 months to do something else, when you get back to it, you won’t remember what you were doing. Or, when someone else inherits your script, they won’t know what’s going on. Comments provide a nice, easy way to prevent that type of confusion. I like to include information like this with each function I create&lt;br /&gt;/*&lt;br /&gt;Name:&lt;br /&gt;&lt;br /&gt;Description:&lt;br /&gt;&lt;br /&gt;Syntax:&lt;br /&gt;&lt;br /&gt;Parameters:&lt;br /&gt;&lt;br /&gt;Return Values:&lt;br /&gt;&lt;br /&gt;Example:&lt;br /&gt;&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;You can also use utilities like TwinText to generate help files based on your comments. This provides a nice reference that people can browse for functions that may be  useful in their own testing.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Don't chain tests. &lt;/span&gt;I see this a lot in UI automation, where "Test B" is dependent on "Test A"’s results. For example, let’s say you are testing a telephone directory application. Test Case A scrolls to the  “Howland, Jessica” user record in the phone book and verifies its data. Test Case B clicks the Next button 3 times to get to the “Jameson, Rita” user record, and then verifies its data. If Test Case A fails to reach “Howland, Jessica”, there’s a chance that Test Case B will fail because the number of clicks needed to get to “Jameson, Rita” are dependant upon being at the “Howland, Jessica” record. This is a chain, and could lead to problems with your script. A better approach would be to start at a known point in the database (such as the first record), and use a parameterized loop to click Next until “Jameson, Rita” is displayed in the Name field.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Use source control. &lt;/span&gt;This lets you keep a versioned history of your tests, and lets you see who's edited what parts of the tests.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Keep your own backups.&lt;/span&gt; The source control server may be backed up, the network drive where you keep your working copies may be backed up, but do yourself a favor and keep your own backups of your tests. External hard drives are cheap, and writing a short script to copy everything from your working directory on to the external drive will only take a minute or two. This can save you a lot of headaches and frustration when servers crash; when your IT guys realize the backup drives are full and haven't succesfuly backed up in a month; or when you get told that your restore task is at the bottom of the todo list.&lt;br /&gt;&lt;br /&gt;What good practices would you recommend?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-792167702816690665?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/792167702816690665/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/01/good-coding-practices.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/792167702816690665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/792167702816690665'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/01/good-coding-practices.html' title='Good Coding Practices'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-8601991653090442840</id><published>2009-02-12T08:29:00.001-05:00</published><updated>2009-02-13T11:27:52.892-05:00</updated><title type='text'>Tools Do Not Convey Knowledge</title><content type='html'>Let's say you've decided that you want to change the oil in your car. You don't want to take it to a shop, you want to do it yourself. So you go into Sears, find the Craftsman section, and purchase a mechanic's wrench set, an oil pan, and some jacks. You're all set, right?&lt;br /&gt;&lt;br /&gt;One minor issue - you don't know *how* to change the oil; you've never done it before. But these tools were expensive, and they're supposed to make the job easy, so there shouldn't be a problem, right? So now, you get back to your house, crawl under the car and start messing around. After a few hours of frustrated cursing, you emerge from under the car covered in oil, your knuckles are torn up and you've damaged your car so badly that it'll need to be towed. You are all set to call Sears and light into them about what crappy tools they make because you couldn't even do a simple task like change your oil.&lt;br /&gt;&lt;br /&gt;While extreme, and perhaps a little ridiculous, this scenario is exactly what happens when a company blindly introduces an automation tool without seeing if its people have the skills needed to use it properly. The statement "Automating tests is easy, you just click a record button" could be equated to "Changing the oil is easy, you just drain the oil and put in fresh stuff."&lt;br /&gt;&lt;br /&gt;Make sure that you have a good understanding of what's going to be involved in your automation efforts before you put a tool into play. Do a small pilot project or proof of concept against a piece of your application and see if there are any surprises. That whizzy custom control your developer whipped up may only be accessible to someone who knows C#. That database test you want to perform may only be possible by someone who can write SQL stored procedures. Make sure that your people have those skills before you ask them to dive right in to automation.&lt;br /&gt;&lt;br /&gt;Remember, tools enable people to work more effectively, but people need to understand how to use those tools before that can happen.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-8601991653090442840?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/8601991653090442840/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/02/tools-do-not-convey-knowledge.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/8601991653090442840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/8601991653090442840'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/02/tools-do-not-convey-knowledge.html' title='Tools Do Not Convey Knowledge'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-2337479252413940862</id><published>2009-02-11T09:31:00.000-05:00</published><updated>2009-02-11T09:32:57.671-05:00</updated><title type='text'>Testers don't break code</title><content type='html'>It was about 9 am when Carl, our lead developer introduced me to Jesse, a recent college grad and our newest developer. Carl introduced me as "one of the QA team", to which Jesse said "Oh, you're one of the guys who breaks my code." I smiled at him and replied "Actually, the code's already broken by the time I get it." He paused for a moment, then laughed.&lt;br /&gt;&lt;br /&gt;This perception of testers has always bothered me. I don't break anyone's code - I try to think of scenarios that the developer may have missed and help him make a better product. If I wanted to be a malicious little gremlin that "broke" code, I'd go into the source files and remove all the semicolons, or replace every instance of the letter e with a q. *That* would be breaking the code.&lt;br /&gt;&lt;br /&gt;Testers are there to help developers build a better product. I think the issue arises when people take the issues testers log as personal negative feedback. One of the ways I was able to alleviate that was to do some pairs testing with a developer. We sat down, walked through the AUT, and I talked him through my thought process as I tested. At first he just watched, then started asking to try things as we went along. In short order, he had found issues that I wouldn't have thought to check for. Once he saw that I wasn't being malicious, his whole attitude toward the test team changed.&lt;br /&gt;&lt;br /&gt;Have you encountered the "Testers break code" mentality? How did you resolve it?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-2337479252413940862?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/2337479252413940862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/02/testers-dont-break-code.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/2337479252413940862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/2337479252413940862'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/02/testers-dont-break-code.html' title='Testers don&apos;t break code'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-1812640422691204306</id><published>2009-02-09T09:19:00.000-05:00</published><updated>2009-02-09T09:44:17.917-05:00</updated><title type='text'>UI Automation Safety Tip</title><content type='html'>Here's a safety tip for everyone who works with UI automation record &amp;amp; playback tools. Turn off your email &amp;amp; IM programs before you start recording. Close down your Twitter, GMail and Yahoo-based items as well. This has nothing to do with system resources or anything like that. Rather, it's because there are a surprising number of people out there who will be recording a test, then respond to an IM or decide to jot off an email.&lt;br /&gt;&lt;br /&gt;And when they do that, the recorder captures it and puts it into the script, where anyone else who has access to it can see. I had a co-worker once who used to IM his girlfriend during work hours. We sat down one afternoon to review a script he'd been working on, and right in the middle of it was his side of one of their conversations. There was nothing racy or controversial in there, but he was very embarrassed to say the least. It didn't occur to him that the tool was recording *every* action he performed.&lt;br /&gt;&lt;br /&gt;So please, for your own sake, turn off those social media utils while you're doing record &amp;amp; playback.  (Or at least remember to click the Stop Recording button before you use them.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-1812640422691204306?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/1812640422691204306/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/02/ui-automation-safety-tip.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/1812640422691204306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/1812640422691204306'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/02/ui-automation-safety-tip.html' title='UI Automation Safety Tip'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-1935538569302888180</id><published>2009-02-04T08:19:00.000-05:00</published><updated>2009-02-05T09:16:58.825-05:00</updated><title type='text'>Incremental Automation</title><content type='html'>When you're automating, it may seem logical to automate an entire test plan before you begin running it. For example, if you're automating a smoke test, you may want to have all pieces of the smoke test scripted so that you can run the test at the touch of a button. That's a good goal to strive for, but that doesn't mean you can't automate a piece of that smoke test and then start running it right away.&lt;br /&gt;&lt;br /&gt;Back when I was first learning to automate, my smoke test was a 26 page test plan that touched all the major features of our product. When I sat down to automate it, I started on page 1 and went step by step. I was doing great until I hit page 11, when a control in my AUT wasn't recognized by my test tool. I spent a couple of days tracking down the issue and coming up with a workaround. A similar problem happened later in the test. All in all, it took about 3 days to automate the test, and another 3 days to troubleshoot issues, so it was over a week before the script ever ran. This was my first experience with automation, so I thought this was probably normal.&lt;br /&gt;&lt;br /&gt;Looking back, I can see that by not running the parts of the test that were finished, I lost a great opportunity. I could have had the first 11 pages of that test running while I troubleshot the issues. Then people would have seen that the automation was doing something, and I could've shown my manager that while I was encountering some issues, our first crack at automation was off to a good start. I've heard stories where people tried to automate an entire test, and due to one problem or another, didn't actually run the test until two or three days before their product was set to release. That sort of approach doesn't benefit anyone, and winds up costing time and effort instead of saving it. It also reduces automation's credibility in management's eyes, which is part of the reason (I think, anyway) of why so many automation efforts get abandoned.&lt;br /&gt;&lt;br /&gt;So the moral of the story is don't do "big bang automation", where you wait until everything is finished and perfect before you start running your automated tests. Get a piece of your test automated and then start running it. Then continue adding pieces until your entire test or suite of tests are finished.  Your team will see results faster from automation, and your management will be more confident that the automation is helping the developing efforts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-1935538569302888180?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/1935538569302888180/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/02/incremental-automation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/1935538569302888180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/1935538569302888180'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/02/incremental-automation.html' title='Incremental Automation'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-2513551358804526993</id><published>2009-02-03T12:25:00.000-05:00</published><updated>2009-02-03T12:35:34.687-05:00</updated><title type='text'>You Can't Automate User Acceptance Testing</title><content type='html'>One of the things I hear from clients is "we want our business analysts to be able to automate our user acceptance tests." I cringe every time that phrase gets mentioned. It doesn't work for two reasons.&lt;br /&gt;&lt;br /&gt;The first is usually that the analyst does not have the skill set needed to effectively automate a test, and management is usually reluctant to make that kind of investment in them. The second reason is that you can't automate a user acceptance test. You can automate the functionality that makes up that test, make sure the correct dialogs and error messages are displayed at the appropriate time, but the "user acceptance" part only applies if a person with domain knowledge has tried the test and agreed "Yes, this is how the program should work."&lt;br /&gt;&lt;br /&gt;I'm afraid that people then get lulled into a false sense of security. "Our automated acceptance tests are passing, so our product meets our users' needs."&lt;br /&gt;&lt;br /&gt;What do you think? What have your experiences been with automating user acceptance testing?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-2513551358804526993?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/2513551358804526993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/02/you-cant-automate-user-acceptance.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/2513551358804526993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/2513551358804526993'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/02/you-cant-automate-user-acceptance.html' title='You Can&apos;t Automate User Acceptance Testing'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-1008478604184335983</id><published>2009-02-02T14:08:00.000-05:00</published><updated>2009-02-02T08:31:52.883-05:00</updated><title type='text'>Automation Mashers</title><content type='html'>Test automation is handy for regression testing, but automated regression tests rarely find new bugs. So instead of focusing exclusively on regression tests, try coming up with scenarios to detect bugs that would be difficult (or impossible) to find manually. For example, let's say my AUT can be used to generate reports. I enter some criteria, click "Generate" and the AUT fetches data from a database and dynamically creates a report based on my selections. Let's also say that this fetch and display operation causes a momentary spike in my CPU usage and memory usage before settling back to normal.&lt;br /&gt;&lt;br /&gt;Now, we could create a automated regression test that generated a report and verified it generated the correct data. That may be useful, but we can make it much more useful by turning it into a "masher" test. Mashers are tests that perform a single operation over and over again, while tracking how the system performs over time. In doing this, we can find bugs (like memory leaks) that we wouldn't be able to find by manual testing alone.&lt;br /&gt;&lt;br /&gt;So in my scenario above, I noticed that there's a momentary spike in CPU and memory use when the report is generated. Being suspicious, I wonder if there's the possibility for a memory leak somewhere in that code.  So I'd create an automated test that ran my report and confirmed it was correct, and then loop it so that reports were being generated for 24 hours straight. As the test ran, it would log the system resources being used after each generation. At the end of the test, I'd graph the data that had been logged. If the system resource usage remains constant, then there's no problem. But if there's a steady increase in resource usage, then we have a memory leak, and we've found a bug that a regular regression test (manual or automated) would have missed.&lt;br /&gt;&lt;br /&gt;So in addition to making manual testing easier, and taking care of regression tests, don't forget to look for places where automation can help you find bugs that would be impossible to find otherwise.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-1008478604184335983?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/1008478604184335983/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/01/automation-mashers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/1008478604184335983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/1008478604184335983'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/01/automation-mashers.html' title='Automation Mashers'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-1418266644433785582</id><published>2009-01-30T14:12:00.000-05:00</published><updated>2009-01-30T14:36:54.222-05:00</updated><title type='text'>Augment Manual Tests with Automation</title><content type='html'>When people think of test automation, the knee-jerk reaction is to think of some tool that performs a test or test-related activity for you. That tool runs unattended and gives you results of some kind when it's finished.  That's definitely part of automation, but by no means the only thing it can do. You can also use it to create utilities that testers can use to speed up the testing process.&lt;br /&gt;&lt;br /&gt;Here's a scenario for you - a tester needs to confirm that a text box can accept strings up to a given length. If there are too many characters in the string, the AUT throws an error message. We've probably all seen and done this type of boundary test many times. And you probably created your input strings the same way I did - you opened up Word, held down the X key for a bit, then used the word count feature to see how long of a string you'd made. If it was too long, you deleted some of it. Too short, you added characters until you hit the right length. Then you copy/paste that string into your box, see if the right error was displayed and moved on to the next test.&lt;br /&gt;&lt;br /&gt;That's a tedious way to perform a simple boundary test. I got frustrated with doing that and built a small helper utility whose sole purpose was to generate strings. It was just a small dialog that asked how many characters I wanted my string to be, and after I entered that, it generated a string of that length and automatically placed it on the clipboard. I pasted the string into the desired field, confirmed that my error was displayed, and moved on.  I didn't have to mess around with Word anymore, and I could create those needed strings much faster and more accurately than before.&lt;br /&gt;&lt;br /&gt;I shared that helper utility with other members of my team and it was very well received. Several of the developers on the team asked for it too, so they could do some preliminary tests before the code got passed over to the testers. Over time, the String Generator evolved so that people could just click a button to "quick-create" strings of a predefined length.&lt;br /&gt;&lt;br /&gt;The string generator only took me a few minutes to write, and it turned out to be a real time saver. Always keep your eyes open for places where a little bit of code can save a lot of manual effort.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-1418266644433785582?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/1418266644433785582/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/01/augment-manual-tests-with-automation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/1418266644433785582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/1418266644433785582'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/01/augment-manual-tests-with-automation.html' title='Augment Manual Tests with Automation'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-3745339289501526738</id><published>2009-01-28T18:05:00.000-05:00</published><updated>2009-01-28T18:29:20.759-05:00</updated><title type='text'>If You Want to Automate Tests, Learn to Script</title><content type='html'>Many people who get tasked with automating test cases have never written code before.  As such, they rely on the promises from UI tool vendors that they can automate all their tests without ever touching a line of code. While UI automation tools may be able to create simple tests, those tests tend to be brittle and prone to breakage. As such, a non-scripting user can quickly become frustrated and abandon test automation all together. Compare that to a person with some scripting experience - they can very easily modify a recorded script and turn it from something brittle into something nearly bulletproof.&lt;br /&gt;&lt;br /&gt;When I started out in automation, my background was in technical writing. I had no programming experience or training, but I saw how powerful automation could be, and was determined to see it work. I spent a lot of time learning TSL, which was WinRunner's proprietary language, and found that I could make tests really sing by coding them myself. (My colleagues who were relying on record &amp;amp; playback were astounded that my scripts could recover from errors. )&lt;br /&gt;&lt;br /&gt;Eventually, I realized that there were other automatable tasks that fell outside the scope of WinRunner. I learned Python and with that I was able to compare the contents of excel spreadsheets, verify that email messages had been posted to a server and then delete them, automatically reboot systems and put them into the proper state for testing. Those wound up being even bigger timesavers.&lt;br /&gt;&lt;br /&gt;So the moral of the story is - if you're going to get into automation, learn how to script. Don't believe anyone who tells you that all your test automation goals can be achieved without ever touching a single line of code. By learning how to script, you become more marketable, and your company's automation efforts have a better chance of success.&lt;br /&gt;&lt;br /&gt;There are a lot of great scripting languages out there - Python, Ruby, JavaScript. If there are developers in your company who already know one of them, ask them to recommend a book or website that will help you learn. If you're working with .NET, I highly recommend &lt;a href="http://www.amazon.com/s/ref=nb_ss_gw_0_8?url=search-alias%3Daps&amp;amp;field-keywords=a+tester%27s+guide+to+.net+programming&amp;amp;x=0&amp;amp;y=0&amp;amp;sprefix=a+tester"&gt; A Tester's Guide to .NET Programing&lt;br /&gt;&lt;/a&gt; and &lt;a href="http://www.amazon.com/s/ref=nb_ss_gw_2_18?url=search-alias%3Daps&amp;amp;field-keywords=effective+software+test+automation&amp;amp;x=0&amp;amp;y=0&amp;amp;sprefix=effective+software"&gt;Effective Software Test Automation&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-3745339289501526738?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/3745339289501526738/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/01/if-you-want-to-automate-tests-learn-to.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/3745339289501526738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/3745339289501526738'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/01/if-you-want-to-automate-tests-learn-to.html' title='If You Want to Automate Tests, Learn to Script'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-5707791224999738578</id><published>2009-01-26T09:11:00.000-05:00</published><updated>2009-01-26T09:38:38.271-05:00</updated><title type='text'>Find the Pain</title><content type='html'>One of the biggest mistakes I see made with test automation is that people don't step back and determine where their manual testers are spending lots of their time. Instead, they just purchase a UI automation tool and then begin automating tests. In some cases, they may get lucky and automate a test that is a time saver. Other times, they may just take a test can be run manually in 5 minutes, and turn it into a 3 minute automated test. While there is a time savings there, it's going to take a lot of runs in order for that 2 minute savings to really add up.&lt;br /&gt;&lt;br /&gt;UI automation tools have their place, but before you consider doing any type of automation, take a good look at where your manual testers are spending their time. Do they spend time populating databases with test data? Do they spend time reading through log files for error messages? Are they spending time manually comparing file names and version versions numbers when doing an install test? These are good candidates for automation. SQL scripts can be created to populate databases, perl or python (or whatever your language of choice is) can be used to parse log files for certain strings, and can be used to query file info as well.&lt;br /&gt;&lt;br /&gt;In short, significant time savings can be achieved if you incorporate automation all parts of your test activities, not just the running of the tests themselves.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-5707791224999738578?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/5707791224999738578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/01/find-pain.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/5707791224999738578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/5707791224999738578'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/01/find-pain.html' title='Find the Pain'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-1614080236833638398</id><published>2009-01-23T09:04:00.000-05:00</published><updated>2009-01-23T11:05:37.157-05:00</updated><title type='text'>On Evaluating a UI Automation Tool</title><content type='html'>At some point, manual software testers look at their ever-growing workload and say "Ok, this is getting out of control. There has to be a better way to do this." And the answer comes back from management, "Find an automated tool."&lt;br /&gt;&lt;br /&gt;There are a bunch of automated tools out on the market.  So many in fact, that it can be overwhelming to find the right one for you. Each tool has its own set of unique features that differentiate it from the others, and your first instinct may be to put together some sort of matrix that compares each tool. That's a fine idea, but hold off on doing it for the moment. Also resist the temptation to just start downloading all the tools blindly. Instead, take a step back and look at each tool with these criteria:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Does this tool support the language my app is written in, and the environments I require?&lt;/span&gt;&lt;br /&gt;This may seem obvious, but there are people who never actually checked to see if their programming language was supported. Instead they compared all the "bells &amp;amp; whistles"-type features, and wound up spending thousands of dollars on products that didn't support their needs. One other thing to consider here is if your app makes use of 3rd party controls. To a manual tester, those controls don't seem any different than standard controls, but to an automation tool, they're very different. Ask your development team if there are 3rd party controls in your app, and then find out from the vendor if those are supported. You'll save yourself a lot of headaches and avoid surprises by doing this.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Is this tool in my budget?&lt;/span&gt;&lt;br /&gt;I hate to make cost one of the first things to consider, but the unfortunate reality is that the QA department's budget is usually more restricted than other groups. The last thing you need is to spend a lot of time evaluating a tool only to find out you can't afford it.&lt;br /&gt;&lt;br /&gt;Those two questions can usually be answered in a few minutes with a quick phone call to the vendor, or with a visit to the vendor's website. Once you've established that a tool or tools will work for you, download an evaluation copy of the product. Again, resist the urge to start a feature comparison matrix at this point. Instead, take two or three of your test cases and try to automate them with the evaluation software. It's a good idea to pick test cases from different areas of your application, to ensure that the tool will work properly for your needs. You don't want to find out after you purchased that while ToolA worked flawlessly against TestCase1, it failed to work at all against TestCases2 - 37.&lt;br /&gt;&lt;br /&gt;Once you've done your initial automation, see if there are places where you have questions about how the tool worked. Jot those down and email them to your vendor. To keep the process moving quickly, be as specific as you can when describing your questions. Explain what you're trying to achieve to the vendor, what your application is written in, and then list your questions. Treat these questions the same way you would bug reports; the more info you can provide, the faster the vendor can get answers to you.&lt;br /&gt;&lt;br /&gt;When the initial automation is done, and you're waiting for answers to your questions, now you can create that comprehensive feature matrix comparison.&lt;br /&gt;&lt;br /&gt;The important thing is to make sure that the tool works well with your application first, and then worry about the niceties. I like to compare this to buying a car; sure, it's great if the car has an all leather interior, heated seats and an aux jack for your mp3 player, but if it doesn't get you from point A to point B reliably, those other features are moot.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-1614080236833638398?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/1614080236833638398/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/01/on-evaluating-ui-automation-tool.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/1614080236833638398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/1614080236833638398'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/01/on-evaluating-ui-automation-tool.html' title='On Evaluating a UI Automation Tool'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1359885315589854787.post-5995894458062512531</id><published>2009-01-23T08:58:00.000-05:00</published><updated>2009-01-23T09:03:52.655-05:00</updated><title type='text'>Welcome</title><content type='html'>Welcome to the Autonomicon. In this blog, I'll post notes about automated software testing, links to helpful utilities that can speed up your day to day activities, and offer my experiences with the QA process in general.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1359885315589854787-5995894458062512531?l=autonomicon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://autonomicon.blogspot.com/feeds/5995894458062512531/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://autonomicon.blogspot.com/2009/01/welcome.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/5995894458062512531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1359885315589854787/posts/default/5995894458062512531'/><link rel='alternate' type='text/html' href='http://autonomicon.blogspot.com/2009/01/welcome.html' title='Welcome'/><author><name>Nick Olivo</name><uri>http://www.blogger.com/profile/15868180397795000804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
