<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-6143723392471225584</atom:id><lastBuildDate>Fri, 24 Feb 2012 18:04:22 +0000</lastBuildDate><category>ruby</category><category>defect management</category><category>JMeter</category><category>certification</category><category>test execution</category><category>me</category><category>tools</category><category>test analysis</category><category>test types</category><category>definitions</category><category>autoIt</category><category>test techniques</category><category>fun</category><category>events</category><category>watir</category><category>automation</category><category>SOA</category><category>test management</category><title>TestingMinded</title><description>Trust, but verify</description><link>http://www.testingminded.com/</link><managingEditor>noreply@blogger.com (Steven Machtelinckx)</managingEditor><generator>Blogger</generator><openSearch:totalResults>49</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Testingminded" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="testingminded" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><creativeCommons:license>http://creativecommons.org/licenses/by/2.0/</creativeCommons:license><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">Testingminded</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6143723392471225584.post-1726445519278967749</guid><pubDate>Mon, 10 Oct 2011 14:08:00 +0000</pubDate><atom:updated>2011-10-10T16:08:28.730+02:00</atom:updated><title>Call for Software Testing Blogs</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
It has been a while since I composed the &lt;a href="http://www.testingminded.com/2010/04/top-100-software-testing-blogs.html"&gt;Top 100 Software Testing Blogs&lt;/a&gt;. To be more precise, it has been 1 year and a half already. Since software testing blogs change and evolve, just like any other thing in life, a new Top 100 Software Testing Blogs would surely make sense. So let's make a 2011 edition!&lt;span id="fullpost"&gt;&lt;br /&gt;
&lt;br /&gt;
This time I count on you to make this edition a success. Submit any software testing blog, that's not yet in the original &lt;a href="http://www.testingminded.com/2010/04/top-100-software-testing-blogs.html"&gt;Top 100 Software Testing Blogs&lt;/a&gt;, in the comment section of this post. By doing this you increase the coverage of software testing blogs eligible to this list, so we have less chance of missing any. All new submissions and the ones from the original top 100 will be evaluated together to finally become a new Top 100.&lt;br /&gt;
&lt;br /&gt;
Make sure the blog applies to following criteria:&lt;br /&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;must be software testing related&lt;/li&gt;
&lt;li&gt;can have technical test automation/performance topics but should not be about technical test automation/performance only&lt;/li&gt;
&lt;li&gt;must be not present yet in the original Top 100&lt;/li&gt;
&lt;/ol&gt;
Deadline for submissions: Wednesday 30th of November at 23:59&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span id="fullpost"&gt;Your input is much appreciated. Thanks in advance! &lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6143723392471225584-1726445519278967749?l=www.testingminded.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Testingminded/~4/4-vFxyi1rvc" height="1" width="1"/&gt;</description><link>http://www.testingminded.com/2011/10/call-for-software-testing-blogs.html</link><author>noreply@blogger.com (Steven Machtelinckx)</author><thr:total>27</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6143723392471225584.post-2550046829204512345</guid><pubDate>Mon, 19 Apr 2010 11:09:00 +0000</pubDate><atom:updated>2010-05-21T07:46:30.766+02:00</atom:updated><title>Top 100 Software Testing Blogs</title><description>&lt;img alt="Software Testing Blogs" src="http://2.bp.blogspot.com/_ATtgRW3jaI0/S8w5tcD-V1I/AAAAAAAACiQ/vRebwUAqpJw/s1600/TheBlogIconBlueBox.jpg" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" /&gt;
Here it is at last: my first Top 100 of Software Testing Blogs. For those who would like to read more on Software Testing and QA, I created a list with 100 of the best - or at least most popular - Software Testing Blogs in the world. This should definitely give you enough reading!&lt;br&gt;
&lt;br /&gt;
I ordered this list by gathering several metrics of each blog, to be more precise: the Google Pagerank, Alexa Popularity, Technorati Authority, number of comments and number of sites linking to it.(Note: Not all statistics were available for each blog. Where a statistic was missing, the blog in question simply scored 'neutral' for that statistic). &lt;span id="fullpost"&gt;You can read the &lt;a href="http://www.noop.nl/how-to-make-a-top-blog-list.html"&gt;algorythm I used to rank the blogs&lt;/a&gt; at &lt;a href="http://noop.nl/"&gt;noop.nl&lt;/a&gt;. Many of the results were gathered automatically using &lt;a href="http://www.testingminded.com/2009/04/automatic-pagerank-checking-script.html"&gt;my Pagerank Checking script&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Enjoy the list and please let me know which blogs I forgot!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top" width="40"&gt;&lt;b&gt;#&lt;/b&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;b&gt;Site&lt;/b&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;b&gt;Author&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;1&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www.satisfice.com/blog" target="_new"&gt;James Bach's Blog&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;James Bach&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;2&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://blogs.stpcollaborative.com/matt" target="_new"&gt;Testing at the Edge of Chaos&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Matt Heusser&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;3&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://agiletesting.blogspot.com/" target="_new"&gt;Agile Testing &lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Grig Gheorghiu&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;4&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://martinfowler.com/" target="_new"&gt;Martinfowler.com&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Martin Fowler&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;5&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://testertested.blogspot.com/" target="_new"&gt;Tester Tested!&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Pradeep Soundararajan&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;6&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://googletesting.blogspot.com/" target="_new"&gt;Testing Blog&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Google Testing&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;7&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www.satisfice.com/kaner" target="_new"&gt;Cem Kaner’s Blog&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Cem Kaner&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;8&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://misko.hevery.com/" target="_new"&gt;Miško Hevery&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Miško Hevery&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;9&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www.developsense.com/blog.html" target="_new"&gt;DevelopSense&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Michael Bolton&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;10&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://blogs.msdn.com/saraford/default.aspx" target="_new"&gt;Sara Ford's Weblog&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Sara Ford&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;11&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://blogs.msdn.com/steverowe" target="_new"&gt;Steve Rowe's Blog&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Steve Rowe&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;12&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www.testobsessed.com/" target="_new"&gt;Test Obsessed&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Elisabeth Hendrickson&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;13&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://itknowledgeexchange.techtarget.com/software-quality" target="_new"&gt;Software Quality Insights&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;( various )&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;14&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www.exampler.com/blog" target="_new"&gt;Exploration Through Example&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Brian Marick&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;15&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://gojko.net/" target="_new"&gt;Gojko Adzic&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Gojko Adzic&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;16&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://shrinik.blogspot.com/" target="_new"&gt;Thinking Tester&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Shrini Kulkarni&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;17&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://chrismcmahonsblog.blogspot.com/" target="_new"&gt;Chris McMahon's Blog&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Chris McMahon&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;18&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://blogs.msdn.com/james%5Fwhittaker" target="_new"&gt;JW on Test&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;James Whittaker&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;19&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www.softwaretestinghelp.com/" target="_new"&gt;Software testing help&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Vijay&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;20&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://coreygoldberg.blogspot.com/" target="_new"&gt;Corey Goldberg &lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Corey Goldberg &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;21&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www.questioningsoftware.com/" target="_new"&gt;Quality Frog&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Ben Simo&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;22&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www.io.com/%7Ewazmo/blog" target="_new"&gt;Testing Hotlist Update&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Bret Pettichord&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;23&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://blog.abakas.com/" target="_new"&gt;Abakas&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Catherine Powell&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;24&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www.kohl.ca/blog" target="_new"&gt;Collaborative Software Testing&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Jonathan Kohl&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;25&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www.testingreflections.com/blog/74" target="_new"&gt;Sbarber's blog&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Scott Barber&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;26&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://adam.goucher.ca/" target="_new"&gt;Adam goucher&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Adam goucher&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;27&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://blogs.msdn.com/ejarvi" target="_new"&gt;Eric Jarvi&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Eric Jarvi&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;28&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www.testingreflections.com/blog/3804" target="_new"&gt;Karen N. Johnson's blog&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Karen N. Johnson&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;29&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://blogs.msdn.com/micahel" target="_new"&gt;Test Guide&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Michael Hunter&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;30&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://curioustester.blogspot.com/" target="_new"&gt;Curious Tester&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Parimala Shankaraiah&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;31&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://blog.testyredhead.com/" target="_new"&gt;Testy Redhead&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Lanette Creamer&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;32&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www.testingreflections.com/blog/2" target="_new"&gt;Antony Marcano's blog&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Antony Marcano&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;33&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www.sqablogs.com/jstrazzere" target="_new"&gt;All Things Quality&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Joe Strazzere&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;34&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://testingmentor.com/imtesty" target="_new"&gt;I. M. Testy &lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Bj Rollinson&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;35&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://software-testing-zone.blogspot.com/" target="_new"&gt;Software testing zone&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Debasis Pradhan&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;36&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://qablog.practitest.com/" target="_new"&gt;PractiTest QA Blog &lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Joel Montvelisky&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;37&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www.practicalqa.com/" target="_new"&gt;Practical QA&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Linda Wilkinson&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;38&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://marlenacompton.com/" target="_new"&gt;Marlena’s Blog&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Marlena Compton&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;39&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www.testingthefuture.net/" target="_new"&gt;Software Testing and more&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Ewald Roodenrijs, Andréas Prins &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;40&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://patrickwilsonwelsh.com/" target="_new"&gt;patrickwilsonwelsh.com&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Patrick Wilson-Welsh&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;41&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://quality-assurance-software-testing.blogspot.com/" target="_new"&gt;Quality Assurance and Software Testing&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;( various )&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;42&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://blogs.msdn.com/testing123" target="_new"&gt;Testing Testing 1,2,3&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Chan Chaiyochlarb&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;43&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www.michaeldkelly.com/blog" target="_new"&gt;Mike Kelly's blog&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Mike Kelly&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;44&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www.testthisblog.com/" target="_new"&gt;Test this Blog &lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Eric Jacobson&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;45&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://enjoytesting.blogspot.com/" target="_new"&gt;Enjoy testing &lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Ajay Balamurugadas&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;46&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www.eviltester.com/" target="_new"&gt;Evil Tester&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Alan Richardson&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;47&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://angryweasel.com/blog" target="_new"&gt;Tooth of the Weasel&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Alan Page&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;48&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www.testingreflections.com/blog/329" target="_new"&gt;Charlie Audritsh's blog&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Charlie Audritsh&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;49&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://mavericktester.com/" target="_new"&gt;Maverick Tester &lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Anne-Marie Charrett&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;50&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://gerrardconsulting.com/" target="_new"&gt;Paul Gerrard's blog &lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Paul Gerrard&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;51&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://blog.shino.de/" target="_new"&gt;shino.de&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Markus Gaertner&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;52&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://cartoontester.blogspot.com/" target="_new"&gt;Cartoon Tester&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Andy Glover&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;53&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www.clabs.org/blogki" target="_new"&gt;cLabs Blogki&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Chris Morris&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;54&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://testingjeff.wordpress.com/" target="_new"&gt;Jeff Fry on Testing&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Jeff Fry&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;55&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://venkatreddy.in/" target="_new"&gt;Venkat's Blog&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Venkat Reddy Chintalapudi&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;56&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://janetgregory.blogspot.com/" target="_new"&gt;Agile Testing and Process Thoughts&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Janet Gregory&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;57&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www.softwaretestingstuff.com/" target="_new"&gt;Software Testing Stuff&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;( various )&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;58&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://selenadelesie.com/" target="_new"&gt;selenadelesie.com&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Selena Delesie&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;59&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://blogs.msdn.com/joshpoley" target="_new"&gt;Software Sleuthing&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Josh Poley&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;60&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://softwarequalityonline.blogspot.com/" target="_new"&gt;The Software Quality Blog &lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Vijay Bhaskar&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;61&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://expectedresults.blogspot.com/" target="_new"&gt;Expected Results&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Phil Kirkham&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;62&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www.oneofthewolves.com/" target="_new"&gt;One of the wolves&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Tim Coulter&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;63&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://testmuse.spaces.live.com/" target="_new"&gt;Musing about Software Testing&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Keith Stobie&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;64&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://jonbox.wordpress.com/" target="_new"&gt;Jon Bach's blog&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Jonathan Bach&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;65&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www.quardev.com/blog" target="_new"&gt;Quardev&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;( various )&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;66&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://blog.softwaretestingclub.com/" target="_new"&gt;Software Testing Club Blog&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;( various )&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;67&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://testtotester.blogspot.com/" target="_new"&gt;TestToTester&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Sharath Byregowda&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;68&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://lisacrispin.com/wordpress/" target="_new"&gt;Agile Testing with Lisa Crispin&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Lisa Crispin&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;69&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www.passionatetester.com/" target="_new"&gt;Confessions of a Passionate Tester&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Dawn Cannan&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;70&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://blogs.msdn.com/dustin_andrews" target="_new"&gt;I am filled with solutions&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Dustin Andrews&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;71&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://tester.geordiekeitt.com/" target="_new"&gt;Software Tasting&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Geordie Keitt&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;72&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www.rosiesherry.com/blog" target="_new"&gt;Rosie Land&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Rosie Sherry&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;73&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://steveswanson.wordpress.com/" target="_new"&gt;Still Life&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Steve Swanson&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;74&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://bjosman.wordpress.com/" target="_new"&gt;Brian Osman&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Brian Osman&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;75&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://testingideas.wordpress.com/" target="_new"&gt;Dhanasekar S’s Blog&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Dhanasekar S&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;76&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://thesocialtester.posterous.com/" target="_new"&gt;The Social Tester &lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Rob Lambert&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;77&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www1.qainsight.net:8080/" target="_new"&gt;QA Insight&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Brent Strange&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;78&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://thetestingblog.com/" target="_new"&gt;The Testing Blog&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;( various )&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;79&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www.testingminded.com/" target="_new"&gt;Testingminded&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Steven Machtelinckx&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;80&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www.testingreflections.com/blog/3467" target="_new"&gt;John McConda's blog&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;John McConda&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;81&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://swqetesting.blogspot.com/" target="_new"&gt;Software Testing&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Len DiMaggio &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;82&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://testconsultant.blogspot.com/" target="_new"&gt;Jeroen's world of Software Testing&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Jeroen Rosink&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;83&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www.testingperspective.com/blog" target="_new"&gt;TestingPerspective&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Rahul Verma&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;84&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www.adamkwhite.com/" target="_new"&gt;Adam White  &lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Adam White&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;85&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://ubertest.hogfish.net/" target="_new"&gt;Purple Box Testing&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Trish Khoo&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;86&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://swtester.blogspot.com/" target="_new"&gt;Lessons Learned by a Software Tester&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Paul Carvalho&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;87&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://pliantalliance.org/" target="_new"&gt;Pliant Alliance&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Tim Beck&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;88&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www.testjutsu.com/" target="_new"&gt;Testjutsu&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Ben Kelly&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;89&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www.quinert.com/blog" target="_new"&gt;Illiteration&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Jared Quinert&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;90&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://geektester.blogspot.com/" target="_new"&gt;Tester Testifies&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Raj Kamal&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;91&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://tuppad.com/blog/" target="_new"&gt;Santhosh Tuppad's Blog&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Santhosh Tuppad&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;92&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www.teknologika.com/blog" target="_new"&gt;Teknologika&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Bruce McLeod&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;93&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://anujmagazine.blogspot.com/" target="_new"&gt;Creative Tester&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Anuj Magazine&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;94&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www.testertroubles.com/" target="_new"&gt;Tester Troubles &lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Ray Claridge&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;95&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://thoughtsonqa.blogspot.com/" target="_new"&gt;Thoughts on QA and Engineering&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;John Overbaugh&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;96&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://www.quicktestingtips.com/" target="_new"&gt;Quick Testing Tips&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;( various )&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;97&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://cruisinqa.blogspot.com/" target="_new"&gt;Cruisin QA&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Brett Leonard&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;98&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://qahatesyou.com/wordpress" target="_new"&gt;QA Hates You&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;The Director&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;99&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://testerlostfocus.blogspot.com/" target="_new"&gt;Tester Lost Focus&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;Michelle Smith&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align="center" style="text-align: center;" valign="top"&gt;100&lt;/td&gt;&lt;td valign="top"&gt;&lt;a href="http://jamesmccaffrey.spaces.live.com/blog" target="_new"&gt;James McCaffrey's blog&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;James McCaffrey&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Edit: Meanwhile some kind people have submitted blogs which I did not take into account when I created this list. They will be included in future updates.&lt;br&gt;&lt;br&gt;
&lt;a href="http://testsidestory.wordpress.com/" target="_new"&gt;Test Side Story&lt;/a&gt; from Zeger van Hese would have been number 70.&lt;br/&gt;
&lt;a href="http://www.qualityperspectives.ca/blog/" target="_new"&gt;Quality Perspectives&lt;/a&gt; from Lynn McKee would have been number 107.&lt;br/&gt;
&lt;a href="http://www.unimaginedtesting.ca/blog/" target="_new"&gt;Unimagined Testing&lt;/a&gt; from Nancy Kelln would have been number 90.&lt;br/&gt;
&lt;a href="http://www.softwaretestinggenius.com" target="_new"&gt;Software Testing Genius&lt;/a&gt; from Yogindernath would have been number 66.&lt;br/&gt;
&lt;a href="http://www.robkuijt.nl" target="_new"&gt;Rob Kuijt's Testing Blog&lt;/a&gt; from Rob Kuijt would have been number 51.&lt;br/&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6143723392471225584-2550046829204512345?l=www.testingminded.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Testingminded/~4/Yza6daIqqmo" height="1" width="1"/&gt;</description><link>http://www.testingminded.com/2010/04/top-100-software-testing-blogs.html</link><author>noreply@blogger.com (Steven Machtelinckx)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_ATtgRW3jaI0/S8w5tcD-V1I/AAAAAAAACiQ/vRebwUAqpJw/s72-c/TheBlogIconBlueBox.jpg" height="72" width="72" /><thr:total>71</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6143723392471225584.post-1724690830300916573</guid><pubDate>Fri, 02 Apr 2010 06:44:00 +0000</pubDate><atom:updated>2010-05-09T11:04:16.266+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">JMeter</category><category domain="http://www.blogger.com/atom/ns#">SOA</category><title>Running JMeter tests from behind a proxy server</title><description>Sometimes you may need to create and run your tests from behind a proxy server / firewall. For instance when you're on the LAN / intranet and need to connect to the outside. This is very easy to do so, but it can be hard to find out for the first time.&lt;span id="fullpost"&gt;&lt;br /&gt;
&lt;h2&gt;

Configuring the proxy server&lt;/h2&gt;
You need to launch JMeter with one or more of the following options:&lt;br /&gt;
&lt;blockquote&gt;
-H [proxy server or IP address]&lt;br /&gt;
-P [proxy server port]&lt;br /&gt;
-u [username for the proxy authentication]&lt;br /&gt;
-a [password for the proxy authentication]&lt;/blockquote&gt;
Examples:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;jmeter.bat -H 192.168.10.1 -P 8012&lt;/li&gt;
&lt;li&gt;jmeter.bat -H 192.168.10.1 -P 8012 -u my_user_name -a my_password&lt;/li&gt;
&lt;/ul&gt;
The easiest way is to create a new .bat file which launches jmeter.bat with the options above and place it in the JMeter bin directory. This way you can easily switch between JMeter and JMeter with proxy, without having to enter the settings again. &lt;a href="http://www.4shared.com/file/255037140/5f12440f/jmeter_with_proxy.html"&gt;Download an example bat file with proxy here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Note: This proxy mechanism is different from the built-in Http proxy
server. The http proxy server can be used to record http browser
sessions and requires you to modify set the browser proxy settings. &lt;br /&gt;
&lt;h2&gt;

Testing the proxy server settings&lt;/h2&gt;
There are several ways to check if the proxy server settings are correct. I prefer to connect to a public webservice as it is very easy to do so, e.g. the one from amazon: &lt;a href="http://soap.amazon.com/schemas3/AmazonWebServices.wsdl"&gt;http://soap.amazon.com/schemas3/AmazonWebServices.wsdl&lt;/a&gt;. Create a WebService(SOAP) request, fill out the WSDL url and click the "Load WSDL" button. The "Web Methods" dropdown gets filled with the available webservice methods. Congratulations, you correctly set the proxy server settings as you managed to reach the public webservice. &lt;a href="http://www.4shared.com/file/255038760/31ca4a69/Jmeter_with_proxy.html"&gt;Download the JMeter webservice request test file here.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
You don't get the the list of methods, instead you get an exception message? Check if&amp;nbsp; you get one of these messages:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Error1: The WSDL was not valid, please double check the url. org.apache.jmeter.protocol.http.util.WSDLException: Connection timed out: connect.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;The proxy server settings are probably incorrect, double check the proxy server and proxy server port&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Error2: The WSDL was not valid, please double check the url.
org.apache.jmeter.protocol.http.util.WSDLException: Server redirected too many times(20)&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;The username and password are probably incorrect, double check the correctness of these data&lt;br /&gt;
  &lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Error3: The WSDL was not valid, please double check the url.
org.apache.jmeter.protocol.http.util.WSDLException: http://soap.amazo.com/schemas3/AmazonWebServices.wsdl&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;The webservice is probably not up, or you made a typo like I did in the url above: amazo instead of amazon. Paste the url in a browser and check if you get an xml-like file describing the webservice.&lt;br /&gt;
  &lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Did you get get an other message? Leave a comment and I'll come back to you.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6143723392471225584-1724690830300916573?l=www.testingminded.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Testingminded/~4/98rjUSJlEFk" height="1" width="1"/&gt;</description><link>http://www.testingminded.com/2010/04/running-jmeter-tests-from-behind-proxy.html</link><author>noreply@blogger.com (Steven Machtelinckx)</author><thr:total>4</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6143723392471225584.post-7982520508668307294</guid><pubDate>Wed, 27 Jan 2010 07:20:00 +0000</pubDate><atom:updated>2010-01-27T11:50:36.594+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">tools</category><category domain="http://www.blogger.com/atom/ns#">automation</category><category domain="http://www.blogger.com/atom/ns#">watir</category><title>Top 5 Reasons to choose Watir</title><description>&lt;a href="http://watir.com/"&gt;Watir&lt;/a&gt; stands for "Web Application Testing in Ruby". It is a library in &lt;a href="http://www.ruby-lang.org/en/"&gt;Ruby&lt;/a&gt; which allows you to automate web applications. By default Watir supports IE, but with support of supplementary libraries you're able to automate applications in Firefox, Chrome and Safari as well. &lt;span id="fullpost"&gt;&lt;br /&gt;
&lt;br /&gt;
Sometimes I need to automate a task in a webbrowser. There are many tools on the market to choose from but so far Watir is my preferred one. These are my main reasons to choose for Watir:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;It's &lt;b&gt;free&lt;/b&gt;! It's an open source tool, so there are no costs to use this tool.&lt;/li&gt;
&lt;li&gt;It supports &lt;b&gt;multiple browsers and platforms&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;It uses Ruby, my favorite scripting language. Ruby is &lt;b&gt;concise and a joy&lt;/b&gt; to read and write.&lt;/li&gt;
&lt;li&gt;The &lt;b&gt;Ruby&lt;/b&gt; knowledge gained when using Watir can leverage my Ruby and Ruby on Rails projects, and vice versa.&lt;/li&gt;
&lt;li&gt;It's &lt;b&gt;lightweight&lt;/b&gt;. My computer doesn't suffer when creating or running automated tests.&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
Have you got any particular reasons to choose or not to choose Watir?&lt;br /&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6143723392471225584-7982520508668307294?l=www.testingminded.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Testingminded/~4/OrrsRmldi8U" height="1" width="1"/&gt;</description><link>http://www.testingminded.com/2010/01/5-reasons-to-choose-watir.html</link><author>noreply@blogger.com (Steven Machtelinckx)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6143723392471225584.post-7456659875411362052</guid><pubDate>Tue, 19 Jan 2010 11:07:00 +0000</pubDate><atom:updated>2010-04-02T10:09:56.771+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">defect management</category><category domain="http://www.blogger.com/atom/ns#">tools</category><category domain="http://www.blogger.com/atom/ns#">test management</category><category domain="http://www.blogger.com/atom/ns#">test execution</category><title>Agile Testing with HP Quality Center Agile Accelerator</title><description>Companies are increasingly turning towards alternative development management strategies to manage complex and emerging technologies. Projects are increasingly reviewing and adopting Agile methodology as the de facto standard to manage their application development environments for a variety of reasons. The important reasons amongst these are to reduce total cost of ownership, increase quality and reduce time to market.&lt;span id="fullpost"&gt;&lt;br /&gt;
&lt;h2&gt;What is Agile testing?&lt;/h2&gt;Agile testing is a software testing practice that follows the principles of the agile manifesto, emphasizing testing from the perspective of customers who will utilize the system. Agile testing does not emphasize rigidly defined testing procedures, but rather focuses on testing iteratively against newly developed code until quality is achieved from an end customer's perspective. In other words, the emphasis is shifted from "testers as quality police" to something more like "entire project team working toward demonstrable quality."&lt;br /&gt;
&lt;br /&gt;
Agile testing involves testing from the customer perspective as early as possible, testing early and often as code becomes available and stable enough from module/unit level testing.&lt;br /&gt;
&lt;br /&gt;
Since working increments of the software are released often in agile software development, there is also a need to test often. This is commonly done by using automated acceptance testing to minimize the amount of manual labour involved. Doing only manual testing in agile development may result in either buggy software or slipping schedules because it may not be possible to test the entire build manually before each release.&lt;br /&gt;
&lt;h2&gt;HP Quality Center Agile Accelerator&lt;/h2&gt;The HP Quality Center Agile Accelerator is designed to help projects manage Agile development using HP Quality Center 10.0. It can be imported into HP Quality Center 10.0 as a base project to manage both development and testing efforts within the same HP Quality Center Project. It comes with pre-built Agile user roles and related privileges, pre-defined Agile process workflows, configurations and rules to help you manage projects driven by Agile methodology. It also facilitates Agile reporting allowing you to track progress burn-down, burn-up and velocity.&lt;br /&gt;
&lt;h2&gt;Agile Accelerator Benefits&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Supports multiple Agile practices including Scrum/XP methodology: Sprint, Backlog, User story&lt;/li&gt;
&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Reduces calculation effort including tasks, estimation, planning, and spent hours&lt;/li&gt;
&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Improves information visibility across all user groups such as product managers, project engineers, Scrum Master, and others.&lt;/li&gt;
&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Encompasses the full project lifecycle from planning to delivery, development and testing ensuring application meets promised requirements&lt;/li&gt;
&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Reports project progress and delivered value through Burn-up charts and Burn-down charts&lt;/li&gt;
&lt;/ul&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6143723392471225584-7456659875411362052?l=www.testingminded.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Testingminded/~4/TUOsyLscrRA" height="1" width="1"/&gt;</description><link>http://www.testingminded.com/2010/01/agile-testing-with-hp-quality-center.html</link><author>noreply@blogger.com (Steven Machtelinckx)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6143723392471225584.post-1093217855769663218</guid><pubDate>Mon, 11 Jan 2010 15:07:00 +0000</pubDate><atom:updated>2010-01-12T13:02:15.352+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">fun</category><title>Google adsense vs Google translate bug</title><description>&lt;img alt="LogoGoogleAdsenseTranslate" src="http://1.bp.blogspot.com/_ATtgRW3jaI0/S0xkeGz6YtI/AAAAAAAACgE/Ruq0Dlpq4UQ/s320/LogoGoogleAdsenseTranslate.JPG" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;" /&gt;Google Adsense is a web program which enables web publishers to display relevant advertisements (ads) on their site. These advertisements are context based. This means that only ads relevating to the page content are displayed, at least in most cases.&lt;br /&gt;
&lt;span id="fullpost"&gt;&lt;br /&gt;
Google Translate is a free web program which translates words, phrases or even complete web pages to the language of your choice. By typing a website url on the &lt;a href="http://translate.google.com/"&gt;Google Translate homepage&lt;/a&gt;, your website is opened and loaded in the language of your choice, translated by the Google Translate engine.&lt;br /&gt;
&lt;br /&gt;
When combining these two technologies, something strange tends to happens. The contextual advertisements seem to be affected by the translation engine calling the website. Have a look at the screenshot below. The contextual advertisements which normally relate to cellphones and mobile technology are now displaying translation related ads.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;Translated to English version:&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a class="imglink" href="http://3.bp.blogspot.com/_ATtgRW3jaI0/S0s5Qau09wI/AAAAAAAACfk/Arpd04LLdcs/s1600-h/PageTranslated.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_ATtgRW3jaI0/S0s5Qau09wI/AAAAAAAACfk/Arpd04LLdcs/s400/PageTranslated.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;Original version:&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a class="imglink" href="http://2.bp.blogspot.com/_ATtgRW3jaI0/S0s5ZVjTNwI/AAAAAAAACfs/YTeb8meUe0c/s1600-h/PageOriginal.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_ATtgRW3jaI0/S0s5ZVjTNwI/AAAAAAAACfs/YTeb8meUe0c/s400/PageOriginal.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
In my opinion Google Adsense is not intended to behave like this. Probably Google Translate triggers this behaviour by loading the translated web page in a new page with html title "Google Translate" and some more references to translation in the source. This additional information is considered to be more important than the actual web page content to the advertisement units.&lt;br /&gt;
&lt;br /&gt;
If you want to take a look yourself, you can take the url's below.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;This is the "translated to English" version.&lt;br /&gt;
&lt;a href="http://translate.google.be/translate?js=y&amp;amp;prev=_t&amp;amp;hl=en&amp;amp;ie=UTF-8&amp;amp;layout=2&amp;amp;eotf=1&amp;amp;u=http%3A%2F%2Fmobily3araby.com%2F&amp;amp;sl=ar&amp;amp;tl=en"&gt;http://translate.google.be/translate?js=y&amp;amp;prev=_t&amp;amp;hl=en&amp;amp;ie=UTF-8&amp;amp;layout=2&amp;amp;eotf=1&amp;amp;u=http%3A%2F%2Fmobily3araby.com%2F&amp;amp;sl=ar&amp;amp;tl=en&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
And this is the original Arabic version:&lt;br /&gt;
&lt;a href="http://mobily3araby.com/"&gt;http://mobily3araby.com/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Have you seen any other bugs in the Google Adsense and Google Translate products? Or did you encounter similar interferences between other google products? Let us know!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6143723392471225584-1093217855769663218?l=www.testingminded.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Testingminded/~4/9qDXbzequYU" height="1" width="1"/&gt;</description><link>http://www.testingminded.com/2010/01/google-adsense-vs-google-translate-bug.html</link><author>noreply@blogger.com (Steven Machtelinckx)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_ATtgRW3jaI0/S0xkeGz6YtI/AAAAAAAACgE/Ruq0Dlpq4UQ/s72-c/LogoGoogleAdsenseTranslate.JPG" height="72" width="72" /><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6143723392471225584.post-6588138757759829447</guid><pubDate>Tue, 10 Nov 2009 11:50:00 +0000</pubDate><atom:updated>2009-11-10T17:48:17.690+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">autoIt</category><category domain="http://www.blogger.com/atom/ns#">fun</category><title>99 bottles of beer on the wall - code samples</title><description>&lt;span style="float:left;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_ATtgRW3jaI0/SvlRqoWK8xI/AAAAAAAACcY/_wqPuiIvNsg/s320/99BottlesOfBeerOnTheWall.jpg" style="clear: left; float: left; margin-bottom: -0.25em; margin-right: 1em;" /&gt;&lt;span class="imagebyleft"&gt;image by &lt;a href="http://www.flickr.com/photos/longtailworld/"&gt;satomiichimura&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;While I was searching the web for an example of the SCL (System Control Language) syntax, I stumbled upon the &lt;a href="http://www.99-bottles-of-beer.net/"&gt;99 bottles of beer website coding website&lt;/a&gt;. "99 bottles of beer" is a song about... indeed, 99 bottles of beer! The song text can be generated by writing a small program.&lt;br /&gt;
&lt;span id="fullpost"&gt;&lt;br /&gt;
99bottles-of-beer.net has gathered code samples in 1304 programming scripting languages and versions, even the queerest ones like SCL (System Control Language). Every code sample generates the "99 bottles of beer" song text as output, sometimes even with a nice twist.&lt;br /&gt;
&lt;br /&gt;
My favorite code samples are the &lt;a href="http://www.99-bottles-of-beer.net/language-autoit-657.html"&gt;Autoit version&lt;/a&gt; and &lt;a href="http://www.99-bottles-of-beer.net/language-ruby-673.html"&gt;Ruby (minimal) version&lt;/a&gt;. Probably because I just love to script in those languages. If you ever quickly want to know how a programming language looks like, you can easily &lt;a href="http://www.99-bottles-of-beer.net/search.html"&gt;look it up in their database&lt;/a&gt;.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6143723392471225584-6588138757759829447?l=www.testingminded.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Testingminded/~4/wp1qnnjYlzc" height="1" width="1"/&gt;</description><link>http://www.testingminded.com/2009/11/99-bottles-of-beer-on-wall-code-samples.html</link><author>noreply@blogger.com (Steven Machtelinckx)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_ATtgRW3jaI0/SvlRqoWK8xI/AAAAAAAACcY/_wqPuiIvNsg/s72-c/99BottlesOfBeerOnTheWall.jpg" height="72" width="72" /><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6143723392471225584.post-1691669831774760531</guid><pubDate>Tue, 03 Nov 2009 16:42:00 +0000</pubDate><atom:updated>2009-11-04T08:21:47.714+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">automation</category><title>Automation criteria for regression pack test cases</title><description>To automate or not to automate? This is a question everyone should ask to himself when composing a pack of regression test cases for test automation. Here is a shortlist of criteria which help deciding whether a test case is eligible for test automation or not:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Application stability (interface)&lt;/b&gt;&lt;br /&gt;
Changing application interfaces (e.g. GUI) can impact the automated test ware. This may force the update of automation interfaces (object repository, scripts, ...).&lt;br /&gt;
&lt;span id="fullpost"&gt;&lt;br /&gt;
&lt;b&gt;Requirement stability&lt;/b&gt;&lt;br /&gt;
Changing functionality can impact the automated test ware. Composition of tests may need to be altered/updated.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Good quality manual tests&lt;/b&gt;&lt;br /&gt;
A poor manual test will remain a poor test, whether executed manually or automated.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Frequently run tests/functionality&lt;/b&gt;&lt;br /&gt;
Higher ROI when automating tests/functionality which require many runs.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Reusability&lt;/b&gt;&lt;br /&gt;
It may be possible to reuse certain script libraries for different applications.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Limitation of user errors&lt;/b&gt;&lt;br /&gt;
Automating repetitive test procedures decreases the risk of user errors due to loss of concentration.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Complexity of application/tests&lt;/b&gt;&lt;br /&gt;
Complex applications may require extensive training of test executors.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6143723392471225584-1691669831774760531?l=www.testingminded.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Testingminded/~4/afWNZJCxyI8" height="1" width="1"/&gt;</description><link>http://www.testingminded.com/2009/11/automation-criteria-for-regression-pack.html</link><author>noreply@blogger.com (Steven Machtelinckx)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6143723392471225584.post-6666804815421902295</guid><pubDate>Mon, 26 Oct 2009 09:52:00 +0000</pubDate><atom:updated>2009-11-07T10:32:33.879+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">events</category><title>Eurostar 2009 Stockholm is approaching</title><description>&lt;img src="http://4.bp.blogspot.com/_ATtgRW3jaI0/SuVw__1RBRI/AAAAAAAACbk/IE_yh1GOxV8/s320/logoEurostar2009.PNG" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" /&gt;The Eurostar 2009 software testing conference is approaching. The edition of this year will be held in Stockholm, Sweden. The theme for this year is 'Testing for Real, Testing for Now'. Visit the &lt;a href="http://www.eurostarconferences.com/"&gt;Eurostar homepage&lt;/a&gt; for more information on the &lt;a href="http://www.eurostarconferences.com/conferences/2009/conference-at-a-glance.aspx"&gt;Eurostar 2009 programme&lt;/a&gt;. Need reasons to visit this conference? Read the &lt;a href="http://www.eurostarconferences.com/delegates/why-attend/10-reasons-to-attend-eurostar-2009.aspx"&gt;top 10 reasons to attend Eurostar 2009&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6143723392471225584-6666804815421902295?l=www.testingminded.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Testingminded/~4/F7krfuXpGP4" height="1" width="1"/&gt;</description><link>http://www.testingminded.com/2009/10/eurostar-2009-stockholm-is-approaching.html</link><author>noreply@blogger.com (Steven Machtelinckx)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_ATtgRW3jaI0/SuVw__1RBRI/AAAAAAAACbk/IE_yh1GOxV8/s72-c/logoEurostar2009.PNG" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6143723392471225584.post-3735529764812664889</guid><pubDate>Fri, 16 Oct 2009 06:22:00 +0000</pubDate><atom:updated>2009-11-07T10:32:53.367+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">automation</category><category domain="http://www.blogger.com/atom/ns#">events</category><title>GTAC 2009 is approaching</title><description>&lt;img border="0" src="http://1.bp.blogspot.com/_ATtgRW3jaI0/SuVx7Hp9EBI/AAAAAAAACbs/5iTe2R6d-6M/s320/GTAC2009.gif" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;" /&gt;The yearly Google Test Automation Conference is coming. This year the conference is taking place on the 21st and 22nd of October  in Zürich. For more details, visit the &lt;a href="http://www.gtac.biz/"&gt;GTAC website&lt;/a&gt; or the &lt;a href="http://googletesting.blogspot.com/2009/06/google-test-automation-conference-2009.html"&gt;Google Testing Blog&lt;/a&gt;. If you didn't see the speaker videos of last year I recommend checking out the &lt;a href="http://www.gtac.biz/gtac-2008"&gt;GTAC 2008 video archives&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6143723392471225584-3735529764812664889?l=www.testingminded.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Testingminded/~4/--XY9lff7u0" height="1" width="1"/&gt;</description><link>http://www.testingminded.com/2009/10/gtac-2009-is-approaching.html</link><author>noreply@blogger.com (Steven Machtelinckx)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_ATtgRW3jaI0/SuVx7Hp9EBI/AAAAAAAACbs/5iTe2R6d-6M/s72-c/GTAC2009.gif" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6143723392471225584.post-1373982148359418323</guid><pubDate>Tue, 13 Oct 2009 10:56:00 +0000</pubDate><atom:updated>2009-10-21T12:22:33.190+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">JMeter</category><category domain="http://www.blogger.com/atom/ns#">SOA</category><title>JMeter webservices NoClassDefFoundError: javax/mail</title><description>&lt;img border="0" exception="" java="" jmeter="" mail="" src="http://3.bp.blogspot.com/_ATtgRW3jaI0/StRb5J0Y_xI/AAAAAAAACag/__-3B7gyh0w/s320/HeaderJMeterJavaMailException.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" /&gt;Using the JMeter Webservice(SOAP) request sampler requires the installation of mail.jar and activation.jar files. Those library files don't come with JMeter by default. Sending webservice requests without having these files results in an unexpected error. Many users don't know how to tackle this problem, though it's easy to fix.&lt;br /&gt;
&lt;span id="fullpost"&gt;&lt;br /&gt;
&lt;br /&gt;
If one sends a Webservice(SOAP) request with the default JMeter installation, an error is thrown: &lt;b&gt;java.lang.NoClassDefFoundError: javax/mail/MessagingException&lt;/b&gt;. This error is visible both in Jmeter.log (located in the JMeter bin directory) and a result sampler like the View Results Tree.&lt;br /&gt;
&lt;br /&gt;
&lt;a alt="JMeter Java mail exception" class="imglink" href="http://1.bp.blogspot.com/_ATtgRW3jaI0/StRVTqDABFI/AAAAAAAACaA/EEcaAhnaXOY/s1600-h/JMeterJavaMailException.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_ATtgRW3jaI0/StRcHWWhGwI/AAAAAAAACao/60oYR_KCKsc/s320/JMeterJavaMailException.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a alt="JMeter View Results Tree Failure" class="imglink" href="http://4.bp.blogspot.com/_ATtgRW3jaI0/StRUW71yP-I/AAAAAAAACZ4/frVbW7aB3hk/s1600-h/JmeterRunFailedNoJavaMail.PNG" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_ATtgRW3jaI0/StRcVYjB-PI/AAAAAAAACaw/a9cu_pue2xA/s320/JmeterRunFailedNoJavaMail.PNG" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The solution for this problem is to download and install the mail.jar and activiation.jar libraries. Download &lt;a href="http://java.sun.com/products/javamail/downloads/index.html"&gt;java mail from Sun&lt;/a&gt; and java &lt;a href="http://java.sun.com/javase/technologies/desktop/javabeans/jaf/downloads/index.html"&gt;activation from Sun&lt;/a&gt;. Extract respectively mail.jar and activiation.rar from the downloaded zip archives, and put them in your &lt;b&gt;Jmeter lib folder&lt;/b&gt;. For instance: D:\machtst\My Documents\Tools\jakarta-jmeter-2.3.2\lib\&lt;br /&gt;
&lt;br /&gt;
&lt;a alt="JMeter Java mail and activation libs" class="imglink" href="http://3.bp.blogspot.com/_ATtgRW3jaI0/StRWrMa8KBI/AAAAAAAACaQ/DIcVyXwGeek/s1600-h/JavaMailJavaActivationLib.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_ATtgRW3jaI0/StRceBr0yaI/AAAAAAAACa4/uuoOTescySE/s320/JavaMailJavaActivationLib.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
It's important to close JMeter and reopen it again, so JMeter can load the libraries. If you run your test again, the error should be gone.&lt;br /&gt;
&lt;br /&gt;
&lt;a alt="JMeter View Results Tree Success" class="imglink" href="http://3.bp.blogspot.com/_ATtgRW3jaI0/StRV4WYf-cI/AAAAAAAACaI/Y9toj_-sdcs/s1600-h/JmeterRunPassedJavaMailPresent.PNG" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_ATtgRW3jaI0/StRcnqqt4oI/AAAAAAAACbA/duzb4j1KhTg/s320/JmeterRunPassedJavaMailPresent.PNG" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Not the solution you were looking for? Check out the &lt;a href="http://www.testingminded.com/2009/01/jmeter-faq-on-testing-webservices.html"&gt;JMeter FAQ section&lt;/a&gt; for more JMeter solutions.&lt;br /&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6143723392471225584-1373982148359418323?l=www.testingminded.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Testingminded/~4/uSmY9UeJcCI" height="1" width="1"/&gt;</description><link>http://www.testingminded.com/2009/10/jmeter-webservices-noclassdeffounderror.html</link><author>noreply@blogger.com (Steven Machtelinckx)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_ATtgRW3jaI0/StRb5J0Y_xI/AAAAAAAACag/__-3B7gyh0w/s72-c/HeaderJMeterJavaMailException.png" height="72" width="72" /><thr:total>5</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6143723392471225584.post-8865789451185033437</guid><pubDate>Thu, 08 Oct 2009 10:37:00 +0000</pubDate><atom:updated>2009-11-07T11:25:21.981+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tools</category><category domain="http://www.blogger.com/atom/ns#">automation</category><title>PuTTY automatic logon script: LogonPutty</title><description>Recently I found myself using putty quite often. I needed to connect to different servers in order to open log files. Opening all log files on all servers was a tedious task as it required me to connect with Putty to each machine. Next I had to navigate to the log by typing the tail command and the correct log path. By creating a simple autoit tool I managed to automate this boring task which is making life much easier for everyone in our team needing access to log files.&lt;br /&gt;
&lt;span id="fullpost"&gt;&lt;br /&gt;
The script interacts with Putty via the GUI. Several ways to drive GUI exist, like using the component coordinates, interacting with the controls themselves or sending keystrokes. I opted for sending key strokes as this approach requires very litle change to the configuration file if a new version of putty would implement some GUI changes. There's one drawback though. Blindlessley sending keystroke commands without implementing synchronization can lead to unexpected results :-)&lt;br /&gt;
&lt;br /&gt;
Like for many other scripts I have used AutoIt to write the script. I just love AutoIt and it's my most preferable scripting language after Ruby. In order to run the script you need to download AutoIt. You can download the latest version from http://www.autoitscript.com/. Pick "AutoIt Full Installation" which includes ScITE, an excellent AutoIt editor providing syntax highlighting, autocompletion, and more.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;How it works&lt;/h2&gt;&lt;h3&gt;Functionally&lt;/h3&gt;The user can identify several environments which each can have multiple servers. For each server a corresponding session exists in Putty and allows the user to connect to that server. The script launches a putty instance for each session, connects to the server and executes the commands related to the environment. Within a same environment the path to logfiles is usually the same, but accross environments differences can easily exist.&lt;br /&gt;
&lt;br /&gt;
This enables the user to easily connect to all servers on environment TEST for instance. Every log file of the application on that environment is opened by executing the commands related to the environment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Technically&lt;/h3&gt;The script reads the configuration and launches Putty. When the Putty window appears, it navigates to the "Saved Sessions" list and selects a session according to the selected environment(s). For each session in the selected environment a new Putty instance is launched. Every command belonging to the environment of the server/session is executed.&lt;br /&gt;
&lt;br /&gt;
Putty is launched:&lt;br /&gt;
&lt;br /&gt;
&lt;a class="imglink" href="http://2.bp.blogspot.com/_ATtgRW3jaI0/Ss3BO--PfiI/AAAAAAAACZY/DKyWUMRBkmI/s1600-h/puttyLoaded.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="Putty window" border="0" id="BLOGGER_PHOTO_ID_5390176792198741538" src="http://2.bp.blogspot.com/_ATtgRW3jaI0/Ss3BO--PfiI/AAAAAAAACZY/DKyWUMRBkmI/s400/puttyLoaded.PNG" style="cursor: pointer; height: 388px; margin: 0pt 10px 10px 0pt; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The first item in the session list is selected:&lt;br /&gt;
&lt;br /&gt;
&lt;a class="imglink" href="http://1.bp.blogspot.com/_ATtgRW3jaI0/Ss3BbY0U_8I/AAAAAAAACZo/iejbO4uiYI0/s1600-h/puttyFirstSession.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="Putty window first session selected" border="0" id="BLOGGER_PHOTO_ID_5390177005294911426" src="http://1.bp.blogspot.com/_ATtgRW3jaI0/Ss3BbY0U_8I/AAAAAAAACZo/iejbO4uiYI0/s400/puttyFirstSession.PNG" style="cursor: pointer; height: 388px; margin: 0pt 10px 10px 0pt; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The session is selected:&lt;br /&gt;
&lt;br /&gt;
&lt;a class="imglink" href="http://2.bp.blogspot.com/_ATtgRW3jaI0/Ss3BVm089gI/AAAAAAAACZg/XzAmkdAarZQ/s1600-h/puttySessionSelected.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="Putty window correct session selected" border="0" id="BLOGGER_PHOTO_ID_5390176905976411650" src="http://2.bp.blogspot.com/_ATtgRW3jaI0/Ss3BVm089gI/AAAAAAAACZg/XzAmkdAarZQ/s400/puttySessionSelected.PNG" style="cursor: pointer; height: 388px; margin: 0pt 10px 10px 0pt; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Username/password information is entered and commands are being executed:&lt;br /&gt;
&lt;br /&gt;
&lt;a class="imglink" href="http://2.bp.blogspot.com/_ATtgRW3jaI0/Ss3Bg1v_AwI/AAAAAAAACZw/P9zyaDDYuX4/s1600-h/puttyConnectedSmall.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="Putty connected to prompt" border="0" id="BLOGGER_PHOTO_ID_5390177098960667394" src="http://2.bp.blogspot.com/_ATtgRW3jaI0/Ss3Bg1v_AwI/AAAAAAAACZw/P9zyaDDYuX4/s400/puttyConnectedSmall.PNG" style="cursor: pointer; height: 252px; margin: 0pt 10px 10px 0pt; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Preparation of the script&lt;/h2&gt;The putty logon script consists out of two main files:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
A configuration file (.ini)&lt;br /&gt;
The script file (.au3)&lt;br /&gt;
&lt;/blockquote&gt;These files need to be created manually by copying and pasting the code below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;The configuration file&lt;/h3&gt;Create a file "logonPutty.ini" and add following code to it:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="Autoit" name="code"&gt;[launch]
#possible values: TEST,PREPROD
selectedEnvironments=TEST

[common]
#The full path of putty, including the executable name
puttyLocation=D:\machtst\My Documents\Tools\putty.exe
#The username to authenticate with
puttyUsername=yourusername
#The password to authenticate with
puttyPassword=yourpassword
#The title of the Putty window
puttyWindowTitle=PuTTY Configuration
#The number of seconds to wait for the Putty window after launching putty
puttyWindowCheckTimeout=5
#The send key commands to navigate to the saved sessions list
defaultCommands={TAB 4}{DOWN 1}
#The send key command ending the input
commandEnter={ENTER}
#The delimiter to seperate the commands in the command section with
commanddelimiter=;
#The amount of milliseconds to wait after sending commands
inputInterval=600
#The delay in between the keystrokes
sendKeyDelay=15

#The environment section: each environment together with their (putty) sessions
[environments]
TEST=bravo2,tapir
PREPROD=bravo8,panda

#The session section: each session with the send key command to access them,
#...relative to first item in the saved session list
[sessions]
alpha2={DOWN 1}
bravo2={DOWN 2}
bravo8={DOWN 3}
panda={DOWN 4}
tapir={DOWN 5}

#The command section: each environment with the commands to send for all (putty) sessions on the environment
[commands]
TEST=pwd;tail -2000lf domain-home/test/logging/nef-oracle.log
PREPROD=tail -2000lf domain-home/preprod/logging/nef-oracle.log
&lt;/pre&gt;&lt;h3&gt;The script file&lt;/h3&gt;Create a file "logonPutty.au3" and add following code to it:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="Autoit" name="code"&gt;;----------------------- TESTINGMINDED -----------------------
;- Automatic Putty logon script from www.testingminded.com ---
;-------------------- DECLARATION SECTION --------------------

#include &lt;array.au3&gt;

Global $Paused
HotKeySet("{PAUSE}", "TogglePause")
HotKeySet("{ESC}", "Terminate")

$scriptName = StringLeft(@ScriptName, StringLen(@ScriptName) - 4)
$iniLocation = @ScriptDir &amp;amp; '\' &amp;amp; $scriptName &amp;amp; '.ini'
If not(FileExists($iniLocation)) Then
MsgBox(0, "Exception", "The configuration file could not be found: " &amp;amp; $iniLocation)
exit
EndIf

$puttyLocation = IniRead($iniLocation, "common", "puttyLocation", "NotFound")
$puttyUsername = IniRead($iniLocation, "common", "puttyUsername", "NotFound")
$puttyPassword = IniRead($iniLocation, "common", "puttyPassword", "NotFound")
$defaultCommands = IniRead($iniLocation, "common", "defaultCommands", "NotFound")
$commandEnter = IniRead($iniLocation, "common", "commandEnter", "NotFound")
$inputInterval = IniRead($iniLocation, "common", "inputInterval", "NotFound")
$sendKeyDelay = IniRead($iniLocation, "common", "sendKeyDelay", "NotFound")
$commanddelimiter = IniRead($iniLocation, "common", "commanddelimiter", "NotFound")
$puttyWindowTitle = IniRead($iniLocation, "common", "puttyWindowTitle", "NotFound")
$puttyWindowCheckTimeout = IniRead($iniLocation, "common", "puttyWindowCheckTimeout", "NotFound")

$selectedSessions = _arraycreate("","","","","","","","","","","")
$selectedSessionCommands = _arraycreate("","","","","","","","","","","")
$commands = _arraycreate("","","","","","","","","","","")

$selectedEnvironments = IniRead($iniLocation, "launch", "selectedEnvironments", "NotFound")
$selectedSessions = _getsessions($selectedEnvironments)

; ------------------------------------------------------------------------------
; MAIN
; ------------------------------------------------------------------------------

$selectedSessionCommands = _getSelectedSessionCommands($selectedSessions)
$commands = _getCommands($selectedSessions)

Opt("SendKeyDelay", $sendKeyDelay)

for $i = 1 to UBound($selectedSessionCommands) - 1
Run($puttyLocation, "", @SW_MAXIMIZE)
if not (FileExists($puttyLocation)) Then
msgbox(0,"","The putty exe could not be found at location " &amp;amp; $puttyLocation)
Exit
EndIf

if WinWaitActive($puttyWindowTitle, "", $puttyWindowCheckTimeout) then
sleep(1000)
send ($defaultCommands)
Send ($selectedSessionCommands[$i])
send($commandEnter)

sleep($inputInterval)
if not($puttyUsername) = "" Then
Send ($puttyUsername)
send ($commandEnter)
sleep($inputInterval)
EndIf

sleep($inputInterval)
if not($puttyPassword) = "" Then
Send ($puttyPassword)
send ($commandEnter)
sleep($inputInterval)
EndIf

$commandArray = $commands[$i]
for $commandId = 1 to Ubound($commandArray) - 1
send($commandArray[$commandId])
send($commandEnter)
Next

Else
msgbox(0,"","The putty window with title " &amp;amp; $puttyWindowTitle &amp;amp; " could not be find within the foreseen timeframe")
Exit
EndIf
next

; ------------------------------------------------------------------------------
; FUNCTIONS
; ------------------------------------------------------------------------------

Func _getSelectedSessionCommands($selectedSessions)
redim $selectedSessionCommands [ubound($selectedSessions)]
$selectedSessionCommands[0] = ubound($selectedSessions)

for $i = 1 to ubound($selectedSessions) - 1
$session = $selectedSessions[$i]
$selectedSessionCommands[$i] = IniRead($iniLocation, "sessions", $session[0], "NotFound")

if $selectedSessionCommands[$i] == "NotFound" Then
MsgBox(0, "Exception", "Could not find session " &amp;amp; $selectedSessionCommands[$i] &amp;amp; " in the configuration file")
exit
EndIf

Next
return $selectedSessionCommands
EndFunc

Func _getsessions($selectedEnvironments)
$selectedEnvironments =  StringSplit($selectedEnvironments, ",")
$sessionNumber = 0

for $i = 1 to ubound($selectedEnvironments) - 1
$tempSessions = IniRead($iniLocation, "environments", $selectedEnvironments[$i], "NotFound")
if $tempSessions == "NotFound" Then
MsgBox(0, "Exception", "Could not find environment " &amp;amp; $selectedEnvironments[$i] &amp;amp; " in the configuration file")
exit
EndIf

$tempSessions = StringSplit($tempSessions, ",")

for $j = 1 to ubound($tempSessions) - 1
$sessionNumber = $sessionNumber + 1
$selectedSessions[$sessionNumber] = _arraycreate($tempSessions[$j],$selectedEnvironments[$i])
next

Next

redim $selectedSessions [$sessionNumber + 1]
$selectedSessions[0] = ubound($selectedSessions)
return $selectedSessions

EndFunc


Func _getCommands($selectedSessions)
redim $commands [ubound($selectedSessions)]
$commands[0] = ubound($selectedSessions)

for $i = 1 to ubound($selectedSessions) - 1
$session = $selectedSessions[$i]
$commandString = IniRead($iniLocation, "commands", $session[1], "NotFound")
$commands[$i] = stringsplit($commandString, $commanddelimiter)

if $selectedSessionCommands[$i] == "NotFound" Then
MsgBox(0, "Exception", "Could not find command " &amp;amp; $commands[$i] &amp;amp; " in the configuration file")
exit
EndIf

Next
return $commands
EndFunc

Func TogglePause()
$Paused = NOT $Paused
While $Paused
sleep(100)
ToolTip('Script is "Paused"',0,0)
WEnd
ToolTip("")
EndFunc

Func Terminate()
Exit 0
EndFunc
&lt;/array.au3&gt;&lt;/pre&gt;&lt;h2&gt;Configuration and proof running the script&lt;/h2&gt;Open the configuration file and update parameter puttyLocation with the location of Putty, including the file name of the Putty executable. Change parameters puttyUsername and puttyPassword into the username and password you need to connect to the servers with Putty.&lt;br /&gt;
&lt;br /&gt;
Define the environments in the [environments] section. Add server names after each of the environments. The names don't have to match the name of the stored Putty sessions. Next add each server name to the [sessions] section as parameter name and add the {DOWN 1} command as value. The number indicates the order of the stored Putty session, after the first "Default settings" items. Finally add the environments to the [command] section. For each environment, fill in the commands you want PuttyLogon to execute on the servers. You can use multiple commands by seperating them with the command seperator, which is ";" by default.&lt;br /&gt;
&lt;br /&gt;
Before running the script, update the "selectedEnvironments" parameter in the [launch] section. You can specify multiple environments. Run the script by opening it with the SciTE editor and pressing F5 or by creating  and running the executable.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6143723392471225584-8865789451185033437?l=www.testingminded.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Testingminded/~4/1zd137WMLPs" height="1" width="1"/&gt;</description><link>http://www.testingminded.com/2009/10/putty-automatic-logon-script-logonputty.html</link><author>noreply@blogger.com (Steven Machtelinckx)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_ATtgRW3jaI0/Ss3BO--PfiI/AAAAAAAACZY/DKyWUMRBkmI/s72-c/puttyLoaded.PNG" height="72" width="72" /><thr:total>13</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6143723392471225584.post-2333504674853827626</guid><pubDate>Sun, 27 Sep 2009 11:57:00 +0000</pubDate><atom:updated>2009-09-28T08:05:27.025+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tools</category><category domain="http://www.blogger.com/atom/ns#">autoIt</category><category domain="http://www.blogger.com/atom/ns#">fun</category><category domain="http://www.blogger.com/atom/ns#">automation</category><title>Autoit Bejeweled bot tutorial part 4: switching the gems</title><description>&lt;img style="margin: 0pt 10px 0pt 0pt; float: left; width: 250px; height: 149px;" alt="AutoIt Bejeweled bot tutorial part 4" src="http://users.telenet.be/machtelinckx/testingminded/images/content/Introduction-5.jpg" border="0" /&gt;This article makes part of the &lt;a href="http://www.testingminded.com/2009/03/autoit-bejeweled-bot-tutorial.html"&gt;Bejeweled bot tutorial series&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This final article on my bejeweled bot is about checking the possible moves, followed by switching the gems. We could say that this is one of the most crucial factors in the bot creation process.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Decision making&lt;/h2&gt;There are several ways to decide which gems to move first. You could look at the amount of points to earn for each move, and then move the gem which gives you the maximum of points. Also you could look at the cascade effect your move is possibly going to produce.&lt;br /&gt;&lt;br /&gt;This bot is applying a fairly easy and straightforward approach though. We define the possible gem patterns for identical gems and scan the gem play field for gems matching these patterns. The order of the patterns we look for defines the importancy of the move. We start by checking the patterns which will give us more points. The eventual cascade effect is not calculated, but for each pattern we start checking the lowest gems first and continue towards the top.&lt;br /&gt;&lt;br /&gt;Now roll up your sleeves and prepare yourself for the coding.&lt;br /&gt;&lt;br /&gt;We start by creating the clickDelay definition. Add following key to the configuration file:&lt;br /&gt;&lt;pre class="Autoit" name="code"&gt;&lt;br /&gt;moveClickDelay=0&lt;br /&gt;&lt;/pre&gt;And add this code to the declaration section:&lt;br /&gt;&lt;pre class="Autoit" name="code"&gt;&lt;br /&gt;$moveClickDelay=IniRead ( $iniFile, "Common" , "moveClickDelay", 0 )&lt;br /&gt;&lt;/pre&gt;Next we will implement the first decision making code. The variables firstGem and secondGem will contain the x and y coordinates of both gems to be switched, once we find matching gems. The switched boolean is put to false by default, and will keep track of switched gems during this iteration. If no gems were switched yet, we can continue to check for different patterns, otherwhise start over by checking for the first pattern again.&lt;br /&gt;&lt;br /&gt;We start by looping through the gem play field and fetching the gem colors of the gems we need to check against the pattern. Looping happens vertically from bottop to top, and horizontally from right to left. In this first case below we fetch the gem colors of 4 adjacent gems and check whether the first, second and fourth gems match. If they match, we store their x and y coordinates and switch the gems. If not, we check whether the first, third and fourth gems match, and so on.&lt;br /&gt;&lt;br /&gt;Add following code to the main section, on the place of the placeholder for the movement of gems:&lt;br /&gt;&lt;pre class="Autoit" name="code"&gt;&lt;br /&gt;local $firstGem[2] = [0, 0]&lt;br /&gt;local $secondGem[2] = [0, 0]&lt;br /&gt;&lt;br /&gt;if $switched == false then&lt;br /&gt; for $j = ($amountGems - 1) to 0 step -1&lt;br /&gt;  for $i = ($amountGems - 4) to 0 step -1&lt;br /&gt;  &lt;br /&gt;   $ColorGem1=$field[$i][$j]&lt;br /&gt;   $ColorGem2=$field[$i+1][$j]&lt;br /&gt;   $ColorGem3=$field[$i+2][$j]&lt;br /&gt;   $ColorGem4=$field[$i+3][$j]&lt;br /&gt;   &lt;br /&gt;   ;XXOX&lt;br /&gt;   if _ColorsMatch($ColorGem1, $ColorGem2, $ColorGem4)then&lt;br /&gt;    $firstGem[0] = $i + 2&lt;br /&gt;    $firstGem[1] = $j&lt;br /&gt;    $secondGem[0] = $i + 3&lt;br /&gt;    $secondGem[1] = $j  &lt;br /&gt;    $switched = _Switch($firstGem, $secondGem)&lt;br /&gt;    exitLoop 2&lt;br /&gt;   endif&lt;br /&gt;   &lt;br /&gt;   ;XOXX&lt;br /&gt;   if _ColorsMatch($ColorGem1, $ColorGem3, $ColorGem4)then&lt;br /&gt;    $firstGem[0] = $i&lt;br /&gt;    $firstGem[1] = $j&lt;br /&gt;    $secondGem[0] = $i + 1&lt;br /&gt;    $secondGem[1] = $j  &lt;br /&gt;    $switched = _Switch($firstGem, $secondGem)&lt;br /&gt;    exitLoop 2&lt;br /&gt;   endif&lt;br /&gt;   &lt;br /&gt;  next&lt;br /&gt; next&lt;br /&gt;&lt;br /&gt;endif&lt;br /&gt;&lt;/pre&gt;The other patterns are quite similar so I won't comment them. Add this code to the main section as well, right below the code you just added:&lt;br /&gt;&lt;pre class="Autoit" name="code"&gt;&lt;br /&gt; if $switched == false then&lt;br /&gt;  for $j = ($amountGems - 4) to 0 step -1&lt;br /&gt;   for $i = ($amountGems - 1) to 0 step -1&lt;br /&gt;   &lt;br /&gt;    $ColorGem1=$field[$i][$j]&lt;br /&gt;    $ColorGem2=$field[$i][$j+1]&lt;br /&gt;    $ColorGem3=$field[$i][$j+2]&lt;br /&gt;    $ColorGem4=$field[$i][$j+3]&lt;br /&gt;    &lt;br /&gt;    ;X&lt;br /&gt;    ;X&lt;br /&gt;    ;O&lt;br /&gt;    ;X    &lt;br /&gt;    if _ColorsMatch($ColorGem1, $ColorGem2, $ColorGem4)then&lt;br /&gt;     $firstGem[0] = $i&lt;br /&gt;     $firstGem[1] = $j + 2&lt;br /&gt;     $secondGem[0] = $i&lt;br /&gt;     $secondGem[1] = $j + 3      &lt;br /&gt;     $switched = _Switch($firstGem, $secondGem)&lt;br /&gt;     exitLoop 2&lt;br /&gt;    endif&lt;br /&gt;    &lt;br /&gt;    ;X&lt;br /&gt;    ;O&lt;br /&gt;    ;X&lt;br /&gt;    ;X     &lt;br /&gt;    if _ColorsMatch($ColorGem1, $ColorGem3, $ColorGem4)then            &lt;br /&gt;     $firstGem[0] = $i&lt;br /&gt;     $firstGem[1] = $j&lt;br /&gt;     $secondGem[0] = $i&lt;br /&gt;     $secondGem[1] = $j + 1      &lt;br /&gt;     $switched = _Switch($firstGem, $secondGem)&lt;br /&gt;     exitLoop 2&lt;br /&gt;    endif&lt;br /&gt;    &lt;br /&gt;   next&lt;br /&gt;  next&lt;br /&gt; endif &lt;br /&gt; &lt;br /&gt; if $switched == false then&lt;br /&gt;  for $j = ($amountGems - 2) to 0 step -1&lt;br /&gt;   for $i = ($amountGems - 3) to 0  step -1&lt;br /&gt;   &lt;br /&gt;    $ColorGem1=$field[$i][$j]&lt;br /&gt;    $ColorGem2=$field[$i+1][$j]&lt;br /&gt;    $ColorGem3=$field[$i+2][$j]&lt;br /&gt;    $ColorGem4=$field[$i][$j+1]&lt;br /&gt;    $ColorGem5=$field[$i+1][$j+1]&lt;br /&gt;    $ColorGem6=$field[$i+2][$j+1]&lt;br /&gt;&lt;br /&gt;    ;XXO or ;OOX&lt;br /&gt;    ;OOX    ;XXO&lt;br /&gt;    if _ColorsMatch($ColorGem1, $ColorGem2, $ColorGem6) or _ColorsMatch($ColorGem4, $ColorGem5, $ColorGem3) then&lt;br /&gt;     $firstGem[0] = $i + 2&lt;br /&gt;     $firstGem[1] = $j&lt;br /&gt;     $secondGem[0] = $i + 2&lt;br /&gt;     $secondGem[1] = $j + 1     &lt;br /&gt;     $switched = _Switch($firstGem, $secondGem)&lt;br /&gt;     exitLoop 2&lt;br /&gt;    endif&lt;br /&gt; &lt;br /&gt;    ;XOX or ;OXO&lt;br /&gt;    ;OXO    ;XOX&lt;br /&gt;    if _ColorsMatch($ColorGem1, $ColorGem3, $ColorGem5) or _ColorsMatch($ColorGem4, $ColorGem6, $ColorGem2) then&lt;br /&gt;     $firstGem[0] = $i + 1&lt;br /&gt;     $firstGem[1] = $j&lt;br /&gt;     $secondGem[0] = $i + 1&lt;br /&gt;     $secondGem[1] = $j + 1     &lt;br /&gt;     $switched = _Switch($firstGem, $secondGem)&lt;br /&gt;     exitLoop 2&lt;br /&gt;    endif&lt;br /&gt;    &lt;br /&gt;    ;OXX or ;XOO&lt;br /&gt;    ;XOO    ;OXX   &lt;br /&gt;    if _ColorsMatch($ColorGem2, $ColorGem3, $ColorGem4) or _ColorsMatch($ColorGem1, $ColorGem5, $ColorGem6) then&lt;br /&gt;     $firstGem[0] = $i&lt;br /&gt;     $firstGem[1] = $j&lt;br /&gt;     $secondGem[0] = $i&lt;br /&gt;     $secondGem[1] = $j + 1     &lt;br /&gt;     $switched = _Switch($firstGem, $secondGem)&lt;br /&gt;     exitLoop 2&lt;br /&gt;    endif&lt;br /&gt;    &lt;br /&gt;   next&lt;br /&gt;  next&lt;br /&gt; endif&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; if $switched == false then&lt;br /&gt;  for $j = ($amountGems - 3) to 0  step -1&lt;br /&gt;   for $i = ($amountGems - 2) to 0 step -1&lt;br /&gt;   &lt;br /&gt;    $ColorGem1=$field[$i][$j]&lt;br /&gt;    $ColorGem2=$field[$i][$j+1]&lt;br /&gt;    $ColorGem3=$field[$i][$j+2]&lt;br /&gt;    $ColorGem4=$field[$i+1][$j]&lt;br /&gt;    $ColorGem5=$field[$i+1][$j+1]&lt;br /&gt;    $ColorGem6=$field[$i+1][$j+2]&lt;br /&gt;&lt;br /&gt;    ;XO or ;OX&lt;br /&gt;    ;XO    ;OX&lt;br /&gt;    ;OX    ;XO   &lt;br /&gt;    if _ColorsMatch($ColorGem1, $ColorGem2, $ColorGem6) or _ColorsMatch($ColorGem3, $ColorGem4, $ColorGem5) then&lt;br /&gt;     $firstGem[0] = $i&lt;br /&gt;     $firstGem[1] = $j + 2&lt;br /&gt;     $secondGem[0] = $i + 1&lt;br /&gt;     $secondGem[1] = $j + 2   &lt;br /&gt;     $switched = _Switch($firstGem, $secondGem)&lt;br /&gt;     exitLoop 2&lt;br /&gt;    endif&lt;br /&gt; &lt;br /&gt;    ;XO or ;OX&lt;br /&gt;    ;OX    ;XO&lt;br /&gt;    ;XO    ;OX     &lt;br /&gt;    if _ColorsMatch($ColorGem1, $ColorGem3, $ColorGem5) or _ColorsMatch($ColorGem4, $ColorGem6, $ColorGem2) then&lt;br /&gt;     $firstGem[0] = $i&lt;br /&gt;     $firstGem[1] = $j + 1&lt;br /&gt;     $secondGem[0] = $i + 1&lt;br /&gt;     $secondGem[1] = $j + 1   &lt;br /&gt;     $switched = _Switch($firstGem, $secondGem)&lt;br /&gt;     exitLoop 2&lt;br /&gt;    endif&lt;br /&gt;    &lt;br /&gt;    ;OX or ;XO&lt;br /&gt;    ;XO    ;OX&lt;br /&gt;    ;XO    ;OX &lt;br /&gt;    if _ColorsMatch($ColorGem2, $ColorGem3, $ColorGem4) or _ColorsMatch($ColorGem1, $ColorGem5, $ColorGem6) then&lt;br /&gt;     $firstGem[0] = $i&lt;br /&gt;     $firstGem[1] = $j&lt;br /&gt;     $secondGem[0] = $i + 1&lt;br /&gt;     $secondGem[1] = $j  &lt;br /&gt;     $switched = _Switch($firstGem, $secondGem)&lt;br /&gt;     exitLoop 2&lt;br /&gt;    endif&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;   next&lt;br /&gt;  next&lt;br /&gt;&lt;br /&gt; endif&lt;br /&gt;&lt;/pre&gt;&lt;h2&gt;Checking gem colors&lt;/h2&gt;Identical gems are recognized based on their color. This bot doesn't apply any safety margin. Only when the color dots have exactly the same code we consider them as matching.&lt;br /&gt;&lt;br /&gt;Add following code to the function section:&lt;br /&gt;&lt;pre class="Autoit" name="code"&gt;&lt;br /&gt;Func _ColorsMatch($color1, $color2, $color3)&lt;br /&gt; $colorsEqual = false&lt;br /&gt; &lt;br /&gt; if $color1 = $color2 and $color1 = $color3 then&lt;br /&gt;  _Log("The colors matched exactly: " &amp;amp; hex($color1))   &lt;br /&gt;  $colorsEqual =  true&lt;br /&gt;  return $colorsEqual&lt;br /&gt; endif&lt;br /&gt; &lt;br /&gt;EndFunc&lt;br /&gt;&lt;/pre&gt;It's important to know that this approach is not error proof and only suitable for Bejeweled I. Therefore I have upgraded this approach in my Bejeweled Blitz bot by applying color ranges, which also works for Bejeweled 2. In the future I will discuss this so called "color range approach". Meanwhile I'll give you something to chew on by showing an extract of the configuration file of my Bejeweled Blitz bot.&lt;br /&gt;&lt;br /&gt;[colors]&lt;br /&gt;red=0xFE9191:0xFE4141&lt;br /&gt;orange=0xF8B84E:0xEF7422&lt;br /&gt;white=0xFEFEFE:0x909090&lt;br /&gt;&lt;h2&gt;Switching the gems&lt;/h2&gt;Actually switching the gems is the last part of the chain and is not complicated at all. The bot clicks two times: once on the first gem and once on the second gem. Add following code to the function section:&lt;br /&gt;&lt;pre class="Autoit" name="code"&gt;&lt;br /&gt;Func _Switch($firstGem, $secondGem)&lt;br /&gt; mouseclick("left",$Field1[0] + ($BlockWidth * $firstGem[0]) ,$Field1[1] + ($BlockWidth * $firstGem[1]),1,$MoveClickDelay)&lt;br /&gt; mouseclick("left",$Field1[0] + ($BlockWidth * $secondGem[0]) ,$Field1[1] + ($BlockWidth * $secondGem[1]),1,$MoveClickDelay)&lt;br /&gt; return True&lt;br /&gt;EndFunc&lt;br /&gt;&lt;/pre&gt;&lt;h2&gt;Proof running the code&lt;/h2&gt;At this point you should again be able to run you script and see the bot working. Save your script and configuration file, and run the bot script by pressing F5 in your ScITE editor. If you correctly followed all steps, the bejeweled bot should be performing all steps from previous parts, and the bot should perform correct moves. If you find the bot clicking faster than the gem play field replenishes after switching gems, you can increase the searchDelay timeout in the configuration file.&lt;br /&gt;&lt;br /&gt;If you encounter difficulties with the execution of these steps and you don't succeed in fixing the problem yourself, then leave a message in the comment section. Don't forget to include the error message shown in the ScITE output window. I will answer to your question as soon as possible.&lt;br /&gt;&lt;br /&gt;This was the last article in the Bejeweled bot tutorial series. Though, you can expect an article on the implementation of the color range approach for the Bejeweled Blitz Bot. Check out &lt;a href="http://www.testingminded.com/"&gt;testingminded&lt;/a&gt; regularly for updates or &lt;a href="http://feeds2.feedburner.com/Testingminded"&gt;subscribe to our RSS feed&lt;/a&gt;.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6143723392471225584-2333504674853827626?l=www.testingminded.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Testingminded/~4/7TeTMe04dH0" height="1" width="1"/&gt;</description><link>http://www.testingminded.com/2009/09/autoit-bejeweled-bot-tutorial-part-4.html</link><author>noreply@blogger.com (Steven Machtelinckx)</author><thr:total>41</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6143723392471225584.post-6715683882768387209</guid><pubDate>Sun, 12 Apr 2009 23:45:00 +0000</pubDate><atom:updated>2009-09-28T08:05:56.051+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tools</category><category domain="http://www.blogger.com/atom/ns#">autoIt</category><category domain="http://www.blogger.com/atom/ns#">fun</category><category domain="http://www.blogger.com/atom/ns#">automation</category><title>Autoit Bejeweled bot tutorial part 3: reading the gem colors</title><description>&lt;img style="margin: 0pt 0pt 10px 10px; float: right; width: 250px; height: 149px;" src="http://users.telenet.be/machtelinckx/testingminded/images/content/Introduction-4.jpg" alt="AutoIt Bejeweled bot tutorial part 3" border="0" /&gt;This article makes part of the &lt;a href="http://www.testingminded.com/2009/03/autoit-bejeweled-bot-tutorial.html"&gt;Bejeweled bot tutorial series&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Today it's time to create our main loop and integrate a function to read the gem colors. We already located the gem play field and we know each gem its position. With this information we should be fine to complete today's part.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;&lt;h2&gt;Reading the gem colors&lt;/h2&gt;&lt;h3&gt;The difficulties&lt;/h3&gt;In the previous article we calculated the center of the three gems on the corners. The easiest way to continue, would be to read the pixel color at each gem center. Unfortunately that's not sufficient as the gem center we have calculated is not always the exact gem center. When writing the bot code originally, I found out that Bejeweled often seemed to randomly add an additional horizontal and vertical row of pixels to the gem field. If the gem field would contain only yellow gems for instance, our pixel reading function would not always return exactly the same color. Sometimes the function would return the color of the pixel beside the actual center of the gem, because of the additional row or column somewhere in the field.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;The possible solutions&lt;/h3&gt;I found two potential solutions for this problem:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Reading the color code at each calculated gem center&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;applying a margin&lt;/span&gt; to the color code when determining whether gems are equal afterwards&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Reading the gem color on locations close to the center&lt;/span&gt; and using exact color codes to determine equal gems afterwards&lt;/li&gt;&lt;/ol&gt;I chose the second solution because I don't like to apply margins to the gem colors. Even the lowest margin can lead to different gem colors being associated, as some gem colors have color codes which also exist at other gems with different colors.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;The pixel reading offset&lt;/h3&gt;Now, a few years later, I discovered the real problem of the additional rows and columns. Bejeweled namely draws one additional horizontal and vertical row in the center of the gem field. Next image shows this row and column in white. Because of these lines, our gem center calculations are not correct anymore in part 2, 3 and 4&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ATtgRW3jaI0/SeJ2AwgbwYI/AAAAAAAACLY/hZSJL1E0HrY/s1600-h/CompleteFieldAdditionalLine.png" class="imglink"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer; width: 302px; height: 320px;" src="http://3.bp.blogspot.com/_ATtgRW3jaI0/SeJ2AwgbwYI/AAAAAAAACLY/hZSJL1E0HrY/s320/CompleteFieldAdditionalLine.png" alt="bejeweled bot gem field" id="BLOGGER_PHOTO_ID_5323947464898363778" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;With this new information I can update the pixel reading mechanism by calculating the exact center for part 2, 3 and 4 separately, but I won't change it at this moment. The pixel reading offset functionality which I implemented as workaround covers this case and still proves to work fine anyway.&lt;br /&gt;&lt;br /&gt;The pixel reading offset or pixel shift method lets the bot read pixel colors on locations other than the calculated center. Each gem type (color) has an area with multiple pixels of the same color which we could call the safe area. If we read the pixel color within the borders of that area, we always get back the same color code for that gem, even if the gem shifts 1 pixel horizontally or vertically.&lt;br /&gt;&lt;br /&gt;Following images show the safe zone for the white and purple gem. They both benefit from the pixel shift set -4 (x coordinate), -2 (y coordinate). The dot in black is the pixel of which the color code is read.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ATtgRW3jaI0/SeJ2kpsZ3pI/AAAAAAAACLg/ITKnmZMJAQs/s1600-h/Centergems.png" class="imglink"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer; width: 320px; height: 107px;" src="http://4.bp.blogspot.com/_ATtgRW3jaI0/SeJ2kpsZ3pI/AAAAAAAACLg/ITKnmZMJAQs/s320/Centergems.png" alt="bejeweled bot center gems" id="BLOGGER_PHOTO_ID_5323948081544814226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;After having investigated all gems, I found out that three pixel shift sets would be sufficient to cover all gem types: 10,10 / 5,5 and -4,-2&lt;br /&gt;&lt;br /&gt;Note that the pixel shift set values relate somehow to the bejeweled game proportions. I configured the pixel shift set values when playing on http://www.spelspelen.com. If a site other than http://www.spelspelen.com displays the bejeweled game with a different size, these pixel shift sets need to be revised. For instance, if the bejeweled game has only half the size of the one on http://www.spelspelen.com, then the pixel shift sets need to divided by two as well.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Implementing the pixel reading offset&lt;/h3&gt;First add following key to the configuration file:&lt;br /&gt;&lt;pre class="Autoit" name="code"&gt;&lt;br /&gt;pixelShift=10,10/5,5/-4,-2&lt;br /&gt;&lt;/pre&gt;Next add this code to the declaration section:&lt;br /&gt;&lt;pre class="Autoit" name="code"&gt;&lt;br /&gt;$pixelShift=IniRead ( $iniFile, "Common" , "pixelShift", 0 )&lt;br /&gt;&lt;/pre&gt;The pixel shift sets need to be split into array for easier processing. Add this code to the main section:&lt;br /&gt;&lt;pre class="Autoit" name="code"&gt;&lt;br /&gt;;Read pixel shift sets into an array&lt;br /&gt;Global $pixelShiftSetCounter = 0&lt;br /&gt;Global $pixelShiftSet = StringSplit($PixelShift,"/")&lt;br /&gt;&lt;br /&gt;;For each pixel shift set, create an array storing the x and y coordinates&lt;br /&gt;for $i = 1 to Ubound($pixelShiftSet) - 1&lt;br /&gt;$pixelShiftSet[$i] = stringSplit($pixelShiftSet[$i],",")&lt;br /&gt;Next&lt;br /&gt;&lt;/pre&gt;In order to loop through the different pixel shift sets when reading the gem field, add following code to the function section:&lt;br /&gt;&lt;pre class="Autoit" name="code"&gt;&lt;br /&gt;Func _getNextPixelShiftSet()&lt;br /&gt;if $PixelShiftSetcounter &lt; (Ubound($PixelShiftSet) - 1) then   $PixelShiftSetcounter = $PixelShiftSetcounter + 1  else   $PixelShiftSetcounter = 1  endif    _log("Using Pixelshiftset with number " &amp;amp; $PixelShiftSetcounter &amp;amp; " and content " &amp;amp; _ArrayToString($PixelShiftSet[$PixelShiftSetcounter],",",1))    return $PixelShiftSet[$PixelShiftSetcounter] EndFunc &lt;/pre&gt;Once we have the pixel shift sets ready, we can add the pixel reading function. Add following code to the function section:&lt;br /&gt;&lt;pre class="Autoit" name="code"&gt;&lt;br /&gt;Func _readPixels()&lt;br /&gt;_log("Start reading pixels")&lt;br /&gt;$pixelShift = _getNextPixelShiftSet()&lt;br /&gt;$shiftHorizontal = $pixelShift[1]&lt;br /&gt;$shiftVertical = $pixelShift[2]&lt;br /&gt;&lt;br /&gt;ToolTip('Reading pixels playfield', 0, 0)&lt;br /&gt;&lt;br /&gt;dim $Field[8][8]&lt;br /&gt;$k=0&lt;br /&gt;$l=0&lt;br /&gt;&lt;br /&gt;for $j = $field1[1] to $field3[1] step $blockWidth&lt;br /&gt; for $i = $field1[0] to $field2[0] step $blockWidth&lt;br /&gt;  $field[$k][$l] = pixelgetColor($i + $shiftHorizontal,$j + $shiftVertical)&lt;br /&gt;&lt;br /&gt;  ;mousemove($i + $shiftHorizontal,$j + $shiftVertical,40)&lt;br /&gt;  ;Sleep(500)&lt;br /&gt;  $k = $k + 1&lt;br /&gt; next&lt;br /&gt; $l = $l + 1&lt;br /&gt; $k = 0&lt;br /&gt;next&lt;br /&gt;&lt;br /&gt;return $field&lt;br /&gt;EndFunc&lt;br /&gt;&lt;/pre&gt;Reading the pixels is one thing, but being able to see which colors were recorded is even better. Add following code to the function section:&lt;br /&gt;&lt;pre class="Autoit" name="code"&gt;&lt;br /&gt;Func _logpixels()&lt;br /&gt;$i = 0&lt;br /&gt;$j = 0&lt;br /&gt;for $j = 0 to 7&lt;br /&gt; $line = ""&lt;br /&gt; for $i = 0 to 7&lt;br /&gt;  $temp = $field[$i][$j]&lt;br /&gt;  $line = $line &amp;amp; " " &amp;amp; hex($temp)&lt;br /&gt; next&lt;br /&gt; _Log($line)&lt;br /&gt;next&lt;br /&gt;_Log("")&lt;br /&gt;EndFunc&lt;br /&gt;&lt;/pre&gt;&lt;h2&gt;The main loop&lt;/h2&gt;Now all pixel reading functions have been implemented, we can set up the main loop of our bot. This loop will read the color code of each gem's center, log the color codes which have been recorded, and later on implement the logic to decide upon which move to make.&lt;br /&gt;&lt;br /&gt;Add following code to the main section:&lt;br /&gt;&lt;pre class="Autoit" name="code"&gt;&lt;br /&gt;while 1&lt;br /&gt;$switched = false&lt;br /&gt;$field = _ReadPixels()&lt;br /&gt;_LogPixels()&lt;br /&gt;&lt;br /&gt;ToolTip('Start checking if gems can be moved', 0, 0)&lt;br /&gt;&lt;br /&gt;;PLACEHOLDER for the movement of gems&lt;br /&gt;&lt;br /&gt;ToolTip('Stop checking if gems can be moved', 0, 0)&lt;br /&gt;&lt;br /&gt;if $switched = true then&lt;br /&gt; sleep($searchDelay)&lt;br /&gt; _log("a move was performed")&lt;br /&gt;Else&lt;br /&gt; _log("checked whole field, no moves were done")&lt;br /&gt;endif&lt;br /&gt;_log("")&lt;br /&gt;wend&lt;br /&gt;&lt;/pre&gt;All above function calls and variables which the loop is referencing to should exist, except for the delay of searching new gems after having performed a move. Add following key to the configuration file:&lt;br /&gt;First add following key to the configuration file:&lt;br /&gt;&lt;pre class="Autoit" name="code"&gt;&lt;br /&gt;searchDelay=1000&lt;br /&gt;&lt;/pre&gt;And add following code to the declaration section:&lt;br /&gt;&lt;pre class="Autoit" name="code"&gt;&lt;br /&gt;$searchDelay=IniRead ( $iniFile, "Common" , "searchDelay", 1200 )&lt;br /&gt;&lt;/pre&gt;&lt;h2&gt;Proof running the code&lt;/h2&gt;At this point you should be able to run you script and see more results. Save your script and configuration file, and run the bot script by pressing F5 in your ScITE editor. If you correctly followed all steps, the bejeweled bot should be performing all steps from previous parts, and the bot should read the pixel colors of the gems. You can verify this by uncommenting the 2 comment lines in the _readPixels function. This will move the mouse to each gem and will give you an idea of what is happening exactly.&lt;br /&gt;&lt;br /&gt;If you encounter difficulties with the execution of these steps and you don't succeed in fixing the problem yourself, then leave a message in the comment section. Don't forget to include the error message shown in the ScITE output window. I will answer to your question as soon as possible.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.testingminded.com/2009/09/autoit-bejeweled-bot-tutorial-part-4.html"&gt;Continue to the fourth part of the bejeweled bot tutorial: switching the gems&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6143723392471225584-6715683882768387209?l=www.testingminded.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Testingminded/~4/qRMmsy34hOo" height="1" width="1"/&gt;</description><link>http://www.testingminded.com/2009/04/autoit-bejeweled-bot-tutorial-part3.html</link><author>noreply@blogger.com (Steven Machtelinckx)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_ATtgRW3jaI0/SeJ2AwgbwYI/AAAAAAAACLY/hZSJL1E0HrY/s72-c/CompleteFieldAdditionalLine.png" height="72" width="72" /><thr:total>22</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6143723392471225584.post-2184698390465530351</guid><pubDate>Thu, 09 Apr 2009 07:26:00 +0000</pubDate><atom:updated>2009-05-03T10:51:15.101+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tools</category><category domain="http://www.blogger.com/atom/ns#">autoIt</category><category domain="http://www.blogger.com/atom/ns#">automation</category><title>Automatic pagerank checking script</title><description>Checking the pagerank of a website is easy. You just search google for the "google pagerank checker" keyword and you instantly get more than 3 million of results. Each website offers you the possibility to manually enter a web site url and returns you the rank. That's great, but what if you need to know the pagerank of more than 200 web sites? And what if you need to know other rankings as well?&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;I'm preparing an article with a top 100 blogs for software testing. I will not write down my personal choice, instead I will make a huge list of blogs and rank them according to &lt;a href="http://www.noop.nl/how-to-make-a-top-blog-list.html"&gt;the how to make a top blog list article&lt;/a&gt; on &lt;a href="http://www.noop.nl/"&gt;Noop.nl&lt;/a&gt;. Several rankings are taken into account, like the Google pagerank (PR), Alexa reach, Alexa popularity, Technorati authority and the number of referring links according to Google.&lt;br /&gt;&lt;br /&gt;Gathering a list of 300+ blogs to start with is already a good start. But retrieving the rankings of each blog by hand is something I don't intend to do. Therefore I created a script to check the rankings for a list of sites automatically. For each site in the input file, the script fetches the rank at each of the selected ranking-service. Each site and its ranks are written to a file to be opened with MS Excel afterwards.&lt;br /&gt;&lt;br /&gt;In order to run the script you need to download AutoIt. You can download the latest version from http://www.autoitscript.com/. Pick "AutoIt Full Installation" which includes ScITE, an excellent AutoIt editor providing syntax highlighting, autocompletion, and more.&lt;br /&gt;&lt;br /&gt;The script is completely free to use, though a comment in the comment section of this post would be appreciated :-)&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Preparation of the pagerank script&lt;/h2&gt;The rank check script consists out of four main files:&lt;br /&gt;&lt;blockquote&gt;A configuration file (.ini)&lt;br /&gt;An input file containing all sites to get the ranking for (.txt)&lt;br /&gt;The script file (.au3)&lt;br /&gt;An output file containing all sites with their rankings (.csv)&lt;br /&gt;&lt;/blockquote&gt;Three out of four files need to be created manually by copying and pasting the code below. The fourth file is generated automatically by the script.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;The configuration file&lt;/h3&gt;Create a file "checkRanking.ini" and add following code to it:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="Autoit"&gt;&lt;br /&gt;[launch]&lt;br /&gt;selectedRankings=googlePR,googleLink,alexaPopularity,technorati&lt;br /&gt;&lt;br /&gt;[common]&lt;br /&gt;#The name of the ranking input file&lt;br /&gt;rankingInputFileName=rankingInput.txt&lt;br /&gt;#The name of the output ranking file&lt;br /&gt;rankingOutputFileName=rankingOutput.csv&lt;br /&gt;#The separator of the output ranking file&lt;br /&gt;rankingOutputSeparator=,&lt;br /&gt;#The separator of the ranking service details&lt;br /&gt;rankingServiceSeparator=§&lt;br /&gt;#The tag in the ranking service url to replace by the site to rank&lt;br /&gt;rankingServiceUrlTag=[url]&lt;br /&gt;#The ranking value for sites not having a rank&lt;br /&gt;rankingValueNoRank=N/A&lt;br /&gt;#The ranking value for sites in the excluded domains&lt;br /&gt;rankingValueExcluded=Excluded&lt;br /&gt;&lt;br /&gt;[ranking-service]&lt;br /&gt;#The ranking services:&lt;br /&gt;#parameter 1 = the url of the service to request&lt;br /&gt;#parameter 2 = the regular expression to fetch the ranking&lt;br /&gt;googlePR=http://www.google.com/search?client=navclient-auto&amp;ch=6-1484155081&amp;features=Rank&amp;q=info:[url]§.*:\d:(.*)&lt;br /&gt;alexaPopularity=http://data.alexa.com/data?cli=10&amp;dat=snbamz&amp;url=[url]§POPULARITY\s\S+\sTEXT=\"(.\d+)\"&lt;br /&gt;alexaReach=http://data.alexa.com/data?cli=10&amp;dat=snbamz&amp;url=[url]§REACH\sRANK=\"(\d+)\"&lt;br /&gt;technorati=http://www.technorati.com/blogs/[url]§&gt;Authority:\s([\d,]+)&lt;br /&gt;googleLink=http://www.google.be/search?hl=nl&amp;q=link%3A[url]§&lt;b&gt;([\d\.]+)&lt;/b&gt;\smet\slinks\stot&lt;br /&gt;&lt;br /&gt;#The domain names which shouldn't get a ranking at a certain ranking-service&lt;br /&gt;[domains-to-exclude]&lt;br /&gt;alexaPopularity=.thoughtworks.com§.msdn.com&lt;br /&gt;alexaReach=.thoughtworks.com§.msdn.com&lt;br /&gt;&lt;/pre&gt;You can further tweak the configuration and add rating services to work with.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;The site input file&lt;/h3&gt;Create a file "rankingInput.txt" and add the sites of your choice to it, for instance:&lt;br /&gt;&lt;pre name="code" class="Autoit"&gt;&lt;br /&gt;http://www.testingminded.com&lt;br /&gt;http://www.testsquad.org&lt;br /&gt;http://www.problogdesign.com&lt;br /&gt;http://www.problogger.net&lt;br /&gt;http://www.noop.nl&lt;br /&gt;http://blogs.msdn.com/joshpoley/&lt;br /&gt;http://blogs.thoughtworks.com/testblog&lt;br /&gt;http://notexistingsite.com&lt;br /&gt;&lt;/pre&gt;&lt;h3&gt;The script file&lt;/h3&gt;Create a file "checkRanking.au3" and add following code to it:&lt;br /&gt;&lt;pre name="code" class="Autoit"&gt;&lt;br /&gt;;----------------------- TESTINGMINDED -----------------------&lt;br /&gt;;--- pagerank checking script from www.testingminded.com -----&lt;br /&gt;;-------------------- DECLARATION SECTION --------------------&lt;br /&gt;&lt;br /&gt;#include &amp;lt;ARRAY.AU3&amp;gt;&lt;br /&gt;#include &amp;lt;FILE.AU3&amp;gt;&lt;br /&gt;#include &amp;lt;INET.AU3&amp;gt;&lt;br /&gt;&lt;br /&gt;Opt("TrayAutoPause", 0)&lt;br /&gt;&lt;br /&gt;Global $sitesToRank&lt;br /&gt;&lt;br /&gt;_inform("Initializing...")&lt;br /&gt;&lt;br /&gt;$scriptName = StringLeft(@ScriptName, StringLen(@ScriptName) - 4)&lt;br /&gt;$iniLocation = @ScriptDir &amp; '\' &amp; $scriptName &amp; '.ini'&lt;br /&gt;If Not (FileExists($iniLocation)) Then&lt;br /&gt; MsgBox(0, "Exception", "The configuration file could not be found: " &amp; $iniLocation)&lt;br /&gt; Exit&lt;br /&gt;EndIf&lt;br /&gt;&lt;br /&gt;$rankingInputFileName = IniRead($iniLocation, "common", "rankingInputFileName", "NotFound")&lt;br /&gt;$rankingOutputFileName = IniRead($iniLocation, "common", "rankingOutputFileName", "NotFound")&lt;br /&gt;$rankingOutputSeparator = IniRead($iniLocation, "common", "rankingOutputSeparator", "NotFound")&lt;br /&gt;$rankingServiceSeparator = IniRead($iniLocation, "common", "rankingServiceSeparator", "NotFound")&lt;br /&gt;$rankingServiceUrlTag = IniRead($iniLocation, "common", "rankingServiceUrlTag", "NotFound")&lt;br /&gt;$rankingValueNoRank = IniRead($iniLocation, "common", "rankingValueNoRank", "NotFound")&lt;br /&gt;$rankingValueExcluded = IniRead($iniLocation, "common", "rankingValueExcluded", "NotFound")&lt;br /&gt;$selectedRankings = IniRead($iniLocation, "launch", "selectedRankings", "NotFound")&lt;br /&gt;$selectedRankingSettings = _arraycreate("", "", "", "", "", "", "", "", "", "", "", "", "", "")&lt;br /&gt;&lt;br /&gt;; ------------------------------------------------------------------------------&lt;br /&gt;; MAIN&lt;br /&gt;; ------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;$rankingInputFile = @ScriptDir &amp; "\" &amp; $rankingInputFileName&lt;br /&gt;&lt;br /&gt;If Not (FileExists($rankingInputFile)) Then&lt;br /&gt; MsgBox(0, "Exception", "The ranking input file could not be found: " &amp; $rankingInputFile)&lt;br /&gt; Exit&lt;br /&gt;EndIf&lt;br /&gt;&lt;br /&gt;$timeStamp = @YEAR &amp; '-' &amp; @MON &amp; '-' &amp; @MDAY &amp; '_' &amp; @HOUR &amp; '-' &amp; @MIN &amp; '-' &amp; @SEC&lt;br /&gt;$RankingOutputFile = @ScriptDir &amp; "\" &amp; $rankingOutputFileName&lt;br /&gt;_FileReadToArray($rankingInputFile, $sitesToRank)&lt;br /&gt;&lt;br /&gt;;retrieve the ranking service details, but only for the selected ranking services&lt;br /&gt;$rankingSettings = _getSelectedRankingSettings($selectedRankings)&lt;br /&gt;&lt;br /&gt;;create the ranking output file&lt;br /&gt;_FileCreate($RankingOutputFile)&lt;br /&gt;&lt;br /&gt;;create the header of the output file&lt;br /&gt;$rankHeader = ""&lt;br /&gt;_addItemToList($rankHeader, "site")&lt;br /&gt;For $i = 1 To UBound($rankingSettings) - 1&lt;br /&gt; $rankingSetting = $rankingSettings[$i]&lt;br /&gt; $rankingName = $rankingSetting[1]&lt;br /&gt; _addItemToList($rankHeader, $rankingName)&lt;br /&gt;Next&lt;br /&gt;&lt;br /&gt;FileWrite($RankingOutputFile, $rankHeader &amp; @CRLF)&lt;br /&gt;&lt;br /&gt;;loop through the sites to rank&lt;br /&gt;For $i = 1 To UBound($sitesToRank) - 1&lt;br /&gt; $rankedSite = $sitesToRank[$i]&lt;br /&gt;&lt;br /&gt; For $j = 1 To UBound($rankingSettings) - 1&lt;br /&gt;  $rank = _getRank($sitesToRank[$i], $rankingSettings[$j])&lt;br /&gt;  _addItemToList($rankedSite, $rank)&lt;br /&gt; Next&lt;br /&gt;&lt;br /&gt; FileWrite($RankingOutputFile, $rankedSite &amp; @CRLF)&lt;br /&gt;Next&lt;br /&gt;&lt;br /&gt;MsgBox(0, "Information", "The ranking of " &amp; UBound($sitesToRank) - 1 &amp; " sites at " &amp; UBound($rankingSettings) - 1 &amp; " ranking services has completed." &amp; @CRLF &amp; "Please check the ranking output file for the results: " &amp; $RankingOutputFile)&lt;br /&gt;&lt;br /&gt;; ------------------------------------------------------------------------------&lt;br /&gt;; FUNCTIONS&lt;br /&gt;; ------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Func _addItemToList(ByRef $list, $item)&lt;br /&gt; If $list == "" Then&lt;br /&gt;  $list = $item&lt;br /&gt; Else&lt;br /&gt;  $list = $list &amp; $rankingOutputSeparator &amp; $item&lt;br /&gt; EndIf&lt;br /&gt;EndFunc   ;==&gt;_addItemToList&lt;br /&gt;&lt;br /&gt;Func _getSelectedRankingSettings($selectedRankings)&lt;br /&gt;&lt;br /&gt; $selectedRankings = StringSplit($selectedRankings, $rankingOutputSeparator)&lt;br /&gt; ReDim $selectedRankingSettings[UBound($selectedRankings)]&lt;br /&gt; $selectedRankingSettings[0] = UBound($selectedRankings)&lt;br /&gt;&lt;br /&gt; For $i = 1 To UBound($selectedRankings) - 1&lt;br /&gt;  $line = IniRead($iniLocation, "ranking-service", $selectedRankings[$i], "NotFound")&lt;br /&gt;&lt;br /&gt;  If $line == "NotFound" Then&lt;br /&gt;   MsgBox(0, "Exception", "Could find not ranking-service parameter " &amp; $selectedRankings[$i] &amp; " in the configuration file")&lt;br /&gt;   Exit&lt;br /&gt;  Else&lt;br /&gt;   $lineParameters = StringSplit($line, $rankingServiceSeparator)&lt;br /&gt;&lt;br /&gt;   If ($lineParameters[0] == 2) Then&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    $domainLine = IniRead($iniLocation, "domains-to-exclude", $selectedRankings[$i], "NotFound")&lt;br /&gt;    Dim $domains[1]&lt;br /&gt;&lt;br /&gt;    If Not ($domainLine == "NotFound") Then&lt;br /&gt;     $domains = StringSplit($domainLine, $rankingServiceSeparator)&lt;br /&gt;    EndIf&lt;br /&gt;&lt;br /&gt;    Dim $rankingSetting[5] = [4, $selectedRankings[$i], $lineParameters[1], $lineParameters[2], $domains]&lt;br /&gt;&lt;br /&gt;    $selectedRankingSettings[$i] = $rankingSetting&lt;br /&gt;   Else&lt;br /&gt;    MsgBox(0, "Exception", "Ranking-service parameter " &amp; $line &amp; " does not contain the correct amount of subitems: ranking-service url, regular expression")&lt;br /&gt;    Exit&lt;br /&gt;   EndIf&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  EndIf&lt;br /&gt;&lt;br /&gt; Next&lt;br /&gt;&lt;br /&gt; Return $selectedRankingSettings&lt;br /&gt;&lt;br /&gt;EndFunc   ;==&gt;_getSelectedRankingSettings&lt;br /&gt;&lt;br /&gt;Func _getRank($site, $rankingSettings)&lt;br /&gt;&lt;br /&gt; $rankingName = $rankingSettings[1]&lt;br /&gt; $rankingUrl = StringReplace($rankingSettings[2], $rankingServiceUrlTag, $site)&lt;br /&gt; $rankingRegex = $rankingSettings[3]&lt;br /&gt; $domainsToExclude = $rankingSettings[4]&lt;br /&gt; $toExclude = False&lt;br /&gt;&lt;br /&gt; For $i = 1 To UBound($domainsToExclude) - 1&lt;br /&gt;  If StringInStr($rankingUrl, $domainsToExclude[$i]) Then&lt;br /&gt;   $toExclude = True&lt;br /&gt;   $i = UBound($domainsToExclude)&lt;br /&gt;  EndIf&lt;br /&gt; Next&lt;br /&gt;&lt;br /&gt; If $toExclude = False Then&lt;br /&gt;&lt;br /&gt;  If $rankingName = "googleLink" Then&lt;br /&gt;   $rankingUrl = StringReplace($rankingSettings[2], $rankingServiceUrlTag, _urlEncode($site))&lt;br /&gt;  Else&lt;br /&gt;   $rankingUrl = StringReplace($rankingSettings[2], $rankingServiceUrlTag, $site)&lt;br /&gt;  EndIf&lt;br /&gt;&lt;br /&gt;  _inform("Getting " &amp; $rankingName &amp; " rank for " &amp; $site)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  ;launch the ranking service request and get the source code&lt;br /&gt;  $source = _INetGetSource($rankingUrl)&lt;br /&gt;  ;retrieve the ranking value&lt;br /&gt;  $rankingRegResult = StringRegExp($source, $rankingRegex, 1)&lt;br /&gt;&lt;br /&gt;  If @error Or ($rankingRegResult[0] == "") Then&lt;br /&gt;   Return $rankingValueNoRank&lt;br /&gt;  Else&lt;br /&gt;   Return StringReplace(StringReplace($rankingRegResult[0], ",", ""), ".", "")&lt;br /&gt;  EndIf&lt;br /&gt; Else&lt;br /&gt;  Return $rankingValueExcluded&lt;br /&gt;&lt;br /&gt; EndIf&lt;br /&gt;&lt;br /&gt;EndFunc   ;==&gt;_getRank&lt;br /&gt;&lt;br /&gt;Func _urlEncode($url)&lt;br /&gt; $url = StringReplace($url, "/", "%2F")&lt;br /&gt; $url = StringReplace($url, ":", "%3A")&lt;br /&gt; Return $url&lt;br /&gt;EndFunc   ;==&gt;_urlEncode&lt;br /&gt;&lt;br /&gt;Func _inform($message, $timeout = 3)&lt;br /&gt; TrayTip("checkRanking progress...", $message, $timeout)&lt;br /&gt;EndFunc   ;==&gt;_inform&lt;/pre&gt;&lt;br /&gt;&lt;h2&gt;Proof running the script&lt;/h2&gt;At this stage, you should be able to run your script and get results. Save your script, ranking input file and configuration file, and run the script by pressing F5 in your ScITE editor. If you correctly followed all steps, a traytip appears to indicate the ranking has started. If not, then please read the error information carefully.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;The ranking output file&lt;/h3&gt;After running the ranking script you should get a ranking output file named "rankingOutput.csv" in the same directory as where the script resides. The content should look like this:&lt;br /&gt;&lt;pre name="code" class="Autoit"&gt;&lt;br /&gt;site,googlePR,googleLink,alexaPopularity,technorati&lt;br /&gt;http://www.testingminded.com,1,2,2020990,N/A&lt;br /&gt;http://www.testsquad.org,3,13,1595485,5&lt;br /&gt;http://www.problogdesign.com,5,392,44114,304&lt;br /&gt;http://www.problogger.net,6,11000,4202,4130&lt;br /&gt;http://www.noop.nl,4,420,166693,174&lt;br /&gt;http://notexistingsite.com,N/A,N/A,N/A,N/A&lt;br /&gt;http://blogs.msdn.com/joshpoley/,4,108,Excluded,N/A&lt;br /&gt;http://blogs.thoughtworks.com/testblog,N/A,N/A,Excluded,N/A&lt;br /&gt;&lt;/pre&gt;If you encounter difficulties with the execution of these steps and you don't succeed in fixing the problem yourself, then leave a message in the comment section. Don't forget to include the error message shown in the ScITE output window. I will answer to your question as soon as possible.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6143723392471225584-2184698390465530351?l=www.testingminded.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Testingminded/~4/FrIJL3_7xgc" height="1" width="1"/&gt;</description><link>http://www.testingminded.com/2009/04/automatic-pagerank-checking-script.html</link><author>noreply@blogger.com (Steven Machtelinckx)</author><thr:total>9</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6143723392471225584.post-1921156881860886516</guid><pubDate>Thu, 26 Mar 2009 20:12:00 +0000</pubDate><atom:updated>2009-04-15T18:47:59.313+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tools</category><category domain="http://www.blogger.com/atom/ns#">autoIt</category><category domain="http://www.blogger.com/atom/ns#">fun</category><category domain="http://www.blogger.com/atom/ns#">automation</category><title>Autoit Bejeweled bot tutorial part 2: identifying the gem play field</title><description>&lt;img style="margin: 0pt 10px 0pt 0pt; float: left; width: 250px; height: 149px;" alt="AutoIt Bejeweled bot tutorial part 3" src="http://users.telenet.be/machtelinckx/testingminded/images/content/Introduction-3.jpg" border="0" /&gt;This article makes part of the &lt;a href="http://www.testingminded.com/2009/03/autoit-bejeweled-bot-tutorial.html"&gt;Bejeweled bot tutorial series&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Last time we have set up a framework for our Bejeweled bot and written the first code to locate the Bejeweled window. At this stage we know which window to work with, so we can locate the gem play field and calculate the gem positions.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Identifying the gem play field&lt;/h2&gt;&lt;h3&gt;The possible solutions&lt;/h3&gt;Several methods to position the gem play field exist; they all have their advantages and disadvantages. Possible methods to determine the gem play field borders are:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Fixed start coordinates and fixed end coordinates&lt;/span&gt;: start with the x,y coordinates of both the upper left and lower right side of the field.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Fixed start coordinates and fixed dimensions&lt;/span&gt;: start with the x,y coordinates of the upper left side of the field together with the length/height of the field.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Searching both start and end coordinates&lt;/span&gt;: start with searching for the color which marks both the start and the end of the field on the screen.&lt;/li&gt;&lt;/ol&gt;I opted for the third method, as that is the most flexible one. Each site can have its bejeweled game positioned on a different location. By searching both start and end each time, we can be sure to have the correct position every time.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Searching the play field corners&lt;/h3&gt;In order to search the gem play field, we will search both the upper left and lower right corner of the field. Once we have their coordinates, we can calculate the other corners ourself.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ATtgRW3jaI0/ScvZAP9Xa7I/AAAAAAAACLA/vLXFYWk2lP0/s1600-h/CompleteField.png" class="imglink"&gt;&lt;img id="BLOGGER_PHOTO_ID_5317582383348149170" style="margin: 0pt 10px 10px 0pt; float: left; width: 137px; cursor: pointer; height: 145px;" alt="bejeweled gem play field" src="http://1.bp.blogspot.com/_ATtgRW3jaI0/ScvZAP9Xa7I/AAAAAAAACLA/vLXFYWk2lP0/s400/CompleteField.png" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ATtgRW3jaI0/ScvYLMow5fI/AAAAAAAACKw/r_I-8-KndRU/s1600-h/Corner1.png" class="imglink"&gt;&lt;img id="BLOGGER_PHOTO_ID_5317581471923365362" style="margin: 0pt 10px 10px 0pt; float: left; width: 119px; cursor: pointer; height: 145px;" alt="bejeweled bot first corner" src="http://2.bp.blogspot.com/_ATtgRW3jaI0/ScvYLMow5fI/AAAAAAAACKw/r_I-8-KndRU/s400/Corner1.png" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ATtgRW3jaI0/ScvYSjv8bXI/AAAAAAAACK4/cIv1sAJA4d8/s1600-h/corner4.png" class="imglink"&gt;&lt;img id="BLOGGER_PHOTO_ID_5317581598386580850" style="margin: 0pt 10px 10px 0pt; float: left; width: 119px; cursor: pointer; height: 145px;" alt="bejeweled bot last corner" src="http://4.bp.blogspot.com/_ATtgRW3jaI0/ScvYSjv8bXI/AAAAAAAACK4/cIv1sAJA4d8/s400/corner4.png" 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;Add following key to the configuration file:&lt;br /&gt;&lt;pre class="Autoit" name="code"&gt;&lt;br /&gt;cornerColor1=0x313129&lt;br /&gt;cornerColor4=0x313129&lt;br /&gt;&lt;/pre&gt;In order to read the newly added configuration keys, add following code to the declaration section:&lt;br /&gt;&lt;pre class="Autoit" name="code"&gt;&lt;br /&gt;$cornerColor1=IniRead ( $iniFile, "Common" , "cornerColor1", "0x313029" )&lt;br /&gt;$cornerColor4=IniRead ( $iniFile, "Common" , "cornerColor4", "0x313029" )&lt;br /&gt;&lt;/pre&gt;Next we will prepare the variables in which to store the coordinates of the four corners. We will also create variables representing three gems: the upper left, upper right, and lower left gem. With these corner and gem locations we can easily process the play field. Add following code to the declaration section&lt;br /&gt;&lt;pre class="Autoit" name="code"&gt;&lt;br /&gt;$corner1=_arrayCreate("","")&lt;br /&gt;$corner2=_arrayCreate("","")&lt;br /&gt;$corner3=_arrayCreate("","")&lt;br /&gt;$corner4=_arrayCreate("","")&lt;br /&gt;&lt;br /&gt;$Field1=_arrayCreate("","")&lt;br /&gt;$Field2=_arrayCreate("","")&lt;br /&gt;$Field3=_arrayCreate("","")&lt;br /&gt;&lt;br /&gt;$BlockWidth = 0&lt;br /&gt;&lt;/pre&gt;Now it's time to search the screen for the color specified in the ini file. Function 'pixelSearch' returns the x,y coordinates of the first found pixel matching that color, from left to right and top to bottom. The coordinates are stored in the &amp;amp;Corner1 variable. If the color cannot be found, the bot stops, else the mouse pointer is moved to the found pixel. Add following code to the main section:&lt;br /&gt;&lt;pre class="Autoit" name="code"&gt;&lt;br /&gt;_log("Searching top left position of playfield")&lt;br /&gt;ToolTip('Searching top left position pixel with color ' &amp;amp; hex($CornerColor1, 6) , 0, 0)&lt;br /&gt;&lt;br /&gt;$Corner1 = pixelSearch(0,0,@DesktopWidth,@DesktopHeight, $CornerColor1,0)&lt;br /&gt;If @error Then&lt;br /&gt;msgbox(0,"","Top Left pixel with color: " &amp;amp; hex($CornerColor1, 6) &amp;amp; " not found")&lt;br /&gt;exit&lt;br /&gt;Else&lt;br /&gt;MouseMove($corner1[0],$corner1[1])&lt;br /&gt;endif&lt;br /&gt;&lt;/pre&gt;Once we have found the first corner we can look for the fourth corner, which is located at the lower bottom of the play field. Again, if the color cannot be found, the bot stops, else the mouse pointer is moved to the found pixel. Add following code to the main section:&lt;br /&gt;&lt;pre class="Autoit" name="code"&gt;&lt;br /&gt;_log("Searching bottom right position of playfield")&lt;br /&gt;ToolTip('Searching bottom right position pixel with color ' &amp;amp; hex($CornerColor4, 6) , 0, 0)&lt;br /&gt;&lt;br /&gt;$Corner4=_pixelSearchReverse(0,0,@DesktopWidth,@DesktopHeight, $CornerColor4)&lt;br /&gt;If @error Then&lt;br /&gt;msgbox(0,"","Bottom Right pixel with color: " &amp;amp; hex($CornerColor4, 6) &amp;amp; " not found")&lt;br /&gt;exit&lt;br /&gt;Else&lt;br /&gt;MouseMove($corner4[0],$corner4[1])&lt;br /&gt;endif&lt;br /&gt;&lt;/pre&gt;Function _pixelSearchReverse doesn't come with Autoit by default. Add this function to the function section:&lt;br /&gt;&lt;pre class="Autoit" name="code"&gt;&lt;br /&gt;Func _pixelSearchReverse($left,$top,$right,$bottom,$color)&lt;br /&gt;$coordFoundColor=_ArrayCreate("-1","-1")&lt;br /&gt;$i = 0&lt;br /&gt;$j = 0&lt;br /&gt;&lt;br /&gt;for $i = @DesktopWidth to 0 Step -1&lt;br /&gt; for $j = @DesktopHeight to 0 Step -1&lt;br /&gt;&lt;br /&gt;  $currentcolor = PixelGetColor($i,$j)&lt;br /&gt;  if $currentcolor = $color then&lt;br /&gt;   $coordFoundColor[0] = $i&lt;br /&gt;   $coordFoundColor[1] = $j&lt;br /&gt;   return $coordFoundColor&lt;br /&gt;  endif&lt;br /&gt;&lt;br /&gt; next&lt;br /&gt;next&lt;br /&gt;SetError(-1)&lt;br /&gt;endFunc&lt;br /&gt;&lt;/pre&gt;With help of corner1 and corner4, we can calculate the x,y coordinates of the other corners, corner2 and corner4. Add this code to the main section:&lt;br /&gt;&lt;pre class="Autoit" name="code"&gt;&lt;br /&gt;;Calculate position of remaining corners&lt;br /&gt;$Corner2[0]=$Corner4[0]&lt;br /&gt;$Corner2[1]=$Corner1[1]&lt;br /&gt;&lt;br /&gt;$Corner3[0]=$Corner1[0]&lt;br /&gt;$Corner3[1]=$Corner4[1]&lt;br /&gt;&lt;/pre&gt;&lt;h3&gt;Calculating the gem positions&lt;/h3&gt;With help of the corner positions we can now calculate the position of three main gems: the upper left, upper right, and lower left gem. Soon we will be needing this exact position of these gems in order to process all gems on the play field.&lt;br /&gt;&lt;br /&gt;Add following code to the declaration section:&lt;br /&gt;&lt;pre class="Autoit" name="code"&gt;&lt;br /&gt;$AmountGems=IniRead ( $iniFile, "Common" , "AmountGems", 0 )&lt;br /&gt;&lt;/pre&gt;First we will calculate the distance between each gem. Add following code to the main section:&lt;br /&gt;&lt;pre class="Autoit" name="code"&gt;&lt;br /&gt;;Calculate distance between center of each gem&lt;br /&gt;$BlockWidth = ($Corner2[0] - $Corner1[0]) / $AmountGems&lt;br /&gt;&lt;/pre&gt;Next we will calculate the position of the three main gems. Add following code to the main section:&lt;br /&gt;&lt;pre class="Autoit" name="code"&gt;&lt;br /&gt;$Field1[0]=$Corner1[0] + ($BlockWidth / 2)&lt;br /&gt;$Field1[1]=$Corner1[1] + ($BlockWidth / 2)&lt;br /&gt;&lt;br /&gt;$Field2[0]=$Corner2[0] - ($BlockWidth / 2)&lt;br /&gt;$Field2[1]=$Corner1[1] + ($BlockWidth / 2)&lt;br /&gt;&lt;br /&gt;$Field3[0]=$Corner3[0] + ($BlockWidth / 2)&lt;br /&gt;$Field3[1]=$Corner3[1] - ($BlockWidth / 2)&lt;br /&gt;&lt;/pre&gt;&lt;h3&gt;Proof running the code&lt;/h3&gt;At this point you should be able to run you script and see more results. Save your script and configuration file, and run the bot script by pressing F5 in your ScITE editor. If you correctly followed all steps, the bejeweled browser window becomes active. Next the mouse pointer is moved to the upper left corner of the play field, followed by the lower right corner of the play field. Don't worry; searching for the right bottom pixel might take a while. Feel free to improve the _pixelSearchReverse function, which will speed up the initialization process a lot!&lt;br /&gt;&lt;br /&gt;If you encounter difficulties with the execution of these steps and you don't succeed in fixing the problem yourself, then leave a message in the comment section. Don't forget to include the error message shown in the ScITE output window. I will answer to your question as soon as possible.&lt;br /&gt;&lt;br /&gt;In the next part of this tutorial we will be creating the main loop for the bot and implement the function to read the gem colors. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.testingminded.com/2009/04/autoit-bejeweled-bot-tutorial-part3.html"&gt;Continue to the third part of the bejeweled bot tutorial: reading the gem colors&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6143723392471225584-1921156881860886516?l=www.testingminded.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Testingminded/~4/AbxvKs5ikpU" height="1" width="1"/&gt;</description><link>http://www.testingminded.com/2009/03/autoit-bejeweled-bot-tutorial-part2.html</link><author>noreply@blogger.com (Steven Machtelinckx)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_ATtgRW3jaI0/ScvZAP9Xa7I/AAAAAAAACLA/vLXFYWk2lP0/s72-c/CompleteField.png" height="72" width="72" /><thr:total>36</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6143723392471225584.post-5892585923397078769</guid><pubDate>Tue, 24 Mar 2009 19:48:00 +0000</pubDate><atom:updated>2009-03-24T20:54:39.617+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tools</category><category domain="http://www.blogger.com/atom/ns#">automation</category><title>Araxis Merge automation API in JavaScript</title><description>Araxis Merge is a file comparison tool that supports many file formats, even formats such as MSWord and PDF. That makes this tool ideal for regression testing of application output in the form of, for instance, generated PDF files. Araxis Merge comes with an automation API which helps us speeding up the file comparison process easily.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Several programming and scripting languages are supported from which you can control Araxis Merge, such as VBA, c#, C++ and Windows Scripting host (VBScript, JavaScript).&lt;br /&gt;&lt;br /&gt;Recently I needed to call the automation API from within AutoIt in order to compare two pdf files and to generate the comparison report. As AutoIt is not in the list of supported scripting/programming languages, I wrote a script with JavaScript to perform this action. Following script can be run from command line, so it can be called from any other scripting language, such as AutoIt.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;The comparison JavaScript&lt;/h3&gt;&lt;br /&gt;I have foreseen three different input parameters for the script:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;baseFile&lt;/span&gt;: the complete path + filename of the first file. This is the base line file which the newly generated file will be compared with&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;newFile&lt;/span&gt;: the complete path + filename of the second file to compare against the base line file&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;report&lt;/span&gt;: the complete path + filename of the comparison report to generate&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;If all mandatory arguments were specified, the file comparison starts; otherwise directions on how to call the compare script are shown.&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;&lt;br /&gt;if (WScript.Arguments.length != 3) {&lt;br /&gt;    directions();&lt;br /&gt;}&lt;br /&gt;else {&lt;br /&gt;    compare();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Create an Araxis Merge application object and retrieve the command line parameters. Perform the comparison between the base file and new file. Create a merge report only if there is at least 1 difference between the two files. Note that I wrote down &gt; 1 as a value of 1 of property NumberOfChanges means that there are no differences.&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;&lt;br /&gt;function compare() {&lt;br /&gt;   &lt;br /&gt; var app = WScript.CreateObject("Merge70.Application");&lt;br /&gt;    var tc = app.TextComparison;&lt;br /&gt;&lt;br /&gt;    baseFile = WScript.Arguments.Item(0);&lt;br /&gt;    newFile = WScript.Arguments.Item(1);&lt;br /&gt;    report = WScript.Arguments.Item(2);&lt;br /&gt;&lt;br /&gt;    tc.Compare(baseFile, newFile)&lt;br /&gt;&lt;br /&gt;    if ( tc.NumberOfChanges &gt; 1) {&lt;br /&gt;        tc.Report("html", 0/*lesCRLF*/, report); //report&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;This function displays the correct comment line syntax to use when calling the compare script.&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;&lt;br /&gt;function directions() {&lt;br /&gt;    WScript.Echo("Command line syntax:\ncompare.js baseFile newFile report");&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Put above code all together in one JavaScript file, for instance "compare.js". From the command prompt window, navigate to the script folder location and run the script by typing the command below. Don't forget to replace normal "\" by "\\" in each of the three arguments.&lt;br /&gt;&lt;blockquote&gt;compare.js baseFileLocation newFileLocation reportCompleteLocation&lt;/blockquote&gt;&lt;br /&gt;When running this command Araxis Merge should start comparing the two input files, and to write down the report to the location of your choice if any changes exist.&lt;br /&gt;&lt;br /&gt;I chose not to implement any error handling in the script, to make it as simple as possible. Any error handling and validation is handled by the caller script in AutoIt in my case.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6143723392471225584-5892585923397078769?l=www.testingminded.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Testingminded/~4/v9r4OeTbzoY" height="1" width="1"/&gt;</description><link>http://www.testingminded.com/2009/03/araxis-merge-automation-api-javascript.html</link><author>noreply@blogger.com (Steven Machtelinckx)</author><thr:total>4</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6143723392471225584.post-2692161184967160669</guid><pubDate>Fri, 13 Mar 2009 07:11:00 +0000</pubDate><atom:updated>2010-03-25T21:01:07.584+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tools</category><category domain="http://www.blogger.com/atom/ns#">autoIt</category><category domain="http://www.blogger.com/atom/ns#">fun</category><category domain="http://www.blogger.com/atom/ns#">automation</category><title>Autoit Bejeweled bot tutorial part 1: bot framework &amp; preparation</title><description>&lt;img style="margin: 0pt 0pt 10px 10px; float: right; width: 250px; height: 149px;" src="http://users.telenet.be/machtelinckx/testingminded/images/content/Introduction-2.jpg" alt="AutoIt Bejeweled bot tutorial part 1" border="0" /&gt;This article makes part of the &lt;a href="http://www.testingminded.com/2009/03/autoit-bejeweled-bot-tutorial.html"&gt;Bejeweled bot tutorial series&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
In this part we will set up a framework for our bot script. We will create the necessary files for our bot and add basic functionality to the script such as logging and configuration. Once we're set it's time to start with the real programming work.&lt;span id="fullpost"&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Preparation&lt;/h2&gt;&lt;h3&gt;Bot files&lt;/h3&gt;The bot consists out of three main files:&lt;br /&gt;
&lt;blockquote&gt;The script file (.au3)&lt;br /&gt;
A configuration file (.ini)&lt;br /&gt;
A log file (.txt)&lt;/blockquote&gt;Create a new Autoit script file and give it a useful name. Next create a configuration file and give it the same name as your script. You can do this by creating a new text file and changing the file extension to .ini. You don't need to create the log file, it will be generated automatically.&lt;br /&gt;
&lt;br /&gt;
Now add following configuration section and key to the configuration file:&lt;br /&gt;
&lt;pre name="code" class="Autoit"&gt;[Common]
amountGems=8
windowBejeweled=SpelSpelen.com - Bejeweled
&lt;/pre&gt;&lt;h3&gt;Code sections&lt;/h3&gt;I divided the script in three main code sections. Whenever I display new code, you need to add the code to the right section. I'll always indicate either the section, or the exact location to insert your code at. Now copy the section comments below into your script file. If I mention the section only, then add the code beneath the last added code of that section.&lt;br /&gt;
&lt;pre name="code" class="Autoit"&gt;;----------------------- TESTINGMINDED -----------------------
;---------- bot tutorial from www.testingminded.com ----------

;-------------------- DECLARATION SECTION --------------------

;-------------------- MAIN SECTION ---------------------------

;-------------------- FUNCTION SECTION -----------------------
&lt;/pre&gt;&lt;h3&gt;Basic functions&lt;/h3&gt;Before writing the bejeweled specific code we'll first add basic functionality to the script. We will be using Array and File functions so you need to link to those external libraries. Add following code to the declaration section:&lt;br /&gt;
&lt;pre name="code" class="Autoit"&gt;#include &lt;array.au3&gt;
#include &lt;file.au3&gt;
&lt;/pre&gt;&lt;span style="font-style: italic;"&gt;Note1: the code boxes seem to include closing tags, which I didn't wrote, for the include statements. So please don't mind and don't use those include closing tags, for instance line 3 in above code box.  &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
We need to have a possibility to pause or stop the bot. Therefore add following code to the declaration section&lt;br /&gt;
&lt;pre name="code" class="Autoit"&gt;Global $paused ;sets up pause hotkey
HotKeySet("{ESC}", "_quit") ;set escape hotkey to exit
HotKeySet("{PAUSE}", "_pause") ;set pasue hotkey to pause
&lt;/pre&gt;And add following code to the function section:&lt;br /&gt;
&lt;pre name="code" class="Autoit"&gt;;makes a quit function
Func _quit()
Exit
EndFunc

;makes a pause function
Func _pause()
$paused = Not $paused
While $paused
Sleep(100)
ToolTip('Script is "Paused, to unpause press pause key"', 0, 0)
WEnd
ToolTip("")
EndFunc
&lt;/pre&gt;For debugging purpose I recommend to have an application log, therefore add following code to the function section:&lt;br /&gt;
&lt;pre name="code" class="Autoit"&gt;Func _Log($message)
_FileWriteLog(@scriptDir &amp;amp; "\output.txt", $message)
EndFunc
&lt;/pre&gt;&lt;span style="font-style: italic;"&gt;Note2: the code boxes seem to comment out some parts of the code :-) In order be sure you write the code correctly, click the "view plain" link to see the original and correct code. &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
We'll create a first log statement to indicate what the bot is doing. Add following code to the declaration section:&lt;br /&gt;
&lt;pre name="code" class="Autoit"&gt;_log("Initializing bejeweled bot...")
&lt;/pre&gt;The configuration file in which we store the bot settings must exist. To check that, we will add following code to the declaration section:&lt;br /&gt;
&lt;pre name="code" class="Autoit"&gt;$iniFile=stringleft(@ScriptName,stringlen(@scriptname)-4) &amp;amp; ".ini"
if not FileExists($iniFile) Then
msgbox(0,"","The ini file could not be found at following location: " &amp;amp; $iniFile)
exit
EndIf
&lt;/pre&gt;&lt;br /&gt;
&lt;h2&gt;Finding the bejeweled window&lt;/h2&gt;Now we have everything in place to write our first bot specific code. Open a browser window and navigate to http://www.spelspelen.com/play/bejeweled. The window should display the bejeweled game. We will now write code to tell the script which browser window to use. The script will then activate the bejeweled browser window.&lt;br /&gt;
&lt;br /&gt;
We'll specify the title of the page which is displaying the bejeweled game to the configuration file. The title is usually displayed in the title bar at the top of your browser window. Writing down a partial name will do. Add following key to the configuration file:&lt;br /&gt;
&lt;pre name="code" class="Autoit"&gt;windowBejeweled=SpelSpelen.com - Bejeweled
&lt;/pre&gt;In order to read the newly added configuration key, add following code to the declaration section:&lt;br /&gt;
&lt;pre name="code" class="Autoit"&gt;$windowBejeweled=IniRead ( $iniFile, "Common" , "windowBejeweled", "" )
&lt;/pre&gt;Now we'll add code to search and activate that browser window. Add following code to the main section&lt;br /&gt;
&lt;pre name="code" class="Autoit"&gt;if winactivate($windowBejeweled) == 0 then
msgbox(0,"","Window " &amp;amp; $windowBejeweled &amp;amp; " could not be found.")
exit
endif
&lt;/pre&gt;&lt;h3&gt;Proof running the code&lt;/h3&gt;At this stage, you should be able to run your script and actually see results. Save your script and configuration file, and run the bot script by pressing F5 in your ScITE editor. If you correctly followed all steps, the bejeweled browser window becomes active. If not, double check that your configuration file exists and contains the section and all keys mentioned in above steps.&lt;br /&gt;
&lt;br /&gt;
If you encounter difficulties with the execution of these steps and you don't succeed in fixing the problem yourself, then leave a message in the comment section. Don't forget to include the error message shown in the ScITE output window. I will answer to your question as soon as possible.&lt;br /&gt;
&lt;br /&gt;
In the next part of this tutorial we will be positioning the gem play field and calculating the gem dimensions.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.testingminded.com/2009/03/autoit-bejeweled-bot-tutorial-part2.html"&gt;Continue  to the second part of the bejeweled bot tutorial: identifying the gem play field&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6143723392471225584-2692161184967160669?l=www.testingminded.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Testingminded/~4/flUDjexHTP4" height="1" width="1"/&gt;</description><link>http://www.testingminded.com/2009/03/autoit-bejeweled-bot-tutorial-part1.html</link><author>noreply@blogger.com (Steven Machtelinckx)</author><thr:total>13</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6143723392471225584.post-2434484696287225791</guid><pubDate>Wed, 11 Mar 2009 07:05:00 +0000</pubDate><atom:updated>2009-04-15T13:00:44.113+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tools</category><category domain="http://www.blogger.com/atom/ns#">autoIt</category><category domain="http://www.blogger.com/atom/ns#">fun</category><category domain="http://www.blogger.com/atom/ns#">automation</category><title>Autoit Bejeweled bot tutorial</title><description>&lt;img style="margin: 0pt 10px 0pt 0pt; float: left; width: 250px; height: 149px;" src="http://users.telenet.be/machtelinckx/testingminded/images/content/Introduction-1.jpg" alt="AutoIt Bejeweled bot tutorial" border="0" /&gt;Following the success of my &lt;a href="http://www.testingminded.com/2008/12/creating-bejeweled-bot-with-autoit.html"&gt;Autoit Bejeweled bot post&lt;/a&gt;, I decided to write a tutorial so you can create your own bot for Bejeweled. I also want to prove that AutoIt is an excellent automation tool and can be used in the software testing domain for certain automation tasks. Are you into scripting or do you like playing Bejeweled? In both cases following article might be of interest to you. &lt;span id="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;This article is the first one in a series of articles covering the tutorial. Step by step the articles will explain the process of creating a bot for the popular bejeweled game. At each step I will provide code snippets to put together. By the end you will have gained a good understanding of the internal working of a Bejeweled bot and you will have the code for a fully functional bejeweled bot.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Note: the bot works flawlessly for bejeweled 1. In order to make it work for Bejeweled 2 or Bejeweled Blitz, some small modifications have to be made though.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Disclaimer&lt;/h3&gt;This bot is fully free and for Educational purposes only. You assume full responsibility for using this code, and you understand and agree that I am not responsible or liable for any claim resulting from its use by you or another user. This bot should not be used to cheat or to make money with. This is purely to demonstrate that also complex applications can be automated within the software testing domain without using expensive tools.&lt;br /&gt;&lt;br /&gt;This bot is only compatible with the Bejeweled I game at this stage. The bot can be modified however to become compatible with other versions, for instance Bejeweled II, by applying minor tweaks to the code.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Prerequisites&lt;/h3&gt;You are required to have knowledge of the AutoIt scripting language. Knowledge of programming in general will do as well, provided that you learn the basics of AutoIt.&lt;br /&gt;&lt;br /&gt;Make sure you have AutoIt installed. You can download the latest version from &lt;a href="http://www.autoitscript.com/autoit3/downloads.shtml"&gt;http://www.autoitscript.com/&lt;/a&gt;. Pick "AutoIt Full Installation" which includes ScITE, an excellent AutoIt editor providing syntax highlighting, autocompletion, and more.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.testingminded.com/2009/03/autoit-bejeweled-bot-tutorial-part1.html"&gt;Continue to the first part of the bejeweled bot tutorial: Bot framework &amp;amp; preparation&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6143723392471225584-2434484696287225791?l=www.testingminded.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Testingminded/~4/1QM1y_ijx6M" height="1" width="1"/&gt;</description><link>http://www.testingminded.com/2009/03/autoit-bejeweled-bot-tutorial.html</link><author>noreply@blogger.com (Steven Machtelinckx)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6143723392471225584.post-3977929869358489727</guid><pubDate>Sun, 08 Mar 2009 14:04:00 +0000</pubDate><atom:updated>2009-03-12T17:17:46.163+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">test analysis</category><category domain="http://www.blogger.com/atom/ns#">test techniques</category><category domain="http://www.blogger.com/atom/ns#">definitions</category><title>What is semantic testing?</title><description>Semantic testing is a &lt;span style="font-weight: bold;"&gt;test technique&lt;/span&gt; with as goal to test the &lt;span style="font-weight: bold;"&gt;relationship between data&lt;/span&gt;. The relationship can exist in three different ways:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Relationship between input data on 1 screen&lt;/li&gt;&lt;li&gt;Relationship between input data on different screens&lt;/li&gt;&lt;li&gt;Relationship between input data on data already existing in the system&lt;/li&gt;&lt;/ul&gt;The outcome of this test technique might reveal that a relationship is missing or that a relationship was incorrectly implemented.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;&lt;h2&gt;How to create a semantic test?&lt;/h2&gt;&lt;h3&gt;Identify the relationships to check&lt;/h3&gt;Search the &lt;a href="http://www.testingminded.com/2008/12/what-is-test-base.html"&gt;test basis&lt;/a&gt; for relationships. Test bases containing useful information for this technique are for instance: data model, graphical user interface specifications (screen descriptions), functional requirement specifications.&lt;br /&gt;&lt;br /&gt;These are examples of data relationships in a functional requirement specification document for travel booking system:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The user cannot check out if his shopping basket is empty&lt;/li&gt;&lt;li&gt;If the user orders at least 2 item on the "product overview" screen, he/she can enter a reduction code on the "check out" screen.&lt;/li&gt;&lt;li&gt;The delivery date can't be in the past (relationship between delivery date and system date)&lt;/li&gt;&lt;li&gt;The user has only access if his/her personal data is known by the system (relationship between sign-in name and information in the database)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Develop the relationships to check&lt;/h3&gt;Write down the relationships in a simple structure:&lt;br /&gt;&lt;blockquote&gt;IF A&lt;br /&gt;THEN B&lt;br /&gt;ELSE C&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;Example:&lt;/span&gt;&lt;br /&gt;If the user orders at least 2 item on the "product overview" screen, he/she can enter a reduction code on the "check out" screen. Reduction codes can only be used on Sunday. On other days a message is shown to promote shopping on Sundays.&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span&gt;IF&lt;/span&gt; day = Sunday&lt;br /&gt;&lt;span&gt;THEN&lt;/span&gt;&lt;br /&gt;IF items ordered &gt;= 2&lt;br /&gt;THEN reduction code field is available&lt;br /&gt;ELSE reduction code field is not available&lt;br /&gt;&lt;span&gt;ELSE&lt;/span&gt; Sunday shopping promotion message&lt;/blockquote&gt;&lt;h3&gt;Create test cases&lt;/h3&gt;Every line where a THEN or an ELSE statement is placed but not IF statement, forms an end-point of a test pathway. For above example, we can find back three pathways:&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span&gt;IF&lt;/span&gt; day = Sunday&lt;br /&gt;&lt;span&gt;THEN&lt;/span&gt;&lt;br /&gt;&lt;span&gt;    IF&lt;/span&gt; items ordered &gt;= 2&lt;br /&gt;&lt;span&gt;    THEN&lt;/span&gt; reduction code field is available (-&gt; &lt;span style="font-weight: bold;"&gt;pathway 1&lt;/span&gt;)&lt;br /&gt;&lt;span&gt;    ELSE&lt;/span&gt; reduction code field is not available (-&gt; &lt;span style="font-weight: bold;"&gt;pathway 2&lt;/span&gt;)&lt;br /&gt;&lt;span&gt;ELSE&lt;/span&gt; Sunday shopping promotion message (-&gt; &lt;span style="font-weight: bold;"&gt;pathway 3&lt;/span&gt;)&lt;/blockquote&gt;For each pathway a test case can be created:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Test case 1&lt;/span&gt;: on Sunday order 5 items&lt;br /&gt;Expected result: reduction code is available&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Test case 2&lt;/span&gt;: on Sunday order 1 item&lt;br /&gt;Expected result: reduction code is not available&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Test case 3&lt;/span&gt;: on Thursday order 5 items&lt;br /&gt;Expected result: reduction code is not available&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Where to apply semantic testing?&lt;/h2&gt;Semantic testing is a &lt;span style="font-weight: bold;"&gt;black-box test technique&lt;/span&gt; which is useful at System testing level and Acceptance testing level. An &lt;a href="http://www.testingminded.com/2009/01/authentication-vs-authorization.html"&gt;authentication procedure&lt;/a&gt; for instance is a typical example requiring semantic testing.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6143723392471225584-3977929869358489727?l=www.testingminded.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Testingminded/~4/fH1swmhlKEY" height="1" width="1"/&gt;</description><link>http://www.testingminded.com/2009/03/what-is-semantic-testing.html</link><author>noreply@blogger.com (Steven Machtelinckx)</author><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6143723392471225584.post-3068122326626709209</guid><pubDate>Tue, 03 Mar 2009 07:23:00 +0000</pubDate><atom:updated>2009-03-03T12:43:21.225+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">test management</category><category domain="http://www.blogger.com/atom/ns#">definitions</category><title>ISO9126 software quality attributes and characteristics</title><description>ISO 9126 is an international &lt;span style="font-weight: bold;"&gt;standard &lt;/span&gt;for the evaluation of software quality. It guarantees a uniform approach by defining a quality model. This model consists of 6 main groups of &lt;span style="font-weight: bold;"&gt;software quality characteristics&lt;/span&gt;. Each main characteristic has again sub characteristics.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Functionality&lt;/span&gt;: does the software &lt;a href="http://www.testingminded.com/2008/12/what-is-testing.html"&gt;function as intended (validation)&lt;/a&gt; and &lt;a href="http://www.testingminded.com/2008/12/what-is-testing.html"&gt;function correctly (verification)&lt;/a&gt;&lt;br /&gt;sub characteristics: suitability, accuracy, security, compliance, interoperability&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;span id="fullpost"&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Reliability&lt;/span&gt;: can we trust the performance of the application under given conditions and period of time&lt;br /&gt;sub characteristics: fault tolerance, recoverability, maturity&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Usability&lt;/span&gt;: is the software easy to work with and can people easily learn to work with&lt;br /&gt;sub characteristics: learnability, operability, understandability&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Efficiency&lt;/span&gt;: what is the relationship between the performance and time/resources&lt;br /&gt;sub characteristics: time behaviour, resource behaviour&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Maintainability&lt;/span&gt;: can the software easily be modified&lt;br /&gt;sub characteristics: stability, testability, changeability, analyzability&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Portability&lt;/span&gt;: can the software easily be transferred to another environment&lt;br /&gt;sub characteristics: adaptability, installability, conformance , replaceability&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;This standard is a &lt;span style="font-weight: bold;"&gt;framework &lt;/span&gt;for organizations to define a quality model for their software product. All sub characteristics have a set of attributes on their turn. Only attributes can be used to measure and verify the quality of software. When organizations put together their own model, they can choose which of the quality attributes to pay attention to.&lt;br /&gt;&lt;br /&gt;Note that many of the quality attributes are &lt;span style="font-weight: bold;"&gt;non-functional&lt;/span&gt;. Very often testing activities are focused on the functional aspect. However attention should also be paid to the non-functional aspect, as that can become a huge risk once the software is live.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6143723392471225584-3068122326626709209?l=www.testingminded.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Testingminded/~4/fCsJnfhlR7Y" height="1" width="1"/&gt;</description><link>http://www.testingminded.com/2009/03/iso9126-software-quality-attributes-and.html</link><author>noreply@blogger.com (Steven Machtelinckx)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6143723392471225584.post-9184335931727963247</guid><pubDate>Wed, 18 Feb 2009 11:07:00 +0000</pubDate><atom:updated>2009-03-03T12:44:38.548+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">test types</category><category domain="http://www.blogger.com/atom/ns#">definitions</category><title>What is dynamic testing?</title><description>Dynamic testing is a &lt;span style="font-weight: bold;"&gt;test type&lt;/span&gt; which refers to executing tests on a running application in order to validate the behaviour of the code. We put in values and check whether the software returns the expected output. Therefore in dynamic testing the software must be compiled and run.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Dynamic testing is the opposite of test type &lt;a href="http://www.testingminded.com/2008/12/what-is-static-testing.html"&gt;static testing&lt;/a&gt;. Dynamic tests are performed on multiple test levels, for instance, unit testing, system testing, system integration testing and acceptance testing.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6143723392471225584-9184335931727963247?l=www.testingminded.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Testingminded/~4/d93X2mrDwSg" height="1" width="1"/&gt;</description><link>http://www.testingminded.com/2009/02/what-is-dynamic-testing.html</link><author>noreply@blogger.com (Steven Machtelinckx)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6143723392471225584.post-2751424793387981479</guid><pubDate>Fri, 13 Feb 2009 23:24:00 +0000</pubDate><atom:updated>2009-04-15T18:49:28.600+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">me</category><category domain="http://www.blogger.com/atom/ns#">test execution</category><title>The testing paradox: blogger template migration</title><description>Recently I decided to implement a new layout for my TestingMinded blog. My blog is hosted by Blogger, so I had to use the default blogger upload template functionality in order to migrate my design. Blogger promotes their "push button publishing" concept. That's why I felt quite confident in migrating easily at a push of a button. At that moment, I had no idea which trouble I was about to experience.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;&lt;h2&gt;The migration&lt;/h2&gt;Testing is my profession but on top of that I'm testing minded as well. That's why I decided to try out the migration on a dummy blog first. I did not want to go live with the new template without fully testing the template transition. Taking those precautions would grant me an acceptable level of trust.&lt;br /&gt;&lt;br /&gt;I started out by creating a dummy blog and added a few Blogger widgets. Basically widgets are html placeholders and a user friendly way to manipulate the layout. You can drag and drop them easily to your taste across your html layout.&lt;br /&gt;Next I decided to upload the new layout. Immediately after clicking the "upload" button an exception message "We're sorry but we're unable to complete your request" and code "bX-vjhbsj" were displayed.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ATtgRW3jaI0/SZqg-ET73dI/AAAAAAAACIM/ca--57G0Ero/s1600-h/blogger-error-codes.jpg" class="imglink"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 223px;" src="http://4.bp.blogspot.com/_ATtgRW3jaI0/SZqg-ET73dI/AAAAAAAACIM/ca--57G0Ero/s320/blogger-error-codes.jpg" alt="" id="BLOGGER_PHOTO_ID_5303728499351870930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Basically the behavior of the widgets was at the base of this problem. When you upload the new template, Blogger tries to link the widgets of the old layout to the ones from the new layout based on their id. You should know that many different possibilities exist on that level as widgets can have a different type and content. Either Blogger did not test this very well in advance, or they didn't expect such various kinds of templates to be used.&lt;br /&gt;&lt;br /&gt;Soon I started looking for solutions on the web and found several potential causes for this problem, all related to the widgets. I tried out many, if not all, solutions but that just didn't help. In the best case the error message remained and the error code changed. For every new error code I again tried out other solutions but unfortunately it wouldn't work. During some my tests, the layout of the test blog got screwed up, and the blog couldn't even be displayed anymore. Meanwhile I had already spent hours searching for a solution and trying myself. I became frustrated as I didn't understand the exact cause of each error. And I became disappointed because it just wouldn't work for me.&lt;br /&gt;&lt;br /&gt;After all those "lost" hours I decided to upload the new layout immediately to my TestingMinded blog. You may consider this as being desperate kamikaze attack. At the moment when I was ready to push the "upload" button I realized the consequences if the same problems would rise again. But being really stubborn I clicked the "upload" button and blogger showed following message "Your changes have been saved. View blog". I couldn't believe my eyes. Blogger claimed to have uploaded the template correctly. I clicked the "preview" link and to my surprise the new layout was correctly displayed on my blog. I only needed to move some widgets around and fix their content but that was nothing compared to the mess I dealt with before.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The disappointment&lt;/h2&gt;For the very first time I put so much effort into trying to find out what's wrong with an application, without having any result. I do admit, I could have contacted the blogger help team. But honestly I didn't feel like starting a long procedure without maybe even getting any response or result. Having a detailed error message shown to the user would have been better at that moment. I then would have been able to debug the upload functionality and maybe even find a workaround. Informing the user on the exact cause would of course reveal more of their Blogger application, as people would be better understanding the inner working of the upload functionality.&lt;br /&gt;&lt;br /&gt;I'm sure I will not change my habit of testing before implementing a change. I did learn however that trying to debug the application yourself as test engineer doesn't always make a difference. If the application under test is well covering its internal working and is giving little information, you might be better off by only logging a defect without anything more. In some cases it's simply not worth to investigate all the why's and the how's yourself. Still I find it very frustrating to have experienced so many problems on my test blog, while I didn't notice any of them on my normal blog and knowing that the application didn't change. I guess that something we simply have to deal with.&lt;br /&gt;&lt;br /&gt;How about you? What do you do when encountering an exception? Do you immediately log a defect or do you try to investigate the problem yourself first?&lt;br /&gt;And have you ever found that all your effort put into testing led to so few results?&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6143723392471225584-2751424793387981479?l=www.testingminded.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Testingminded/~4/gGs5hu5SJnk" height="1" width="1"/&gt;</description><link>http://www.testingminded.com/2009/02/testing-paradox-blogger-template.html</link><author>noreply@blogger.com (Steven Machtelinckx)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_ATtgRW3jaI0/SZqg-ET73dI/AAAAAAAACIM/ca--57G0Ero/s72-c/blogger-error-codes.jpg" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6143723392471225584.post-3293611653901489906</guid><pubDate>Mon, 09 Feb 2009 07:19:00 +0000</pubDate><atom:updated>2009-03-02T12:24:08.454+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">defect management</category><title>Defect priority and severity levels</title><description>Defects are given a priority and severity level. Such classification is absolutely needed as the development team cannot resolve all defects simultaneously. The test team needs to indicate how soon they want to get the defect fixed, and how big the impact on the functionality of the application under test is. Let's have a look at the classification levels:&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Defect priority&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;High:&lt;/span&gt; Fix the defect immediately. A core functionality fails or test execution is completely blocked.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Medium:&lt;/span&gt; Fix the defect soon. An important functionality fails but we don't need to test it right away and we have a workaround.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Low:&lt;/span&gt; Don't fix this defect before the high and medium defects are fixed but don't forget this defect.&lt;br /&gt;&lt;br /&gt;Defect priority indicates the impact on the test team or test planning. If the defect blocks or greatly slows down test execution, you might want to select the highest grade for the defect priority.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Defect severity&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Critical:&lt;/span&gt; A core functionality returns completely invalid results or doesn't work at all.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Important:&lt;/span&gt; This defect has impact on basic functionality.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Useful:&lt;/span&gt; There is impact on the business, but only in a very few cases.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Nice to have:&lt;/span&gt; The impact on the business is minor. Any user interface defect not complicating the functionality often gets this severity grade.&lt;br /&gt;&lt;br /&gt;Defect severity indicates the impact on the business of the client. If important functionality is blocked or if that functionality functions incorrectly, the test engineer mostly selects the highest defect severity.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Above priority and severity qualifiers can be different between either companies or projects but basically their value remains the same. Assigning a defect priority and severity is always subjective as the test engineer measures the impact from his point of view. Nevertheless he should always decide with care as the defect resolution time depends on this.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Which prioritization are you used to work with? Do developers take your defect priority into account?&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6143723392471225584-3293611653901489906?l=www.testingminded.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Testingminded/~4/yR1MyG0HO8g" height="1" width="1"/&gt;</description><link>http://www.testingminded.com/2009/02/defect-priority-and-severity-levels.html</link><author>noreply@blogger.com (Steven Machtelinckx)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6143723392471225584.post-57726947388395784</guid><pubDate>Thu, 05 Feb 2009 13:48:00 +0000</pubDate><atom:updated>2009-04-15T18:49:46.402+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">JMeter</category><category domain="http://www.blogger.com/atom/ns#">automation</category><category domain="http://www.blogger.com/atom/ns#">test execution</category><title>Tutorial: functional testing with JMeter</title><description>&lt;span id="fullpost"&gt;&lt;span style="font-style: italic;"&gt;In this article by Emily H. Halili, we will give you a walkthrough on how to create a Functional Test Plan as we incorporate and configure JMeter elements to support functional testing.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;JMeter is a 100% pure Java desktop application. JMeter is found to be very useful and convenient in support of functional testing. Although JMeter is known more as a performance testing tool, functional testing elements can be integrated within the Test Plan, which was originally designed to support load testing. Many other load-testing tools provide little or none of this feature, restricting themselves to performance-testing purposes.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Besides integrating functional-testing elements along with load-testing elements in the Test Plan, you can also create a Test Plan that runs these exclusively. In other words, aside from creating a Load Test Plan, JMeter also allows you to create a &lt;span style="font-weight: bold;"&gt;Functional Test Plan&lt;/span&gt;. This flexibility is certainly resource-efficient for the testing project.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Preparing for Functional Testing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;JMeter does not have a built-in browser, unlike many functional-test tools. It tests on the protocol layer, not the client layer (i.e. JavaScripts, applets, and many more.) and it does not render the page for viewing. Although, by default that embedded resources can be downloaded, rendering these in the Listener | View Results Tree may not yield a 100% browser-like rendering. In fact, it may not be able to render large HTML files at all. This makes it difficult to test the GUI of an application under testing. However, to compensate for these shortcomings, JMeter allows the tester to create assertions based on the tags and text of the page as the HTML file is received by the client. With some knowledge of HTML tags, you can test and verify any elements as you would expect them in the browser.It is unnecessary to select a specific workload time to perform a functional test. In fact, the application you want to test may even reside locally, with your own machine acting as the "localhost" server for your web application. For this article, we will limit ourselves to selected functional aspects of the page that we seek to verify or assert.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Continue to part 1: &lt;a href="http://www.testingminded.com/2009/02/tutorial-on-functional-testing-with_3268.html"&gt;Using JMeter components&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Emily H. Halili Is the author of the book: A practical beginner’s guide to automated testing and performance measurement for your websites. &lt;a href="http://www.packtpub.com/beginning-apache-jmeter/book/mid/280109jcyia3"&gt;Click here for more information on her book&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.packtpub.com/beginning-apache-jmeter/book/mid/280109jcyia3" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" class="imglink"&gt;&lt;img id="BLOGGER_PHOTO_ID_5296301868988730466" style="display: block; cursor: pointer; width: 100px; height: 123px;" alt="" src="http://3.bp.blogspot.com/_ATtgRW3jaI0/SYA-fSRPjGI/AAAAAAAACEc/TOgUCCvFjRg/s320/Jmeter.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6143723392471225584-57726947388395784?l=www.testingminded.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Testingminded/~4/knhrsgKeJiY" height="1" width="1"/&gt;</description><link>http://www.testingminded.com/2009/02/tutorial-on-functional-testing-with_3033.html</link><author>noreply@blogger.com (Steven Machtelinckx)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_ATtgRW3jaI0/SYA-fSRPjGI/AAAAAAAACEc/TOgUCCvFjRg/s72-c/Jmeter.jpg" height="72" width="72" /><thr:total>0</thr:total></item></channel></rss>

