<?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 &#187; Heuristics</title>
	<atom:link href="http://automation-beyond.com/category/testing/heuristics/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>Fri, 20 Apr 2012 13:30:04 +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>Numeric Boundary Testing (MindMap)</title>
		<link>http://automation-beyond.com/2011/07/05/numeric-boundary-testing-mindmap/</link>
		<comments>http://automation-beyond.com/2011/07/05/numeric-boundary-testing-mindmap/#comments</comments>
		<pubDate>Tue, 05 Jul 2011 10:38:28 +0000</pubDate>
		<dc:creator>Albert Gareev</dc:creator>
				<category><![CDATA[Heuristics]]></category>
		<category><![CDATA[Mind Maps]]></category>
		<category><![CDATA[2. Testing]]></category>
		<category><![CDATA[boundary]]></category>
		<category><![CDATA[challenges]]></category>
		<category><![CDATA[container]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[engineering]]></category>
		<category><![CDATA[exploratory]]></category>
		<category><![CDATA[freemind]]></category>
		<category><![CDATA[heuristic]]></category>
		<category><![CDATA[James Bach]]></category>
		<category><![CDATA[Map]]></category>
		<category><![CDATA[method]]></category>
		<category><![CDATA[Mind]]></category>
		<category><![CDATA[mindmap]]></category>
		<category><![CDATA[number]]></category>
		<category><![CDATA[overflow]]></category>
		<category><![CDATA[problem]]></category>
		<category><![CDATA[quality]]></category>
		<category><![CDATA[reverse]]></category>
		<category><![CDATA[risk-based]]></category>
		<category><![CDATA[technique]]></category>
		<category><![CDATA[test]]></category>
		<category><![CDATA[testing methodology]]></category>
		<category><![CDATA[value]]></category>
		<category><![CDATA[weakness]]></category>
		<category><![CDATA[weakness-oriented]]></category>
		<category><![CDATA[XMind]]></category>

		<guid isPermaLink="false">http://automation-beyond.com/?p=4168</guid>
		<description><![CDATA[I created this mindmap quite a while ago, as a follow-up to Data Container Boundaries and Complex Data Boundaries blog posts. Due to poor visualization capabilities of Freemind, I used previously, (before going with XMind), I decided to draw the mindmap manually, in MS Paint. That took me loooong time but I liked the result. Although, now I would write the [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fautomation-beyond.com%252F2011%252F07%252F05%252Fnumeric-boundary-testing-mindmap%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2FijI7Uj%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Numeric%20Boundary%20Testing%20%28MindMap%29%22%20%7D);"></div>
<p>I created this mindmap quite a while ago, as a follow-up to <a title="Data Container Boundaries" href="http://automation-beyond.com/2009/10/07/data-container-boundaries/" target="_blank">Data Container Boundaries</a> and <a title="Complex data boundaries" href="http://automation-beyond.com/2009/11/02/complex-data-boundaries/" target="_blank">Complex Data Boundaries</a> blog posts. Due to poor visualization capabilities of Freemind, I used previously, (before going with <a href="http://www.xmind.net/account/agareev/" target="_blank">XMind</a>), I decided to draw the mindmap manually, in MS Paint. That took me loooong time but I liked the result. Although, now I would write the posts differently in some aspects, and I <em>will</em> get back to the theme of heuristic-based boundary testing.</p>
<p>Below you can view and compare manually created map and the one designed with XMind tool.</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>
<p><a href="http://automation-beyond.com/wp/wp-content/uploads/2011/01/Number-Boundary-Testing.jpg" target="_blank"><img class="alignnone size-medium wp-image-4170" title="Number Boundary Testing" src="http://automation-beyond.com/wp/wp-content/uploads/2011/01/Number-Boundary-Testing-300x225.jpg" alt="" width="300" height="225" /></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>
<p><a href="http://automation-beyond.com/wp/wp-content/uploads/2011/01/Number-Boundary-Testing1.jpg" target="_blank"><img class="alignnone size-medium wp-image-4171" title="Number Boundary Testing" src="http://automation-beyond.com/wp/wp-content/uploads/2011/01/Number-Boundary-Testing1-300x167.jpg" alt="" width="300" height="167" /></a></p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://automation-beyond.com/2011/09/26/functional-load-testing/" rel="bookmark" class="crp_title">Functional Load Testing &#8211; MindMap</a></li><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/2009/08/11/test-automation-problems-4b/" rel="bookmark" class="crp_title">Test Automation Problems (4) &#8211; Implementation Approach &#8211; Coverage</a></li><li><a href="http://automation-beyond.com/2011/04/19/functionality-testing-mindmap/" rel="bookmark" class="crp_title">Functionality Testing &#8211; Mindmap</a></li><li><a href="http://automation-beyond.com/2007/05/22/built-in-verification-too-simple/" rel="bookmark" class="crp_title">Built-in verification in Testing Tools &#8211; too simple, too narrow</a></li></ul></div>
]]></content:encoded>
			<wfw:commentRss>http://automation-beyond.com/2011/07/05/numeric-boundary-testing-mindmap/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Functionality Testing &#8211; Mindmap</title>
		<link>http://automation-beyond.com/2011/04/19/functionality-testing-mindmap/</link>
		<comments>http://automation-beyond.com/2011/04/19/functionality-testing-mindmap/#comments</comments>
		<pubDate>Tue, 19 Apr 2011 10:29:51 +0000</pubDate>
		<dc:creator>Albert Gareev</dc:creator>
				<category><![CDATA[Heuristics]]></category>
		<category><![CDATA[Mind Maps]]></category>
		<category><![CDATA[2. Testing]]></category>
		<category><![CDATA[based]]></category>
		<category><![CDATA[functional]]></category>
		<category><![CDATA[heuristic]]></category>
		<category><![CDATA[James Bach]]></category>
		<category><![CDATA[Map]]></category>
		<category><![CDATA[Michael Bolton]]></category>
		<category><![CDATA[Mind]]></category>
		<category><![CDATA[mindmap]]></category>
		<category><![CDATA[model]]></category>

		<guid isPermaLink="false">http://automation-beyond.com/?p=4579</guid>
		<description><![CDATA[While getting ready for the Rapid Software Testing course I dedicated some time for the “homework” – studying of publicly available exploratory testing documents. And here’s my ideas on Functionality Testing. References Heuristic Test Strategy Model – Satisfice, Inc. – Designed by James Bach Michael Bolton, DevelopSense: Testers Know That Things Can Be Different Related [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fautomation-beyond.com%252F2011%252F04%252F19%252Ffunctionality-testing-mindmap%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2Ff8Hvfx%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Functionality%20Testing%20-%20Mindmap%22%20%7D);"></div>
<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><a href="http://automation-beyond.com/wp/wp-content/uploads/2011/04/FUNCTIONALITY.jpg"><img class="alignnone size-medium wp-image-4581" title="FUNCTIONALITY" src="http://automation-beyond.com/wp/wp-content/uploads/2011/04/FUNCTIONALITY-300x176.jpg" alt="" width="300" height="176" /></a></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>
<p>While getting ready for the <a href="http://www.developsense.com/courses.html" target="_blank">Rapid Software Testing course</a> I dedicated some time for the “homework” – studying of publicly available exploratory testing documents. And here’s my ideas on Functionality Testing.</p>
<h4>References</h4>
<p><a href="http://www.satisfice.com/tools/satisfice-tsm-4p.pdf" target="_blank">Heuristic Test Strategy Model – Satisfice, Inc. – Designed by James Bach</a></p>
<p><a href="http://www.developsense.com/" target="_blank">Michael Bolton, DevelopSense: Testers Know That Things Can Be Different</a></p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://automation-beyond.com/2011/07/05/numeric-boundary-testing-mindmap/" rel="bookmark" class="crp_title">Numeric Boundary Testing (MindMap)</a></li><li><a href="http://automation-beyond.com/2011/09/26/functional-load-testing/" rel="bookmark" class="crp_title">Functional Load Testing &#8211; MindMap</a></li><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/2011/04/18/claims-testing-mindmap/" rel="bookmark" class="crp_title">Claims Testing &#8211; Mindmap</a></li><li><a href="http://automation-beyond.com/2009/08/11/test-automation-problems-4b/" rel="bookmark" class="crp_title">Test Automation Problems (4) &#8211; Implementation Approach &#8211; Coverage</a></li></ul></div>
]]></content:encoded>
			<wfw:commentRss>http://automation-beyond.com/2011/04/19/functionality-testing-mindmap/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Claims Testing &#8211; Mindmap</title>
		<link>http://automation-beyond.com/2011/04/18/claims-testing-mindmap/</link>
		<comments>http://automation-beyond.com/2011/04/18/claims-testing-mindmap/#comments</comments>
		<pubDate>Mon, 18 Apr 2011 10:11:41 +0000</pubDate>
		<dc:creator>Albert Gareev</dc:creator>
				<category><![CDATA[Heuristics]]></category>
		<category><![CDATA[Mind Maps]]></category>
		<category><![CDATA[2. Testing]]></category>
		<category><![CDATA[based]]></category>
		<category><![CDATA[heuristic]]></category>
		<category><![CDATA[James Bach]]></category>
		<category><![CDATA[Map]]></category>
		<category><![CDATA[Michael Bolton]]></category>
		<category><![CDATA[Mind]]></category>
		<category><![CDATA[mindmap]]></category>
		<category><![CDATA[model]]></category>

		<guid isPermaLink="false">http://automation-beyond.com/?p=4574</guid>
		<description><![CDATA[While getting ready for the Rapid Software Testing course I dedicated some time for the &#8220;homework&#8221; &#8211; studying of publicly available exploratory testing documents. And here&#8217;s my ideas on Claims Testing. References Heuristic Test Strategy Model &#8211; Satisfice, Inc. &#8211; Designed by James Bach Michael Bolton, DevelopSense: Testers Know That Things Can Be Different Related [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fautomation-beyond.com%252F2011%252F04%252F18%252Fclaims-testing-mindmap%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2FgNO2Tq%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Claims%20Testing%20-%20Mindmap%22%20%7D);"></div>
<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><a href="http://automation-beyond.com/wp/wp-content/uploads/2011/04/CLAIMS.jpg" target="_blank"><img class="alignnone size-medium wp-image-4576" title="CLAIMS" src="http://automation-beyond.com/wp/wp-content/uploads/2011/04/CLAIMS-300x190.jpg" alt="" width="300" height="190" /></a></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>
<p>While getting ready for the <a href="http://www.developsense.com/courses.html" target="_blank">Rapid Software Testing course</a> I dedicated some time for the &#8220;homework&#8221; &#8211; studying of publicly available exploratory testing documents. And here&#8217;s my ideas on Claims Testing.</p>
<h4>References</h4>
<p><a href="http://www.satisfice.com/tools/satisfice-tsm-4p.pdf" target="_blank">Heuristic Test Strategy Model &#8211; Satisfice, Inc. &#8211; Designed by James Bach</a></p>
<p><a href="http://www.developsense.com/" target="_blank">Michael Bolton, DevelopSense: Testers Know That Things Can Be Different</a></p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://automation-beyond.com/2011/07/05/numeric-boundary-testing-mindmap/" rel="bookmark" class="crp_title">Numeric Boundary Testing (MindMap)</a></li><li><a href="http://automation-beyond.com/2011/08/20/weekend-testing-mindmapping/" rel="bookmark" class="crp_title">Weekend Testing: Mindmapping</a></li><li><a href="http://automation-beyond.com/2011/09/26/functional-load-testing/" rel="bookmark" class="crp_title">Functional Load Testing &#8211; MindMap</a></li><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/2011/04/19/functionality-testing-mindmap/" rel="bookmark" class="crp_title">Functionality Testing &#8211; Mindmap</a></li></ul></div>
]]></content:encoded>
			<wfw:commentRss>http://automation-beyond.com/2011/04/18/claims-testing-mindmap/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Considering probability in Boundary Testing, and beyond</title>
		<link>http://automation-beyond.com/2010/10/13/considering-probability/</link>
		<comments>http://automation-beyond.com/2010/10/13/considering-probability/#comments</comments>
		<pubDate>Wed, 13 Oct 2010 12:42:55 +0000</pubDate>
		<dc:creator>Albert Gareev</dc:creator>
				<category><![CDATA[Heuristics]]></category>
		<category><![CDATA[2. Testing]]></category>
		<category><![CDATA[case]]></category>
		<category><![CDATA[considered]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[Example]]></category>
		<category><![CDATA[exploratory]]></category>
		<category><![CDATA[Exploratory Testing]]></category>
		<category><![CDATA[happen]]></category>
		<category><![CDATA[heuristic]]></category>
		<category><![CDATA[investigation]]></category>
		<category><![CDATA[likelihood]]></category>
		<category><![CDATA[probability]]></category>
		<category><![CDATA[scenario]]></category>
		<category><![CDATA[test]]></category>
		<category><![CDATA[tester]]></category>
		<category><![CDATA[User]]></category>

		<guid isPermaLink="false">http://automation-beyond.com/?p=3949</guid>
		<description><![CDATA[How to find bugs quickly? How to pick just right test scenarios without losing your time trying thousands of possible combinations? These questions worth years of research. In my post I&#8217;m going to cover just one simple approach I practice quite successfully, and give a few examples you might be able to reproduce. Let&#8217;s start from [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fautomation-beyond.com%252F2010%252F10%252F13%252Fconsidering-probability%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Considering%20probability%20in%20Boundary%20Testing%2C%20and%20beyond%22%20%7D);"></div>
<p>How to find bugs quickly? How to pick just right test scenarios without losing your time trying thousands of possible combinations?</p>
<p>These questions worth years of research.</p>
<p>In my post I&#8217;m going to cover just one simple approach I practice quite successfully, and give a few examples you might be able to reproduce.</p>
<p>Let&#8217;s start from <a href="http://en.wikipedia.org/wiki/Probability" target="_blank">definition</a>.</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>
<blockquote><p><em><strong>Probability</strong> is a way of expressing knowledge or belief that an event will occur or has occurred. The concept has been given an exact mathematical meaning in probability theory, which is used extensively in such areas of study as mathematics, statistics, finance, gambling, science, and philosophy to draw conclusions about the likelihood of potential events and the underlying mechanics of complex systems.<br />
<strong>Wikipedia.org</strong></em></p></blockquote>
<p>As you can see, almost everything from the definition above applies to software testing. Complex systems &#8211; that&#8217;s what we investigate. Mathematics and statistics - is what we use in analysis. Gambling? &#8211; Well, testing involves guessing, and the thrill of the bug hunt is for sure addictive. Overall, software testing is an alloy of science and philosophy.</p>
<h3>Considering probability</h3>
<p>Exhaustive investigation of all possible boundary conditions is very time-consuming.  In the same time, after any code change of the particular functionality all boundary investigation results become obsolete. That is, unless you have infinite time, the primary goal is not to find all boundary bugs but look until we find the first important one, and then move on to another piece of functionality (Why? Please read about <a href="http://www.developsense.com/blog/2009/09/when-do-we-stop-test/" target="_blank">&#8220;The Dead Horse&#8221; and other stopping heuristics</a>).</p>
<p>And here is the rule of thumb I use.</p>
<p style="text-align: center;">Try first those Test Scenarios that</p>
<p style="text-align: center;"><strong>least likely were considered during implementation</strong><br />
and/or<br />
<strong>much likely can happen during use of the system.</strong></p>
<p> Note, that these two probabilities are not the same number. It could be &#8220;not considered but much likely to happen&#8221; (worst case) or &#8220;surely considered and unlikely to happen&#8221; (happy case).</p>
<h3>Examples</h3>
<h4>1. User Input Filtering and Validation</h4>
<p>Let&#8217;s assume, there is a requirement: a user can enter only numbers in the text box.</p>
<p>You try keystrokes using every single button on the keyboard, and see that invalid characters are successfully filtered. Then you type an invalid combination in Notepad, Ctrl-C, Ctrl-V, &#8211; and <em>voilà</em>! Programmer didn&#8217;t think of it, but a user can do it quite naturally.</p>
<p>Submitting a query with a date or date range in order to receive a report is quite common functionality in many applications.  Here I want to share how analysing response messages helped guessing programmer&#8217;s logic and finding gaps.</p>
<p>As a first step, I figured that expected format is MM/DD/YYYY, and front-end JavaScript marks &#8220;invalid&#8221; an input which is not exactly 10 characters.  Then I immediately entered MM0DD0YYYY combination and received a response that either &#8220;/&#8221; or &#8220;-&#8221; must be used as a separator. Nice! As it turned out, front-end filter accepted MM-DD/YYYY, MM/DD-YYYY combinations, but SQL on the back-end generated an error. In another branch of ideas I tried M/DDD/YYYY, MM//D/YYYY, MM/ D/YYYY combinations, and figured that front-end validation again misses some of them, while in the back-end that led to exceptions. </p>
<p>To admire programmers, the all exceptions were properly handled, so the application didn&#8217;t crush or broke business logic flow. However, my point was that properly filtering an invalid input in the first place is better behaviour than throwing back to user a message like &#8220;your input caused a problem but we&#8217;ve successfully recovered&#8221;, and development lead agreed upon that. </p>
<p>I want to emphasize here that those described above were quick trial-and-error tests without any automation. Automated GUI tests were engaged later in exhaustive testing to throw hundreds of possible combinations of valid and invalid boundary data to every field, and log behaviour of the system.</p>
<h4>2. &#8220;Broken Procedure&#8221; Tests</h4>
<p>Most of user-computer interactions are based on linear procedures: &#8220;input-output&#8221;, &#8220;request-response&#8221;. Trying to distort a procedure in time or context sometimes brings interesting effects.</p>
<p>You may try the example, illustrated with screenshots below, on your system with Windows Explorer; the defect it causes is quite harmless and does not require any recovery steps.  </p>
<p><span style="color: #808080;">(Note. The consequences of human mistake triggered by the defect might be not so harmless.)</span></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>
<p>1. Find or create a folder with a few subfolders inside.</p>
<p><img class="alignnone size-full wp-image-3952" title="TestFolder-0" src="http://automation-beyond.com/wp/wp-content/uploads/2010/10/TestFolder-0.jpg" alt="TestFolder-0" width="295" height="230" /></p>
<p>2. Double-click on the second last subfolder to get inside.</p>
<p><img class="alignnone size-full wp-image-3953" title="TestFolder-7" src="http://automation-beyond.com/wp/wp-content/uploads/2010/10/TestFolder-7.jpg" alt="TestFolder-7" width="295" height="230" /></p>
<p>3. Click &#8220;Back&#8221; button on Explorer&#8217;s toolbar.<br />
Now you are back in the parent folder. Note, that selection (highlighted list item) shows the last item you clicked, which is quite valid.</p>
<p><img class="alignnone size-full wp-image-3954" title="TestFolder-7-selected" src="http://automation-beyond.com/wp/wp-content/uploads/2010/10/TestFolder-7-selected.jpg" alt="TestFolder-7-selected" width="295" height="230" /></p>
<p>4. Now try selecting together the subfolder you&#8217;ve been inside (it was the second last one) and the last subfolder. If you tried on other subfolder, somewhere in the middle of the list, that&#8217;s OK. Still try to select a range between your subfolder and the last one.</p>
<p><em>While holding &#8220;Shift&#8221;, click on the last subfolder.</em></p>
<p>Oops! Somehow you get <em>all</em> subfolders selected.</p>
<p><img class="alignnone size-full wp-image-3955" title="TestFolder-8-selected-all" src="http://automation-beyond.com/wp/wp-content/uploads/2010/10/TestFolder-8-selected-all.jpg" alt="TestFolder-8-selected-all" width="295" height="230" /></p>
<p>What can we get from here? During implementation of the selection procedure the following was assumed:</p>
<ul>
<li>Group selection takes the all list items between first item clicked and second item clicked</li>
<li>Clicked item, highlighted item, and selected item is the same</li>
</ul>
<p> </p>
<p>And, as it turned out, the second statement is not always true, but it can never be discovered if you test selection functionality as a separate and isolated procedure!</p>
<p>Now let me thank you for reading and you are more than welcome to share your own examples.</p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://automation-beyond.com/2011/07/05/numeric-boundary-testing-mindmap/" rel="bookmark" class="crp_title">Numeric Boundary Testing (MindMap)</a></li><li><a href="http://automation-beyond.com/2009/08/11/test-automation-problems-4b/" rel="bookmark" class="crp_title">Test Automation Problems (4) &#8211; Implementation Approach &#8211; Coverage</a></li><li><a href="http://automation-beyond.com/2010/09/23/you-have-to-digest-it/" rel="bookmark" class="crp_title">You have to digest it</a></li><li><a href="http://automation-beyond.com/2011/02/22/wta-07-questioning-the-mission/" rel="bookmark" class="crp_title">WTA07: Questioning the Mission</a></li><li><a href="http://automation-beyond.com/2010/06/03/testing-challenge-results/" rel="bookmark" class="crp_title">Testing Challenge: Results</a></li></ul></div>
]]></content:encoded>
			<wfw:commentRss>http://automation-beyond.com/2010/10/13/considering-probability/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>More on Unlearning</title>
		<link>http://automation-beyond.com/2010/07/22/more-on-unlearning/</link>
		<comments>http://automation-beyond.com/2010/07/22/more-on-unlearning/#comments</comments>
		<pubDate>Thu, 22 Jul 2010 12:00:54 +0000</pubDate>
		<dc:creator>Albert Gareev</dc:creator>
				<category><![CDATA[Heuristics]]></category>
		<category><![CDATA[Notes]]></category>
		<category><![CDATA[2. Testing]]></category>
		<category><![CDATA[Albert Gareev]]></category>
		<category><![CDATA[Example]]></category>
		<category><![CDATA[heuristic]]></category>
		<category><![CDATA[learning]]></category>
		<category><![CDATA[unlearning]]></category>

		<guid isPermaLink="false">http://automation-beyond.com/?p=3183</guid>
		<description><![CDATA[You must unlearn what you have learned. Master Yoda to Luke Skywalker Although Unlearning is not a testing heuristic itself, I found it very helpful in many activities &#8211; from testing and test automation to problem solving and management. That is why I wrote about Unlearning on quicktestingtips.com. Yet I wanted to share even more [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fautomation-beyond.com%252F2010%252F07%252F22%252Fmore-on-unlearning%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22More%20on%20Unlearning%22%20%7D);"></div>
<div class="wp-caption aligncenter" style="width: 490px"><a href="http://images3.wikia.nocookie.net/__cb20070305180240/starwars/images/a/a2/Yodalukedagobah.jpg" target="_blank"><img title="Master Yoda" src="http://images3.wikia.nocookie.net/__cb20070305180240/starwars/images/a/a2/Yodalukedagobah.jpg" alt="Master Yoda teaches Luke Skywalker" width="480" height="320" /></a><p class="wp-caption-text">Image courtesy: starwars.wikia.com</p></div>
<p style="text-align: right;"><em>You must unlearn what you have learned.</em><br />
<a href="http://starwars.wikia.com/wiki/Yoda" target="_blank">Master Yoda</a> to <a href="http://starwars.wikia.com/wiki/Luke_Skywalker" target="_blank">Luke Skywalker</a></p>
<p>Although Unlearning is not a testing heuristic itself, I found it very helpful in many activities &#8211; from testing and test automation to problem solving and management. That is why I <a onclick="pageTracker._trackPageview('/outbound/article/www.quicktestingtips.com');" href="http://www.quicktestingtips.com/tips/2010/07/unlearning-for-testers/" target="_blank">wrote</a> about Unlearning on quicktestingtips.com.</p>
<p>Yet I wanted to share even more about Unlearning, applied to testing, and beyond that, so here is my today’s post.</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>Test Requirements</h3>
<p>It&#8217;s nice when you have detailed test requirements which instruct you to verify that an application works the way it meant to do. But keep in mind that users don&#8217;t always read guides and instructions (or might even say &#8211; <em>never</em> read), so unlearn &#8220;right&#8221; user habits and try to do same tests in a weird manner.</p>
<h3>Test Management</h3>
<p>There is a long time known IT joke saying &#8220;Project Manager is a person who thinks nine women can deliver a baby in one month&#8221;. The idea of replacing experienced staff with cheap, unskilled resources, supplied in great numbers, with a hope that the same results will be achieved at low costs, still lives. However, if you want to unlearn it (or convince someone), I suggest you reading &#8220;<a href="http://www.polite-unlearning.svalbardrepublic.org/images/taylortermination.pdf" target="_blank">The Taylor Termination Programme</a>&#8221; story published on polite-unlearning.org web-site.</p>
<p>People were taught to believe in numbers. If your approach is &#8220;metrics first&#8221;, you may want to know that you will die from tomatoes. Surprised? Read the following case study &#8211; &#8220;<a href="http://www.polite-unlearning.svalbardrepublic.org/images/tomato.pdf" target="_blank">The Dread Tomato Addiction</a>&#8220;.</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>Testing</h3>
<p>Unlearning and re-learning testing habits could be fun.</p>
<p>Used to navigate through an application with mouse only? Try keyboard shortcuts, Space/Enter instead of clicking, Cut/Paste instead of typing, holding Ctrl/Shift during GUI manipulation.<br />
(One of little tricks here is that modern software has a lot of functionalities built-in by default. Operating in an unusual way you trigger them, or you <em>not</em> trigger pre-programmed event handlers thus affecting inner flags and counters in a program.)</p>
<p>Breaking sequences and not following assumptions is another way. Try performing an action before or after it&#8217;s expected, double-click instead of single click, manually pasting urls instead of clicking navigation links, Undo/Make changes/Redo cycles. Rename binary file to txt extension and feed it into your application. Change XML tags. Try French or Chinese input instead of English characters.</p>
<p>Parallel or reversed work instead of sequential. Here we have a variety of options; below I gave just a few examples that helped me exposing bugs in the past.</p>
<ul>
<li>Save / submit data (file, report, web-page, &#8230;) while requesting it as another user</li>
<li>Send / request data and disconnect session before receiving a confirmation)</li>
<li>Delete (to Recycle Bin) a named item (file, web content element, etc.), create a new one with the same name, and try to restore the deleted item</li>
<li>For scheduling and filtering functionalities, change computer dates and item dates</li>
</ul>
<p> </p>
<h3>Test Automation</h3>
<p>A successful test automation engineer must be proficient both in testing and programming.<br />
However, design of testing scripts requires unlearning from both tester&#8217;s and programmer&#8217;s habits.</p>
<p>That is, the following should be unlearned:</p>
<ul>
<li>automated testing is execution of testing scripts</li>
<li>testing script should mimic tester&#8217;s actions</li>
<li>testing script is a program that drives another program</li>
</ul>
<p> </p>
<h3>Further reading</h3>
<p><a href="http://www.unlearning101.com/" target="_blank">Unlearning101</a> by <a href="http://www.jumpthecurve.net/" target="_blank">Jack Uldrich</a></p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://automation-beyond.com/2010/08/26/2010-07-qtt-posts/" rel="bookmark" class="crp_title">2010/07 Quick Testing Tips posts archive</a></li></ul></div>
]]></content:encoded>
			<wfw:commentRss>http://automation-beyond.com/2010/07/22/more-on-unlearning/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Blink testing exercises</title>
		<link>http://automation-beyond.com/2010/06/17/blink-testing-exercises/</link>
		<comments>http://automation-beyond.com/2010/06/17/blink-testing-exercises/#comments</comments>
		<pubDate>Thu, 17 Jun 2010 12:16:19 +0000</pubDate>
		<dc:creator>Albert Gareev</dc:creator>
				<category><![CDATA[Exercises]]></category>
		<category><![CDATA[Heuristics]]></category>
		<category><![CDATA[2. Testing]]></category>
		<category><![CDATA[blink]]></category>
		<category><![CDATA[Blink Testing]]></category>
		<category><![CDATA[heuristic]]></category>
		<category><![CDATA[learn]]></category>
		<category><![CDATA[practice]]></category>
		<category><![CDATA[technique]]></category>
		<category><![CDATA[testcraft]]></category>
		<category><![CDATA[tester]]></category>

		<guid isPermaLink="false">http://automation-beyond.com/?p=2641</guid>
		<description><![CDATA[Blink testing, as described by James Bach and explained by Michael Bolton, is an oracle heuristic based on &#8220;snap judgment&#8221; effect. Try catching &#8220;bug&#8221; (an odd character) in patterns below. I arranged them by difficulty I had. Feel free to put your experience in comments. In full-screen view all characters are 10pt capitals, as in standard [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fautomation-beyond.com%252F2010%252F06%252F17%252Fblink-testing-exercises%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Blink%20testing%20exercises%22%20%7D);"></div>
<p>Blink testing, as <a href="http://www.satisfice.com/blog/archives/33" target="_blank">described by James Bach</a> and <a href="http://www.stickyminds.com/sitewide.asp?Function=edetail&amp;ObjectType=ART&amp;ObjectId=11309" target="_blank">explained by Michael Bolton</a>, is an oracle heuristic based on &#8220;snap judgment&#8221; effect.</p>
<p>Try catching &#8220;bug&#8221; (an odd character) in patterns below.<br />
I arranged them by difficulty <em>I</em> had. Feel free to put <em>your</em> experience in comments.</p>
<p>In full-screen view all characters are 10pt capitals, as in standard Notepad window. </p>
<h3>Easy difficulty</h3>
<p><a href="http://automation-beyond.com/wp/wp-content/uploads/2010/05/test1.jpg" target="_blank"><img class="size-medium wp-image-2642 alignnone" title="test1" src="http://automation-beyond.com/wp/wp-content/uploads/2010/05/test1-300x113.jpg" alt="" width="300" height="113" /></a></p>
<p>(click to see full-screen in a separate window)</p>
<p><a href="http://automation-beyond.com/wp/wp-content/uploads/2010/06/test5.jpg" target="_blank"><img class="alignnone size-medium wp-image-2646" title="test5" src="http://automation-beyond.com/wp/wp-content/uploads/2010/06/test5-300x113.jpg" alt="" width="300" height="113" /></a></p>
<p>(click to see full-screen in a separate window)</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>Medium difficulty</h3>
<p><a href="http://automation-beyond.com/wp/wp-content/uploads/2010/06/test2.jpg" target="_blank"><img class="alignnone size-medium wp-image-2647" title="test2" src="http://automation-beyond.com/wp/wp-content/uploads/2010/06/test2-300x112.jpg" alt="" width="300" height="112" /></a></p>
<p>(click to see full-screen in a separate window)</p>
<p><a href="http://automation-beyond.com/wp/wp-content/uploads/2010/06/test3.jpg" target="_blank"><img class="alignnone size-medium wp-image-2649" title="test3" src="http://automation-beyond.com/wp/wp-content/uploads/2010/06/test3-300x113.jpg" alt="" width="300" height="113" /></a></p>
<p>(click to see full-screen in a separate window)</p>
<h3>Hard difficulty</h3>
<p> <a href="http://automation-beyond.com/wp/wp-content/uploads/2010/06/test7.jpg" target="_blank"><img class="alignnone size-medium wp-image-2651" title="test7" src="http://automation-beyond.com/wp/wp-content/uploads/2010/06/test7-300x111.jpg" alt="" width="300" height="111" /></a></p>
<p>(click to see full-screen in a separate window)</p>
<p><div style="position: relative; z-index:1;"><script type="text/javascript"><!--
google_ad_client = "pub-4470793787913935";
/* Large Banner */
google_ad_slot = "7026207536";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div></p>
<h3>Impossible difficulty</h3>
<p><a href="http://automation-beyond.com/wp/wp-content/uploads/2010/06/test10.jpg" target="_blank"><img class="alignnone size-medium wp-image-2652" title="test10" src="http://automation-beyond.com/wp/wp-content/uploads/2010/06/test10-300x94.jpg" alt="" width="300" height="94" /></a></p>
<p>(click to see full-screen in a separate window)</p>
<h3>Copyright notice</h3>
<p>I maintain no copyright on the idea of such puzzles or the patterns used. I saw many of them on the Web on free resources, and I received some of them as fun stuff via mail.<br />
What I <em>did</em> was creating the patterns of same size, and saving them as images, to prevent cheating through source code view.</p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://automation-beyond.com/2010/08/25/2010-06-qtt-posts/" rel="bookmark" class="crp_title">2010/06 Quick Testing Tips posts archive</a></li><li><a href="http://automation-beyond.com/2011/11/14/personal-recommendation-rst/" rel="bookmark" class="crp_title">Personal Recommendation: Rapid Software Testing</a></li><li><a href="http://automation-beyond.com/2010/06/03/testing-challenge-results/" rel="bookmark" class="crp_title">Testing Challenge: Results</a></li><li><a href="http://automation-beyond.com/2009/11/13/do-you-want-to-help-with-the-all-new-software-testing-magazine/" rel="bookmark" class="crp_title">Do you want to help with the all new Software Testing magazine?</a></li><li><a href="http://automation-beyond.com/2011/12/23/mapping-testing-story/" rel="bookmark" class="crp_title">Mapping Testing Story (My article in The Testing Planet)</a></li></ul></div>
]]></content:encoded>
			<wfw:commentRss>http://automation-beyond.com/2010/06/17/blink-testing-exercises/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Complex Data Boundaries</title>
		<link>http://automation-beyond.com/2009/11/02/complex-data-boundaries/</link>
		<comments>http://automation-beyond.com/2009/11/02/complex-data-boundaries/#comments</comments>
		<pubDate>Mon, 02 Nov 2009 13:00:57 +0000</pubDate>
		<dc:creator>Albert Gareev</dc:creator>
				<category><![CDATA[Heuristics]]></category>
		<category><![CDATA[2. Testing]]></category>
		<category><![CDATA[array]]></category>
		<category><![CDATA[boundary]]></category>
		<category><![CDATA[challenges]]></category>
		<category><![CDATA[heuristic]]></category>
		<category><![CDATA[method]]></category>
		<category><![CDATA[number]]></category>
		<category><![CDATA[overflow]]></category>
		<category><![CDATA[string]]></category>
		<category><![CDATA[technique]]></category>
		<category><![CDATA[test]]></category>
		<category><![CDATA[testing methodology]]></category>

		<guid isPermaLink="false">http://automationbeyond.wordpress.com/?p=513</guid>
		<description><![CDATA[Complex Data Boundaries: overflow or type mismatch? Complex data types are created by composition of basic data types. Compositions of data of the same type are formed as arrays. Compositions of data of different type are formed as records. There are internal (technical) rules defining how complex data types are managed. The rules are platform and [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fautomation-beyond.com%252F2009%252F11%252F02%252Fcomplex-data-boundaries%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Complex%20Data%20Boundaries%22%20%7D);"></div>
<h3>Complex Data Boundaries: overflow or type mismatch?</h3>
<p>Complex data types are created by composition of basic data types. Compositions of data of the same type are formed as arrays. Compositions of data of different type are formed as records.</p>
<p>There are internal (technical) rules defining how complex data types are managed. The rules are platform and programming language specific. </p>
<h4 style="text-align: left;">Arrays and pointers</h4>
<p>For the each dimension it has, an array has minimal and maximal index boundaries defined as numbers. In some programming languages array index begins with 0, in some other – with 1. That leads to lots of confuses based on:</p>
<ul>
<li>First element should be accessed as Array(0),</li>
<li>Last element should be accessed as Array(Number_of_elements minus one) </li>
</ul>
<p>When reported to the screen indexes should be converted to 1-based notations. When an input is received it should be converted to 0-based index before addressing an array element. </p>
<p>To overcome that issue programmers use various approaches. For example, I have seen the code below on a few projects and in different companies:</p>
<p>Months = Array (“Zerourary”, “January”, “February”, “March”, “April”, “May”, “June”, “July”, “August”, “September”, “October”, “November”, “December”)<br />
“Zerourary” month is defined to occupy the first slot which has index 0. </p>
<p>Arrays may occupy a static (defined) memory amount or dynamically allocated memory. Dynamically allocated memory is addressed by a pointer data type.</p>
<p>If a memory allocation operation fails, NULL (empty) value is assigned to a pointer. Any attempt to address memory under the NULL-pointer will cause a run-time error.</p>
<p>If memory is constantly being allocated and not released, a program may exhaust system resources and cause heap overflow error (and most likely will get crushed).</p>
<p>If memory was released then the pointer has an uncertain value (&#8220;dangling pointer&#8221;). If program code tries to use it (address memory for reading or writing) it will cause an error and may result in a crush of the program.</p>
<h4 style="text-align: left;">Strings</h4>
<p>String is an array consisting of characters. Some programming languages reserve 256 elements for a string type and store the actual number of characters at index 0 element. So the string may have up to 255 characters total. Depending on the programming language and compiler directives, when the actual number of characters is exceeded the string is silently truncated or an automatic exception is thrown. </p>
<h4 style="text-align: left;">Enumerations and lists</h4>
<p>Enumerations and lists define possible values that could be taken. In addition to index boundaries there are could be additional rules as in the following examples:</p>
<ul>
<li>an array must contain same or less number of items as in the enumeration (e.g. reporting week days in timesheet)</li>
<li>an array may not contain duplicated items from the enumeration (e.g. week days should not be duplicated in the example above)</li>
<li>some items may not be duplicated and some could be (e.g. one can have multiple brothers, sisters, sons, daughters but only one mother and father. To make it more complicated: some countries allow having multiple spouses) </li>
</ul>
<h4 style="text-align: left;">Records </h4>
<p>Records may represent closely related values, like year, month, and day for the date; or somewhat related only business-wise, for example last name and SIN. Often values stored in a record require transformation before output to the screen. These transformation rules are subject to change depending on regional settings and customization settings in the program. </p>
<p>A code operating records is oriented to the specific format. Code modules that pass in and back data records should either follow the same convention with a format or have bridging functions that perform the conversion. That applies both to back-end and front-end functions. </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>Testing the boundaries </h4>
<p><em>The approach</em> </p>
<p>While defects with these types of boundaries usually impose a high severity issues they can be relatively easy caught at very early stages of development. Implementation of automated Unit Tests is better investment here rather than implementation of automated functional tests.</p>
<p>However there are a few good functional test sets that allow quickly check the most common scenarios. Since complex data type boundaries are internal the main trick here is to make a code make a mistake. </p>
<p><strong><span style="text-decoration: underline;">Examples.</span></strong> </p>
<ul>
<li>Strings. Although GUI may not allow user to input strings exceeding the boundaries tester may try to make an application to produce a string of an inappropriate length. For example, if full name is constructed by an application as a combination like “last name comma first name” based on the manual input of first and last name.</li>
<li>Arrays and enumerations. Tries to make a code assigning a wrong value work very well with combo boxes (leave black, try multi-select, try typing value not presented in the list), list boxes (select none, select all), radio groups (select none) and combinations of those, for example, try input two mothers. </li>
</ul>
<p><em>The challenges</em> </p>
<p>The challenges in identifying and proving a defect are similar to the ones described in <a href="http://automation-beyond.com/2009/10/07/data-container-boundaries/" target="_blank">data container boundary testing</a>.</p>
<p>1. No immediate visible reaction</p>
<p>An application might accept an (invalid) input and still be alright. Causing it to output the value or use the value in some operations might help revealing a problem.</p>
<p>Boundary testing for a single value might require a whole scenario: post transaction – run processing – verify account balance.</p>
<p> 2. Internal mess-up</p>
<p>A single value might “travel” a pretty complicated path while being passed from one function to another inside the program. If somewhere within that chain the value won’t fit the memory cell the end-result will be wrong despite of the application accepted input. Or value could be properly stored in memory but will be messed up during saving into file or database record.</p>
<p>Test scenarios might be required to reveal those defects.</p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://automation-beyond.com/2011/07/05/numeric-boundary-testing-mindmap/" rel="bookmark" class="crp_title">Numeric Boundary Testing (MindMap)</a></li><li><a href="http://automation-beyond.com/2007/09/17/telling-testing-story/" rel="bookmark" class="crp_title">Telling testing story</a></li><li><a href="http://automation-beyond.com/2009/10/07/data-container-boundaries/" rel="bookmark" class="crp_title">Data Container Boundaries</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/2007/10/21/web-winrunner-2/" rel="bookmark" class="crp_title">Web Table operations 2 (WinRunner, TSL)</a></li></ul></div>
]]></content:encoded>
			<wfw:commentRss>http://automation-beyond.com/2009/11/02/complex-data-boundaries/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Data Container Boundaries</title>
		<link>http://automation-beyond.com/2009/10/07/data-container-boundaries/</link>
		<comments>http://automation-beyond.com/2009/10/07/data-container-boundaries/#comments</comments>
		<pubDate>Wed, 07 Oct 2009 13:02:43 +0000</pubDate>
		<dc:creator>Albert Gareev</dc:creator>
				<category><![CDATA[Heuristics]]></category>
		<category><![CDATA[2. Testing]]></category>
		<category><![CDATA[boundary]]></category>
		<category><![CDATA[challenges]]></category>
		<category><![CDATA[container]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[heuristic]]></category>
		<category><![CDATA[method]]></category>
		<category><![CDATA[number]]></category>
		<category><![CDATA[overflow]]></category>
		<category><![CDATA[technique]]></category>
		<category><![CDATA[test]]></category>
		<category><![CDATA[testing methodology]]></category>
		<category><![CDATA[weakness]]></category>
		<category><![CDATA[weakness-oriented]]></category>

		<guid isPermaLink="false">http://automationbeyond.wordpress.com/?p=465</guid>
		<description><![CDATA[Data Container Boundaries: where is the weakness? All the values used by computer programs are classified by type (integer number, floating point number, string, date, etc.), and all data types are internally encoded with numbers. Digital nature of computers makes them specific and discrete with numbers; once-and-forever defined memory cells serve that purpose. The capacity [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fautomation-beyond.com%252F2009%252F10%252F07%252Fdata-container-boundaries%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Data%20Container%20Boundaries%22%20%7D);"></div>
<h3>Data Container Boundaries: where is the weakness?</h3>
<p>All the values used by computer programs are classified by type (integer number, floating point number, string, date, etc.), and all data types are internally encoded with numbers. Digital nature of computers makes them specific and discrete with numbers; once-and-forever defined memory cells serve that purpose.</p>
<p>The capacity of a memory cell defines boundaries of a range while the range itself is flexible. </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>
<p><strong><span style="text-decoration: underline;">Examples.</span></strong> </p>
<ul>
<li>One Byte data container – Byte, Unsigned Char (0  &#8230; 255), Signed Char (-128 &#8230; 127).</li>
<li>Two Bytes data container – Word, Unsigned Short Integer (0 &#8230; 65535), Signed Short Integer (-32,768 &#8230; 32,767).</li>
<li>Four Bytes data container – Double Word, Unsigned Integer (0 &#8230; 4,294,967,295), Signed Integer (-2,147,483,648 &#8230; 2,147,483,647). </li>
</ul>
<p>Note that an atomic part of a memory cell (a single bit) is used to encode sign of a number. </p>
<p>Generally, memory cells that are to be allocated for storing values are explicitly defined in a program code by a developer (in case of compiler type programming languages) or defined by default settings (in case of interpreter type programming languages).</p>
<p>Now, what happens when a number doesn’t fit the boundaries? </p>
<h4>1. Native machine code behavior: arithmetic overflow</h4>
<p>Note. It won’t stop CPU from further execution of machine code. </p>
<p><em>Result.</em> The memory cell will contain an uncertain but definitely wrong value. </p>
<p><em>Consequences.</em> Any further operations with the value from the cell will produce wrong results. If further execution uses the value from the cell as a condition of some sort then the decision made most likely will be wrong. </p>
<p>An arithmetic overflow destroyed Ariane 5 space rocket (<a href="http://en.wikipedia.org/wiki/Ariane_5_Flight_501" target="_blank">Flight 501</a>). </p>
<h4>2. Language-specific machine code behavior: wrapping around or truncation</h4>
<p>Note. It won’t stop CPU from further execution of machine code. </p>
<p><em>Result.</em></p>
<ul>
<li>In case of wrapping around the memory cell will contain a value within the initial boundaries and relevant to the original one but definitely wrong.</li>
</ul>
<p>Example. If Unsigned Short Integer data container is defined for the Amount on User  Account, and the Balance is 65K, deposit of 1,000 will change the Balance to 465 – which won’t bring down the program but might bring down the bank. </p>
<ul>
<li>In case of truncation the memory cell will always contain a maximum allowed number. In other words, 10 + 1 will be 10 if truncation is in effect and 10 is the top of the range. </li>
</ul>
<p><em>Consequences.</em> Any further operations with the value from the cell will produce wrong results. If further execution uses the value from the cell as a condition of some sort then the decision made most likely will be wrong. If the value was supposed to be used for memory allocation purposes or memory addressing purposes the entire operating system could potentially be brought down. </p>
<p><a href="http://www.devsource.com/c/a/Techniques/Defend-Against-Integer-Overflow-Attacks/" target="_blank">Integer overflow vulnerability</a> is widely (and quite effectively) used in remote attacks affecting both UNIX and Windows operating systems. </p>
<h4>3. System exception handling behavior: recovery</h4>
<p>Note. System exception handling prevents the wrong operation to be executed in machine code. </p>
<p><em>Result.</em> Typically, a program generates an error report in a log file, shows to a user some kind of error message and finishes execution. More advanced programs can recover by partially or completely reloading themselves. </p>
<p><em>Consequences.</em> Typically, the current working session gets closed and all the unsaved data are lost. Server application might suffer from memory leakage, file/disk inconsistencies, or database inconsistencies. Closed Client side application loses a connection to server that might be overtaken. </p>
<p>Generally, system exception handling scenarios are automatically added into program at the compilation time. </p>
<h4>4. Business logic behavior: avoidance</h4>
<p>Note. In accordance to business logic defined, an application avoids erroneous situations by rejecting wrong data or handling those situations following programmatically defined scenarios. </p>
<p><em>Result.</em></p>
<ul>
<li>In case of data rejection an application typically remains at the same state as it was.</li>
<li>In case of error-handling scenario an application “rolls back”, typically to a preceding  state (or to an idle state), and generates some kind of report. </li>
</ul>
<p><em>Consequences.</em> Typically, business logic based error-handling is desired and expected behavior of an application so there is no negative impact.<strong> </strong></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 style="text-align: left;">Testing the boundaries</h4>
<p style="text-align: center;"><em>The problem</em></p>
<p>While all the data container boundaries could be easily found in technical documentation, identifying those boundaries is always a task of great challenge for tester, especially if design specification is not available (or simply there are no design rules mandatory for all developers on the project).</p>
<p>Another typical reason is a drift of business requirements. For example, originally maximum transaction amount was specified as 100 and then it’s changed to 1,000. Here two boundaries were crossed: 127 (Signed Char) and 255 (Unsigned Char).</p>
<p>Nowadays, different wizards, code generators, as well as external libraries and frameworks, bring even more chaos as developers lose control over the code, and may not be aware of data container boundaries.</p>
<p style="text-align: center;"><em>The challenges</em></p>
<p>1. Search for upper boundary</p>
<p>Business requirements and common sense might help identifying the “starting point” of the search. If that can’t help then trying a “magical” numbers, like 128, 256, 32768, 65536 might help.</p>
<p>Using binary search methods we can get to the threshold faster.</p>
<p>2. No immediate visible reaction</p>
<p>An application might accept an (invalid) input and still be alright. Causing it to output the value or use the value in some operations might help revealing a problem.</p>
<p>Boundary testing for a single value might require a whole scenario: post transaction – run processing – verify account balance.</p>
<p>3. Internal transition</p>
<p>A single value may “travel” a pretty complicated path while being passed from one function to another inside the program. If somewhere within that chain the value won’t fit the memory cell the end-result will be wrong despite of the application accepted input. Or value could be properly stored in memory but will be messed up during saving into file or database record.</p>
<p>Test scenarios might be required to reveal those defects.<strong> </strong></p>
<h4 style="text-align: left;">Conclusion</h4>
<p>There are two main weaknesses in digital encoding technology: data container overflow (memory cell overflow, register overflow) and a confusion (type mismatch) during conversion. Programs have multiple layers of defense to protect these weaknesses. Sometimes protection functionalities interfere with business functionalities.</p>
<p>If you know that protection is missing something you can find a method to expose a defect.</p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://automation-beyond.com/2011/07/05/numeric-boundary-testing-mindmap/" rel="bookmark" class="crp_title">Numeric Boundary Testing (MindMap)</a></li><li><a href="http://automation-beyond.com/2009/11/02/complex-data-boundaries/" rel="bookmark" class="crp_title">Complex Data Boundaries</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/2007/10/21/web-winrunner-2/" rel="bookmark" class="crp_title">Web Table operations 2 (WinRunner, TSL)</a></li><li><a href="http://automation-beyond.com/2010/06/22/quick-questions-quick-answers/" rel="bookmark" class="crp_title">Quick questions &#8211; quick answers</a></li></ul></div>
]]></content:encoded>
			<wfw:commentRss>http://automation-beyond.com/2009/10/07/data-container-boundaries/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Heuristics exposed</title>
		<link>http://automation-beyond.com/2009/10/05/heuristics-exposed/</link>
		<comments>http://automation-beyond.com/2009/10/05/heuristics-exposed/#comments</comments>
		<pubDate>Mon, 05 Oct 2009 13:00:52 +0000</pubDate>
		<dc:creator>Albert Gareev</dc:creator>
				<category><![CDATA[Heuristics]]></category>
		<category><![CDATA[2. Testing]]></category>
		<category><![CDATA[assurance]]></category>
		<category><![CDATA[boundary]]></category>
		<category><![CDATA[exploratory]]></category>
		<category><![CDATA[functional]]></category>
		<category><![CDATA[heuristic]]></category>
		<category><![CDATA[investigation]]></category>
		<category><![CDATA[James Bach]]></category>
		<category><![CDATA[method]]></category>
		<category><![CDATA[Methodology]]></category>
		<category><![CDATA[number]]></category>
		<category><![CDATA[quality]]></category>
		<category><![CDATA[SDLC]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[technique]]></category>
		<category><![CDATA[test]]></category>
		<category><![CDATA[weakness-oriented]]></category>

		<guid isPermaLink="false">http://automationbeyond.wordpress.com/?p=459</guid>
		<description><![CDATA[Software Testing is an empirical process. Empirical approach as an opposite to theoretical requires observation, investigation and experimenting. Results of those actions performed are collected, documented, analyzed, and categorized, before conclusion is made. A Scientific Method of Learning consists of the collection of data through observation and experimentation, and the formulation and testing of hypotheses. [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fautomation-beyond.com%252F2009%252F10%252F05%252Fheuristics-exposed%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Heuristics%20exposed%22%20%7D);"></div>
<p style="text-align: right;"><em>Software Testing is an empirical process.<br />
Empirical approach as an opposite to theoretical requires<br />
observation, investigation and experimenting.<br />
Results of those actions performed are collected,<br />
documented, analyzed, and categorized, before conclusion is made. </em></p>
<p style="text-align: left;"><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>
<p style="text-align: left;">A <a href="http://en.wikipedia.org/wiki/Scientific_method" target="_blank">Scientific Method of Learning</a> consists of the collection of data through observation and experimentation, and the formulation and testing of hypotheses. If hypothesis is consistently confirmed in series of reproducible tests then it is considered truth. All the data, ideas, and methodology should be documented and shared so they could be objectively reviewed by side observers in order to verify results by attempting to reproduce them.</p>
<p style="text-align: left;">Everyone familiar with software testing and its role in Software Development will see a close match between it and Scientific Method.<br />
There is, however, one major difference. Scientists research physical laws, that never change and apply everywhere in the Universe. For testers, every new program build is a new &#8220;universe&#8221;. We have to research its qualities all over again.</p>
<p style="text-align: left;">Investigating a computer program involves two kinds of processes:</p>
<ul>
<li>process of verification of known functionalities to see if they meet defined business and technical requirements;</li>
<li>process of investigation of unknown functionalities and side effects in order to reveal their qualities, influence to and interference with defined functionalities.</li>
</ul>
<p style="text-align: left;">The problem here is that known functionalities are almost never defined at the finest granularity level. There are always gaps and generalizations that filled with developers&#8217; assumptions or even left missing. And even if requirements are defined at the best possible precision level there is always possibility of miscommunication or misunderstanding. As if that&#8217;s not enough, even in ideal situation if it&#8217;s coded exactly as specified there is a good chance that it will be messed up by the next release. Ironically, the current release is also still at risk because computer programs are sensitive to hardware and OS configuration, and dependant on their settings.  So if a test is passed in a test environment it is not 100% guarantee that the tested functionality will work in production. </p>
<p style="text-align: left;">Investigation based methods are in better place as they do not rely on expected results but objectively provide information on program&#8217;s behavior. Furthermore, decades of worldwide practice demonstrated that investigation-oriented approach results in better software product&#8217;s quality rather that verification-oriented.  </p>
<p style="text-align: left;">Another good thing about empirical methods that you don&#8217;t have to spend (actually, waste) time and efforts creating Universal Laws. If something under some circumstances works more often than it doesn&#8217;t &#8211; you can use this approach. The approach may evolve as context and methods change; it can get abandoned and revived back. Any practical approach is a <a href="http://en.wikipedia.org/wiki/Heuristic" target="_blank">heuristic</a>. With regards to software testing, I also want to link this definition to James Bach&#8217;s <a href="http://www.satisfice.com/blog/archives/462" target="_blank">explanation</a>.</p>
<p style="text-align: left;">Software testing heuristics are not bound to &#8220;Black Box&#8221; testing methods.</p>
<p style="text-align: left;">In the subsequent posts under this category I&#8217;m tracing the roots of different problems in software (bugs) in order to find out what are that weak spots and how they appeared.</p>
<p style="text-align: left;"><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> <strong> </strong></p>
<h4>Publications and References</h4>
<p><a href="http://www.kaner.com/books.html" target="_blank">&#8220;Testing Computer Software&#8221;</a>, Cem Kaner, Jack Falk, Hung Q. Nguyen</p>
<p><a href="http://www.kaner.com/books.html" target="_blank">&#8220;Lessons Learned in Software Testing&#8221;</a>, Cem Kaner, James Bach, Bret Pettichord</p>
<p>Heuristic Risk-Based Testing by James Bach <a href="http://www.satisfice.com/articles/hrbt.pdf">http://www.satisfice.com/articles/hrbt.pdf</a></p>
<p>Test Heuristics Cheat Sheet by Elisabeth Hendrickson <a href="http://testobsessed.com/2007/02/19/test-heuristics-cheat-sheet/">http://testobsessed.com/2007/02/19/test-heuristics-cheat-sheet/</a></p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://automation-beyond.com/2010/08/25/2010-06-qtt-posts/" rel="bookmark" class="crp_title">2010/06 Quick Testing Tips posts archive</a></li><li><a href="http://automation-beyond.com/2010/10/06/2010-09-qtt-posts/" rel="bookmark" class="crp_title">2010/09 Quick Testing Tips posts archive</a></li><li><a href="http://automation-beyond.com/2007/01/10/links-usability-requirements/" rel="bookmark" class="crp_title">Link-a-log: Usability Requirements</a></li><li><a href="http://automation-beyond.com/2009/08/13/test-automation-problems-4d/" rel="bookmark" class="crp_title">Test Automation Problems (4) &#8211; Implementation Approach &#8211; Robustness</a></li><li><a href="http://automation-beyond.com/2010/07/05/my-refactoring-heuristics-4/" rel="bookmark" class="crp_title">My refactoring heuristics (4)</a></li></ul></div>
]]></content:encoded>
			<wfw:commentRss>http://automation-beyond.com/2009/10/05/heuristics-exposed/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Breakdown (decomposition) approach</title>
		<link>http://automation-beyond.com/2007/12/15/breakdown-decomposition-approach/</link>
		<comments>http://automation-beyond.com/2007/12/15/breakdown-decomposition-approach/#comments</comments>
		<pubDate>Sat, 15 Dec 2007 05:00:28 +0000</pubDate>
		<dc:creator>Albert Gareev</dc:creator>
				<category><![CDATA[Heuristics]]></category>
		<category><![CDATA[Notes]]></category>
		<category><![CDATA[2. Testing]]></category>
		<category><![CDATA[Example]]></category>
		<category><![CDATA[story]]></category>

		<guid isPermaLink="false">http://automation-beyond.com/?p=3014</guid>
		<description><![CDATA[A challenge Requirements are never complete or detailed enough&#8230; It might be a risk we have to consider or a challenge we need to take. This applies to anything in our job: from testing to development tasks. How do I handle this? An approach The approach I use I usually call a breakdown or decomposition. One might [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fautomation-beyond.com%252F2007%252F12%252F15%252Fbreakdown-decomposition-approach%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Breakdown%20%28decomposition%29%20approach%22%20%7D);"></div>
<h3>A challenge</h3>
<p>Requirements are never complete or detailed enough&#8230; It might be a risk we have to consider or a challenge we need to take. This applies to anything in our job: from testing to development tasks.</p>
<p>How do I handle this?</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>An approach</h3>
<p>The approach I use I usually call a <em>breakdown </em>or<em> decomposition</em>. One might call it a testing heuristic, but I would refer to it as a thinking style I gained after learning and practicing <a href="http://en.wikipedia.org/wiki/Systems_theory" target="_blank">systems approach</a>.</p>
<ul>
<li><em>Think of any entity as a component of a system (or multiple systems). Think of qualities that the enitity adds to the systems. Think of types of bonds that connect the enitity with other elements of the systems.</em></li>
<li><em>Look inside the entity and learn about elements and bonds that form it. Learn what qualities have those elements, and what new qualities they create being formed into an entity.</em></li>
<li><em>Look inside the elements that form the entity, and look upside the system(s) which part the entity is.</em></li>
</ul>
<p> </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/2008/10/10/on-functional-decomposition/" rel="bookmark" class="crp_title">On Functional Decomposition</a></li><li><a href="http://automation-beyond.com/2011/08/19/weekend-testing-modeling-and-practicing/" rel="bookmark" class="crp_title">Weekend Testing: Modeling and Practicing</a></li><li><a href="http://automation-beyond.com/2011/11/01/mark-draw-fire/" rel="bookmark" class="crp_title">Mark! Draw! Fire!</a></li><li><a href="http://automation-beyond.com/2009/08/10/test-automation-problems-4a/" rel="bookmark" class="crp_title">Test Automation Problems (4) &#8211; Implementation Approach &#8211; Framework</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></ul></div>
]]></content:encoded>
			<wfw:commentRss>http://automation-beyond.com/2007/12/15/breakdown-decomposition-approach/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

