<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule">

<channel>
	<title>Automation Beyond</title>
	<atom:link href="http://automation-beyond.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://automation-beyond.com</link>
	<description>An engineering approach to Software Testing and Test Automation</description>
	<lastBuildDate>Wed, 08 May 2013 15:05:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/3.0/</creativeCommons:license>		<item>
		<title>What testers can learn from playing chess</title>
		<link>http://automation-beyond.com/2013/05/08/what-testers-can-learn-from-playing-chess/</link>
		<comments>http://automation-beyond.com/2013/05/08/what-testers-can-learn-from-playing-chess/#comments</comments>
		<pubDate>Wed, 08 May 2013 11:21:32 +0000</pubDate>
		<dc:creator>Albert Gareev</dc:creator>
				<category><![CDATA[Notes]]></category>
		<category><![CDATA[2. Testing]]></category>
		<category><![CDATA[analogy]]></category>
		<category><![CDATA[approach]]></category>
		<category><![CDATA[chess]]></category>
		<category><![CDATA[Comment]]></category>
		<category><![CDATA[exploratory]]></category>
		<category><![CDATA[Heuristics]]></category>
		<category><![CDATA[lead]]></category>
		<category><![CDATA[model]]></category>
		<category><![CDATA[note]]></category>
		<category><![CDATA[note-taking]]></category>
		<category><![CDATA[playing]]></category>
		<category><![CDATA[QA]]></category>
		<category><![CDATA[strategy]]></category>
		<category><![CDATA[test lead]]></category>
		<category><![CDATA[vision]]></category>

		<guid isPermaLink="false">http://automation-beyond.com/?p=5366</guid>
		<description><![CDATA[(If they haven&#8217;t learnt that from doing testing) This is another my notebook entry, but entry unusual. I started it while playing chess. This is also one of the proud parent moments: my 9 years old son brought this initiative of evening chess parties &#8211; all by himself! As much as we, parents, try to [...]]]></description>
			<content:encoded><![CDATA[
<h1>(If they haven&#8217;t learnt that from doing testing)</h1>
<p>This is another my notebook entry, but entry unusual. I started it while playing chess.</p>
<blockquote><p><em>This is also one of the proud parent moments: my 9 years old son brought this initiative of evening chess parties &#8211; all by himself!</em><br />
<em> As much as we, parents, try to protect and guide our children, we also try to develop them self-driven and self-sustainable &#8211; and that&#8217;s not easy, you know.</em></p>
<p><em>A couple of years ago my dad introduced chess to my son, and the three of us had some quality time learning about this game. But it didn&#8217;t stick that time.</em><br />
<em>Then this winter my son asked me to help installing chess game on his tablet, and I saw him playing it now and then, along with arcades, shooters, and other typical for his age games.</em><br />
<em>And suddenly my son approaches me, saying that he is one of the best in the school&#8217;s chess club, and he wants to get even better by playing regularly with me. He asks me to dedicate time for regular evening sessions and promises to help more with household stuff to help freeing up time.</em><br />
<em> Well, that&#8217;s exactly the moment of feeling proud of your child, and having real confirmation that you&#8217;re doing a good job as a parent.</em></p>
<p><em>More to say, it&#8217;s been over a month since we started playing regularly, lots of losses for my son, and he is still persistent and strong spirited about the game.</em></p></blockquote>
<p>Now, here are the connections with testing.</p>
<h2>Have a strategy, and be ready  to change it</h2>
<h4>It is about goals, not &#8220;steps to perform&#8221;</h4>
<p>Winning the party is an ultimate goal, which is reached by series of small wins (mixed with some losses, possibly) through the party. No one can prescribe a sequence of moves to win the game.</p>
<h4>Know the context</h4>
<p>You need to know what kind of game you play: modern chess, hexagonal chess, xiangqi, shogi, or chaturanga. Think it&#8217;s an edge case example? It should be assumed &#8220;normal&#8221;, modern chess? Well, do you know all <a href="http://www.fide.com/component/handbook/?id=124&amp;view=article" target="_blank">Laws of Chess</a>?</p>
<h4>Requirements cannot cover everything</h4>
<p>If you clicked the link above,  this is what you&#8217;d see first on the page.</p>
<blockquote><p><em>The Laws of Chess cannot cover all possible situations that may arise during a game, nor can they regulate all administrative questions. Where cases are not precisely regulated by an Article of the Laws, it should be possible to reach a correct decision by studying analogous situations which are discussed in the Laws. The Laws assume that arbiters have the necessary competence, sound judgment and absolute objectivity. Too detailed a rule might deprive the arbiter of his freedom of judgment and thus prevent him from finding the solution to a problem dictated by fairness, logic and special factors.</em></p></blockquote>
<h4>Too detailed rules might cause damage, having a freedom of judgment is critical</h4>
<p>Continuing with citation above: not only requirements and rules cannot regulate everything, if they try to do so, they begin an obstacle in finding solutions and moving towards goals.</p>
<p>Instead, context-specific, experience-based solutions &#8211; <a href="http://www.satisfice.com/blog/archives/462" target="_blank">heuristics</a> &#8211; should be thoughtfully applied for finding a solution.</p>
<h4>Know who you are playing with</h4>
<p>Every player has his own style. Knowing it helps to win. Studying it helps to know :)</p>
<p>Know your stakeholders! Their interests, their style, their goals. Knowing that you can shape your own tasks and actions in order to reach your goals and the big common goal.</p>
<h4>Know how to estimate and budget your time</h4>
<p>There is a whole set of rules on Chess Clock. The core idea: you cannot think unlimited time; you must act.</p>
<p>We&#8217;re on the clock in testing as well. Thinking too long ends up in being too late. Additionally, we never have a complete awareness of the situation.</p>
<h2>Game Tactics</h2>
<h4>Is there a problem?</h4>
<p>Whenever a move on the chessboard happens, players assess the new information. Where it leads? What is the threat?</p>
<p>Whenever testers discover a new piece of information about the product, &#8220;is there are problem?&#8221;, &#8211; they ask themselves.</p>
<h4>There are no single best strategy, but there are good tactical moves</h4>
<p>These moves come from the experience. <a href="https://en.wikipedia.org/wiki/Tarrasch_rule" target="_blank">Tarrasch rule</a>, <a href="https://en.wikipedia.org/wiki/Lucena_position" target="_blank">Lucena position</a>, <a href="https://en.wikipedia.org/wiki/Sicilian_Defence" target="_blank">Sicilian Defence</a>&#8230; These moves are usually right thing to do, but not always. There are exceptions. There could be better moves.</p>
<p>What this reminds of?  <a href="http://www.satisfice.com/tools/satisfice-tsm-4p.pdf" target="_blank">Heuristics</a>, again.</p>
<h4>Recording moves</h4>
<p><a href="https://en.wikipedia.org/wiki/Scholar%27s_mate" target="_blank">1. e4 e5 2. Qh5?! Nc6 3. Bc4 Nf6?? 4. Qxf7# 1–0</a></p>
<p>Recording moves is common practice in chess. It has very well developed notation.</p>
<p>Sadly, in testing it&#8217;s often replaced by following a pre-recorded testing steps. But even such conservative tools like HP QC now offer additional capabilities for run-time note taking.</p>
<h4>Game Analysis</h4>
<p>&#8220;In chess, analyzing your games is a main task in your training toward mastery.&#8221; &#8211; This is a quote from article &#8220;<a href="http://chess4real.com/a-hardcore-guide-to-analyze-your-chess-games/" target="_blank">A hardcore guide to analyze your chess games in 12 steps</a>&#8220;. I&#8217;ve just found it by googling &#8220;chess game analysis&#8221;. And you know what? It&#8217;s so amazing, it just all applies to testing with minimum words replaced.</p>
<blockquote><p><strong>Why should we analyze our games?</strong></p>
<p>Because…</p>
<p>A- We can compare our decisions against concrete evidence.</p>
<p>B- We can look deep inside our thought processes.</p>
<p>C- If done correctly, we will learn about the openings we play, the structures presented in those openings, and the endgames that we never had a chance to practice. If the analysis is completed new ideas will appear and you will know a little more about yourself when started.</p>
<p>D- When you analyze your games properly, all your mistakes come to the surface (knowledge, mental processes, recurring errors, etc.), and you will be one step further towards correcting them. The sweat you spend analyzing is worth its weight in gold.</p>
<h4><strong>The guidelines for analyzing your chess games</strong></h4>
<p>1. Write down the time spent in the game on every move as you play.<br />
2. During the game create code signs on your score sheet to point out the critical moments of the game.<br />
3. Immediately after the game, write down what you remember from the game.<br />
4. Write at least three things you learned from the game you just completed<br />
5. (IMPORTANT!) Identify the critical moments of the game …<br />
6. After establishing the critical points, you can begin to analyze them.<br />
7. Check opening theory<br />
8. Positional patterns searching.<br />
9. Analyze the game by yourself (and know when to use programs&#8230;)<br />
10. Reports and diagnostics.<br />
11. Publish your analysis.<br />
12. Time to wrap up and verbalize the acquired knowledge.</p></blockquote>
<p>Each rule has explaining paragraph in the <a href="http://chess4real.com/a-hardcore-guide-to-analyze-your-chess-games/" target="_blank">article</a>. It&#8217;s worth reading, believe me.</p>
<h2>A closing note</h2>
<p>With all &#8220;testing vs. checking&#8221; debates <a href="http://www.developsense.com/blog/2009/08/testing-vs-checking/" target="_blank">occurring</a> and <a href="http://www.satisfice.com/blog/archives/856" target="_blank">reoccurring</a>, one might ask how far my analogy goes. After all, computers can play chess, and can do it <a href="https://en.wikipedia.org/wiki/Deep_Blue_versus_Garry_Kasparov" target="_blank">pretty well</a>. So, isn&#8217;t it a proof that testing can be completely automated, and tester-machine will beat even a master human tester?</p>
<p>My answer here is to consider a few major factors.</p>
<h4>Artificially limited vs. unlimited and evolving context.</h4>
<p>Even though quite complex, Chess is a very formalized and 100% predictable game. There is huge, but finite set of combinations of moves, which can be won through a computing power, similarly to <a href="https://en.wikipedia.org/wiki/Brute-force_search" target="_blank">brute force</a> password hacking.</p>
<p>Even tiniest software development project will be undoubtedly more complex context, with ever changing rules, which also can and will be broken from time to time.</p>
<p>There is no way the machines can win by evolving in this direction.</p>
<h4>Machines are unable to learn, so far.</h4>
<p>In the famous &#8220;<a href="https://en.wikipedia.org/wiki/Deep_Blue_versus_Garry_Kasparov" target="_blank">Deep Blue versus Garry Kasparov</a>&#8221; match the whole team of engineers was working in between of the games, adjusting and improving its algorithms. Moreover, the grandmaster himself helped them to tune up the machine.</p>
<p>It&#8217;s not really the machine&#8217;s victory, but rather a triumph of engineering thought.</p>
<p>However, there is limited progress in this direction. Chess programs now use <a href="http://stackoverflow.com/questions/297577/is-there-a-perfect-algorithm-for-chess" target="_blank">heuristic algorithms</a>, <a href="http://en.wikipedia.org/wiki/Dynamic_programming" target="_blank">dynamic algorithms</a>, try to &#8220;remember and guess&#8221; opponent&#8217;s moves.</p>
<p>Theoretically, for a quite simple testing context such a tester-machine can be created, and, supported by a team of highly paid software engineers (programmers and testers) will be able to perform its testing duties at acceptable level. Wait! Wouldn&#8217;t be faster and cheaper ask those pro testers to provide test results? :)</p>
<h4>The <a href="http://en.wikipedia.org/wiki/Skynet_(Terminator)" target="_blank">SkyNet</a> factor.</h4>
<p>Given that human may create machine-based artificial intelligence one day, it&#8217;s quite possible that it won&#8217;t be interested playing chess, but would want to win over the entire humanity.</p>
<p><div style="position: relative; z-index:1;"><script type="text/javascript"><!--
google_ad_client = "pub-4470793787913935";
/* Banner 468x60 */
google_ad_slot = "8933038987";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div></p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://automation-beyond.com/2011/01/18/wta05-two-fold-mission-bonus/" rel="bookmark" class="crp_title">WTA05: Two-fold Mission + Bonus</a></li><li><a href="http://automation-beyond.com/2008/02/10/proverbs-testing-and-learning/" rel="bookmark" class="crp_title">Proverbs and quotes about Testing and Learning</a></li><li><a href="http://automation-beyond.com/2010/10/15/notes-on-debrief/" rel="bookmark" class="crp_title">Notes on Testing Challenge debrief</a></li><li><a href="http://automation-beyond.com/2011/11/07/groundspeed/" rel="bookmark" class="crp_title">Exploratory Security Testing Tool &#8211; GroundSpeed</a></li><li><a href="http://automation-beyond.com/2007/12/15/breakdown-decomposition-approach/" rel="bookmark" class="crp_title">Breakdown (decomposition) approach</a></li></ul></div>
]]></content:encoded>
			<wfw:commentRss>http://automation-beyond.com/2013/05/08/what-testers-can-learn-from-playing-chess/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>notebook</title>
		<link>http://automation-beyond.com/2013/04/19/notebook-3/</link>
		<comments>http://automation-beyond.com/2013/04/19/notebook-3/#comments</comments>
		<pubDate>Fri, 19 Apr 2013 12:47:47 +0000</pubDate>
		<dc:creator>Albert Gareev</dc:creator>
				<category><![CDATA[Notes]]></category>
		<category><![CDATA[2. Testing]]></category>
		<category><![CDATA[Comment]]></category>
		<category><![CDATA[lead]]></category>
		<category><![CDATA[note]]></category>
		<category><![CDATA[QA]]></category>
		<category><![CDATA[test lead]]></category>
		<category><![CDATA[vision]]></category>

		<guid isPermaLink="false">http://automation-beyond.com/?p=5358</guid>
		<description><![CDATA[I often come back to re-read certain articles and books on testing. Typically, in the light of new experience, or with regards to specific problem. This month&#8217;s top &#8211; Perfect Software and Other Illusions About Testing. Chapters 5 and 8. *** Even though testers pretty much can/should be &#8220;jack of all trades&#8221; kinds of specialists, [...]]]></description>
			<content:encoded><![CDATA[
<p>I often come back to re-read certain articles and books on testing. Typically, in the light of new experience, or with regards to specific problem.</p>
<p>This month&#8217;s top &#8211; <a href="http://www.smashwords.com/books/view/25400" target="_blank">Perfect Software and Other Illusions About Testing</a>. Chapters 5 and 8.</p>
<p style="text-align: center;">***</p>
<p>Even though testers pretty much can/should be &#8220;jack of all trades&#8221; kinds of specialists, certain jobs they shouldn&#8217;t do as main and regular responsibilities.</p>
<ul>
<li>Secretary and administration &#8211; moving around papers and files, cleaning messes in repositories, shipping-receiving, taking-passing messages and faxes-mails, cleaning work areas.<br />
These are the kinds of things that everybody in the development team should be able to do properly, without leaving a mess. Or it must be a dedicated role, like office assistant, or person on duty according to the schedule involving <em>all</em> team members.</li>
<li>Build and release management. Simply because it&#8217;s a critically important thing, and must not be done in casual ways. If QA department owns build and release management, it doesn&#8217;t mean that every tester can or should do it on his or her own way. This must be a regulated and controlled process.</li>
<li>Support jobs. If any tester can be distracted any time for unknown amount of time, don&#8217;t expect them to be able to focus and accomplish testing missions.<br />
On the other hand, testers bring invaluable investigation and problem-solving skills to support team, and, in turn, learn more about real problems that customers are struggling with. Best working approach, as I&#8217;ve seen, is having a dedicated tester(s), assigned to help support team according to the schedule.</li>
</ul>
<p style="text-align: center;">***</p>
<p>As the bottom line, all automation tool vendors, both commercial and open-source, promise the same or very similar benefits. What matters is will they be delivered, and to what extent. It most of all depends not on the tool, but the actual implementation. Once <a href="http://www.mkltesthead.com/p/about-me.html" target="_blank">Michael Larsen</a> and I put together an <a href="http://automation-beyond.com/2012/07/14/follow-the-crumbs/" target="_blank">article</a> on evaluation criteria.</p>
<p>After doing a number of reviews this year, I&#8217;d suggest &#8220;M&#8221; (which stands for Maintainability) to be made the biggest letter with 3 exclamation marks. Every time I hear of fascination with creation of scripts without a concern of how they will be used, I feel very sad about test automation.</p>
<p style="text-align: center;">***</p>
<p>Consistency with the purpose: <strong>Fail</strong>.</p>
<p><iframe width="425" height="344" src="http://www.youtube.com/embed/TtXWWRyJLPw?wmode=transparent" frameborder="0" allowFullScreen> </iframe></p>
<p>&nbsp;</p>
<p><div style="position: relative; z-index:1;"><script type="text/javascript"><!--
google_ad_client = "pub-4470793787913935";
/* Banner 468x60 */
google_ad_slot = "8933038987";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div></p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://automation-beyond.com/2013/04/05/notebook/" rel="bookmark" class="crp_title">notebook</a></li><li><a href="http://automation-beyond.com/2013/04/12/notebook-2/" rel="bookmark" class="crp_title">notebook</a></li><li><a href="http://automation-beyond.com/2013/05/08/what-testers-can-learn-from-playing-chess/" rel="bookmark" class="crp_title">What testers can learn from playing chess</a></li></ul></div>
]]></content:encoded>
			<wfw:commentRss>http://automation-beyond.com/2013/04/19/notebook-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>notebook</title>
		<link>http://automation-beyond.com/2013/04/12/notebook-2/</link>
		<comments>http://automation-beyond.com/2013/04/12/notebook-2/#comments</comments>
		<pubDate>Fri, 12 Apr 2013 18:33:43 +0000</pubDate>
		<dc:creator>Albert Gareev</dc:creator>
				<category><![CDATA[Notes]]></category>
		<category><![CDATA[2. Testing]]></category>
		<category><![CDATA[Comment]]></category>
		<category><![CDATA[lead]]></category>
		<category><![CDATA[note]]></category>
		<category><![CDATA[QA]]></category>
		<category><![CDATA[test lead]]></category>
		<category><![CDATA[vision]]></category>

		<guid isPermaLink="false">http://automation-beyond.com/?p=5351</guid>
		<description><![CDATA[&#8220;Personas&#8221; were not invented by testing people, but quickly picked up, especially with regards to usability testing aspects. Over the years, I&#8217;ve read quite a few articles advocating for use of Personas, mainly in exploratory and agile testing. Yet somehow I haven&#8217;t seen a single practical, &#8220;hard-coded&#8221; example. Since usability is one of the aspects we&#8217;re testing, [...]]]></description>
			<content:encoded><![CDATA[
<p><a href="http://en.wikipedia.org/wiki/Persona_(user_experience)" target="_blank">&#8220;Personas&#8221;</a> were not invented by testing people, but quickly picked up, especially with regards to usability testing aspects. Over the years, I&#8217;ve read quite a few articles advocating for use of Personas, mainly in exploratory and agile testing. Yet somehow I haven&#8217;t seen a single practical, &#8220;hard-coded&#8221; example.</p>
<p>Since usability is one of the aspects we&#8217;re testing, I decided to mix in Personas in our testing approach &#8211; and started with defining a few basic personas.</p>
<p><em><strong>The Impatient</strong></em><br />
<em>Clicks quickly through the app. Sometimes confuses single and double-click, or repeats clicking the same command (link, button) if the response is not instant.</em><br />
<em> Makes mistakes, goes back, or cancels and restarts.</em><br />
<em> Makes quick judgments that often wrong.</em><br />
<em> Sometimes tries &#8220;new ways&#8221; or experiments with the functionalities.</em></p>
<p><em><strong>The Cautious</strong></em><br />
<em>Moves slowly and carefully through the app.</em><br />
<em> Always goes exactly by written instruction.</em><br />
<em> Expects everything to be precisely documented. Expects the application to communicate and instruct her during the work. Expects application to verify and validate everything, and the same herself as well, in order to avoid any mistakes.</em><br />
<em> Gets lost in unexpected situations; follows the pattern in confusing situations.</em></p>
<p><em><strong>The Long Time User</strong></em><br />
<em>Moves quickly and confidently through the app.</em><br />
<em> Knows all the limitations and has effective workarounds for them, but has some misconceptions as well.</em><br />
<em> Doesn&#8217;t need much of communication or confirmations as the sequence of actions is written in her mind.</em><br />
<em> Uses &#8220;restart and repeat&#8221; as a main solution for the all encountered problems.</em></p>
<p style="text-align: center;">***</p>
<p>Even though the original intent was to apply persona-specific testing style to evaluate usability, additional testing values have emerged.</p>
<p><strong>Communication</strong> &#8211; testing as The Cautious helped to find spots where the application is doing poor job communicating with the user &#8211; either provides no confirmation, or brings misleading prompt, or even where the functionality is in disconnect with documentation.</p>
<p><strong>State and Recovery</strong> &#8211; testing as The Impatient helped to find a few spots where the application does not restore into the same starting state upon cancellation, and continuing in that state would cause the problems.</p>
<p style="text-align: center;">***</p>
<p>I&#8217;ve got another hint from a Business Analyst, which might be related to Personas aspect of testing. Long time users are so used to the ways the app working, that even obvious improvements in the functionality might be seen negative, at least for a period of time.</p>
<p>Now, is that the kind of problems that testing should care about as well, and how can we anticipate and report (advocate) such problems?</p>
<p><div style="position: relative; z-index:1;"><script type="text/javascript"><!--
google_ad_client = "pub-4470793787913935";
/* Banner 468x60 */
google_ad_slot = "8933038987";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div></p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://automation-beyond.com/2013/04/05/notebook/" rel="bookmark" class="crp_title">notebook</a></li><li><a href="http://automation-beyond.com/2013/04/19/notebook-3/" rel="bookmark" class="crp_title">notebook</a></li><li><a href="http://automation-beyond.com/2013/05/08/what-testers-can-learn-from-playing-chess/" rel="bookmark" class="crp_title">What testers can learn from playing chess</a></li></ul></div>
]]></content:encoded>
			<wfw:commentRss>http://automation-beyond.com/2013/04/12/notebook-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>notebook</title>
		<link>http://automation-beyond.com/2013/04/05/notebook/</link>
		<comments>http://automation-beyond.com/2013/04/05/notebook/#comments</comments>
		<pubDate>Fri, 05 Apr 2013 10:30:37 +0000</pubDate>
		<dc:creator>Albert Gareev</dc:creator>
				<category><![CDATA[Notes]]></category>
		<category><![CDATA[2. Testing]]></category>
		<category><![CDATA[Comment]]></category>
		<category><![CDATA[lead]]></category>
		<category><![CDATA[note]]></category>
		<category><![CDATA[QA]]></category>
		<category><![CDATA[test lead]]></category>
		<category><![CDATA[vision]]></category>

		<guid isPermaLink="false">http://automation-beyond.com/?p=5346</guid>
		<description><![CDATA[I&#8217;m leading a SWAT team. S.W.A.T. here stands for &#8220;Systematic Wondering, Automation, Testing&#8221;. We&#8217;re doing all kinds of cool stuff in testing. Might say, transforming &#8220;some&#8221; testing to awesome testing. I am very excited about it. While doing a lot of thinking, and having a lot of ideas I could write about, and having experiences [...]]]></description>
			<content:encoded><![CDATA[
<p>I&#8217;m leading a SWAT team. S.W.A.T. here stands for &#8220;Systematic Wondering, Automation, Testing&#8221;. We&#8217;re doing all kinds of cool stuff in testing. Might say, transforming &#8220;some&#8221; testing to awesome testing. I am very excited about it.</p>
<p>While doing a lot of thinking, and having a lot of ideas I could write about, and having experiences I&#8217;d like to share, I can&#8217;t help but notice that I&#8217;m not blogging for quite a few months. It seems that I simply don&#8217;t have enough time to sit in WordPress, and even when I try to, an urgent matter comes up. And yet I had a lot of stuff written in my <a href="www.developsense.com/presentations/etnotebook.pdf" target="_blank">tester&#8217;s notebook</a>. I do it in between of things. I take notes for the very same reasons as in the article linked. In short, note-taking is my thinking tool.</p>
<p>So I decided &#8211; as much I&#8217;d like to write elaborated ideas and experience reports, best I can do now is to publish some of my notes, and (hopefully) I will expand them into articles in the future. Or not.</p>
<p style="text-align: center;">***</p>
<p>Who should have a control over test environment? Programmers or testers? Seemingly, agile development teams shouldn&#8217;t even have such question. And yet I saw it existing in variations both in agile and waterfall teams.</p>
<p>There is a number of reasons why testers need the environment to be in a specific way.</p>
<ul>
<li>They want to finish testing mission while pushing new code will render all testing progress irrelevant.</li>
<li>They want to know what code and configuration changes are being pushed in order to define their testing mission(s).</li>
<li>The database in testing environment is too trivial, not helping to create situations that will/might happen in production.</li>
<li>They want to have open access to all configuration and data in order to create testing situations by purpose, not by chance.</li>
</ul>
<p>Not all of these problems demand for the ownership of the test environment by testing team. Some of them can be resolved by timely and precise communication. Some of them can be resolved by effective collaboration.</p>
<p style="text-align: center;">***</p>
<p><a href="http://context-driven-testing.com/" target="_blank">&#8220;The product is a solution. If the problem isn’t solved, the product doesn’t work. &#8220;</a></p>
<p>Hence one of the questions I&#8217;m always trying to clear &#8211; what problem(s) this particular functionality is trying to solve.</p>
<p>Problem &#8211; Solution &#8211; Logic &#8211; Implementation.</p>
<p>Logic is &#8220;requirements&#8221;. They can be very elaborate and signed off, or go quite informal as &#8220;user stories&#8221;.</p>
<p>Implementation is specification and the software product itself.</p>
<p>The problem is often in &#8220;Problem &#8211; Solution&#8221; pair. If a tester doesn&#8217;t realize what is the problem that the functionality intends to solve, how he (she) can go above and beyond functional correctness?</p>
<p>The most important and the most hard-to-find-and-expensive-to-fix bugs are not in the compliance with specification. They are gaps in logic, conflicting requirements, misunderstood (misinterpreted) logical rules, and, of course, inadequate solutions.</p>
<p>On the spectrum from Problem to Implementation, some roles seem to be involved only in certain phases &#8211; &#8220;requirements gathering&#8221;, &#8220;architecture design&#8221;&#8230; Testing, especially if it pretends for the Quality Assurance role, has to spread itself everywhere.<br />
<div style="position: relative; z-index:1;"><script type="text/javascript"><!--
google_ad_client = "pub-4470793787913935";
/* Banner 468x60 */
google_ad_slot = "8933038987";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div></p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://automation-beyond.com/2013/04/12/notebook-2/" rel="bookmark" class="crp_title">notebook</a></li><li><a href="http://automation-beyond.com/2013/04/19/notebook-3/" rel="bookmark" class="crp_title">notebook</a></li><li><a href="http://automation-beyond.com/2013/05/08/what-testers-can-learn-from-playing-chess/" rel="bookmark" class="crp_title">What testers can learn from playing chess</a></li></ul></div>
]]></content:encoded>
			<wfw:commentRss>http://automation-beyond.com/2013/04/05/notebook/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>How to find all links on a web page (TestComplete)</title>
		<link>http://automation-beyond.com/2012/12/15/how-to-find-all-links-on-a-web-page-testcomplete/</link>
		<comments>http://automation-beyond.com/2012/12/15/how-to-find-all-links-on-a-web-page-testcomplete/#comments</comments>
		<pubDate>Sat, 15 Dec 2012 10:44:43 +0000</pubDate>
		<dc:creator>Albert Gareev</dc:creator>
				<category><![CDATA[GUI Recognition]]></category>
		<category><![CDATA[How to]]></category>
		<category><![CDATA[Source code]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[3. Automation]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[Example]]></category>
		<category><![CDATA[find]]></category>
		<category><![CDATA[FindAllChildren]]></category>
		<category><![CDATA[get]]></category>
		<category><![CDATA[GUI]]></category>
		<category><![CDATA[link]]></category>
		<category><![CDATA[page]]></category>
		<category><![CDATA[sample]]></category>
		<category><![CDATA[snippet]]></category>
		<category><![CDATA[testcomplete]]></category>
		<category><![CDATA[VBScript]]></category>

		<guid isPermaLink="false">http://automation-beyond.com/?p=5294</guid>
		<description><![CDATA[Description Get parent object reference. In the example given, it&#8217;s a browser process, but you can narrow it down to a page or a web container object (table,  div, etc.). Use FindAllChildren to retrieve array of links. - You can limit search depth according to your context. - You may want to do filtered search using [...]]]></description>
			<content:encoded><![CDATA[
<p><div style="position: relative; z-index:1;"><script type="text/javascript"><!--
google_ad_client = "pub-4470793787913935";
/* Banner 468x60 */
google_ad_slot = "8933038987";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div></p>
<h4>Description</h4>
<ol>
<li>Get parent object reference. In the example given, it&#8217;s a browser process, but you can narrow it down to a page or a web container object (table,  div, etc.).</li>
<li>Use FindAllChildren to retrieve array of links.<br />
- You can limit search depth according to your context.<br />
- You may want to do filtered search using additional properties: Visible, VisibleOnScreen, ContentText, etc.</li>
</ol>
<h4>Implementation</h4>
<p><script type="text/javascript"><!--
google_ad_client = "pub-4470793787913935";
/* 4 links text line */
google_ad_slot = "5367351963";
google_ad_width = 468;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
<pre class="brush: vb; title: ;">
  Dim PropNames, PropValues, IEProcess
  Dim Links

  PropNames = Array(&quot;processname&quot;, &quot;index&quot;)
  PropValues = Array(&quot;iexplore&quot;, 1)

  Set IEProcess = Sys.FindChild(PropNames, PropValues, 1, True)

  PropNames = Array(&quot;ObjectType&quot;)
  PropValues = Array(&quot;Link&quot;)
  Links = IEProcess.FindAllChildren(PropNames, PropValues, 100, True)

  PropNames = Array(&quot;ObjectType&quot;, &quot;Visible&quot;)
  PropValues = Array(&quot;Link&quot;, True)
  Links = IEProcess.FindAllChildren(PropNames, PropValues, 100, True)
</pre>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://automation-beyond.com/2010/11/10/testcomplete-find-child/" rel="bookmark" class="crp_title">TestComplete &#8211; Find Child or Find Yourself?</a></li><li><a href="http://automation-beyond.com/2010/11/23/testcomplete-couldnt-find-gui/" rel="bookmark" class="crp_title">TestComplete &#8211; Couldn&#8217;t Find and Fine About It</a></li><li><a href="http://automation-beyond.com/2010/12/07/testcomplete-wait-then-find/" rel="bookmark" class="crp_title">TestComplete &#8211; Wait then Find</a></li><li><a href="http://automation-beyond.com/2010/11/11/testcomplete-find-child-objects/" rel="bookmark" class="crp_title">TestComplete &#8211; Find Child Objects</a></li><li><a href="http://automation-beyond.com/2010/12/16/automation-tutorials-page-update/" rel="bookmark" class="crp_title">Automation Tutorials &#8211; Page Update</a></li></ul></div>
]]></content:encoded>
			<wfw:commentRss>http://automation-beyond.com/2012/12/15/how-to-find-all-links-on-a-web-page-testcomplete/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TestComplete 9 &#8211; Performance Tuning</title>
		<link>http://automation-beyond.com/2012/12/12/testcomplete-9-performance-tuning/</link>
		<comments>http://automation-beyond.com/2012/12/12/testcomplete-9-performance-tuning/#comments</comments>
		<pubDate>Wed, 12 Dec 2012 10:25:18 +0000</pubDate>
		<dc:creator>Albert Gareev</dc:creator>
				<category><![CDATA[How to]]></category>
		<category><![CDATA[TestComplete]]></category>
		<category><![CDATA[3. Automation]]></category>
		<category><![CDATA[configuration]]></category>
		<category><![CDATA[How]]></category>
		<category><![CDATA[improve]]></category>
		<category><![CDATA[options]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[settings]]></category>
		<category><![CDATA[slow]]></category>
		<category><![CDATA[testcomplete]]></category>
		<category><![CDATA[to]]></category>
		<category><![CDATA[tool]]></category>
		<category><![CDATA[very]]></category>

		<guid isPermaLink="false">http://automation-beyond.com/?p=5271</guid>
		<description><![CDATA[This post is not about performance testing with TestComplete. This post is about tweaking TestComplete configuration parameters to make it less &#8220;greedy&#8221; on resources, especially CPU, while performing run-time recognition of a complex GUI. This will mostly be useful to experienced test automation engineers who create their own scripts without record/playback and hard-coded GUI name [...]]]></description>
			<content:encoded><![CDATA[
<p>This post is not about performance testing with TestComplete.<br />
This post is about tweaking TestComplete configuration parameters to make it less &#8220;greedy&#8221; on resources, especially CPU, while performing <a href="http://automation-beyond.com/chapters/tutorials/testcomplete/" target="_blank">run-time recognition</a> of a complex GUI.<br />
This will mostly be useful to experienced test automation engineers who create their own scripts without record/playback and hard-coded GUI name mapping.</p>
<p>When TestComplete 9 was released, many (including me), complained about dramatic performance degradation in real-time GUI recognition mechanism (using FindChild family of methods). Though some parts of recognition chain started working actually faster, the first step &#8211; acquiring process handle &#8211; was taking very long time. Remarkably, SmartBear&#8217;s Support Team responded very quickly and initiated its own investigation based on the code examples provided. They even quickly released a patch. However, the solution is a complex treatment. Automation engineers need to know of the mechanics of the new GUI recognition engine and settings that tweak it.</p>
<p><div style="position: relative; z-index:1;"><script type="text/javascript"><!--
google_ad_client = "pub-4470793787913935";
/* Banner 468x60 */
google_ad_slot = "8933038987";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div></p>
<h3>How It Works*</h3>
<p>* Parts of it I learnt myself through years of working with TestComplete, but I&#8217;d like to give a main credit to TestComplete support engineers who shared insights of the inner mechanics.</p>
<h4>Recognition through properties</h4>
<p>The tool does not actually &#8220;see&#8221; picture on the screen. It uses specified (pre-captured hard-coded or dynamically calculated) expected values of the properties of GUI-representing objects to find a match. Once an object with matching properties is found, the tool gets a handle of it, but still does not &#8220;see&#8221; any visual representation.</p>
<h4>Parent-Child hierarchy</h4>
<p>GUI representation follows a &#8220;parent &#8211; child&#8221; hierarchy. Window contains a button, button contains a label. A parent can have many children, but each child has only one parent.</p>
<p>GUI recognition properties have to be a unique set in the context of the parent if you want recognition to be reliable.</p>
<h4>Depth-First Search</h4>
<p>To find objects with matching properties TestComplete uses <a href="http://en.wikipedia.org/wiki/Depth-first_search" target="_blank">depth-first search algorithm</a> which ensures quick exhaustive search down the chain of parents but makes the search longer if the target object belongs to parent chains further in the hierarchy.</p>
<h4>Handling objects</h4>
<p>Although software applications are unique on their own, presentation layer components (windows, buttons, lists, text boxes) are essentially the same and come in a finite small number. Yet the challenge of an automation tool is to recognize a particular class implementing the GUI element in order to get a hold of its properties and methods.</p>
<p>On the abstract, wrapping class for all the buttons is a single object, but in the underlying the wrapper must support button classes implemented in different libraries, for example, Dot Net and Delphi. For that purpose, TestComplete has &#8220;extensions&#8221;, loading of which is controlled.</p>
<p><script type="text/javascript"><!--
google_ad_client = "pub-4470793787913935";
/* 4 links text line */
google_ad_slot = "5367351963";
google_ad_width = 468;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
<h3>What You Can Do*</h3>
<p>* Use combination of these methods to find a setup best meeting your needs.</p>
<h4>Disable unused extensions</h4>
<p>Go to &#8220;File \ Install Extensions&#8221; and revisit the list &#8211; its pretty big. If you for sure don&#8217;t work with certain application types then disable loading of extensions for them.</p>
<p><img class="alignnone size-full wp-image-5286" title="TC extensions" src="http://automation-beyond.com/wp/wp-content/uploads/2012/12/TC-extensions.png" alt="" width="495" height="428" /></p>
<h4>Limit search depth</h4>
<p>Whenever applicable, limit the depth of search. To see the difference in performance, you can try the following example:</p>
<pre class="brush: vb; title: ;">
  Dim PropNames, PropValues, IEProcess

  PropNames = Array(&quot;processname&quot;, &quot;index&quot;)
  PropValues = Array(&quot;iexplore&quot;, 1)

  Set IEProcess = Sys.FindChild(PropNames, PropValues, 100, True)

  PropNames = Array(&quot;processname&quot;, &quot;index&quot;)
  PropValues = Array(&quot;iexplore&quot;, 1)

  Set IEProcess = Sys.FindChild(PropNames, PropValues, 1, True)
</pre>
<h4>Use Process Filter</h4>
<p>You can instruct TestComplete to &#8220;ignore&#8221; all but specified processes. Go to &#8220;Tools\ Current Project Properties&#8221; -&gt; &#8220;Open Applications\ Process Filter&#8221;.</p>
<p><img class="alignnone size-full wp-image-5289" style="border: 1px solid black;" title="TC Process Filter" src="http://automation-beyond.com/wp/wp-content/uploads/2012/12/TC-Process-Filter.png" alt="" width="450" height="277" /></p>
<p>The effect of this setting is that TestComplete doesn&#8217;t have to scan GUI of other processes and doesn&#8217;t have to load wrappers for all kinds of objects.</p>
<p>This setting might give you the best performance win; however, it can only be switched manually, which is inconvenient while running a batch that tests application in different browsers.</p>
<p>&nbsp;</p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://automation-beyond.com/2010/12/16/automation-tutorials-page-update/" rel="bookmark" class="crp_title">Automation Tutorials &#8211; Page Update</a></li><li><a href="http://automation-beyond.com/2008/06/30/service-functions-msxmldom/" rel="bookmark" class="crp_title">Service Functions &#8211; MSXMLDOM (QTP, TestComplete, VBScript)</a></li><li><a href="http://automation-beyond.com/2011/07/20/xmlnodeset2dictionary/" rel="bookmark" class="crp_title">XMLNodeSet2Dictionary (QTP, TestComplete, VBScript)</a></li><li><a href="http://automation-beyond.com/2008/08/05/p_getxmlelementattrtext/" rel="bookmark" class="crp_title">p_GetXMLElementAttrText (QTP, TestComplete, VBScript)</a></li><li><a href="http://automation-beyond.com/2009/01/09/service-functions-dictionary/" rel="bookmark" class="crp_title">Service Functions – Dictionary (QTP, TestComplete, VBScript)</a></li></ul></div>
]]></content:encoded>
			<wfw:commentRss>http://automation-beyond.com/2012/12/12/testcomplete-9-performance-tuning/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to retrieve value from text node div/span/p (TestComplete)</title>
		<link>http://automation-beyond.com/2012/11/24/how-to-retrieve-value-from-text-node-divspanp-testcomplete/</link>
		<comments>http://automation-beyond.com/2012/11/24/how-to-retrieve-value-from-text-node-divspanp-testcomplete/#comments</comments>
		<pubDate>Sat, 24 Nov 2012 10:17:59 +0000</pubDate>
		<dc:creator>Albert Gareev</dc:creator>
				<category><![CDATA[How to]]></category>
		<category><![CDATA[Source code]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[Example]]></category>
		<category><![CDATA[retrieve]]></category>
		<category><![CDATA[sample]]></category>
		<category><![CDATA[snippet]]></category>
		<category><![CDATA[source]]></category>
		<category><![CDATA[Span]]></category>
		<category><![CDATA[testcomplete]]></category>
		<category><![CDATA[text]]></category>
		<category><![CDATA[textnode]]></category>
		<category><![CDATA[value]]></category>
		<category><![CDATA[VBScript]]></category>
		<category><![CDATA[web element]]></category>

		<guid isPermaLink="false">http://automation-beyond.com/?p=5309</guid>
		<description><![CDATA[Description Let&#8217;s say we need to retrieve a number of megabytes from under &#8220;Lots of space&#8221; category. First, we need to explore the GUI implementation. If we&#8217;re lucky, this text node may have a unique class or ID value. Then it becomes a one-step search as in the code example below. However, if the text node doesn&#8217;t have [...]]]></description>
			<content:encoded><![CDATA[
<p><div style="position: relative; z-index:1;"><script type="text/javascript"><!--
google_ad_client = "pub-4470793787913935";
/* Banner 468x60 */
google_ad_slot = "8933038987";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div></p>
<h4>Description</h4>
<p>Let&#8217;s say we need to retrieve a number of megabytes from under &#8220;Lots of space&#8221; category.</p>
<p><img class="alignnone size-full wp-image-5311" style="border: 1px solid black;" title="Span1" src="http://automation-beyond.com/wp/wp-content/uploads/2012/11/Span1.png" alt="" width="593" height="302" /></p>
<p>First, we need to explore the GUI implementation. If we&#8217;re lucky, this text node may have a unique class or ID value. Then it becomes a one-step search as in the code example below.</p>
<p>However, if the text node doesn&#8217;t have distinct identification properties we have to locate it through one of parents/grandparents that can be identified reliably. Then in the context of the parent we can locate the target text and extract it.</p>
<h4>Implementation</h4>
<p><script type="text/javascript"><!--
google_ad_client = "pub-4470793787913935";
/* 4 links text line */
google_ad_slot = "5367351963";
google_ad_width = 468;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
<pre class="brush: vb; title: ;">
  Dim PropNames, PropValues, IEProcess
  Dim objSpan1, objParent

  'Before running this code example make sure Google Mail Login page is up in IE

  PropNames = Array(&quot;processname&quot;, &quot;index&quot;)
  PropValues = Array(&quot;iexplore&quot;, 1)
  Set IEProcess = Sys.FindChild(PropNames, PropValues, 1, True)
  If Not IEProcess.Exists Then
    'not found - exit
  End If

  '1 - Locating span by html ID
  PropNames = Array(&quot;ObjectType&quot;, &quot;idStr&quot;)
  PropValues = Array(&quot;TextNode&quot;, &quot;quota&quot;)
  Set objSpan1 = IEProcess.FindChild(PropNames, PropValues, 100, True)
  MsgBox objSpan1.contentText

  '2 - Locating span via parent object
  'Get parent
  PropNames = Array(&quot;ObjectType&quot;, &quot;tagName&quot;, &quot;className&quot;)
  PropValues = Array(&quot;Panel&quot;, &quot;div&quot;, &quot;product-info mail&quot;)
  Set objParent = IEProcess.FindChild(PropNames, PropValues, 100, True)
  'Get paragraph in parent
  PropNames = Array(&quot;tagName&quot;, &quot;contentText&quot;)
  PropValues = Array(&quot;P&quot;, &quot;*megabytes*&quot;)
  Set objSpan1 = objParent.FindChild(PropNames, PropValues, 100, True)
  'Little parsing to retrieve the number
  MsgBox Mid(Left(objSpan1.contentText, InStr(objSpan1.contentText, &quot;megabytes&quot;)-1), 5)
</pre>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://automation-beyond.com/2009/09/07/gp-automation-gui-names/" rel="bookmark" class="crp_title">GP/QTP Automation: Addressing GUI names issue</a></li><li><a href="http://automation-beyond.com/2009/11/14/qtp-xml-service-functions-6/" rel="bookmark" class="crp_title">QTP-XML service functions (6) – CreateChildElementByName</a></li><li><a href="http://automation-beyond.com/2012/09/08/childattributevaluebyname/" rel="bookmark" class="crp_title">ChildAttributeValueByName (QTP, TestComplete, VBScript)</a></li><li><a href="http://automation-beyond.com/2011/12/06/movechildelements/" rel="bookmark" class="crp_title">MoveChildElements (QTP, TestComplete, VBScript)</a></li><li><a href="http://automation-beyond.com/2011/10/20/xmlelementdepth/" rel="bookmark" class="crp_title">XMLElementDepth (QTP, TestComplete, VBScript)</a></li></ul></div>
]]></content:encoded>
			<wfw:commentRss>http://automation-beyond.com/2012/11/24/how-to-retrieve-value-from-text-node-divspanp-testcomplete/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to simulate &#8220;mouse over&#8221; (TestComplete)</title>
		<link>http://automation-beyond.com/2012/11/17/how-to-simulate-mouse-over-testcomplete/</link>
		<comments>http://automation-beyond.com/2012/11/17/how-to-simulate-mouse-over-testcomplete/#comments</comments>
		<pubDate>Sat, 17 Nov 2012 10:55:30 +0000</pubDate>
		<dc:creator>Albert Gareev</dc:creator>
				<category><![CDATA[How to]]></category>
		<category><![CDATA[Source code]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[Example]]></category>
		<category><![CDATA[hover]]></category>
		<category><![CDATA[HoverMouse]]></category>
		<category><![CDATA[How]]></category>
		<category><![CDATA[mouse]]></category>
		<category><![CDATA[MouseOver]]></category>
		<category><![CDATA[Move]]></category>
		<category><![CDATA[OnMouseOver]]></category>
		<category><![CDATA[over]]></category>
		<category><![CDATA[sample]]></category>
		<category><![CDATA[snippet]]></category>
		<category><![CDATA[source]]></category>
		<category><![CDATA[testcomplete]]></category>
		<category><![CDATA[VBScript]]></category>

		<guid isPermaLink="false">http://automation-beyond.com/?p=5300</guid>
		<description><![CDATA[Description &#8220;Mouse Over&#8221; event triggers responses like highlighting, pop-up hints, etc. With TestComplete we can use one of GUI object&#8217;s methods &#8211; HoverMouse &#8211; to simulate mouse over by placing mouse cursor over object. Alternatively, we can use LLPlayer object to simulate mouse moves. In the example provided both methods are simulating mouse overs on [...]]]></description>
			<content:encoded><![CDATA[
<p><div style="position: relative; z-index:1;"><script type="text/javascript"><!--
google_ad_client = "pub-4470793787913935";
/* Banner 468x60 */
google_ad_slot = "8933038987";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div></p>
<h4>Description</h4>
<p>&#8220;Mouse Over&#8221; event triggers responses like highlighting, pop-up hints, etc.</p>
<ul>
<li>With TestComplete we can use one of GUI object&#8217;s methods &#8211; <em>HoverMouse</em> &#8211; to simulate mouse over by placing mouse cursor over object.</li>
<li>Alternatively, we can use <em>LLPlayer</em> object to simulate mouse moves.</li>
</ul>
<p>In the example provided both methods are simulating mouse overs on Google Search page.</p>
<h4>Implementation</h4>
<p><script type="text/javascript"><!--
google_ad_client = "pub-4470793787913935";
/* 4 links text line */
google_ad_slot = "5367351963";
google_ad_width = 468;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
<pre class="brush: vb; title: ;">
  Dim PropNames, PropValues, IEProcess
  Dim objSearch1, objSearch2
  Dim Iter

  'Before running this code example make sure Google Search page is up in IE

  PropNames = Array(&quot;processname&quot;, &quot;index&quot;)
  PropValues = Array(&quot;iexplore&quot;, 1)

  Set IEProcess = Sys.FindChild(PropNames, PropValues, 1, True)
  If Not IEProcess.Exists Then
    'not found - exit
  End If

  ' &quot;Google Search&quot; button
  PropNames = Array(&quot;ObjectType&quot;, &quot;ObjectIdentifier&quot;)
  PropValues = Array(&quot;SubmitButton&quot;, &quot;btnK&quot;)
  Set objSearch1 = IEProcess.FindChild(PropNames, PropValues, 100, True)
  If Not objSearch1.Exists Then
    'not found - exit
  End If

  ' &quot;I'm Feeling Lucky&quot; button
  PropNames = Array(&quot;ObjectType&quot;, &quot;ObjectIdentifier&quot;)
  PropValues = Array(&quot;SubmitButton&quot;, &quot;btnI&quot;)
  Set objSearch2 = IEProcess.FindChild(PropNames, PropValues, 100, True)
  If Not objSearch2.Exists Then
    'not found - exit
  End If

  '1st method
  For Iter = 1 To 2
    objSearch1.HoverMouse
    aqUtils.Delay 500

    objSearch2.HoverMouse
    aqUtils.Delay 500
  Next

  '2nd method
  For Iter = objSearch1.ScreenLeft To objSearch1.ScreenLeft+objSearch1.Width
    Call LLPlayer.MouseMove(Iter, objSearch1.ScreenTop+Int(objSearch1.Height/2), 10)
  Next
</pre>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://automation-beyond.com/2010/09/07/anti-sleep-function2/" rel="bookmark" class="crp_title">Anti sleep function (TestComplete, VBScript, LLPlayer)</a></li><li><a href="http://automation-beyond.com/2010/12/16/automation-tutorials-page-update/" rel="bookmark" class="crp_title">Automation Tutorials &#8211; Page Update</a></li><li><a href="http://automation-beyond.com/2009/07/24/test-automation-workarounds/" rel="bookmark" class="crp_title">Test Automation Workarounds</a></li><li><a href="http://automation-beyond.com/2008/06/30/service-functions-msxmldom/" rel="bookmark" class="crp_title">Service Functions &#8211; MSXMLDOM (QTP, TestComplete, VBScript)</a></li><li><a href="http://automation-beyond.com/2011/07/20/xmlnodeset2dictionary/" rel="bookmark" class="crp_title">XMLNodeSet2Dictionary (QTP, TestComplete, VBScript)</a></li></ul></div>
]]></content:encoded>
			<wfw:commentRss>http://automation-beyond.com/2012/11/17/how-to-simulate-mouse-over-testcomplete/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Free test data generators</title>
		<link>http://automation-beyond.com/2012/10/14/free-test-data-generators/</link>
		<comments>http://automation-beyond.com/2012/10/14/free-test-data-generators/#comments</comments>
		<pubDate>Sun, 14 Oct 2012 10:56:22 +0000</pubDate>
		<dc:creator>Albert Gareev</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[free]]></category>
		<category><![CDATA[generator]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://automation-beyond.com/?p=5305</guid>
		<description><![CDATA[Here are a few free data generator tools available online. Lorem Ipsum It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to [...]]]></description>
			<content:encoded><![CDATA[
<p><div style="position: relative; z-index:1;"><script type="text/javascript"><!--
google_ad_client = "pub-4470793787913935";
/* Banner 468x60 */
google_ad_slot = "8933038987";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div></p>
<p>Here are a few free data generator tools available online.</p>
<ol>
<li><a href="http://lipsum.com/" target="_blank">Lorem Ipsum</a><br />
It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using &#8216;Content here, content here&#8217;, making it look like readable English.<br />
You can specify amount of data to generate in paragraphs, words, bytes.</li>
<li> <a href="http://www.fakenamegenerator.com/">www.fakenamegenerator.com</a><br />
To generate detailed “personal records” – name, gender, date of birth, address, credit card, phone, email, occupation, and many other data fields.</li>
<li><a href="http://en.wikipedia.org/wiki/Main_Page" target="_blank">Wikipedia</a><br />
Although it&#8217;s not a data generator by purpose, it&#8217;s multi-language articles come extremely handy.</li>
</ol>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://automation-beyond.com/2011/02/16/custom-markers-xmind/" rel="bookmark" class="crp_title">How to use custom markers with XMind (mindmap)</a></li><li><a href="http://automation-beyond.com/2007/01/15/on-test-data/" rel="bookmark" class="crp_title">On Test Data</a></li><li><a href="http://automation-beyond.com/2011/03/01/generating-test-reports-the-approach/" rel="bookmark" class="crp_title">Generating Test Reports (the approach)</a></li><li><a href="http://automation-beyond.com/2010/11/25/ultimate-paint/" rel="bookmark" class="crp_title">Free Image Editor &#8211; Ultimate Paint</a></li><li><a href="http://automation-beyond.com/2011/01/11/blog-maintenance-ahead-2/" rel="bookmark" class="crp_title">Blog maintenance ahead</a></li></ul></div>
]]></content:encoded>
			<wfw:commentRss>http://automation-beyond.com/2012/10/14/free-test-data-generators/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ChildAttributeValueByName (QTP, TestComplete, VBScript)</title>
		<link>http://automation-beyond.com/2012/09/08/childattributevaluebyname/</link>
		<comments>http://automation-beyond.com/2012/09/08/childattributevaluebyname/#comments</comments>
		<pubDate>Sat, 08 Sep 2012 11:53:11 +0000</pubDate>
		<dc:creator>Albert Gareev</dc:creator>
				<category><![CDATA[Source code]]></category>
		<category><![CDATA[XML Data]]></category>
		<category><![CDATA[Attribute]]></category>
		<category><![CDATA[Child]]></category>
		<category><![CDATA[Child Attribute]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[Example]]></category>
		<category><![CDATA[function]]></category>
		<category><![CDATA[How]]></category>
		<category><![CDATA[How to]]></category>
		<category><![CDATA[MSXMLDOM]]></category>
		<category><![CDATA[Node]]></category>
		<category><![CDATA[QTP]]></category>
		<category><![CDATA[return]]></category>
		<category><![CDATA[sample]]></category>
		<category><![CDATA[snippet]]></category>
		<category><![CDATA[Test Automation]]></category>
		<category><![CDATA[testcomplete]]></category>
		<category><![CDATA[to]]></category>
		<category><![CDATA[VBScript]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[XMLDOM]]></category>

		<guid isPermaLink="false">http://automation-beyond.com/?p=5263</guid>
		<description><![CDATA[Parent page: Service Functions – MSXMLDOM (QTP, TestComplete, VBScript) Description Returns text value of node&#8217;s child attribute specified by name. Valid arguments: an XML element node (NODE_ELEMENT type), name of the attribute. If XML node is not defined, returns empty string. Uses private function p_GetXMLElementAttrText, defined within the library (see parent page). Implementation Public Function [...]]]></description>
			<content:encoded><![CDATA[
<p>Parent page: <a title="Service Functions – MSXMLDOM (QTP, TestComplete, VBScript)" href="http://automation-beyond.com/2008/06/30/service-functions-msxmldom/" target="_blank">Service Functions – MSXMLDOM (QTP, TestComplete, VBScript)</a></p>
<p><div style="position: relative; z-index:1;"><script type="text/javascript"><!--
google_ad_client = "pub-4470793787913935";
/* Banner 468x60 */
google_ad_slot = "8933038987";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div></p>
<h4>Description</h4>
<ul>
<li>Returns text value of node&#8217;s child attribute specified by name.</li>
<li>Valid arguments: an XML element node (NODE_ELEMENT type), name of the attribute.</li>
<li>If XML node is not defined, returns empty string.</li>
<li>Uses private function p_GetXMLElementAttrText, defined within the library (see parent page).</li>
</ul>
<h4>Implementation</h4>
<p><script type="text/javascript"><!--
google_ad_client = "pub-4470793787913935";
/* 4 links text line */
google_ad_slot = "5367351963";
google_ad_width = 468;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
<pre class="brush: vb; title: ;">
Public Function ChildAttributeValueByName(ByRef objXMLNode, ByVal sAttrName)
  If objXMLNode is Nothing Then
    ChildAttributeValueByName = &quot;&quot;
    Exit Function
  End If
  sAttrName = Trim(sAttrName)
  ChildAttributeValueByName = p_GetXMLElementAttrText(objXMLNode, sAttrName)
End Function
</pre>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://automation-beyond.com/2009/07/17/qtp-xml-service-functions-4/" rel="bookmark" class="crp_title">QTP-XML service functions (4) – ChildAttributeValueByName</a></li><li><a href="http://automation-beyond.com/2008/06/30/service-functions-msxmldom/" rel="bookmark" class="crp_title">Service Functions &#8211; MSXMLDOM (QTP, TestComplete, VBScript)</a></li><li><a href="http://automation-beyond.com/2009/12/09/generating-text-file-from-xml-template/" rel="bookmark" class="crp_title">Generating text file from XML template (QTP, VBScript)</a></li><li><a href="http://automation-beyond.com/2009/01/09/service-functions-dictionary/" rel="bookmark" class="crp_title">Service Functions – Dictionary (QTP, TestComplete, VBScript)</a></li><li><a href="http://automation-beyond.com/2009/10/26/gp-automation-highlight-controls/" rel="bookmark" class="crp_title">GP/QTP Automation: Highlight controls in Dexterity Window</a></li></ul></div>
]]></content:encoded>
			<wfw:commentRss>http://automation-beyond.com/2012/09/08/childattributevaluebyname/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
