<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1079818796674583384</id><updated>2012-02-07T03:58:10.455-08:00</updated><title type='text'>Transform QA Philosophy with Test Automation and Crowd Testing</title><subtitle type='html'>Automated testing and QA
Cause most things automatable: all about test automation assisted for QA</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default?start-index=101&amp;max-results=100'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>105</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-5129925175751169467</id><published>2012-01-26T20:43:00.000-08:00</published><updated>2012-01-26T20:43:10.388-08:00</updated><title type='text'>How to get my startup tested out quickly and cheap?</title><content type='html'>&lt;br /&gt;Professional testers, hackers and super Users are very hard to find. Most of them are busy on full time basis or just hard to reach out them. Ultimately we end up with hiring full time tester to reduce business risk. Don't get me wrong but your relatives and friends as well as potential Users will never find serious defects and breaches in your awesome app. Testing is a skill, it is not just boring digging. Believe there are lots of testing techniques and design approaches which are unknown for users and natural for testers. Moreover, expert testers have feeling worked out by years of practice under real conditions with real tools and apps under control. It is time needed to become good tester.&lt;br /&gt;&lt;br /&gt;Ok, now you are armed and the only thing to be done is just to go to &lt;a href="http://bugpub.com/"&gt;http://bugpub.com&lt;/a&gt; and ask professional community to test out your app or site as better as possible in order to meet first Users which will leave positive feedback recommend and return back to you. Do not experiment with your Users.&lt;br /&gt;&lt;br /&gt;The process as simple as sending request to estimate your project and setup ypour Jira. First bugs will appear very shortly!&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-JUSHB1pH_Ls/TyIocouGqZI/AAAAAAAAEIw/Tm2vvqWzYxA/s1600/community.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" height="504" src="http://2.bp.blogspot.com/-JUSHB1pH_Ls/TyIocouGqZI/AAAAAAAAEIw/Tm2vvqWzYxA/s640/community.png" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-0pe1osnqCY8/TyIqP8M_vKI/AAAAAAAAEI4/TTrPeiTBQ4w/s1600/request.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://2.bp.blogspot.com/-0pe1osnqCY8/TyIqP8M_vKI/AAAAAAAAEI4/TTrPeiTBQ4w/s640/request.png" width="529" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-lZye3gv0iDo/TyIqTdfWXKI/AAAAAAAAEJA/hDjPcPVARgA/s1600/issue_list.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="208" src="http://4.bp.blogspot.com/-lZye3gv0iDo/TyIqTdfWXKI/AAAAAAAAEJA/hDjPcPVARgA/s640/issue_list.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-2Pk1BNG7POk/TyIqVpILkoI/AAAAAAAAEJI/lRzzBSsUfcw/s1600/dashboard.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="401" src="http://4.bp.blogspot.com/-2Pk1BNG7POk/TyIqVpILkoI/AAAAAAAAEJI/lRzzBSsUfcw/s640/dashboard.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="font-family: Georgia, 'Bitstream Charter', serif; font-size: 13px; line-height: 18px; margin-bottom: 24px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Georgia, 'Bitstream Charter', serif; font-size: 13px; line-height: 18px; margin-bottom: 24px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-5129925175751169467?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/5129925175751169467/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=5129925175751169467&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/5129925175751169467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/5129925175751169467'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2012/01/how-to-get-my-startup-tested-out.html' title='How to get my startup tested out quickly and cheap?'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-JUSHB1pH_Ls/TyIocouGqZI/AAAAAAAAEIw/Tm2vvqWzYxA/s72-c/community.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-3285920273678756019</id><published>2012-01-24T18:01:00.000-08:00</published><updated>2012-01-24T18:06:15.841-08:00</updated><title type='text'>8 TOP Bugs Digest: Gmail vs Yahoomail</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-iXsE1VqrDZM/Tx9jg7QEgwI/AAAAAAAAEIo/s5PcY5W45l4/s1600/gmail_vs_yahoomail.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="102" src="http://3.bp.blogspot.com/-iXsE1VqrDZM/Tx9jg7QEgwI/AAAAAAAAEIo/s5PcY5W45l4/s320/gmail_vs_yahoomail.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Please welcome top 8 bugs of &amp;nbsp;Gmail and Yahoomail&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Gmail &lt;/b&gt;8 Top Bugs:&lt;br /&gt;&lt;br /&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://bugpub.com/view.php?id=405" style="font-family: 'Times New Roman', serif; font-size: small;" target="_blank" title="View Bug details"&gt;&lt;b&gt;&lt;span style="color: #0f70f0; font-family: Arial, sans-serif;"&gt;When we Click on Gadgets icon in gmail weare shown invite friends to chat&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugpub.com/view.php?id=368" style="font-family: 'Times New Roman', serif; font-size: small;" target="_blank" title="View Bug details"&gt;&lt;b&gt;&lt;span style="color: #0f70f0; font-family: Arial, sans-serif;"&gt;junk tesxt instaed of countries in countrydropdown when trying to "get gmail for your phone"&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugpub.com/view.php?id=360" style="font-family: 'Times New Roman', serif; font-size: small;" target="_blank" title="View Bug details"&gt;&lt;b&gt;&lt;span style="color: #0f70f0; font-family: Arial, sans-serif;"&gt;Google have became slow on log off and inaddition it added huge ugly animated banner on log off page&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugpub.com/view.php?id=358" style="font-family: 'Times New Roman', serif; font-size: small;" target="_blank" title="View Bug details"&gt;&lt;b&gt;&lt;span style="color: #0f70f0; font-family: Arial, sans-serif;"&gt;Translated screen is changed to English in"Forgotten your password?" page when clicking on "Can't accessyour account? " link.&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugpub.com/view.php?id=350" style="font-family: 'Times New Roman', serif; font-size: small;" target="_blank" title="View Bug details"&gt;&lt;b&gt;&lt;span style="color: #0f70f0; font-family: Arial, sans-serif;"&gt;Google calendar widget keeps disconnecting&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugpub.com/view.php?id=278" style="font-family: 'Times New Roman', serif; font-size: small;" target="_blank" title="View Bug details"&gt;&lt;b&gt;&lt;span style="color: #0f70f0; font-family: Arial, sans-serif;"&gt;Two Step verification system&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugpub.com/view.php?id=99" style="font-family: 'Times New Roman', serif; font-size: small;" target="_blank" title="View Bug details"&gt;&lt;b&gt;&lt;span style="color: #0f70f0; font-family: Arial, sans-serif;"&gt;Useris not able to see "Sign Out" option when logged in using IE6 browser&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugpub.com/view.php?id=97" style="font-family: 'Times New Roman', serif;" target="_blank" title="View Bug details"&gt;&lt;b&gt;&lt;span style="color: #0f70f0; font-family: Arial, sans-serif;"&gt;"Newto gmail? text and Create an account button is not displaying for gmail log inpage in IE6 browser.&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Yahoomail &lt;/b&gt;8 Top Bugs:&lt;br /&gt;&lt;div class="MsoNormal" style="margin-bottom: 0.0001pt;"&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://bugpub.com/view.php?id=287" style="font-family: Verdana, sans-serif; font-size: small;" target="_blank" title="View Bug details"&gt;&lt;b&gt;&lt;span style="color: #0f70f0; font-family: Arial, sans-serif; text-decoration: none;"&gt;Ican redirect to previous page outside yahoomail and can move to this page againby using 'Back' and 'Forward' button on the browser.&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugpub.com/view.php?id=267" style="font-family: Verdana, sans-serif; font-size: small;" target="_blank" title="View Bug details"&gt;&lt;b&gt;&lt;span style="color: #0f70f0; font-family: Arial, sans-serif; text-decoration: none;"&gt;YahoomailSession Never Expires when a system is restarted, Login is required.&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;b style="font-family: Verdana, sans-serif; font-size: small;"&gt;&lt;span style="color: #0f70f0; font-family: Arial, sans-serif; text-decoration: none;"&gt;&lt;a href="http://bugpub.com/view.php?id=262" target="_blank" title="View Bug details"&gt;Dontsee Unread Filter Option&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugpub.com/view.php?id=257" style="font-family: Verdana, sans-serif; font-size: small;" target="_blank" title="View Bug details"&gt;&lt;b&gt;&lt;span style="color: #0f70f0; font-family: Arial, sans-serif; text-decoration: none;"&gt;IE9 Upgrade message is appearing in yahoo email&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugpub.com/view.php?id=236" style="font-family: Verdana, sans-serif; font-size: small;" target="_blank" title="View Bug details"&gt;&lt;b&gt;&lt;span style="color: #0f70f0; font-family: Arial, sans-serif; text-decoration: none;"&gt;Whileclicking on 'reply' button from yahoo email, the browser crashes&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugpub.com/view.php?id=213" style="font-family: Verdana, sans-serif; font-size: small;" target="_blank" title="View Bug details"&gt;&lt;b&gt;&lt;span style="color: #0f70f0; font-family: Arial, sans-serif; text-decoration: none;"&gt;Nodelete confirmation for in yahoo Inbox&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugpub.com/view.php?id=178" style="font-family: Verdana, sans-serif; font-size: small;" target="_blank" title="View Bug details"&gt;&lt;b&gt;&lt;span style="color: #0f70f0; font-family: Arial, sans-serif; text-decoration: none;"&gt;Conformationmessage is appearing for blank message after removing attachment&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugpub.com/view.php?id=117" style="font-family: Verdana, sans-serif; line-height: 115%;" target="_blank" title="View Bug details"&gt;&lt;b&gt;&lt;span style="color: #0f70f0; font-family: Arial, sans-serif; line-height: 115%; text-decoration: none;"&gt;Yahoomail security Issue.&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;PLEASE, if you like some of these bugs don't leave them alone – send comment, Like it, tweet it or Share it (all that can be done in Comment section for each and any bug report). We will keep posting about most interesting bugs of popular and widely used technology products.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://bugpub.com/" target="_blank"&gt;Join&lt;/a&gt;&amp;nbsp;&lt;/b&gt;BugPub&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-3285920273678756019?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/3285920273678756019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=3285920273678756019&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/3285920273678756019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/3285920273678756019'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2012/01/8-top-bugs-digest-gmail-vs-yahoomail.html' title='8 TOP Bugs Digest: Gmail vs Yahoomail'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-iXsE1VqrDZM/Tx9jg7QEgwI/AAAAAAAAEIo/s5PcY5W45l4/s72-c/gmail_vs_yahoomail.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-7235816370744087670</id><published>2012-01-03T15:26:00.000-08:00</published><updated>2012-01-03T15:26:02.665-08:00</updated><title type='text'>Unexpected disappointment by Google</title><content type='html'>You are working, your Gmail is as usual is opened in background. You check inbox from time to time. Suddenly you get new "gray" theme of Gmail (same as classical blue but just very unwonted color schema (grey, no separator in inbox grid, just as list of paper). Google nicely tells you that they have changed the color scheme and that is it. You should find out yourself in settings how to switch to classical view.Found it, switched back. Happy. Google Labs or Google Experiments don't touch my settings!&lt;br /&gt;&lt;br /&gt;Ok, went back to work, left Gmail window as is, did not log off/on. Exactly in 10 minutes went to Gmail to check email. Oh My Google, they force me to switch to yet another brand new look and feel. Force because that dude on your window does not allow you to disregard. He says you have an option to find out yourself how to &lt;b&gt;temporarily &lt;/b&gt; switch back to classical mode! Besides once you dig out that setting (try yourself), Google ask to provide a reason why I want back my look and feel which is my 5 years habit. What is next&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Lx3ao1aQ3VQ/TwOKduGNwvI/AAAAAAAAEIc/BIS5dO5AYoE/s1600/google_force.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="590" src="http://1.bp.blogspot.com/-Lx3ao1aQ3VQ/TwOKduGNwvI/AAAAAAAAEIc/BIS5dO5AYoE/s640/google_force.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-7235816370744087670?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/7235816370744087670/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=7235816370744087670&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/7235816370744087670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/7235816370744087670'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2012/01/unexpected-disappointment-by-google.html' title='Unexpected disappointment by Google'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-Lx3ao1aQ3VQ/TwOKduGNwvI/AAAAAAAAEIc/BIS5dO5AYoE/s72-c/google_force.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-6909669114308000625</id><published>2011-12-22T17:21:00.000-08:00</published><updated>2011-12-22T17:22:39.452-08:00</updated><title type='text'>Pitfalls of wrong usage or non-professional crowd testing by James Whittaker</title><content type='html'>James Whittaker has been blaming the crowd testing vendor of their choice for hundreds and hundreds duplicated bugs which are already known by Google team. &lt;blockquote&gt;"This dog food process is insane"&lt;/blockquote&gt;&lt;blockquote&gt;"Why we do this crowdsourcing it is expensive and it does not do value"&lt;/blockquote&gt;I like this: &lt;blockquote&gt;"common... do something useful we pay you lots of money"&lt;/blockquote&gt;&lt;iframe width="420" height="315" src="http://www.youtube.com/embed/KXGnXq5uXR4" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br&gt;&lt;br&gt;Though, in one year and one month after that meetup, James admits that matured crowdtesting has a big future and top crowdtesters will be doing a quarter million of dollars per year or even more. Sure they will make these amounts but only passionate, proficient and dedicated individuals. So the bottom line for both Testers and Crowdtesting clients is: go with professional crowd testing.&lt;br&gt;&lt;br&gt;&lt;iframe width="560" height="315" src="http://www.youtube.com/embed/Yl7Dqe15pYg" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-6909669114308000625?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/6909669114308000625/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=6909669114308000625&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/6909669114308000625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/6909669114308000625'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2011/12/pitfalls-of-wrong-usage-or-non.html' title='Pitfalls of wrong usage or non-professional crowd testing by James Whittaker'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/KXGnXq5uXR4/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-2691789695194890371</id><published>2011-12-20T19:58:00.000-08:00</published><updated>2011-12-20T19:58:36.604-08:00</updated><title type='text'>Most Interesting Facebook bugs Digest</title><content type='html'>&lt;br /&gt;Hi All,&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-uxtgvi5XVkY/TvFZIK0d9GI/AAAAAAAAEIM/Jnkn87fONbQ/s1600/fb_bug.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-uxtgvi5XVkY/TvFZIK0d9GI/AAAAAAAAEIM/Jnkn87fONbQ/s1600/fb_bug.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;Today our excitement comes from idea of sharing with you several Facebook.com bugs which appear outstanding and interesting for us. In addition we followed up these findings and all other bugs with Facebook tech support.&lt;br /&gt;PLEASE, if you like some of these bugs don't leave them alone – send comment, Like it, tweet it or Share it (all that can be done in Comment section for each and any bug report). Based on your opinion we will sum up impressions and ultimately will determine "best Facebook bug(s)". It will be driven by people! We will keep posting about most interesting bugs of popular and widely used technology products.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://bugpub.com/view.php?id=215" target="_blank"&gt;&lt;b&gt;Privacy setting in status does not return to friends&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugpub.com/view.php?id=204" target="_blank"&gt;&lt;b&gt;Privacy "How to Connect" Error&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugpub.com/view.php?id=169" target="_blank"&gt;&lt;b&gt;On home page, the two lists of friends available on chat, do not match each other&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugpub.com/view.php?id=168" target="_blank"&gt;&lt;b&gt;No option of friend's group remain available/editable when you access a friend through your Friend list Search results&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugpub.com/view.php?id=164" target="_blank"&gt;&lt;b&gt;you get notified of Closed Friends activities even when you unsubscribe for those, explicitly, through their profile.&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugpub.com/view.php?id=161" target="_blank"&gt;&lt;b&gt;Apps that do not support secure browsing can not be opened even when the secure broswing security feature is disabled&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugpub.com/view.php?id=67" target="_blank"&gt;&lt;b&gt;Duplicate Smart Lists are created&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugpub.com/view.php?id=66" target="_blank"&gt;&lt;b&gt;Facebook cookies continue track User's activities of logged off User&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://bugpub.com/" target="_blank"&gt;Join&lt;/a&gt; &lt;/b&gt;BugPub &amp;gt; the CrowdTesting by real professionals with LinkedIn profiles from around the world&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-2691789695194890371?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/2691789695194890371/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=2691789695194890371&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/2691789695194890371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/2691789695194890371'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2011/12/most-interesting-facebook-bugs-digest.html' title='Most Interesting Facebook bugs Digest'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-uxtgvi5XVkY/TvFZIK0d9GI/AAAAAAAAEIM/Jnkn87fONbQ/s72-c/fb_bug.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-7328312877582677926</id><published>2011-12-16T15:18:00.000-08:00</published><updated>2011-12-16T15:18:08.659-08:00</updated><title type='text'>SOPA &amp; PIPA Heat up to Boiling Point</title><content type='html'>While we hear and see tons of ads and commercials by TV saying "Stop Online Piracy", there is steady flowing and overflowing work of&amp;nbsp;lobbying&amp;nbsp; &lt;a href="http://en.wikipedia.org/wiki/Stop_Online_Piracy_Act" target="_blank"&gt;Stop Online Piracy Act&lt;/a&gt; and also&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/PROTECT_IP_Act" target="_blank"&gt;Preventing Real Online Threats to Economic Creativity and Theft of Intellectual Property Act of 2011&lt;/a&gt;. I would say we are witnesses of big&amp;nbsp;battle of Piracy vs&amp;nbsp;Openness&amp;nbsp;which is in essence wrong because openness&amp;nbsp;and piracy have almost nothing in common, these are just different notions. They have same in common as having glass door of your house and people which can observe your&amp;nbsp;private&amp;nbsp;life through that transparent door.&lt;br /&gt;&lt;br /&gt;Just yesterday 83 Internet Inventors have signed and published a letter against SOPA and PIPA initiatives. Most impressive part for me:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;i&gt;"...&amp;nbsp;&lt;/i&gt;&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;&lt;i&gt;If enacted, either of these bills will create an environment of tremendous fear and uncertainty for technological innovation, and seriously harm the credibility of the United States in its role as a steward of key Internet infrastructure. Regardless of recent amendments to SOPA, both bills will risk fragmenting the Internet's global domain name system (DNS) and have other capricious technical consequences. In exchange for this, such legislation would engender censorship that will simultaneously be circumvented by deliberate infringers while hampering innocent parties' right and ability to communicate and express themselves online.&lt;/i&gt;&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;&lt;i&gt;All censorship schemes impact speech beyond the category they were intended to restrict, but these bills are particularly egregious in that regard because they cause entire domains to vanish from the Web, not just infringing pages or files. Worse, an incredible range of useful, law-abiding sites can be blacklisted under these proposals. In fact, it seems that this has already begun to happen under the nascent DHS/ICE seizures program.&lt;/i&gt;&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;&lt;i&gt;Censorship of Internet infrastructure will inevitably cause network errors and security problems. This is true in China, Iran and other countries that censor the network today; it will be just as true of American censorship. It is also true regardless of whether censorship is implemented via the DNS, proxies, firewalls, or any other method. Types of network errors and insecurity that we wrestle with today will become more widespread, and will affect sites other than those blacklisted by the American government.&lt;/i&gt;&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;&lt;i&gt;The current bills -- SOPA explicitly and PIPA implicitly -- also threaten engineers who build Internet systems or offer services that are not readily and automatically compliant with censorship actions by the U.S. government. When we designed the Internet the first time, our priorities were reliability, robustness and minimizing central points of failure or control. We are alarmed that Congress is so close to mandating censorship-compliance as a design requirement for new Internet innovations. This can only damage the security of the network, and give authoritarian governments more power over what their citizens can read and publish.&lt;/i&gt;&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;&lt;i&gt;..."&amp;nbsp;&lt;/i&gt;&lt;/blockquote&gt;From&amp;nbsp;&lt;a href="https://www.eff.org/deeplinks/2011/12/internet-inventors-warn-against-sopa-and-pipa"&gt;https://www.eff.org/deeplinks/2011/12/internet-inventors-warn-against-sopa-and-pipa&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Opinions?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-7328312877582677926?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/7328312877582677926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=7328312877582677926&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/7328312877582677926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/7328312877582677926'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2011/12/sopa-pipa-heat-up-to-boiling-point.html' title='SOPA &amp; PIPA Heat up to Boiling Point'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-34203890437803293</id><published>2011-11-28T14:50:00.001-08:00</published><updated>2011-11-28T15:40:40.860-08:00</updated><title type='text'>Automate Your Automation</title><content type='html'>I think if one claims that they have test automation, I mean full-fledged test automation, it must imply not only automated tests per say but it should include process automation. Automated tests (the code) are useful in same extent as manual tests which were never executed. It is just having no value unless it is executed at least once. &amp;nbsp;When we execute tests, we kind a returning back these expenses invested in test design, same for automated tests.&amp;nbsp;However&amp;nbsp;as automation specialists, we should go beyond of this point. We should leverage&amp;nbsp;automated&amp;nbsp;tests by setting up proper automation process which will command all aspects and flows in test automation.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-BtSh_YhEA-A/TtQbpC9IgaI/AAAAAAAAEHk/ezZvBd7xhXQ/s1600/carrots2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-BtSh_YhEA-A/TtQbpC9IgaI/AAAAAAAAEHk/ezZvBd7xhXQ/s1600/carrots2.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;What to be process-wise&amp;nbsp;automated?&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Test execution implies triggered executions - kicked of by&amp;nbsp;Continuous&amp;nbsp;integration server, on demand or scheduled. In state of the art project, it could be smart test execution - when only subset of test are executed which belong to a affected with new build pieces of software&amp;nbsp;&lt;/li&gt;&lt;li&gt;Test Reporting and test Results management. Keeping historical data in one place, in mid and long term provide you very valuable statistics, metrics and lessons learnt. Reporting is essential for managers and stakeholders, it helps them to make decision. So our job is to give them a tool which will build report for them and provide valuable information in one screen.&lt;/li&gt;&lt;li&gt;Results analysis and collaboration. Let your team mark results, exchange, share and tag specific test run results with one click; avoid effort duplication; keep tests stable and up to date by acting&amp;nbsp;immediately; make it transparent&lt;/li&gt;&lt;li&gt;Test debugging. Helps you to avoid tedious and hardly&amp;nbsp;manageable&amp;nbsp;test code fixes and improvements, given tool should ease all internal collaboration and accelerate decision making process&lt;/li&gt;&lt;li&gt;Version control is&amp;nbsp;irreplaceable&amp;nbsp;in test automation. Do versioning, branching, tagging, etc!&lt;/li&gt;&lt;li&gt;Auto Tests deployment. Something should run in background to make sure that right and latest version of tests and framework is being executed. In advanced cases, it should be able to deploy test code which is compatible with specific software under test version. Sounds cool!&lt;/li&gt;&lt;li&gt;Test Lab,&amp;nbsp;infrastructure deployment and roll up (e.g. virtual machines stand by and suspend - especially in case of dealing with virtual data centers, on demand cloud centers - basically where run time is run money off)&lt;/li&gt;&lt;li&gt;Environment and SUT availability monitoring (all data that can be precondition for whether start actual test execution or report fatal error and quit)&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Gredy addresses most of these process automation&amp;nbsp;aspects. &lt;a href="http://gredy.net/" target="_blank"&gt;&lt;b&gt;Gredy&lt;/b&gt; &lt;/a&gt;automates test automation&lt;br /&gt;&lt;br /&gt;Would you add more to the list of&amp;nbsp;automation&amp;nbsp;automation?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-34203890437803293?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/34203890437803293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=34203890437803293&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/34203890437803293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/34203890437803293'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2011/11/automate-your-automation.html' title='Automate Your Automation'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-BtSh_YhEA-A/TtQbpC9IgaI/AAAAAAAAEHk/ezZvBd7xhXQ/s72-c/carrots2.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-1792242942663506377</id><published>2011-11-18T21:56:00.001-08:00</published><updated>2011-11-18T22:34:36.411-08:00</updated><title type='text'>Everything changes irrevocably and hardly... Just surf's up!</title><content type='html'>&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-sZkoMc9K7X4/TsdMG6XUcGI/AAAAAAAAEHc/WqlFqBnjwDo/s1600/surfsupmen3.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;img border="0" height="192" src="http://4.bp.blogspot.com/-sZkoMc9K7X4/TsdMG6XUcGI/AAAAAAAAEHc/WqlFqBnjwDo/s320/surfsupmen3.jpg" width="320" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: .0001pt; margin: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;It is ongoing and no way to stopthese changes - I talk about big changes in s/w development practices andmethodologies, approaches and trends. I don't think everybody realize how Agile hadcaptured whole market, it made it softly and steady, you know, kind a "killme softly". Killers finally will be killed by other gangsters but it isdifferent story. Now we play slightly different game - nimble, quick,lightweight, not thinking about long term - just make it happen today, fewsprint and release. For the time being, I worked for 3 crazy_about_Agilecompanies. And since I'm test automation guy, it was never problem for me; I'mlike a fish in sea. Agile brings new concept of QA, at some extend it breakstraditional QA, it removes user advocates, it kills idea of independent assessmentand verification.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;However it brings new opportunities, here are some of these:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;- test automation is integral and nobody can escapefrom that responsibility. No more manual testers! What's the heck?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;- much more exploratory, ad-hoc, session-based,security, whatever-you -call-challenging or truly breaking testing. Awesometechnical challenge instead of boring step by step testing&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;- quick bug reporting with tech insight. Do meaningfulheadline, attach logs and some piece of code maybe - you are set. No morerudementary 12 detailed steps to reproduce&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;- User evolvement - crowdtesting, dog food, beta,alpha demo, blah. Community rulez. The benefits - UA, A/B, functional,compatibility, distributed testing in one in one bottle. &lt;a href="http://bugpub.com/"&gt;BugPub &lt;/a&gt;is a gate forreal crowdtesting with win-win model&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;- No more kind a tools which cover all your needs. This expensive stuff is now called crap. So tools should be either free or cheap and right, I mean perfectly fit your needs&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;- No more bunch of managers which just double staff&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0.0001pt; margin-left: 0cm; margin-right: 0cm; margin-top: 0cm;"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;It is ongoing, it is right over you, just surf's up!&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-1792242942663506377?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/1792242942663506377/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=1792242942663506377&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/1792242942663506377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/1792242942663506377'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2011/11/everything-changes-irrevocably-and.html' title='Everything changes irrevocably and hardly... Just surf&apos;s up!'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-sZkoMc9K7X4/TsdMG6XUcGI/AAAAAAAAEHc/WqlFqBnjwDo/s72-c/surfsupmen3.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-5450255613234880117</id><published>2011-11-16T09:24:00.001-08:00</published><updated>2011-11-16T10:43:24.017-08:00</updated><title type='text'>Market fragmentation trend - best in class tools for specific domain and no longer solutions that can do everything and nothing</title><content type='html'>I really amazed by this great trend which really flips and flops giant software enterprises. This is why they hurry to purchase small start ups and little companies with one but awesome product or service. These companies understands that their heavy solutions are not serving consumers so good and cheap as those little but flexible players. It is understandable that big companies desire to surround their customers by "one stop" solution, closing intentionally integration with other vendors and framing&amp;nbsp;proprietary closed ecosystem&amp;nbsp;which is eventually very costly caused by huge R&amp;amp;D&amp;nbsp;investments to build this one-stop.&lt;br /&gt;So now we as consumers use a lot of apps on our desktops, on web and smartphones (especially!)&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-04BmJAlc66Q/TsQEJQWuGfI/AAAAAAAAEHQ/gk066p8QPvA/s1600/swiss_knife.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-04BmJAlc66Q/TsQEJQWuGfI/AAAAAAAAEHQ/gk066p8QPvA/s1600/swiss_knife.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This trend is sweeping software companies and IT&amp;nbsp;departments&amp;nbsp;themselves - we want only having deal with best tools solving specific problem and helping out to be productive + enjoy their look and feel. And it does not really matter whether this or that tool is open source or commercial - the most important is User experience, perception and passion to use that tool every day.&lt;br /&gt;&lt;br /&gt;A quick example HP ALM (or any other ALM at this point on market) - a tool which can "do everything"... This tool attempts to fit all possible software entities (bugs, requirements, test cases, runs, test automation) into one sort of table view dogma. In essence this is boring, not domain specific - it is just like reflecting database structure on Web, bunch of fields and folder which can at least confuse and even scary. Sorry for negative example given first but it is really &lt;strike&gt;pain&lt;/strike&gt;, costly pain.&lt;br /&gt;&lt;br /&gt;The time for positive. Atlassian. This company create tools, specific ones, flexible, evolving. People love these tools. You can buy bundle, you can buy one tool. These tools are based on open standards, APIs, etc, so you free to build your ecosystem with tools and technologies of your choice. Let's go back to HP ALM, regarding integration, do they provide integration with CI, which test automation I can use with them apart from QTP, can I integrate with another nice bug tracker, do they support other requirements management systems? NO. Mercury tools gonna follow same mistake as Rational did after acquiring by IBM.&lt;br /&gt;&lt;br /&gt;The problem of this kind a system/solution is not implementation, the problem is not even its cost, the problem is just idea itself, the idea of one-stop solution.&lt;br /&gt;&lt;br /&gt;There are a lot and a lot great tools on&amp;nbsp;market&amp;nbsp;- a universe of them are commercial and bunch of them open source (especially technologies and frameworks)&lt;br /&gt;&lt;br /&gt;Lastly, can you call Wallmart or Amazon one-stop store for you?&amp;nbsp;Software&amp;nbsp;market fragmentation is&amp;nbsp;ongoing&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-5450255613234880117?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/5450255613234880117/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=5450255613234880117&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/5450255613234880117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/5450255613234880117'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2011/11/market-fragmentation-trend-best-in.html' title='Market fragmentation trend - best in class tools for specific domain and no longer solutions that can do everything and nothing'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-04BmJAlc66Q/TsQEJQWuGfI/AAAAAAAAEHQ/gk066p8QPvA/s72-c/swiss_knife.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-5116207942432038234</id><published>2011-11-15T21:00:00.001-08:00</published><updated>2011-11-15T21:47:47.645-08:00</updated><title type='text'>Automation Metrics and KPIs - how to beautify and not sink</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://www.dashboardinsight.com/CMS/55ddae9d-f5a9-4bc6-ae95-9e0416c43c2d/wave-chart-business.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="192" src="http://www.dashboardinsight.com/CMS/55ddae9d-f5a9-4bc6-ae95-9e0416c43c2d/wave-chart-business.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;Post-mortem, yearly reports, metrics, KPIs, predictive analysis, graphs, %%%%. Again big reporting for big managers!&lt;br /&gt;&lt;div&gt;My 5 cents which hopefully could help to run off all that nightmare inventing that stuff.&lt;/div&gt;&lt;div&gt;Key metrics for showing test automation contribution and value:&lt;/div&gt;&lt;div&gt;1. Coverage - higher %, bigger scope, more influence&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;against manual test cases&lt;/li&gt;&lt;li&gt;against functionality/use cases&lt;/li&gt;&lt;li&gt;against source code&lt;/li&gt;&lt;li&gt;against API&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;2. Test automation ROI (notorious ROI - I wanna present you my approach for its calculation little bit later). Showing ohw automation saves money/time. Btw, at some point you can show a trend of your ROI instead of current or projecting ROI. For me, seeing dynamics is way better and clean than static numbers. You can have achieved only 90% ROI though if you will show me a steady progress over time, I can value it higher of current 150% ROI which was finally achieved in 5 years. More advanced way to show your dynamics/trend is to lay on 2 graphs on one plot:&amp;nbsp;projected ROI dynamics&amp;nbsp;vs. real ROI dynamics&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3. Defecs Discovery Rate (number of found issues vs number of auto tests). I found this metric more representative if you will correlate this metric to the same metric but applied to manual testing. In this case you expose productivity of manual team against manual testing in terms of revealed defects.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the example below, you can find more project-wise metrics and KPIs as taken from Gredy&lt;/div&gt;&lt;div&gt;&lt;table class="KPItable" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #0099cc; font-family: Verdana, sans-serif; font-size: 12px; font-weight: bold; margin-bottom: 5px; margin-left: auto; margin-right: auto; margin-top: 5px; text-align: center; width: 1087px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="tpercents" style="border-bottom-color: rgb(152, 251, 152); border-bottom-left-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-style: solid; border-bottom-width: 3px; border-left-color: rgb(152, 251, 152); border-left-style: solid; border-left-width: 3px; border-right-color: rgb(152, 251, 152); border-right-style: solid; border-right-width: 3px; border-top-color: rgb(152, 251, 152); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-top-style: solid; border-top-width: 3px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;68.60%&lt;/span&gt;&lt;/td&gt;&lt;td class="tpercents" style="border-bottom-color: rgb(152, 251, 152); border-bottom-left-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-style: solid; border-bottom-width: 3px; border-left-color: rgb(152, 251, 152); border-left-style: solid; border-left-width: 3px; border-right-color: rgb(152, 251, 152); border-right-style: solid; border-right-width: 3px; border-top-color: rgb(152, 251, 152); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-top-style: solid; border-top-width: 3px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;27&lt;/span&gt;&lt;/td&gt;&lt;td class="tpercents" style="border-bottom-color: rgb(152, 251, 152); border-bottom-left-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-style: solid; border-bottom-width: 3px; border-left-color: rgb(152, 251, 152); border-left-style: solid; border-left-width: 3px; border-right-color: rgb(152, 251, 152); border-right-style: solid; border-right-width: 3px; border-top-color: rgb(152, 251, 152); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-top-style: solid; border-top-width: 3px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;778&lt;/span&gt;&lt;/td&gt;&lt;td class="tpercents" style="border-bottom-color: rgb(152, 251, 152); border-bottom-left-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-style: solid; border-bottom-width: 3px; border-left-color: rgb(152, 251, 152); border-left-style: solid; border-left-width: 3px; border-right-color: rgb(152, 251, 152); border-right-style: solid; border-right-width: 3px; border-top-color: rgb(152, 251, 152); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-top-style: solid; border-top-width: 3px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;99.23%&lt;/span&gt;&lt;/td&gt;&lt;td class="info" style="border-bottom-color: rgb(152, 251, 152); border-bottom-left-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-style: solid; border-bottom-width: 3px; border-left-color: rgb(152, 251, 152); border-left-style: solid; border-left-width: 3px; border-right-color: rgb(152, 251, 152); border-right-style: solid; border-right-width: 3px; border-top-color: rgb(152, 251, 152); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-top-style: solid; border-top-width: 3px;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td class="info" style="border-bottom-color: rgb(152, 251, 152); border-bottom-left-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-style: solid; border-bottom-width: 3px; border-left-color: rgb(152, 251, 152); border-left-style: solid; border-left-width: 3px; border-right-color: rgb(152, 251, 152); border-right-style: solid; border-right-width: 3px; border-top-color: rgb(152, 251, 152); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-top-style: solid; border-top-width: 3px;"&gt;&lt;br /&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;2011-11-21&amp;nbsp;# 2.1234.23 - 50.00%&lt;/span&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;2011-11-22 # 2.1234.23 - 47.62%&lt;/span&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;2011-11-23 # 2.1234.23 - 46.15%&lt;/span&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;2011-11-07 # 2.1234.23 - 41.38%&lt;/span&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;2011-11-18 # 2.1234.23 - 40.00%&lt;/span&gt;&lt;/li&gt;&lt;/td&gt;&lt;td class="info" style="border-bottom-color: rgb(152, 251, 152); border-bottom-left-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-style: solid; border-bottom-width: 3px; border-left-color: rgb(152, 251, 152); border-left-style: solid; border-left-width: 3px; border-right-color: rgb(152, 251, 152); border-right-style: solid; border-right-width: 3px; border-top-color: rgb(152, 251, 152); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-top-style: solid; border-top-width: 3px;"&gt;&lt;br /&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;2011-11-04 # 2.1234.23 - 11.11%&lt;/span&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;2011-11-27 # 2.1234.23 - 16.67%&lt;/span&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;2011-11-09 # 2.1234.23 - 17.86%&lt;/span&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;2011-11-30 # 2.1234.23 - 20.00%&lt;/span&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;2011-11-25 # 2.1234.23 - 22.73%&lt;/span&gt;&lt;/li&gt;&lt;/td&gt;&lt;td class="info" height="200px" style="border-bottom-color: rgb(152, 251, 152); border-bottom-left-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-style: solid; border-bottom-width: 3px; border-left-color: rgb(152, 251, 152); border-left-style: solid; border-left-width: 3px; border-right-color: rgb(152, 251, 152); border-right-style: solid; border-right-width: 3px; border-top-color: rgb(152, 251, 152); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-top-style: solid; border-top-width: 3px;"&gt;&lt;br /&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;b&gt;TST_ID_876.004:&lt;/b&gt;&amp;nbsp;16&lt;/span&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;b&gt;TST_ID_235.962:&lt;/b&gt;&amp;nbsp;15&lt;/span&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;b&gt;TST_ID_511.669:&lt;/b&gt;&amp;nbsp;12&lt;/span&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;b&gt;TST_ID_677.207:&lt;/b&gt;&amp;nbsp;12&lt;/span&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;b&gt;TST_ID_173.008:&lt;/b&gt;&amp;nbsp;11&lt;/span&gt;&lt;/li&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="cell" style="background-attachment: initial; background-clip: initial; background-color: #ccffcc; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-color: rgb(204, 204, 204); border-bottom-left-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(204, 204, 204); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-top-style: solid; border-top-width: 1px; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px;"&gt;Avg. daily &lt;br /&gt;success &lt;br /&gt;rate&lt;/td&gt;&lt;td class="cell" style="background-attachment: initial; background-clip: initial; background-color: #ccffcc; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-color: rgb(204, 204, 204); border-bottom-left-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(204, 204, 204); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-top-style: solid; border-top-width: 1px; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px;"&gt;Number of&lt;br /&gt;&amp;nbsp;test cases&lt;br /&gt;in suite&lt;/td&gt;&lt;td class="cell" style="background-attachment: initial; background-clip: initial; background-color: #ccffcc; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-color: rgb(204, 204, 204); border-bottom-left-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(204, 204, 204); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-top-style: solid; border-top-width: 1px; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px;"&gt;Number&lt;br /&gt;of all test &lt;br /&gt;execution&lt;/td&gt;&lt;td class="cell" style="background-attachment: initial; background-clip: initial; background-color: #ccffcc; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-color: rgb(204, 204, 204); border-bottom-left-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(204, 204, 204); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-top-style: solid; border-top-width: 1px; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px;"&gt;Stable &lt;br /&gt;("Ready") &lt;br /&gt;executions &lt;br /&gt;vs. All&lt;/td&gt;&lt;td class="cell" style="background-attachment: initial; background-clip: initial; background-color: #ccffcc; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-color: rgb(204, 204, 204); border-bottom-left-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(204, 204, 204); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-top-style: solid; border-top-width: 1px; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td class="cell" style="background-attachment: initial; background-clip: initial; background-color: #ccffcc; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-color: rgb(204, 204, 204); border-bottom-left-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(204, 204, 204); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-top-style: solid; border-top-width: 1px; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px;"&gt;5 Best builds/days&lt;br /&gt;&lt;br /&gt;&amp;nbsp;(by success %)&lt;/td&gt;&lt;td class="cell" style="background-attachment: initial; background-clip: initial; background-color: #ccffcc; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-color: rgb(204, 204, 204); border-bottom-left-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(204, 204, 204); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-top-style: solid; border-top-width: 1px; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px;"&gt;5 Worst builds/days &lt;br /&gt;&lt;br /&gt;(by success %)&lt;/td&gt;&lt;td class="cell" style="background-attachment: initial; background-clip: initial; background-color: #ccffcc; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-color: rgb(204, 204, 204); border-bottom-left-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(204, 204, 204); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(204, 204, 204); border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-top-style: solid; border-top-width: 1px; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px;"&gt;5 most frequent&lt;br /&gt;&amp;nbsp;failing &amp;nbsp;tests&lt;br /&gt;&amp;nbsp;(total failed times)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-5116207942432038234?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/5116207942432038234/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=5116207942432038234&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/5116207942432038234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/5116207942432038234'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2011/11/automation-metrics-and-kpis-how-to.html' title='Automation Metrics and KPIs - how to beautify and not sink'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-3234607450164159361</id><published>2011-10-26T15:47:00.000-07:00</published><updated>2011-10-26T15:47:32.034-07:00</updated><title type='text'>The first Nokia Windows Mobile smartphone is here to beat others</title><content type='html'>What's up?&lt;br /&gt;Today, London, Stephen Elop, Nokia&amp;nbsp;president,&amp;nbsp;presents a very first Nokia - Microsoft Windows phone. It is really exciting, especially being part of this truly innovative mobile Company. Hands on videos are below - enjoy!&lt;br /&gt;What I really like - facebook seamlessly integration, skype is part of MS ecosys after acquiring first one, MS office and finally - the big hope is this phone gonna stay synched up with Windows 8 as you work on one same machine - if this illusion will come true - Windows across all devices will be very user friendly so ppl will be tapped to one big solution without need to manually synchronize, manage, convert and worry about platforms&amp;nbsp;incompatibilities. Another big market for MS appears to be enterprise which is totally under Windows. + it would be awesome if next version will come with Kinect. Will see if Win Mobile can crack the code.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object width="320" height="266" class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://0.gvt0.com/vi/pqelWtAuZ9Q/0.jpg"&gt;&lt;param name="movie" value="http://www.youtube.com/v/pqelWtAuZ9Q&amp;fs=1&amp;source=uds" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266"  src="http://www.youtube.com/v/pqelWtAuZ9Q&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;object width="320" height="266" class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://1.gvt0.com/vi/rdMoRhfd1Sk/0.jpg"&gt;&lt;param name="movie" value="http://www.youtube.com/v/rdMoRhfd1Sk&amp;fs=1&amp;source=uds" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266"  src="http://www.youtube.com/v/rdMoRhfd1Sk&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Fun ad:&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object width="320" height="266" class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://2.gvt0.com/vi/I1qTbs8K3go/0.jpg"&gt;&lt;param name="movie" value="http://www.youtube.com/v/I1qTbs8K3go&amp;fs=1&amp;source=uds" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266"  src="http://www.youtube.com/v/I1qTbs8K3go&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-3234607450164159361?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/3234607450164159361/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=3234607450164159361&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/3234607450164159361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/3234607450164159361'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2011/10/first-nokia-windows-mobile-smartphone.html' title='The first Nokia Windows Mobile smartphone is here to beat others'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-5398970734993129538</id><published>2011-10-21T17:32:00.000-07:00</published><updated>2011-10-21T17:32:57.887-07:00</updated><title type='text'>SOAP UI is hot</title><content type='html'>Hey there, what's up with API nowadays?&lt;br /&gt;They are hot topics wherever you go. No API = no product for now. Well, Soap UI is on a wave of this trendy tech flop. Why? Let's see:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Easy to get into it, small learning curve&lt;/li&gt;&lt;li&gt;Perfectly, thoughtfully built to test SOAP and Restful web services&lt;/li&gt;&lt;li&gt;Supports&amp;nbsp;proprietary&amp;nbsp;and specific protocols&lt;/li&gt;&lt;li&gt;No coding required&lt;/li&gt;&lt;li&gt;If coding is needed - use lightweight non-typed but still OOP Groovy&lt;/li&gt;&lt;li&gt;Functional&amp;nbsp;scripts can be used for load testing&lt;/li&gt;&lt;li&gt;Nice approach for assertions and&amp;nbsp;verification&lt;/li&gt;&lt;li&gt;Through data/variables&amp;nbsp;transferring&lt;/li&gt;&lt;li&gt;Documentation&amp;nbsp;is pretty good&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;b&gt;Now how to make happen logging in &lt;a href="http://gredy.net/"&gt;Gredy &lt;/a&gt;after SOAP UI test execution?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Easy! Basically there are 2 ways to enable it but everything starts from nice built-in Teardown script (there is Setup too). So you can write some Groovy in Teardown script on level of test suite or/and test case. This script will automatically kicked off once test suite (case) will be finished (all iterations including iterative, e.g. when you have multiple ones driving data through external data source)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ok, now two ways to send data to your gredy server:&lt;/div&gt;&lt;div&gt;1. Sending POST request in accordance with given documentation. The data structure is given here:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial;"&gt;&lt;h3 style="color: #555555; font-family: Verdana; font-size: 11px; margin-bottom: 10px; margin-left: 0px; margin-right: 0px; margin-top: 10px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left;"&gt;Array&lt;br /&gt;(&lt;br /&gt;&lt;span style="color: red;"&gt;[product] =&amp;gt; YOUR_PRODUCT_FULL_NAME&lt;/span&gt;&lt;br /&gt;[acronym] =&amp;gt; YOUR_PRODUCT_ACRONYM&lt;br /&gt;[owner] =&amp;gt; YOUR_PRODUCT_OWNER&lt;br /&gt;[descr] =&amp;gt; YOUR_PRODUCT_DESCRIPTION&lt;br /&gt;&lt;span style="color: red;"&gt;[ProjectName] =&amp;gt; TEST_PROJECT_NAME&lt;/span&gt;&lt;br /&gt;[DesignSteps] =&amp;gt; TEST_PROJECT_TEST_DESIGN&lt;br /&gt;[Resolution] =&amp;gt; TEST_PROJECT_ASSOCIATED_COMMENTS&lt;br /&gt;[ToDOs] =&amp;gt; TEST_PROJECT_ASSOCIATED_TODO&lt;br /&gt;[Defects] =&amp;gt; TEST_PROJECT_ASSOCIATED_DEFECTS&lt;br /&gt;&lt;span style="color: red;"&gt;[SuiteName] =&amp;gt; SUITE_BELONGED_THIS_TEST_RUN&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;[Tier] =&amp;gt; TIER_TESTED_ON&lt;/span&gt;&lt;br /&gt;[Date] =&amp;gt; DATE_OF_RUN_YYYY-MM-DD&lt;br /&gt;&lt;span style="color: orange;"&gt;[ErrorsCnt] =&amp;gt; NUMBER_OF_ERRORS_OCCURED_ON_TEST_PROJECT_RUN&lt;/span&gt;&lt;br /&gt;&lt;span style="color: orange;"&gt;[WarnCnt] =&amp;gt; NUMBER_OF_WARNINGS_OCCURED_ON_TEST_PROJECT_RUN&lt;/span&gt;&lt;br /&gt;[Path_to_log] =&amp;gt; DIRECT_PATH_TO_TEST_RUN_LOG&lt;br /&gt;[Path_to_Report] =&amp;gt; DIRECT_PATH_TO_TEST_REPORT_OR_WHATEVER&lt;br /&gt;&lt;span style="color: orange;"&gt;[ReportErrors] =&amp;gt; NUMBER_OF_ERRORS_OCCURED_ON_Path_to_Report&lt;/span&gt;&lt;br /&gt;[Version] =&amp;gt; TESTED_VERSION_OR_BUILD&lt;br /&gt;[StandName] =&amp;gt; MACHINE_ON_TEST_RUN&lt;br /&gt;[Locale] =&amp;gt; TESTED_LOCALIZATION&lt;br /&gt;[Language] =&amp;gt; TESTED_LANGUAGE&lt;br /&gt;)&lt;/h3&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;2. Sending data via database directly as given below. This script is one-stop script which will do everything for you. The only thing you should care is database connectivity [&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;sql = Sql.newInstance("jdbc:mysql://MySQL_SERVER", "db_user","db_password", "com.mysql.jdbc.Driver");]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman';"&gt;Another thing which can be customized is the way how you name test steps (&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;def testname = i + " - " + testRunner.testCase.name + " - " + r.testStep.name;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Finally, you can send more data to database (see Gredy's data model)&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&lt;u&gt;the Groovy script:&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;import static org.junit.Assert.*;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;import groovy.sql.Sql&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;com.eviware.soapui.support.GroovyUtils.registerJdbcDriver( "com.mysql.jdbc.Driver" );&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;def i=0;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;//def r=testRunner.results;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;//r in testRunner.results&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;for( r in testRunner.results )&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;i++;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;def product = testRunner.testCase.testSuite.project.name;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;def suite = testRunner.testCase.testSuite.name;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;def testname = i + " - " + testRunner.testCase.name + " - " + r.testStep.name;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;def err=0;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;sql = Sql.newInstance("jdbc:mysql://MySQL_SERVER", "db_user","db_password", "com.mysql.jdbc.Driver");&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;try{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;log.info("Status: " + r.status);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;log.info("TestStep Name: " +r.testStep.name);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; def rows = sql.firstRow("select * from products where name=${product}");&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; if (rows==null )&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;sql.execute("INSERT INTO products (Name) VALUES &amp;nbsp;(${product})");&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; rows = sql.firstRow("select * from suites where SuiteName=? and product_Id IN (SELECT id FROM products WHERE Name=?)", [suite,product]);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; if (rows==null )&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;sql.execute('INSERT INTO suites (SuiteName, product_Id) VALUES &amp;nbsp;(?, (SELECT id FROM products WHERE Name=?))', [suite,product]);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; rows = sql.firstRow("select Name from projects where Name=? and testLevel IN (SELECT Id FROM suites WHERE SuiteName=? and product_id IN (SELECT id FROM products WHERE Name=?))", [testname,suite,product]);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; if (rows==null )&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;sql.execute('INSERT INTO projects (Name, testLevel, Defects) VALUES &amp;nbsp;(?, (SELECT Id FROM suites WHERE SuiteName=? and product_id IN (SELECT id FROM products WHERE Name=?)), "")', [testname,suite,product]);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;if (r.status.toString()=="FAILED")&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;err=1;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;else err=0;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;sql.execute('INSERT INTO logs (PrjID, Date, ErrorsCnt, tier, Path_to_Log) VALUES ((SELECT Id FROM projects WHERE Name=? and testLevel IN (SELECT Id FROM suites WHERE SuiteName=? and product_id IN (SELECT id FROM products WHERE Name=?))), CURRENT_DATE, ?, ?, ?)', [testname,suite,product,err,context.expand('${#Project#tier}'),"\\\\"+InetAddress.localHost.hostName]);&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;catch(Error e){}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;if (sql != null) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; sql.close();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;} &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;log.info("Status: " + r.status);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here are links to get more familiar with advanced features of SOAP UI and Groovy:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.soapui.org/Scripting-Properties/tips-a-tricks.html"&gt;http://www.soapui.org/Scripting-Properties/tips-a-tricks.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.soapui.org/Scripting-Properties/scripting-and-the-script-library.html"&gt;http://www.soapui.org/Scripting-Properties/scripting-and-the-script-library.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.soapui.org/forum/viewtopic.php?f=2&amp;amp;t=41"&gt;http://www.soapui.org/forum/viewtopic.php?f=2&amp;amp;t=41&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://groovyinsoapui.wordpress.com/"&gt;http://groovyinsoapui.wordpress.com/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://groovy.codehaus.org/"&gt;http://groovy.codehaus.org/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-5398970734993129538?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/5398970734993129538/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=5398970734993129538&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/5398970734993129538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/5398970734993129538'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2011/10/soap-ui-is-hot.html' title='SOAP UI is hot'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-1720148626464102341</id><published>2011-09-15T22:09:00.000-07:00</published><updated>2011-09-15T22:09:59.078-07:00</updated><title type='text'>Test Automation Market Share - Links!</title><content type='html'>Current annual market value of testing and QA is 12b $. And we now that test automation is very trending so I would say most of employers are interested in having QA with test automation background with some specific skills/tools set profficiency. These few links just give a clue how market of automated testing was looking like in the beginning of 200x and for this moment the structure and size of market are very different and fragmented.&lt;br /&gt;&lt;br /&gt;See these presentations:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Forester analysis: &lt;a href="http://www.forrester.com/Events/Content/0,5180,-1403,00.ppt"&gt;www.forrester.com/Events/Content/0,5180,-1403,00.ppt&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ISQT Step-Auto conference'07:&amp;nbsp;&lt;a href="http://isqtinternational.com/defect/images/Bhaskar_Mphasis.pdf"&gt;http://isqtinternational.com/defect/images/Bhaskar_Mphasis.pdf&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Test automation tools evaluation as of 2002:&amp;nbsp;&lt;a href="http://www.vcaa.com/tools/wsipc-automatedtestingtoolevaluation.pdf"&gt;http://www.vcaa.com/tools/wsipc-automatedtestingtoolevaluation.pdf&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Another independent observations: &lt;a href="http://www.google.com/url?sa=t&amp;amp;source=web&amp;amp;cd=19&amp;amp;ved=0CGsQFjAIOAo&amp;amp;url=http%3A%2F%2Fconnectedtesting.com%2FPresentations%2FTest%2520Automation%2520-%2520Business%2520v2.ppt&amp;amp;ei=WNZyTvetIunu0gHftKz3CQ&amp;amp;usg=AFQjCNHjLBjUwmd-t7A5FbWn9PmQw41DRQ"&gt;http://www.google.com/url?sa=t&amp;amp;source=web&amp;amp;cd=19&amp;amp;ved=0CGsQFjAIOAo&amp;amp;url=http%3A%2F%2Fconnectedtesting.com%2FPresentations%2FTest%2520Automation%2520-%2520Business%2520v2.ppt&amp;amp;ei=WNZyTvetIunu0gHftKz3CQ&amp;amp;usg=AFQjCNHjLBjUwmd-t7A5FbWn9PmQw41DRQ&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-1720148626464102341?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/1720148626464102341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=1720148626464102341&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/1720148626464102341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/1720148626464102341'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2011/09/test-automation-market-share-links.html' title='Test Automation Market Share - Links!'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-3261446178474200726</id><published>2011-06-23T15:05:00.000-07:00</published><updated>2011-06-23T15:27:07.728-07:00</updated><title type='text'>Test Automation Management: A Call For Better Tools</title><content type='html'>My article is get published in &lt;b&gt;June'11 issue of Automated Software Testing Magazine! &lt;/b&gt;That is cool news - check that out: &lt;a href="http://www.automatedtestinginstitute.com/home/index.php?option=com_content&amp;amp;view=article&amp;amp;id=1276:ast-magazine&amp;amp;catid=105:ast-cover-description&amp;amp;Itemid=122"&gt;http://www.automatedtestinginstitute.com/home/index.php?option=com_content&amp;amp;view=article&amp;amp;id=1276:ast-magazine&amp;amp;catid=105:ast-cover-description&amp;amp;Itemid=122&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Direct link to download PDF of that magazine issue:&lt;br /&gt;&lt;a href="http://www.automatedtestinginstitute.com/home/ASTMagazine/2011/AutomatedSoftwareTestingMagazine_June2011.pdf"&gt;http://www.automatedtestinginstitute.com/home/ASTMagazine/2011/AutomatedSoftwareTestingMagazine_June2011.pdf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Also I wanna put the &lt;span style="font-weight:bold;"&gt;copy &lt;/span&gt;of the content as blog post right over here:&lt;br /&gt;&lt;br /&gt;Test Automation Management: A Call For Better Tools&lt;br /&gt;One of the cool things about beginning a test automation effort is that only a minimal level of technical expertise is required – basic skills in testing, some coding and knowledge of key technologies. The shockingly unobvious thing in test automation is the difficulty surrounding management of tests in mid-sized and large automation teams. The major difficulty comes into play when your team tries to analyze the results of automated test that have been run against your daily build and attempts to keep those tests up-to-date and stable for the next day’s build. Moreover, as a release’s delivery date draws closer  there is often an increase in scope, instability, expected turnaround and visibility. In order to effectively manage this chaos some mechanism must be employed to facilitate and assist in organizing the team’s work in an efficient way. The output from automated test scripts is typically a low level log and stats that are useful for debugging and internal analysis by automators, but are less useful for higher level status and issue reporting. Not to mention, they can be monotonous and just plain boring! So this alone is not effective for managing the test effort.&lt;br /&gt;To truly understand the need for an effective automated test management solution think about issue tracking, source control, and task management systems. These tools are all about easing our collaboration by making inter- and intra-team communication more efficient. The same standard should be placed on a test automation management system in ways similar to the following:&lt;div&gt;&lt;br /&gt;• &lt;span style="font-weight:bold;"&gt;Intra&lt;span style="font-style:italic;"&gt;&lt;/span&gt;&lt;/span&gt;-team Business Requirements – Test automation engineers should have a collaborative environment that provides reporting, tasking, and a transparent view of the entire project. Ideally this environment enables clear traceability with other testing artifacts such as defect reports (product and internal automation), test cases and software specifications.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;• &lt;span style="font-weight:bold;"&gt;Inter&lt;span style="font-style:italic;"&gt;&lt;/span&gt;&lt;/span&gt;-team Business Requirements - Project stakeholders should have access to a flexible, transparent and multilevel reporting tool to see what is going on with automation and the tested product. It should offer a high level picture of the product’s evolution and trends, as well as aid in evaluating the maturity and progress of the test automation effort.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;The Need for Something New?&lt;br /&gt;There are a crop of available test management systems that exist, but the question that must be answered is “do they meet our needs?” While you could theoretically use many of these tools to some effect, many of them have serious disadvantages in the context of heavy test automation.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The basic features that exist in test management systems include:&lt;br /&gt;- Test case and test suite management&lt;br /&gt;- Test cycle and test release management&lt;br /&gt;- Planning, group tasking and scheduling&lt;br /&gt;- Defect tracking&lt;br /&gt;- Reporting and trends analysis (usually defects trends, execution trends)&lt;br /&gt;- Traceability&lt;br /&gt;&lt;br /&gt;Let’s take an honest look at how these features are often used on real projects:&lt;br /&gt;Test case and test suite management – Once created, test cases are rarely kept up to date. Some of them may be used for a subsequent release, some will be junk. Also, most of the tools I’ve seen tend to complicate test case writing – multiple tabs and double clicks to navigate back and forth, page response, etc. I recognize the advantage of fielded data but should it come at the expense of features such as auto formatting, formulas, very simple copying and cloning? Many testers think not, and desire this type of simplicity, evident in the fact that they often create cases in Excel spreadsheets and then import them into the test management system for managers.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Test cycle and release management&lt;/span&gt; – Basically, this nice feature is often implemented as a folder that inherits test cases from the test plan. Since the test management tool is often disconnected from the Continuous Integration (CI) server, this feature is not automatically tied to the creation of a new release on the CI server, which creates a disconnect that can make it tedious to keep the CI server and test management tool in sync.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Planning&lt;/span&gt; – As a manager, you can assign any test or test suite for execution for a particular day. But who wants to repeatedly perform this boring activity? Typically, testing tasks are based on the functionality to which a tester has been assigned.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Defect tracking&lt;/span&gt; – Who knows, maybe some companies use this feature. Very often, however, this feature of a test management solution goes to waste, because the organization uses some separate defect tracking solution or has no defect tracking solution at all.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-weight:bold;"&gt;Reporting &lt;/span&gt;– I suppose this is the most important feature but only if other features are used accurately. There is no value in the reporting of incorrect or incomplete data.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-weight:bold;"&gt;Traceability &lt;/span&gt;– If you have granular requirements in a single Test or Application Lifecycle Management (ALM) tool, it is nice to be able to obtain automatic linkages between tests and requirements. If specifications live somewhere outside of the tool used for test management, there is minimal value from this feature because the linking process and the process of keeping the links up to date will be a manual task.&lt;br /&gt;So, my conclusion is that existing test management tools are useful when their whole set of functionality is used; particularly when used on mid-to-large scaled projects, on distributed and/or remote teams and for cross project analysis. Otherwise, they may be more trouble than they are worth. So we must ask ourselves the following question: “If these tools are flawed for manual test case management, why we should we rely on them from a test automation perspective?”&lt;br /&gt;What is expected?&lt;br /&gt;From my experience I have drawn a few specific requirements for test automation management tools and I would like to share them here.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-weight:bold;"&gt;Useful Reporting&lt;/span&gt; – Reporting should be meaningful and should facilitate the continual learning of lessons over time. This implies the presence of trend analysis over historical data, calculating key performance indicators (KPIs), root cause analysis, and graphical data representation.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-weight:bold;"&gt;Compliance with development practices&lt;/span&gt; – A test management solution that seriously works for test automation should comply with basic software development practices. For example, offering access to standardized, xUnit formatted logs through a web services interface.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-weight:bold;"&gt;Traceability &lt;/span&gt;– It’s important to be able to trace other testing artifacts to the test automation process, thus making it integral within the project. It is very useful to have all relevant information or references in one place: i.e. references to defects that are covered by test, reference to test design, data and specifications, and references to the CI server (i.e. link to the build number).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;Making test debugging less painful&lt;/b&gt; – Helping test developers organize their debugging work is often an essential task. Sometimes finding the cause of a test failure and applying fixes requires a lengthy effort, an effort that should be eased by the information provided by a test management tool.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Compliance with Agile lifecycle&lt;/span&gt; – The ability to obtain quick daily status information is important for getting an effective start on a new Scrum day. Just enough information to recognize changes is often all that’s necessary. The changes are usually marked by differences in errors found in the test logs between day A and day A+1. For example, the difference in the number of failures (log errors) signals probable changes either in the AUT or in test code (broken test code base, instabilities) or at times in both.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Interfaces for triggered and manual test execution&lt;/span&gt; – Ideally test automation possesses a facility to run a bunch of tests remotely against several machine instances. This includes hardware management (physical and virtual), tasks queue management and tasks prioritization to rule the order of execution if concurrent use of resources takes place. The interface should not be limited to UI elements, but should provide a simple API that may be used by a CI server to schedule and manage tasks. An example of a good practice is when the CI server triggers test execution through that API upon the deployment of a new build. The API might be a simple REST service in a POST or GET request implementation. The most challenging part of this component is the queuing mechanism: prioritization, watching, management and coordination.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-weight:bold;"&gt;Tool agnostic interface&lt;/span&gt; – All capabilities should be agnostic to the utilized test automation tool. You can use multiple tools or migrate from one to another but your test automation management is done via a single unified interface. Interfaces with CI should be decoupled in order to get rid of preferences. It is the responsibility of the CI server to schedule tasks by means of calling the API, while test automation can return reporting in an xUnit format.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-weight:bold;"&gt;Transparency of deliverables and internal team collaboration&lt;/span&gt; – The idea is to make the tool clear and lightweight for any stakeholder. It should be flexible enough to provide information with an appropriate level of detail.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-weight:bold;"&gt;Keep it simple&lt;/span&gt; – The look and feel of the end user interfaces as well as automatic interfaces (i.e. results submission interface, integration with CI severs) should be intuitive enough to facilitate a quick startup.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Reducing test automation costs&lt;/b&gt; – Ultimately the test automation management tool should facilitate making test automation profitable, reactive and valuable.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;Current state of the art&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;There are a few tools providing test automation management capabilities at some extent of described expected functionality. This article is not about comparing them. Here are the tools I’m aware about:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Quality Center&lt;/span&gt; – does not segregate test automation from manual. Though there is scheduling capability through Web UI and through API, which is actually complicated and unstable COM object. HP QC has straightforward interfaces with QTP only. Yes you can hack it to run something else but why then buy the tool?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;QAComplete &lt;/span&gt;– ALM product similar to HP QC but looks like more flexible in terms of compatibility with automation tools (e.g. they provide connector for QTP test runner). In same way as QC, the tool mixes ups manual and automated effort and does not provide specific tools to debug and to have collaborative environment specific for test automation engineers.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Gredy &lt;/span&gt;– lightweight Web tool that explicitly serves as test automation management system and does not have preferences to automation tools. Has advanced capabilities to manage and analyze test execution results, assists in debugging, internal automation team collaboration and provides flexible reporting.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Tapper  &lt;/span&gt;- open source solution from AMD written on Ruby. It has ready to go interfaces for test scheduling and viewing test execution reports.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Bromine &lt;/span&gt;– provides capability to manage test cases and test lab. The tool is tightly tied to Selenium automation tool. Tests can be run on remote machines with installed Selenium IDE/RC.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Litmus &lt;/span&gt;– open source from Mozilla and currently used by Mozilla to run and manage test automation suites. Has nice look and feel and thoughtful approach to manage tests and analyze test execution results.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-3261446178474200726?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/3261446178474200726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=3261446178474200726&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/3261446178474200726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/3261446178474200726'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2011/06/test-automation-management-call-for.html' title='Test Automation Management: A Call For Better Tools'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-3746003178412092181</id><published>2011-05-31T16:25:00.000-07:00</published><updated>2011-05-31T16:28:43.461-07:00</updated><title type='text'>Presentation from Meetup: Why Test automation guys should have hacker mindset?!</title><content type='html'>The slides from meetup &lt;a href="http://www.meetup.com/QAtools/events/17348127/"&gt;"Why Test automation guys should have hacker mindset?!"&lt;/a&gt; are now available for everyone:&lt;br /&gt;&lt;br /&gt;&lt;div style="width:425px" id="__ss_8167102"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/PeterBiz/why-test-automation-guys-should-have-hacker-mindset" title="Why Test automation guys should have hacker mindset?!"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse8167102" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=whyhackermindset-110531182247-phpapp02&amp;stripped_title=why-test-automation-guys-should-have-hacker-mindset&amp;userName=PeterBiz" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse8167102" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=whyhackermindset-110531182247-phpapp02&amp;stripped_title=why-test-automation-guys-should-have-hacker-mindset&amp;userName=PeterBiz" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-3746003178412092181?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/3746003178412092181/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=3746003178412092181&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/3746003178412092181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/3746003178412092181'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2011/05/presentation-from-meetup-why-test.html' title='Presentation from Meetup: Why Test automation guys should have hacker mindset?!'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-3725787777855491811</id><published>2011-05-13T11:48:00.000-07:00</published><updated>2011-05-16T12:22:40.625-07:00</updated><title type='text'>Why software bugs are not public?</title><content type='html'>Weird question, isn’t? I think the situation is horrible because we as Users mostly have no way to share, keep track and eventually have influence on the software or services they produce. When you or your friend submits a support request, submits an issues – it just goes out for internal company’s judgment. It is totally up to them and their business decision whether to fix that problem one day or talk to you back “We apologize for inconvenience…”. We as user have no idea and tool how to drive our expectations. &lt;br /&gt;&lt;br /&gt;Some companies integrate on their web sites user’s voice plug-ins that allows sharing some ideas how to improve something. Some remarkable companies and their products have public bug tracking – most of them running open source projects (Linux distributives, Mozilla, some of Google’s projects, MySQL, Java, Apache, PHP). Looks like generally these are geeky-centric software. &lt;br /&gt;&lt;br /&gt;What about Consumer and proprietary software and services? I don’t wanna to mention companies, but the majority of their major projects are not providing public bug and change request tracker for end Users.&lt;br /&gt;&lt;br /&gt;Yes you as User can post request but they will decide what, where and how to fix that and all this happens because your voice is not visible for others, the whole Community of Users don’t share the issue in organized single place. Though, we still may find some information here and there in internet as gathering grain of sand, it is not enough to be influential. To have an influence as Users of software, all we need is pretty organized, social and easily accessible place for all our findings and wishes. Btw, &lt;a href="http://bugpub.com"&gt;BugPub&lt;/a&gt; is such a place.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-3725787777855491811?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/3725787777855491811/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=3725787777855491811&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/3725787777855491811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/3725787777855491811'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2011/05/why-software-bugs-are-not-public.html' title='Why software bugs are not public?'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-5446544965267642806</id><published>2011-01-19T21:18:00.000-08:00</published><updated>2011-01-19T21:36:44.099-08:00</updated><title type='text'>Testability influence on software design - super new concept from Google or old habitual TDD?</title><content type='html'>Hey,&lt;br /&gt;&lt;br /&gt;just found out these slides from GTAC '10 that generally represent how flexible s/w design impact on testability. Then authors draw conclusions that design should be impacted (or even driven) by testability - see latest slides. In this presentation you will find good examples, explanations and correlation with OO practices.&lt;br /&gt;Now I'm thinking - nothing new - it is all about Test driven development (TDD). So you write and after that you have a hint on how to design s/w code itself as you will support that test further. If so, there are less chances to make mistakes "not see a tree for the forest" kind of. I'd like to experience such a care about testability by evolving in code design analysis&lt;br /&gt;&lt;br /&gt;&lt;iframe width=100% height=560px frameborder=0 src=https://docs.google.com/viewer?a=v&amp;pid=explorer&amp;chrome=false&amp;embedded=true&amp;srcid=0B4fT-BFGDnQkOWU4M2M0Y2YtYjY5ZC00MjE1LWFiYzAtODFmZDI4MGRiNDU1&amp;hl=en&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-5446544965267642806?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/5446544965267642806/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=5446544965267642806&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/5446544965267642806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/5446544965267642806'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2011/01/testability-influence-on-software.html' title='Testability influence on software design - super new concept from Google or old habitual TDD?'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-2850072141010507503</id><published>2011-01-19T20:34:00.000-08:00</published><updated>2011-01-19T20:43:49.168-08:00</updated><title type='text'>Hey mid and grand SW companies, look inside Mozila's testing business. Like It!</title><content type='html'>Steve Balmer exclaimed "Devs, Devs, Devs..." (hopefully now it is not turned to 'Sales, Sales, Sales'). Mozila's testing sounds like Tools, Crowd, Community.&lt;br /&gt;&lt;br /&gt;I like their Litmus for testing management and as well as lots of free add-ons.  Honestly talking about browser, my pref have shifted to Chrome but I'm still with FF.&lt;br /&gt;&lt;br /&gt;&lt;iframe width=100% height=560px frameborder=0 src=https://docs.google.com/viewer?a=v&amp;pid=explorer&amp;chrome=false&amp;embedded=true&amp;srcid=0B4fT-BFGDnQkNzQ3MjQ5NDMtYjZiZi00MTUyLWIwZWUtNTI4Njc3NGE0ZDYw&amp;hl=en&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-2850072141010507503?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/2850072141010507503/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=2850072141010507503&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/2850072141010507503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/2850072141010507503'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2011/01/hey-mid-and-grand-sw-companies-look.html' title='Hey mid and grand SW companies, look inside Mozila&apos;s testing business. Like It!'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-5654935534781054755</id><published>2010-12-03T08:56:00.000-08:00</published><updated>2010-12-03T09:02:36.140-08:00</updated><title type='text'>Essentials for Test Automation - survey results here</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_H8RIeuOZSco/TPkios0fdfI/AAAAAAAAD5I/FZid-u2gXZE/s1600/survey2.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 291px;" src="http://1.bp.blogspot.com/_H8RIeuOZSco/TPkios0fdfI/AAAAAAAAD5I/FZid-u2gXZE/s400/survey2.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5546502498704913906" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_H8RIeuOZSco/TPkiaKj6SHI/AAAAAAAAD5A/ZRHAPmDuFSQ/s1600/survey1.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 377px;" src="http://2.bp.blogspot.com/_H8RIeuOZSco/TPkiaKj6SHI/AAAAAAAAD5A/ZRHAPmDuFSQ/s400/survey1.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5546502248990394482" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-5654935534781054755?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/5654935534781054755/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=5654935534781054755&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/5654935534781054755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/5654935534781054755'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/12/essentials-for-test-automation-survey.html' title='Essentials for Test Automation - survey results here'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_H8RIeuOZSco/TPkios0fdfI/AAAAAAAAD5I/FZid-u2gXZE/s72-c/survey2.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-1479150048144110249</id><published>2010-11-25T06:17:00.000-08:00</published><updated>2010-11-25T06:53:57.027-08:00</updated><title type='text'>AT4QA is the winner as best blog of this year by ATI and other's awards</title><content type='html'>Hey the test automation world!&lt;br /&gt;&lt;br /&gt;The blog At4QA is recognized as the best one in this year by &lt;a href="www.automatedtestinginstitute.com"&gt;Automated Testing Institute&lt;/a&gt;.&lt;br /&gt;I’m proud and excited to be a part of this honor and being standing in a row with rocks of the industry – tools and individuals ( I suggest to look through the whole &lt;a href="http://www.automatedtestinginstitute.com/home/ASTMagazine/2010/AutomatedSoftwareTestingMagazine_November2010.pdf"&gt;magazine issue&lt;/a&gt;)&lt;br /&gt;Thank you all a lot, we will Keep this way!&lt;br /&gt;Here is a &lt;a href="http://www.automatedtestinginstitute.com/home/ASTMagazine/2010/AutomatedSoftwareTestingMagazine_November2010.pdf"&gt;downloadable version of the magazine issue&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you can't download - see how it looks right here below&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_H8RIeuOZSco/TO54PnqzbMI/AAAAAAAAD4w/HKWphFE-ttY/s1600/AT4QA%2Bwinner%2Bby%2BATI%2B-%2B1.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 199px;" src="http://2.bp.blogspot.com/_H8RIeuOZSco/TO54PnqzbMI/AAAAAAAAD4w/HKWphFE-ttY/s400/AT4QA%2Bwinner%2Bby%2BATI%2B-%2B1.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5543500401081543874" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_H8RIeuOZSco/TO54YKo_8AI/AAAAAAAAD44/U2Jlic3l2tU/s1600/AT4QA%2Bwinner%2Bby%2BATI.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 300px; height: 400px;" src="http://4.bp.blogspot.com/_H8RIeuOZSco/TO54YKo_8AI/AAAAAAAAD44/U2Jlic3l2tU/s400/AT4QA%2Bwinner%2Bby%2BATI.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5543500547908169730" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-1479150048144110249?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/1479150048144110249/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=1479150048144110249&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/1479150048144110249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/1479150048144110249'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/11/at4qa-is-winner-as-best-blog-of-this.html' title='AT4QA is the winner as best blog of this year by ATI and other&apos;s awards'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_H8RIeuOZSco/TO54PnqzbMI/AAAAAAAAD4w/HKWphFE-ttY/s72-c/AT4QA%2Bwinner%2Bby%2BATI%2B-%2B1.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-2389113349813310339</id><published>2010-09-29T07:48:00.000-07:00</published><updated>2010-09-29T07:53:17.336-07:00</updated><title type='text'>Survey: Essentials for Test Automation</title><content type='html'>&lt;iframe frameborder="0" width="100%" height="600" scrolling="auto" src="http://polldaddy.com/s/3EEC7AD656436793?iframe=1"&gt;&lt;a href="http://polldaddy.com/s/3EEC7AD656436793"&gt;View Survey&lt;/a&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-2389113349813310339?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/2389113349813310339/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=2389113349813310339&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/2389113349813310339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/2389113349813310339'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/09/survey-essentials-for-test-automation.html' title='Survey: Essentials for Test Automation'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-3860123864695397208</id><published>2010-09-05T02:32:00.000-07:00</published><updated>2010-09-05T12:00:55.705-07:00</updated><title type='text'>Fortunate Test Automation</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_H8RIeuOZSco/TIPosvHrtCI/AAAAAAAAD4Q/OAs4MKEGeOw/s1600/golf.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 191px;" src="http://3.bp.blogspot.com/_H8RIeuOZSco/TIPosvHrtCI/AAAAAAAAD4Q/OAs4MKEGeOw/s200/golf.jpg" alt="" id="BLOGGER_PHOTO_ID_5513506224092197922" border="0" /&gt;&lt;/a&gt;Just imagine you are going to sell your test automation project to Project/Test/QA management in a way as sales managers/engineers present, propose and account a solution. Under solution we can mean outsourcing project development, COTS, open-source assuming paid hosting, integration and support or whatever else. Right automated testing is product itself too. As told James Bach "Useful test automation is a major software project". I’m not trying to escape from original topic &lt;br /&gt;&lt;br /&gt;Really how you will sell that unclear automation? You need to prepare the best proposal, solution, surveys, fact sheets, comparisons and &lt;span style="font-weight: bold;"&gt;of course happy case studies&lt;/span&gt;. Once your presentation is polished out - you are ready to present it to your customer, stakeholders or, in general, decision-makers.&lt;br /&gt;&lt;br /&gt;In fact, people like and want real cases, they want to hear that you or whoever else did the same for some of "Fortune 100" companies. Moreover they want to know how, why and for how much they had got that. Your potential Clients want to know risks, issues, lessons learnt and benefits of your proposal from other guys who had got the experience. They would like to ask them but usually cannot. And my target as seller is to forestall them, I'm trying to show them case studies.&lt;br /&gt;&lt;br /&gt;Case studies could be personalized or anonymized. The last one appears as pattern (proper or anti) and still serves as message reflecting a real-life situations and experience. Someone may say it's tricky to show anonymous reviews/surveys. I'd rather agree in most cases. But what if your market is so limited and closed for sharing information? Answer - nothing but tricky hinting. What if your study covers a huge group of customers/users? In this case you can extract some representative groups with the same obtained result/capabilities/behavior/model or generally segment a target audience groups. I apologize for my passion, but statistical analysis is what I like as well as test automation.&lt;br /&gt;&lt;br /&gt;The fortunate case studies from me are cheerfully given but please consider them as patterns of proper or &lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;happy software automated testing&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Case #1 Various environments support, compatibility with other software, components...&lt;/span&gt;&lt;br /&gt;Test automation framework is designed as platform-independent. So that test engineers easily run test sets against various environments and combinations of installed software in order to test compatibility and fault tolerance under different real-life usage scenarios. For Web systems it could be running on various browsers and versions, with different combinations of installed plug-ins and add-ons on different set of OSs&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Case #2 Multiple Localization testing &lt;/span&gt;&lt;br /&gt;Automated tests are not tied to GUI visible captions, it means &lt;span style="font-weight: bold;"&gt;recognition &lt;/span&gt;is implemented by checking invariant attributes (ID, location binding in hierarchy, appearance index...). However localization validation is not nightmare. For that, localization database to be designed which feeds data for checking localization attributes in GUI. Basically you can run a verification of GUI either at runtime or as batch-state-checkpoint. The last one is better as it brings a separate level of testing called GUI localization testing. Other words, whole automation scope is split out on functional testing (the same code without parameterization will test product behavior for all locales) and GUI testing (will just verify appearance using dynamic parameterization from localization DB).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Case #3 Unstable GUI but stable API &lt;/span&gt;&lt;br /&gt;Some companies made and forced a decision of testing by pulling API. It means end-User UI is not touched upon testing. The drawback is that the approach will not cover real user interface but test coverage and stability will be incomparable to functional testing through GUI. Yet other advantages are less expensive overall automation, quicker execution and integration with codebase of AUT.&lt;br /&gt;However project decided to have GUI testing anyway. For that, test automation guys came up with GUI testing as additional verification layer which was inlined to API tests. It's really simple and clever - call or change something in application by API, then verify result again with API and additionally and independently in GUI.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Case #4 Business needs to support software As-Is-It-Now for a few years but fixing bugs will be applied by patches, CFs and so forth&lt;/span&gt;&lt;br /&gt;This case is a usual for COTS and enterprise systems. Support requires testing and main effort is regression. Business should make sure that fix does not affect existing functionality. This is very risky to ship critical fix without a round of regression testing. Here is automation can come as cheap or almost free solution (someone just have to run and review results)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Case #5 System does not evaluate significantly between releases. New release is just old one + some fixes + additional features&lt;/span&gt;&lt;br /&gt;It's again nice point to leave regression for test automation. The rest effort is spending on new features and bugs. From this point automation becomes very effective as returning investements on automation is continious process. It's like planting - initially you just spend after a while you gather in the crops but a little effort on support still have place.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Case #6 Often commits, often builds&lt;/span&gt;&lt;br /&gt;Making test automation as part of continuous integration in aggressive project environment for providing ASAP and often feedback about build quality. Some tests could be run as sanity checking against each code pre and/or post commit. The rest suite is run upon each new build arrival&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Case #7 Mission critical project shipping&lt;/span&gt;&lt;br /&gt;In this case stakeholders may agree to have automated tests as part of delivery package. For instance a new build is not accepted if test automation does not yet ready as planned for a build/release and if whole test suite does not result a Green (passed) result. This is really challengeable. Just imagine test automation is a inseparable part from a product. I like this approach especially for &lt;a href="http://en.wikipedia.org/wiki/Built-in_self-test"&gt;self-tests&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/TPT_%28Software%29"&gt;embedded &lt;/a&gt;automated tests. Take a look at the &lt;a href="http://www.eventhelix.com/RealtimeMantra/FaultHandling/hardware_diagnostics.htm"&gt;example&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Case #8 Our system is a legacy back-end data processing and some unstable (under continuous development) to changes UI. Almost no money on test automation&lt;/span&gt;&lt;br /&gt;under this case goes well a claim "We just need to support that unknown legacy system with small money". Well, if small effort, consider automation of system logs parsing, checking datatbase consistency, reliability and data integrity by running queries periodically, &lt;a href="http://www.codeproject.com/KB/debug/automemorydump.aspx?msg=750761&amp;amp;PageFlow=FixedWidth"&gt;automatic memory dumps processing&lt;/a&gt; (&lt;a href="http://windbg.info/download/doc/pdf/WinDbg_A_to_Z_color.pdf"&gt;learn in depth&lt;/a&gt;), build in a memory leaks checkers, &lt;a href="http://at4qa.blogspot.com/2010/08/this-simple-vbs-script-can-be-used-to.html"&gt;continous health monitoring of environment&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Case #9 Test automation is looks like chaotic but it's smart distributed one indeed&lt;/span&gt;&lt;br /&gt;Imagine you have a cloud of various environment and you have a smart dispatcher which decides which tests, where and how to run based on its acknowledges about the cloud. This is amazing abstraction that presents accelerated test running relying on wide spread test stands and acknowledged by stands load/usage. System completely controls execution, engineer just to check results out in real-time. IMO it's state of art!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Case #10 Integration with 3-rd par&lt;/span&gt;ty systems&lt;br /&gt;Test automation daemon may sit as listener somewhere in integration point. Automated test should understand native communication language, so listening traffic and verifying result is just a deal. Let say we can create Web services testing (SOAP/WSDL) which utilizes the same data schema as it incorporated in web service itself. Test can proxy, interpret, stub or listen data.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Case #11 Security is a priority number one on Agile (shipping often) project&lt;/span&gt;&lt;br /&gt;It’s not a secret &lt;a href="http://at4qa.blogspot.com/2010/01/automated-security-testing.html"&gt;security testing can be perfectly modeled and automated&lt;/a&gt;. The core of security tests will work against most of web projects (XSS, SQL injections, session hijacking, tampering, sniffing and so forth). If a project runs short iterations and releasing frequency is high, security tests could be run over and over again against pages and contained. For instance test engine walks through all web pages and then feeds basic dangerous scripts (JS, SQL, VBS, sh) to all fields, then triggering form submission. You can even simulate DOS attacks and brute force password hacking. Although there are already many tools which will do it for you, thus our job is just to automate execution and reporting.&lt;br /&gt;&lt;br /&gt;Is it enough?  It does not but I need to stop this story in a fear the story will never finish. Actually any project can produce different cases and practices since inviting a best fit to project solution demands creativity and out of the ordinary thinking. Patterns themselves don't require using them as is, they are rather reusable good practices which could be ported and adopted if it make sense in your project. Using combination of patterns may bear new patterns or a single pattern of level higher than reused ones.&lt;br /&gt;&lt;br /&gt;It would be very nice if we will share specific cases, patterns and lessons learnt of &lt;span style="font-weight: bold;"&gt;fortunate test automation&lt;/span&gt;. I just doubt why bloggers running test automation exchange their successes and achievements too rarely for the industry; instead we can found risks, problems, obstacles and why-dont-run-low-ROI-automation mostly in the internet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-3860123864695397208?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/3860123864695397208/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=3860123864695397208&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/3860123864695397208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/3860123864695397208'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/09/fortunate-test-automation.html' title='Fortunate Test Automation'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_H8RIeuOZSco/TIPosvHrtCI/AAAAAAAAD4Q/OAs4MKEGeOw/s72-c/golf.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-5960115977971611599</id><published>2010-09-04T02:27:00.000-07:00</published><updated>2010-09-04T06:29:04.933-07:00</updated><title type='text'>TestNG unit testing framework for Java: annotations, listeners, interceptors</title><content type='html'>I'm running a short research devoted to synthesize various techniques, framework and practices in automated testing including Unit testing. Why am I doing that? Don't know, and I'm not going to explain my intentions as can't find certain ones myself. Some frameworks presented in this blog appear as just highlight, some provide detailed overview.&lt;br /&gt;&lt;br /&gt;TestNG is the next one in a series of Unit testing FW overviews. Here are &lt;a href="http://testng.org/doc/documentation-main.html#testng-xml"&gt;a documentation http://testng.org/doc/documentation-main.html#testng-xml&lt;/a&gt; and &lt;a href="http://testng.org/javadocs/index.html"&gt;JavaDoc http://testng.org/javadocs/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As not a real user of that framework, in fact I can't run and report in-depth analysis. IMO the core axis and feature of TestNG is wide use of &lt;a href="http://en.wikipedia.org/wiki/Java_annotation"&gt;annotations&lt;/a&gt;. The whole list of annotations and attributes in TestNG is &lt;a href="http://testng.org/doc/documentation-main.html#annotations"&gt;here&lt;/a&gt;. The set of @BeforeXXX and @AfterXXX annotations serve as inherited implementation of setup() / teardown() in xUnit. &lt;a href="http://testng.org/doc/documentation-main.html#testng-xml"&gt;testing.xml&lt;/a&gt; specifies how test suites are built, how execution flow is supposed to be and like sequencing, shuffling.&lt;br /&gt;&lt;br /&gt;Authors took care about compatibility with Junit Reporter XML schema, though they claim that their own reporter contains more specific information so that TestNG's native reporting schema is slightly different. But compatibility with jUnit reporter looks weak as developer should care about reporting himself using &lt;a href="http://testng.org/javadocs/org/testng/Reporter.html"&gt;org.testing.Reporter&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Advanced things like annotations customization, parallelism, listeners, interceptors are available at abovementioned referenced API and documentation.&lt;br /&gt;&lt;br /&gt;See also:&lt;br /&gt;- &lt;a href="http://at4qa.blogspot.com/2010/08/microsoft-testing-framework.html"&gt;MS's Framework overview&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://at4qa.blogspot.com/2010/07/google-testing-and-mocking-frameworks.html"&gt;Google's Framework overview &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-5960115977971611599?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/5960115977971611599/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=5960115977971611599&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/5960115977971611599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/5960115977971611599'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/09/testng-unit-testing-framework-for-java.html' title='TestNG unit testing framework for Java: annotations, listeners, interceptors'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-2282189277667338617</id><published>2010-08-31T11:48:00.000-07:00</published><updated>2010-08-31T12:50:43.122-07:00</updated><title type='text'>Blog Day is Today - let's open up for guest blogging</title><content type='html'>&lt;a href="http://www.blogday.org/" target="_blank"&gt;&lt;img src="http://www.blogday.org/images/badge_red.gif" alt="Blog Day 2010" width="310" height="130" /&gt;&lt;/a&gt;&lt;br /&gt;In accordance with BlogDay.org &lt;blockquote&gt;&lt;span style="font-style: italic;"&gt;one long moment on August 31st, bloggers from all over the world will post recommendations of 5 new Blogs, preferably Blogs that are different from their own culture, point of view and attitude. On this day, blog readers will find themselves leaping around and discovering new, unknown Blogs, celebrating the discovery of new people and new bloggers.&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I would like to expand this by the proposal - Let's open our blogs for guest blogging (sure content should fit with blog theme and pass validation by original author(s)). The back links will track back to guest author's blog. Thus we will expand our net. What do you think? My blog is really open for your greate content in a field (you know  - test automation, QA, QC and technologies). At the same time I have some interesting articles to be published as guest author. Let's follow up!&lt;br /&gt;&lt;br /&gt;Meanwhile, I follow up the Blog Day goal - 5 blog post:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://googletesting.blogspot.com/"&gt;Google Testing Blog - http://googletesting.blogspot.com/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.asmartbear.com/"&gt;A Smart Bear blog  - http://blog.asmartbear.com/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.testingmentor.com/imtesty/"&gt;I.M. Testy blog - http://www.testingmentor.com/imtesty/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://inderpsingh.blogspot.com/"&gt;Software testing space - http://inderpsingh.blogspot.com/&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://coreygoldberg.blogspot.com/"&gt;Corey Goldberg Blog - http://coreygoldberg.blogspot.com/&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-2282189277667338617?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/2282189277667338617/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=2282189277667338617&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/2282189277667338617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/2282189277667338617'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/08/blog-day-is-today-lets-open-up-for.html' title='Blog Day is Today - let&apos;s open up for guest blogging'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-3818854025983507717</id><published>2010-08-31T02:10:00.000-07:00</published><updated>2010-08-31T08:06:04.107-07:00</updated><title type='text'>Prepare to interview with Geekinterview.com and Glassdoor.com</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.geekinterview.com//image/logo.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 253px; height: 54px;" src="http://www.geekinterview.com//image/logo.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The &lt;a href="http://www.geekinterview.com/Interview-Questions"&gt;http://www.geekinterview.com/Interview-Questions&lt;/a&gt; goes certainly to my list of Favorites.&lt;br /&gt;&lt;br /&gt;It really contains huge database of interesting and original questions which everyone may be questioned upon IT interview. I was surprised - there are a lot of shared real-life questions on &lt;a href="http://www.geekinterview.com/Interview-Questions/Testing"&gt;Testing&lt;/a&gt; (see there is break sown by different sections including automation). The direct links on &lt;a href="http://www.geekinterview.com/Interview-Questions/Testing/Test-Automation"&gt;test automation section&lt;/a&gt;, &lt;a href="http://www.geekinterview.com/Interview-Questions/Testing-Tools"&gt;testing tools&lt;/a&gt;, separately for QTP and TestComplete users - &lt;a href="http://www.geekinterview.com/Interview-Questions/Web/VB-Script"&gt;VBS questions&lt;/a&gt;, &lt;a href="http://www.geekinterview.com/Interview-Questions/Web/java-Script"&gt;JS questions&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You guys as creator of this resource - are rocks!&lt;br /&gt;&lt;br /&gt;Want to get hired by a particular Company? Be prepared by crawling questions from real interviews on Glassdoor.com (inside look at Salaries, Reviews and Interviews provided by real Users). This is a direct link to &lt;a href="http://www.glassdoor.com/Interview/index.htm"&gt;Interview Tab&lt;/a&gt;&lt;span style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;If you are lucky one and passed along several tech interviews at Your-Dream-Company, you are rolling over package negotiation with the employer Glassdoor.com again comes to play a role of naviagtor in that tricky moment "Neither play over nor loose offer".&lt;br /&gt;&lt;br /&gt;Other useful resources on this topic? All are Welcomed to suggest!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-3818854025983507717?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/3818854025983507717/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=3818854025983507717&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/3818854025983507717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/3818854025983507717'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/08/prepare-to-interview-with.html' title='Prepare to interview with Geekinterview.com and Glassdoor.com'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-2478414126031422086</id><published>2010-08-30T02:02:00.000-07:00</published><updated>2010-08-30T11:25:34.122-07:00</updated><title type='text'>Links: Unit Test Patterns and Framework overview by Marc Clifton</title><content type='html'>I don't use "Advanced Unit Test" but it looks pretty and beateful solution.&lt;br /&gt;&lt;br /&gt;First, read a view of Unit testing patterns. I found it interesting&lt;br /&gt;&lt;a href="http://www.codeproject.com/KB/architecture/autp5.aspx"&gt;http://www.codeproject.com/KB/architecture/autp5.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is really interesting vision on unit patterns? Running automation over UI and aka grey-box automatoin is perfectly modeled and presented in terms of MVC pattern (Model-View-Controller) -&lt;a href="http://www.codeproject.com/KB/architecture/autp5.aspx##mvc1"&gt;shortcut within the page&lt;/a&gt;&lt;br /&gt;The rest content (framework itself, shortcuts:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.codeproject.com/csharp/autp1.asp"&gt;Overview&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeproject.com/csharp/autp2.asp"&gt;Core Implementation&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeproject.com/csharp/autp3.asp"&gt;Testing Processes&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeproject.com/csharp/autp4.asp"&gt;Fixture Setup/Teardown, Test Repetition, And Performance Tests&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-2478414126031422086?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/2478414126031422086/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=2478414126031422086&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/2478414126031422086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/2478414126031422086'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/08/links-unit-test-patterns-and-framework.html' title='Links: Unit Test Patterns and Framework overview by Marc Clifton'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-3070608763310655157</id><published>2010-08-25T08:31:00.000-07:00</published><updated>2010-08-25T08:35:59.984-07:00</updated><title type='text'>The power of right motivation by RSA.org - awesome animate!</title><content type='html'>Must to see!&lt;br /&gt;&lt;br /&gt;&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/u6XAPnuFjJc?fs=1&amp;amp;hl=ru_RU"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/u6XAPnuFjJc?fs=1&amp;amp;hl=ru_RU" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Other videos of thir public researchs can be found &lt;a href="http://comment.rsablogs.org.uk/videos/"&gt;here (http://comment.rsablogs.org.uk/videos/)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-3070608763310655157?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/3070608763310655157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=3070608763310655157&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/3070608763310655157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/3070608763310655157'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/08/power-of-right-motivation-by-rsaorg.html' title='The power of right motivation by RSA.org - awesome animate!'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-2364508404401307592</id><published>2010-08-24T11:41:00.000-07:00</published><updated>2010-08-24T11:52:54.665-07:00</updated><title type='text'>Working with objects in JS</title><content type='html'>The starting point to get confidence over JavaScript OO (object-oriented approach) full support take a look at &lt;a href="http://nefariousdesigns.co.uk/archive/2006/05/object-oriented-javascript/"&gt;this post (http://nefariousdesigns.co.uk/archive/2006/05/object-oriented-javascript/)&lt;/a&gt;. Emulation? Right - these are not C++ or Java techniques with deidcated keywords (protected, private, abstract, extends, template...) and operators (::, -&gt;, : &lt;&gt;...). But - it (JS) works and fits pretty well to develop GUI, test automation harness, tools and utilities. Keep it simple, right?&lt;br /&gt;&lt;br /&gt;Hovewer the primary intention of the post is to give Ready-to-Go utilities to work with JS's objects as data structures for TestComplete (JS) users. The excerpt is here:&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; //USEUNIT TypeTraits  &lt;br /&gt; function Clone ( obj )  &lt;br /&gt; {  &lt;br /&gt;      if (!TypeTraits.IsReference ( obj ))  &lt;br /&gt;      {  &lt;br /&gt;           return obj;  &lt;br /&gt;      }  &lt;br /&gt;      var newObj = new Object ( );  &lt;br /&gt;      for ( var key in obj )  &lt;br /&gt;      {  &lt;br /&gt;           newObj [ key ] = Clone ( obj [ key ] );  &lt;br /&gt;      }  &lt;br /&gt;      return newObj;  &lt;br /&gt; }  &lt;br /&gt; function toString( obj )  &lt;br /&gt; {  &lt;br /&gt;      var _collectionToString = function( obj, indent ){  &lt;br /&gt;           var newIndent = indent || "";  &lt;br /&gt;           newIndent += "  ";  &lt;br /&gt;           var pairs = [];  &lt;br /&gt;           for (var key in obj)  &lt;br /&gt;           {                 &lt;br /&gt;                if ( obj[key] === null )  &lt;br /&gt;       {  &lt;br /&gt;         var value = "null";  &lt;br /&gt;       }  &lt;br /&gt;       else if ( typeof obj[key] == "object" )  &lt;br /&gt;       {  &lt;br /&gt;                     var value = _collectionToString( obj[key], newIndent )  &lt;br /&gt;       }    &lt;br /&gt;                else  &lt;br /&gt;       {  &lt;br /&gt;                     var value = obj[key];  &lt;br /&gt;       }  &lt;br /&gt;                pairs.push( "\n"+newIndent+key+" : "+value );  &lt;br /&gt;           }  &lt;br /&gt;           return ( "{"+pairs+"\n"+indent+"}" ).replace( /\{[\n\s]+\}/mg,"{}"); //remove all spaces between empty {}  &lt;br /&gt;      }  &lt;br /&gt;      return _collectionToString( obj, "" )  &lt;br /&gt; }  &lt;br /&gt; function merge( /*Object*/ base, /*Object*/ another )  &lt;br /&gt; {  &lt;br /&gt;      /*  &lt;br /&gt;           PURPOSE:  &lt;br /&gt;                Merge base object with another object  &lt;br /&gt;           RETURNS  &lt;br /&gt;                Merged object.   &lt;br /&gt;                Fields of "base" replaced with those of "another"  &lt;br /&gt;      */  &lt;br /&gt;      //Clone base into resulting object to avoid damage to base object       &lt;br /&gt;      var result = new Object();  &lt;br /&gt;      if ( base )  &lt;br /&gt;      {  &lt;br /&gt;           for ( property in base )  &lt;br /&gt;           {  &lt;br /&gt;                if ( base.hasOwnProperty(property) )  &lt;br /&gt;                     result[property] = base[property];  &lt;br /&gt;           }  &lt;br /&gt;      }  &lt;br /&gt;   // merge  &lt;br /&gt;      if ( another )  &lt;br /&gt;      {  &lt;br /&gt;           for ( property in another )  &lt;br /&gt;           {  &lt;br /&gt;                if ( another.hasOwnProperty(property) &amp;amp;&amp;amp; ( another[property] !== null) )  &lt;br /&gt;                     result[property] = another[property];  &lt;br /&gt;           }  &lt;br /&gt;      }  &lt;br /&gt;      return result;  &lt;br /&gt; }  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-2364508404401307592?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/2364508404401307592/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=2364508404401307592&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/2364508404401307592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/2364508404401307592'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/08/working-with-objects-in-js.html' title='Working with objects in JS'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-7959644213148274258</id><published>2010-08-23T05:12:00.000-07:00</published><updated>2010-08-23T07:41:03.451-07:00</updated><title type='text'>Control recognition problem</title><content type='html'>&lt;p  style="text-align: justify; margin-left: 0pt; margin-right: 0pt;font-family:verdana;"&gt;&lt;span style="font-size:100%;"&gt;TestComplete has lots of built-in features to operate with  properties and methods of tested object. As was mentioned in a previous  section, all wrappers over controls of AUT are implemented in  components. This part of codebase is much often subject of changes from  release to release and usually those changes are unpredictable. One day,  our team was not ready to run in-time full regression tests against  fresh build because of recent changes in DOM tree for many objects.  We  were need to invite something robust, not silent and not verbose&lt;/span&gt;&lt;span style="font-size:100%;"&gt;;&lt;/span&gt;&lt;span style="font-size:100%;"&gt; this mechanism  should report something into logs when a control was not found directly  but it should attempt to recognize that control using set of provided  properties. &lt;/span&gt;&lt;span style="font-size:100%;"&gt;We developed robust pattern that posses&lt;/span&gt;&lt;span style="font-size:100%;"&gt; obvious  advantages:&lt;/span&gt;&lt;/p&gt;&lt;ul  type="disc" style="font-family:verdana;"&gt;&lt;li style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;Easy  code maintenance: to call an object &lt;/span&gt;&lt;span style="font-size:100%;"&gt;located&lt;/span&gt;&lt;span style="font-size:100%;"&gt; on a page, just  write something like this:&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p  style="margin-left: 0pt; margin-right: 0pt; text-align: left; color: rgb(0, 0, 153);font-family:courier new;"&gt;&lt;span style="font-size:100%;"&gt;var conext =  Common.GetAppTop();&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin-left: 0pt; margin-right: 0pt; text-align: left;font-family:verdana;"&gt;&lt;span style="color: rgb(0, 0, 153);font-size:100%;" &gt;var res = recognizeControl (  w.Panel(0).Panel(0).Panel(0).TextNode(0).Link(0),  ["ObjectType","innerHTML"], ["Link","Log in"], context);&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;i style="font-style: italic;"&gt;  &lt;/i&gt;&lt;span style="font-style: italic;"&gt;  &lt;/span&gt;           &lt;/span&gt;&lt;/p&gt;&lt;ul  type="disc" style="font-family:verdana;"&gt;&lt;li style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;Robust change  management: if object direct path was changed on a page, test log will  report an error but the control will be found indirectly either within a  particular html element (e.g. cell, row) or within whole web page.&lt;/span&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span style="font-size:100%;"&gt;Automatic checking of correspondence between  properties values of direct object path and specified object properties  for indirect search. In this way, we achieve discipline of test  development process and may reveal hidden mismatches. For instance, this  code can reveal that “Log In” link has changed innerText property to  “Log Innn” but test will continue work with this control because direct  object path is correct.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p  style="text-align: justify; margin-left: 0pt; margin-right: 0pt;font-family:verdana;"&gt;&lt;span style="font-size:100%;"&gt;In conclusion, the proposed approach  of object recognition provides checking relevant properties and  expected object location simultaneously.&lt;/span&gt;&lt;span style="font-size:100%;"&gt; The code snippet  of the proposed pattern is presented below.&lt;/span&gt;&lt;/p&gt;&lt;p  style="text-align: justify; margin-left: 0pt; margin-right: 0pt;font-family:verdana;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="Section3"  style="font-family:verdana;"&gt;&lt;p style="text-align: center; margin-left: 0pt; margin-right: 0pt;"&gt;&lt;span style="font-size:100%;"&gt;&lt;img alt="" src="https://docs.google.com/File?id=df2k428k_8cc6fhhfh_b" width="456" border="0" height="353" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: center; margin-left: 0pt; margin-right: 0pt;"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;Figure. &lt;/b&gt;&lt;b&gt;Test automation framework&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="Section4"  style="font-family:verdana;"&gt;&lt;p style="text-align: justify; margin-left: 0pt; margin-right: 0pt;"&gt;&lt;span style="font-size:100%;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="Section5"  style="font-family:verdana;"&gt;&lt;p style="text-align: justify; margin-left: 0pt; margin-right: 0pt;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;Code snippet &lt;/span&gt;of  pattern for object recognition and verification &lt;/span&gt;&lt;span style="font-size:100%;"&gt;on the&lt;/span&gt;&lt;span style="font-size:100%;"&gt; fly &lt;/span&gt;&lt;span style="font-size:100%;"&gt;in &lt;span style="font-weight: bold;"&gt;JavaScript&lt;/span&gt;:&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;div class="Section6"&gt;&lt;p style="margin-left: 0pt; margin-right: 0pt; text-align: justify;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="margin-left: 0pt; margin-right: 0pt; text-align: justify;"&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;function&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; recognizeControl( directPath, _propCollection, _propValues, topParentPath ) &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;{&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;try&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;var&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; res;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;if&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; ( &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;typeof&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; ( _propCollection ) == &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;'string'&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; )&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;if&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; ( Init.GetCurBrowser() == &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;"firefox"&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; )&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _propCollection = _propCollection.replace( /innerText/g, &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;"innerHTML"&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; );&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; propCollection = _propCollection;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;else&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; propCollection = Arrays.ConvertArray ( _propCollection );&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;if&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; ( &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;typeof&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; ( _propValues ) == &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;'string'&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; )&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; propValues = _propValues;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;else&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; propValues = Arrays.ConvertArray( _propValues );&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;if&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; ( TypeTraits.IsFit( directPath ) &amp;amp;&amp;amp; directPath.Exists )&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;if&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; ( TypeTraits.IsFit( _propCollection ) &amp;amp;&amp;amp; TypeTraits.IsFit( _propValues ))&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PropMatch ( directPath, _propCollection, _propValues );&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;return&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; directPath;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;i&gt;&lt;font face="consolas"&gt;&lt;font color="#008000"&gt;&lt;font size="2"&gt;//specified direct link is returned&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;var&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; res;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;if&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; ( TypeTraits.IsFit( topParentPath )&amp;amp;&amp;amp; topParentPath.Exists )&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; res = topParentPath.FindChild( propCollection, propValues, &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#808000"&gt;&lt;font size="2"&gt;200&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; );&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;if&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; ( TypeTraits.IsFit( res )&amp;amp;&amp;amp; res.Exists )&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;return&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; res; &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;i&gt;&lt;font face="consolas"&gt;&lt;font color="#008000"&gt;&lt;font size="2"&gt;//the object was found located within the Parent object&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;else&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; {&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;if&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; ( TypeTraits.IsFit( topParentPath ) &amp;amp;&amp;amp; topParentPath.Exists )&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Log.Warning( &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;'Can`t find child with property name [ '&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; + propCollection.toString()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;' ]; and property value [ '&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; + _propValues.toString() + &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;' ]; on parent object;'&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;,&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;'&amp;nbsp;&amp;nbsp;&amp;nbsp; Parent:\r\n'&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; + topParentPath.FullName + &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;'\r\n&amp;nbsp;&amp;nbsp;&amp;nbsp; Page:\r\n'&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; + GetPage().URL, &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#808000"&gt;&lt;font size="2"&gt;300&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;, f );&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; res = GetPage().FindChild ( propCollection, propValues, &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#808000"&gt;&lt;font size="2"&gt;200&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; );&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;if&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; ( TypeTraits.IsFit( res ) &amp;amp;&amp;amp;&amp;nbsp; res.Exists )&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;return&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; res; &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;i&gt;&lt;font face="consolas"&gt;&lt;font color="#008000"&gt;&lt;font size="2"&gt;//the object was found located within the Page&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;else&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Log.Error( &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;'Cant find child with property name [ '&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; + _propCollection.toString() + &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;' ]; and property value [ '&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; + _propValues.toString() + &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;' ]'&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;+&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;''&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;return&lt;/font&gt;&lt;/font&gt;&lt;/font&gt; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;false&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;; &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;i&gt;&lt;font face="consolas"&gt;&lt;font color="#008000"&gt;&lt;font size="2"&gt;//default returning if nothing was found&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;catch&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; ( ex ) {&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Log.Error ( &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;'Exception occurs in Splitter.recognizeControl'&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;, ex.description, &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#808000"&gt;&lt;font size="2"&gt;300&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;, f );&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Init.exceptionHandler( arguments );&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;return&lt;/font&gt;&lt;/font&gt;&lt;/font&gt; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;false&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;i&gt;&lt;font face="consolas"&gt;&lt;font color="#008000"&gt;&lt;font size="2"&gt;// PropMatch validates if object having direct path has predefined properties as alternatives;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;function&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; PropMatch ( directPath, _propCollection, _propValues ){&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;var&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; str;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;try&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; {&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;if&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; (( &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;typeof&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; _propCollection == &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;'string'&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; ) || ( &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;typeof&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; _propCollection == &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;'number'&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; ))&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _propCollection = &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;new&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; Array( _propCollection );&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;if&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; (( &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;typeof&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; _propValues == &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;'string'&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; ) || ( &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;typeof&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; _propValues == &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;'number'&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; ))&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _propValues = &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;new&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; Array( _propValues );&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;for&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; ( &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;var&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; i = &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#808000"&gt;&lt;font size="2"&gt;0&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;; i &amp;lt; _propCollection.length; i++ ){&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;var&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; iProp = _propCollection[i].toString();&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;var&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; iProp = eval ( directPath.FullName + &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;"."&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; + iProp + &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;";"&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; );&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;if&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; ( &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;typeof&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; iProp != &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;'undefined'&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; ){&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;var&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; hasText; &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;i&gt;&lt;font face="consolas"&gt;&lt;font color="#008000"&gt;&lt;font size="2"&gt;// Boolean flag for text existing&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;if&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; ( _propValues[i].indexOf ( &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;'*'&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; ) == -&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#808000"&gt;&lt;font size="2"&gt;1&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; ){&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hasText = ( iProp == _propValues[i]);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;else&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hasText = &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;true&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;if&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; ( !hasText )&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Log.Warning (&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;"The direct path to object ["&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; + directPath.FullName + &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;"] has property ["&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; +&amp;nbsp; _propCollection[i] + &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;"] value ["&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; + iProp + &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;"] but expected value is ["&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; + _propValues[i] + &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;"]"&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;else&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Log.Warning ( &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;"Object ["&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; + directPath.FullName + &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;"] has no property ["&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; +&amp;nbsp; _propCollection[i] + &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;"]"&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;catch&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; ( ex ){&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Log.Error( &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;'Exception occurs in Splitter.PropMatch'&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;, &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;"The direct path to object ["&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; + directPath.FullName+&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;"] has property ["&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; +&amp;nbsp; _propCollection.toString() + &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;"] value ["&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; + iProp + &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;"] but expected value is ["&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt; + _propValues.toString() + &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#a31515"&gt;&lt;font size="2"&gt;"]"&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;, &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#808000"&gt;&lt;font size="2"&gt;300&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;, f );&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;return&lt;/font&gt;&lt;/font&gt;&lt;/font&gt; &lt;font face="consolas"&gt;&lt;font color="#0000ff"&gt;&lt;font size="2"&gt;false&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="consolas"&gt;&lt;font color="#000000"&gt;&lt;font size="2"&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;b style="color: rgb(11, 83, 148);"&gt;&lt;font size="2"&gt;&lt;br&gt;&lt;/font&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-7959644213148274258?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/7959644213148274258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=7959644213148274258&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/7959644213148274258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/7959644213148274258'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/08/control-recognition-problem.html' title='Control recognition problem'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-5546409126530087312</id><published>2010-08-18T13:12:00.000-07:00</published><updated>2010-08-18T13:22:28.721-07:00</updated><title type='text'>Automated testing of JS apps - embedded overview</title><content type='html'>I found tasty presentation on JS (Java Script) code test automation (Unit) in LinkedIn. Well, as fan of JS, cant's skip it to be shared. Enjoy this overview with frameworks comparision and various code snippets!&lt;br /&gt;&lt;br /&gt;&lt;div style='width:425px;text-align:left'&gt;&lt;object style='margin:0px' width='425' height='355'&gt;&lt;param name='movie' value='http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=js-testing-090916091841-phpapp01&amp;stripped_title=understanding-javascript-testing' /&gt;&lt;param name='allowFullScreen' value='true'/&gt;&lt;param name='allowScriptAccess' value='always'/&gt;&lt;embed src='http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=js-testing-090916091841-phpapp01&amp;stripped_title=understanding-javascript-testing' type='application/x-shockwave-flash' allowscriptaccess='always' allowfullscreen='true' width='425' height='355'&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-5546409126530087312?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/5546409126530087312/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=5546409126530087312&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/5546409126530087312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/5546409126530087312'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/08/automated-testing-of-js-apps-embedded.html' title='Automated testing of JS apps - embedded overview'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-1250392645546088551</id><published>2010-08-17T01:57:00.000-07:00</published><updated>2010-08-17T05:25:08.685-07:00</updated><title type='text'>Why We use “FAIL” for many reasons?</title><content type='html'>&lt;span style="" lang="EN-US"&gt;Why We use “FAIL” for many reasons?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="" lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="" lang="EN-US"&gt;Really why we are so restricted by test automation tools such as Mercury QTP and AutomatedQA TestComplete and other popular ones give us just 2 options – either report Pass or report Fail. If a test log contains at least one Fail – the whole run is getting Fail. This is OK. However I definitely want to have different statuses for checkers belonging to test design and other things occurring from time to time in automation. I propose the following breakdown:&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="" lang="EN-US"&gt;&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;Failed &lt;/span&gt;= on unmatched Assertions, comparisons and checkpoints. If test automation is checking GUI consistency, explicit GUI checkpoints should be designed&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="" lang="EN-US"&gt;&lt;span style="color: rgb(204, 0, 0); font-weight: bold; font-style: italic;"&gt;Error &lt;/span&gt;= on any runtime errors, exceptions, unexpected failures, compilation errors, missed objects, improper interfaces/methods/properties applied to objects. Generally – all fails out of checkpoint and assertions&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_H8RIeuOZSco/TGp950qo4OI/AAAAAAAAD3k/elX1cK9P1Ak/s1600/FailedError.bmp"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 138px;" src="http://4.bp.blogspot.com/_H8RIeuOZSco/TGp950qo4OI/AAAAAAAAD3k/elX1cK9P1Ak/s320/FailedError.bmp" alt="" id="BLOGGER_PHOTO_ID_5506351926757351650" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="" lang="EN-US"&gt;Unfortunate thing is that tools do not provide such statuses. Basically we have only Fail and Warning (but the last one does not affect overall status). The problem is rising when your team builds huge test automation suites and this team is responsible for test execution analysis. And not only for analysis and reporting to customers and management but that team should do it timely and efficiently with minimal effort. &lt;span style=""&gt; &lt;/span&gt;It means also that product issues should be reported ASAP and first to provide whole real picture on build quality as early as possible. The second thing is clearing up testing code, fix infrastructure problems, and discover reasons of unexpected failures (all that is what I indicated as Error). Well, actually the optimal work path under this pressure is essential. But how I can differentiate where is Fail in order to process and analyze first and where is that unexpected Error (the second matter), if tools vendors gave me generic Fail only??? I must to drill down to all failed test instances one by one.&lt;/span&gt;&lt;/p&gt;&lt;span style="" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="" lang="EN-US"&gt;Another not good practice is to continue test execution on any failure. I rather prefer to stop and cleanup execution at any failure (either Failed or Error)&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="" lang="EN-US"&gt;Here we go and the time to workaround is come. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="" lang="EN-US"&gt;We will create custom status in high-level reporting.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="" lang="EN-US"&gt;Turn off logging at all at the very testing beginning:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="" lang="EN-US"&gt;&lt;span style="font-weight: bold;"&gt;QTP&lt;/span&gt;: &lt;/span&gt;&lt;b&gt;&lt;span style="" lang="EN"&gt;Reporter.Filter = &lt;/span&gt;rfDisableAll&lt;/b&gt;&lt;b&gt;&lt;span style="" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="" lang="EN-US"&gt;&lt;span style="font-weight: bold;"&gt;TestComplete&lt;/span&gt;&lt;b&gt;: Log.Enabled = False&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="" lang="EN-US"&gt;then we will need to write 2 wrapping functions which will report Failed and Warning&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="" lang="EN-US"&gt;//Call this function on any test checkpoint/assertions failed&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal; color: rgb(51, 102, 255);"&gt;&lt;span style="" lang="EN-US"&gt;function &lt;span style="font-weight: bold;"&gt;LogFail &lt;/span&gt;(message, priority, options) {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-indent: 35.4pt; line-height: normal; color: rgb(51, 102, 255);"&gt;&lt;b&gt;&lt;span style="" lang="EN-US"&gt;Log.Enabled = True //&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="" lang="EN-US"&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="" lang="EN"&gt;QTP: Reporter.Filter = &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="" lang="EN-US"&gt;rfEnableAll&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-indent: 35.4pt; line-height: normal; color: rgb(51, 102, 255);"&gt;&lt;span style="" lang="EN-US"&gt;//Log Failure code &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-indent: 35.4pt; line-height: normal; color: rgb(51, 102, 255);"&gt;&lt;b&gt;&lt;span style="" lang="EN-US"&gt;Log.Enabled = False //&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="" lang="EN-US"&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="" lang="EN"&gt;QTP: Reporter.Filter = &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="" lang="EN-US"&gt;rfDisableAll&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-indent: 35.4pt; line-height: normal; color: rgb(51, 102, 255);"&gt;&lt;span style="" lang="EN-US"&gt;CleanUp (True, "Fail")&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-indent: 35.4pt; line-height: normal; color: rgb(51, 102, 255);"&gt;&lt;b&gt;&lt;span style="" lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal; color: rgb(51, 102, 255);"&gt;&lt;span style="" lang="EN-US"&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal; color: rgb(51, 102, 255);"&gt;&lt;span style="" lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal; color: rgb(51, 102, 255);"&gt;&lt;span style="" lang="EN-US"&gt;//Call this function on any unexpected error, exception…&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal; color: rgb(51, 102, 255);"&gt;&lt;span style="" lang="EN-US"&gt;function &lt;span style="font-weight: bold;"&gt;LogError &lt;/span&gt;(message, priority, options) {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-indent: 35.4pt; line-height: normal; color: rgb(51, 102, 255);"&gt;&lt;b&gt;&lt;span style="" lang="EN-US"&gt;Log.Enabled = True //&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="" lang="EN-US"&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="" lang="EN"&gt;QTP: Reporter.Filter = &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="" lang="EN-US"&gt;rfEnableAll&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-indent: 35.4pt; line-height: normal; color: rgb(51, 102, 255);"&gt;&lt;span style="" lang="EN-US"&gt;//Log Failure code &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-indent: 35.4pt; line-height: normal; color: rgb(51, 102, 255);"&gt;&lt;b&gt;&lt;span style="" lang="EN-US"&gt;Log.Enabled = False //&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="" lang="EN-US"&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="" lang="EN"&gt;QTP: Reporter.Filter = &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="" lang="EN-US"&gt;rfDisableAll&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-indent: 35.4pt; line-height: normal; color: rgb(51, 102, 255);"&gt;&lt;span style="" lang="EN-US"&gt;CleanUp (True, "Error")&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-indent: 35.4pt; line-height: normal; color: rgb(51, 102, 255);"&gt;&lt;b&gt;&lt;span style="" lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="" lang="EN-US"&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;}&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="" lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="" lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="" lang="EN-US"&gt;After that we will learn high-level reporting (aka Dashboard) to understand and properly display if a test log contains at least one Warning – show up Error. Otherwise – overall run status should be matched with native status decided by test tool, i.e. Pass=Pass, Fail=Fail&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="" lang="EN-US"&gt;In TestComplete/QTP test run should message to Dashboard (TestRunStatus variable) DB in such a way within Cleanup () method:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal; color: rgb(51, 102, 255);"&gt;&lt;span style="" lang="EN-US"&gt;Function &lt;span style="font-weight: bold;"&gt;CleanUp &lt;/span&gt;(doTerminate, ErrLevel) { //doTerminate True/False&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-indent: 35.4pt; line-height: normal; color: rgb(51, 102, 255);"&gt;&lt;span style="" lang="EN-US"&gt;//Some operations to free execution&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-indent: 35.4pt; line-height: normal; color: rgb(51, 102, 255);"&gt;&lt;span style="" lang="EN-US"&gt;//…&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-indent: 35.4pt; line-height: normal; color: rgb(51, 102, 255);"&gt;&lt;span style="" lang="EN-US"&gt;//&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-indent: 35.4pt; line-height: normal; color: rgb(51, 102, 255);"&gt;&lt;span style="" lang="EN-US"&gt;If (ErrLevel = “Fail”) TestRunStatus = Fail&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-indent: 35.4pt; line-height: normal; color: rgb(51, 102, 255);"&gt;&lt;span style="" lang="EN-US"&gt;&lt;span style=""&gt;                &lt;/span&gt;Else If (ErrLevel = “Error”) TestRunStatus = Error&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-indent: 35.4pt; line-height: normal; color: rgb(51, 102, 255);"&gt;//Calling termination whole test execution&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-indent: 35.4pt; line-height: normal; color: rgb(51, 102, 255);"&gt;If (&lt;span style="" lang="EN-US"&gt;doTerminate) TerminateExecution()&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span  lang="EN-US" style="color:blue;"&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="" lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="" lang="EN-US"&gt;So what we’ve got? Localization project issues (including defects) is getting quicker, as Fail now means failure in functionality or behavior of tested application (AUT) – wrong result which is also known as deviation from Expected result; opposite status Error means something unexpected happened (test code problem, infrastructure, changes in AUT interfaces (e.g. changed Button caption results in impossibility to recognize the Button on screen).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="" lang="EN-US"&gt;Moving forward, someone can come up that Error and/or Fail could be split up on a few more. E.g. Error set can be considered as Exception | Environmental Error | 3&lt;sup&gt;rd&lt;/sup&gt; Party exception | Object missed | Object improper method/property | Execution crash. We can think out any custom execution statuses but not sure if that really needed.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="" lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style="" lang="EN-US"&gt;The proposed solution is good way to avoid mix up of different failures. Another approach I’d like to recommend (especially for those who use TestComplete) is to employ priority of logged messages (in our case Fail). TestComplete allows specifying priority of posted message to log. This gives opportunity to make more flexible model of failures reporting. Somehow it implies to make your framework remember maximum number of priority of posted Fail to the log. Finally maximum priority value will be Fail priority for test run overall. Then you can design Dashboard with usable coloring to represent priority and to give direction t&lt;/span&gt;&lt;span style="" lang="EN-US"&gt;o analysis order from huge scope. In the example below, Fail (500) could be used as Fail in application test itself (assert/checkpoint fail), Fail (100) – unexpected exception (e.g. database connection exception), Fail (300) – Browser hang (who knows, maybe our tested application is too leaking and caused to browser hang)&lt;span style="" lang="EN-US"&gt;&lt;a onblur="try  {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_H8RIeuOZSco/TGp-K2AdpRI/AAAAAAAAD3s/cBZPgfiZRJ0/s1600/Fail_priority.JPG"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 189px; height: 43px;" src="http://1.bp.blogspot.com/_H8RIeuOZSco/TGp-K2AdpRI/AAAAAAAAD3s/cBZPgfiZRJ0/s400/Fail_priority.JPG" alt="" id="BLOGGER_PHOTO_ID_5506352219175101714" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;br /&gt;&lt;span style="" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-1250392645546088551?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/1250392645546088551/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=1250392645546088551&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/1250392645546088551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/1250392645546088551'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/08/why-we-use-fail-for-many-reasons.html' title='Why We use “FAIL” for many reasons?'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_H8RIeuOZSco/TGp950qo4OI/AAAAAAAAD3k/elX1cK9P1Ak/s72-c/FailedError.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-1036644037539169030</id><published>2010-08-12T13:28:00.000-07:00</published><updated>2010-08-24T10:49:21.123-07:00</updated><title type='text'>Customizable random strings generator in JavaScript (TestComplete)</title><content type='html'>What this guy can give you? Answer: the class allowing to generate a custom (predefined by pattern or type)  string. The code is fully compatible with TestComplete - just add it as library to your Project. Another application - to use as routine code for JS scripts in web. In this case you have to hack some line, like logging, other TestComplete's function calls.&lt;br /&gt;&lt;br /&gt;&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; //USEUNIT TypeTraits   &lt;br /&gt;  var _String;  &lt;br /&gt; function RandomStringFactory ( minLen, maxLen, type, pattern )  &lt;br /&gt; {  &lt;br /&gt;  new GeneratedStringObject ( minLen, maxLen, type, pattern );  &lt;br /&gt;  return _String;   &lt;br /&gt; }  &lt;br /&gt; function GeneratedStringObject ( minLen, maxLen, type, pattern )   &lt;br /&gt; {  &lt;br /&gt;  this.minLen      = minLen;  &lt;br /&gt;  this.maxLen      = maxLen;  &lt;br /&gt;  this.type           = type;  &lt;br /&gt;  this.pattern      = pattern;  &lt;br /&gt;  _String = GenerateStringWrapper ( this );  &lt;br /&gt; }  &lt;br /&gt; function GenerateStringWrapper ( obj )   &lt;br /&gt; {                    &lt;br /&gt;  return GenerateString ( obj.minLen, obj.maxLen, obj.type, obj. pattern );  &lt;br /&gt; }                                      &lt;br /&gt; function GenerateString ( minLen, maxLen, type, pattern ) //minLen, maxLen, type, pattern  &lt;br /&gt; {                             &lt;br /&gt;      //var minLen=11, maxLen=1150, type="free", pattern="dddcccsss$dddsssccc";   &lt;br /&gt;       var resString = "";  &lt;br /&gt;       var len;  &lt;br /&gt;  if ( ValidateParameters ( minLen, maxLen, type ))  &lt;br /&gt;  {   &lt;br /&gt;   //Randomize();  &lt;br /&gt;   len = minLen+Math.floor ( Math.random ( ) * ( maxLen - minLen ));  &lt;br /&gt;   switch ( type )   &lt;br /&gt;       {  &lt;br /&gt;       case ("alpha")          :     resString = ProduceAlphaStr ( len );  &lt;br /&gt;            break;  &lt;br /&gt;       case ("num")               : resString = ProduceNumStr ( len );   &lt;br /&gt;            break;   &lt;br /&gt;       case ("alphanum")     : resString = ProduceAlphaNumStr ( len );   &lt;br /&gt;            break;   &lt;br /&gt;       case ("email")          : resString = ProduceEmailStr ( len );   &lt;br /&gt;            break;  &lt;br /&gt;    case ("validEmail"): resString = ProduceValidEmailStr ( len );   &lt;br /&gt;            break;   &lt;br /&gt;       case ("free")               : resString = ProduceFreeString ( len );   &lt;br /&gt;            break;  &lt;br /&gt;       case ("custom"):   &lt;br /&gt;            if ( pattern != "" &amp;amp;&amp;amp; pattern != null )  &lt;br /&gt;                 resString = ProduceCustomString ( pattern );  &lt;br /&gt;            else   &lt;br /&gt;                     Log.Error ( "No pattern for randomly generated field with type Custom string" )   &lt;br /&gt;            break;  &lt;br /&gt;       default: resString = ProduceFreeString ( );  &lt;br /&gt;            break;   &lt;br /&gt;       }  &lt;br /&gt;  }                        &lt;br /&gt;  return resString;  &lt;br /&gt; }  &lt;br /&gt; function ValidateParameters ( minLen, maxLen, type )  &lt;br /&gt; {  &lt;br /&gt;      if ( !isNaN ( minLen ) &amp;amp;&amp;amp; !isNaN ( maxLen ) &amp;amp;&amp;amp; minLen &amp;lt;= maxLen )  &lt;br /&gt;       if ( TypeTraits.IsFit ( type ))   &lt;br /&gt;        return true;  &lt;br /&gt;   else   &lt;br /&gt;           return false;  &lt;br /&gt; }  &lt;br /&gt; function ProduceCustomString(pattern)  &lt;br /&gt; {  &lt;br /&gt;  var res                              = "";  &lt;br /&gt;  var AlphaSet                    = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";  &lt;br /&gt;  var NumSet                         = "0123456789";  &lt;br /&gt;  var SpecialCharSet     = "!#$%&amp;amp;')(*+,-./:;&amp;lt;=&amp;gt;?@[\]^_`{|}~";  &lt;br /&gt;  //Randomize();  &lt;br /&gt;  for ( var i = 0; i &amp;lt; pattern.length; i++)   &lt;br /&gt;      {   &lt;br /&gt;       var curChar=pattern.charAt (i);  &lt;br /&gt;            switch (curChar)   &lt;br /&gt;       {  &lt;br /&gt;       case ("c") : ch = AlphaSet.charAt (Math.floor ( Math.random () * ( AlphaSet.length )));  &lt;br /&gt;            break;  &lt;br /&gt;       case ("d") : ch = NumSet.charAt ( Math.floor ( Math.random () * ( NumSet.length )));    &lt;br /&gt;                 break;   &lt;br /&gt;       case ("s") : ch = SpecialCharSet.charAt ( Math.floor ( Math.random () * ( SpecialCharSet.length )));   &lt;br /&gt;            break;  &lt;br /&gt;       default: ch = curChar;   //any const char, e.g. @ - apply as is  &lt;br /&gt;       }  &lt;br /&gt;       res += ch;  &lt;br /&gt;  }  &lt;br /&gt;  return res;  &lt;br /&gt; }  &lt;br /&gt; function ProduceAlphaStr( len )   &lt;br /&gt; {  &lt;br /&gt;      var pattern = "";  &lt;br /&gt;      for ( var i = 0; i &amp;lt; len; i++ )  &lt;br /&gt;      pattern += "c"   &lt;br /&gt;      return ProduceCustomString ( pattern );  &lt;br /&gt; }  &lt;br /&gt; function ProduceNumStr ( len )   &lt;br /&gt; {  &lt;br /&gt;      var pattern = "";  &lt;br /&gt;      for ( var i = 0; i &amp;lt; len; i++ )  &lt;br /&gt;      pattern += "d"   &lt;br /&gt;      return ProduceCustomString ( pattern );  &lt;br /&gt; }  &lt;br /&gt; function ProduceAlphaNumStr ( len )   &lt;br /&gt; {  &lt;br /&gt;      //Randomize();  &lt;br /&gt;      var pattern="";  &lt;br /&gt;      var fl;  &lt;br /&gt;      for ( var i = 0; i &amp;lt; len; i++ )  &lt;br /&gt;       {   &lt;br /&gt;           fl = Math.floor ( Math.random () * (2));  &lt;br /&gt;           var ch = (fl == 0) ? "d":(( fl==1 ) ? "c" : "s");   &lt;br /&gt;           pattern += ch;   &lt;br /&gt;      }  &lt;br /&gt;       return ProduceCustomString ( pattern );  &lt;br /&gt; }  &lt;br /&gt; function ProduceFreeString ( len )  &lt;br /&gt; {                   &lt;br /&gt;      //Randomize();  &lt;br /&gt;      var pattern = "";  &lt;br /&gt;      var fl;  &lt;br /&gt;      for ( var i = 0; i &amp;lt; len; i++ )  &lt;br /&gt;      {  &lt;br /&gt;           fl = Math.floor ( Math.random () * (3));  &lt;br /&gt;           var ch = (fl==0) ? "d":((fl==1) ? "c" : "s");   &lt;br /&gt;           pattern+=ch;   &lt;br /&gt;      }  &lt;br /&gt;      return ProduceCustomString ( pattern );  &lt;br /&gt; }  &lt;br /&gt; function ProduceEmailStr ( len )   &lt;br /&gt; {   &lt;br /&gt;      //Randomize();  &lt;br /&gt;      var pattern = "";  &lt;br /&gt;      var fl;  &lt;br /&gt;      var ret = true;  &lt;br /&gt;      var ch = "";  &lt;br /&gt;      for ( var i = 0; i &amp;lt; len; i++ )  &lt;br /&gt;      {                 &lt;br /&gt;           var remainedCh = len - i;  &lt;br /&gt;           if ( remainedCh &amp;gt; 9 )  &lt;br /&gt;           {  &lt;br /&gt;                fl = Math.floor ( Math.random () * (2));  &lt;br /&gt;                ch = (fl == 0) ? "d":((fl == 1) ? "c" : "s");   &lt;br /&gt;           }  &lt;br /&gt;           else   &lt;br /&gt;           {  &lt;br /&gt;                if ( ret == true )   &lt;br /&gt;                {  &lt;br /&gt;                     ch = "@";   &lt;br /&gt;                     ret = false;  &lt;br /&gt;        }  &lt;br /&gt;                else   &lt;br /&gt;                {  &lt;br /&gt;                 if ( remainedCh == 4 )   &lt;br /&gt;                          ch= ".";  &lt;br /&gt;                 else   &lt;br /&gt;                          ch= "c";    &lt;br /&gt;                }   &lt;br /&gt;        }  &lt;br /&gt;           pattern += ch;   &lt;br /&gt;      }  &lt;br /&gt;      return ProduceCustomString ( pattern );  &lt;br /&gt; }   &lt;br /&gt; function ProduceValidEmailStr ( len )   &lt;br /&gt; {   &lt;br /&gt;      //Randomize();  &lt;br /&gt;      var pattern = "";  &lt;br /&gt;      var fl;  &lt;br /&gt;      var ret = true;  &lt;br /&gt;      var ch = "";  &lt;br /&gt;      for ( var i = 0; i &amp;lt; len; i++ )  &lt;br /&gt;      {                 &lt;br /&gt;           var remainedCh = len - i;  &lt;br /&gt;           if ( remainedCh &amp;gt; 9 )  &lt;br /&gt;           {  &lt;br /&gt;                fl = Math.floor ( Math.random () * (2));  &lt;br /&gt;                ch = (fl == 1) ? "d":"c";   &lt;br /&gt;           }  &lt;br /&gt;           else   &lt;br /&gt;           {  &lt;br /&gt;                if ( ret == true )   &lt;br /&gt;                {  &lt;br /&gt;                     ch = "@";   &lt;br /&gt;                     ret = false;  &lt;br /&gt;        }  &lt;br /&gt;                else   &lt;br /&gt;                {  &lt;br /&gt;                 if ( remainedCh == 4 )   &lt;br /&gt;                          ch= ".";  &lt;br /&gt;                 else   &lt;br /&gt;                          ch= "c";    &lt;br /&gt;                }   &lt;br /&gt;        }  &lt;br /&gt;           pattern += ch;   &lt;br /&gt;      }  &lt;br /&gt;      return ProduceCustomString ( pattern );  &lt;br /&gt; }  &lt;br /&gt; function GetRandomElementFrom( /*Array*/ itemSet )  &lt;br /&gt; {  &lt;br /&gt;      /*  &lt;br /&gt;      PURPOSE  &lt;br /&gt;           Select and return random element from given array of items  &lt;br /&gt;      ARGUMENTS  &lt;br /&gt;           itemSet: array of elements of any type;  &lt;br /&gt;      RETURNS  &lt;br /&gt;           random element form given set  &lt;br /&gt;      */  &lt;br /&gt;      if ( !itemSet || (itemSet.length == 0 )){  &lt;br /&gt;           return null  &lt;br /&gt;      }  &lt;br /&gt;      else {  &lt;br /&gt;           return itemSet[ Math.floor( Math.random() * itemSet.length ) ]  &lt;br /&gt;      }  &lt;br /&gt; }  &lt;br /&gt; function test ()   &lt;br /&gt; {  &lt;br /&gt;      var w;  &lt;br /&gt;      for ( i = 0; i &amp;lt; 20; i++ )  &lt;br /&gt;      {  &lt;br /&gt;      w = GenerateString (12, 20, 'validEmail', null );  &lt;br /&gt;      w = w.toLowerCase ();  &lt;br /&gt;      Log.Message (w);  &lt;br /&gt;      }  &lt;br /&gt; }  &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-1036644037539169030?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/1036644037539169030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=1036644037539169030&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/1036644037539169030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/1036644037539169030'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/08/customizable-random-strings-generator.html' title='Customizable random strings generator in JavaScript (TestComplete)'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-524841267917666307</id><published>2010-08-06T06:41:00.000-07:00</published><updated>2010-08-06T06:41:00.433-07:00</updated><title type='text'>Technically efficeint and clearly explained Framework over Selenium</title><content type='html'>Guys did their best to highlight clearly in detail the approach and organization of framework over Selenium IDE. Actually I worked with 3 frameworks relying on XML. The difference is only that their framework connect data with UI elements explicitly in XML. My frameworks usually bind data and UI in scripting code. So that test data, steps (test case instructions) and UI map are loosely coupled.&lt;br /&gt;Also their framework could be improved with advantages of applying XML schema and other XML techniques (http://at4qa.blogspot.com/2010/01/tools-xml-orm-for-efficient.html)&lt;br /&gt;&lt;br /&gt;&lt;a title="View GTAC_SeleniumFramework on Scribd" href="http://www.scribd.com/doc/7949401/GTACSeleniumFramework" style="margin: 12px auto 6px auto; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; display: block; text-decoration: underline;"&gt;GTAC_SeleniumFramework&lt;/a&gt; &lt;object id="doc_87208" name="doc_87208" height="600" width="600" type="application/x-shockwave-flash" data="http://d1.scribdassets.com/ScribdViewer.swf" style="outline:none;" &gt;                &lt;param name="movie" value="http://d1.scribdassets.com/ScribdViewer.swf"&gt;                 &lt;param name="wmode" value="opaque"&gt;                 &lt;param name="bgcolor" value="#ffffff"&gt;                 &lt;param name="allowFullScreen" value="true"&gt;                 &lt;param name="allowScriptAccess" value="always"&gt;                 &lt;param name="FlashVars" value="document_id=7949401&amp;access_key=key-946x5lm754hhahra273&amp;page=1&amp;viewMode=list"&gt;                 &lt;embed id="doc_87208" name="doc_87208" src="http://d1.scribdassets.com/ScribdViewer.swf?document_id=7949401&amp;access_key=key-946x5lm754hhahra273&amp;page=1&amp;viewMode=list" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="600" width="600" wmode="opaque" bgcolor="#ffffff"&gt;&lt;/embed&gt;             &lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-524841267917666307?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/524841267917666307/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=524841267917666307&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/524841267917666307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/524841267917666307'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/08/technocally-efficeint-and-clearly.html' title='Technically efficeint and clearly explained Framework over Selenium'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-6733730646467480029</id><published>2010-08-05T03:58:00.000-07:00</published><updated>2010-08-05T04:43:48.975-07:00</updated><title type='text'>JSON generic converters</title><content type='html'>For those who AJAXing and work closely with JS this intercahnge format is essential. For those who things it's tricky - check out first the origianl site devoted to &lt;span style="color: rgb(51, 51, 153); font-weight: bold;font-family:courier new;" &gt;JSON &lt;/span&gt;- &lt;a href="http://www.json.org/"&gt;json.org&lt;/a&gt; and then - wikipedia page (&lt;a href="http://en.wikipedia.org/wiki/JSON"&gt;http://en.wikipedia.org/wiki/JSON&lt;/a&gt;) to realize how it's easy. Built-in JS's methods &lt;span style="font-style: italic;"&gt;stringify &lt;/span&gt;and &lt;span style="font-style: italic;"&gt;parse&lt;/span&gt; are basic for processing JSON back/forth strings&lt;br /&gt;&lt;br /&gt;The advanced scenarios are smart &lt;span style="font-style: italic;"&gt;Stringifiers&lt;/span&gt; and converters forth/back XML. The last one is especially applied task for making data compatible between 2 technologies (one may not know about JSON) and to improve performance of data transition (JSON is ~30% less and faster in remote data excahnging then XML)&lt;br /&gt;&lt;br /&gt;Just to share with you guys ready-to-go Java Script libraries:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Stringifier (with smart logic) find here implementation (&lt;a href="http://www.thomasfrank.se/downloadableJS/jsonStringify.js"&gt;http://www.thomasfrank.se/downloadableJS/jsonStringify.js&lt;/a&gt;) and &lt;a href="http://www.thomasfrank.se/json_stringify_revisited.html"&gt;notes from author&lt;/a&gt;&lt;/li&gt;&lt;li&gt;XML&lt;-&gt;JSON conversion in JS: &lt;a href="http://www.thomasfrank.se/downloadableJS/xml2json.js"&gt;first implementation&lt;/a&gt; and&lt;a href="http://michael.hinnerup.net/blog/wp-content/uploads/2008/01/JsonXml.js"&gt; second implementation&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Those who relies on frameworks and platforms - JSON's classes with all needed features are included in Java, .Net and some databases (JSOn serializers on a fly)&lt;br /&gt;&lt;br /&gt;P.S. jsut for fun - the same problem the same solution - Win Registry serializer on VC++ &lt;a href="http://www.codeguru.com/cpp/w-p/system/registry/article.php/c2859"&gt;http://www.codeguru.com/cpp/w-p/system/registry/article.php/c2859&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-6733730646467480029?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/6733730646467480029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=6733730646467480029&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/6733730646467480029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/6733730646467480029'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/08/json-generic-converters.html' title='JSON generic converters'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-634027590475559555</id><published>2010-08-03T08:51:00.000-07:00</published><updated>2010-08-04T00:50:12.656-07:00</updated><title type='text'>Microsoft Testing framework (Microsoft.VisualStudio.TestTools namespace) overview</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://ecx.images-amazon.com/images/I/41JEFC7KGNL._SL500_AA300_.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 300px; height: 300px;" src="http://ecx.images-amazon.com/images/I/41JEFC7KGNL._SL500_AA300_.jpg" alt="" border="0" /&gt;&lt;/a&gt;If you are working within .Net and other MS's platforms, you probably should be happy having Visual Studio Team System as part of Visual Studio IDE. This is getting more interesting if your ALM is Team Foundation Server as Visual Studio with TFS perfectly fit and compatible(can't be different?)&lt;br /&gt;&lt;br /&gt;What I like - is detailed useful and thought-out Team Test API. Yes API! This is presented within 5 namespaces (&lt;a href="http://msdn.microsoft.com/en-us/library/ms243438%28v=VS.80%29.aspx"&gt;references are here&lt;/a&gt;):&lt;br /&gt;Microsoft.VisualStudio.TestTools.LoadTesting&lt;br /&gt;Microsoft.VisualStudio.TestTools.UnitTesting&lt;br /&gt;Microsoft.VisualStudio.TestTools.UnitTesting.Web&lt;br /&gt;Microsoft.VisualStudio.TestTools.WebTesting&lt;br /&gt;Microsoft.VisualStudio.TestTools.WebTesting.Rules&lt;br /&gt;&lt;br /&gt;Besides of API, VS Team System provides GUI &lt;a href="http://msdn.microsoft.com/en-us/library/ms243146%28v=VS.80%29.aspx"&gt;User-friendly tool&lt;/a&gt;s for managing test sets, code edition within VS IDE (with all native capabilities) and record-playback feture. Supporting several languages running over CLR is also benefit of testing framework from Microsoft.&lt;br /&gt;&lt;br /&gt;One more important thing is Load testing pure functionality as part of Test Team API (performance/load modeling, profiling, watching performance counters, monitoring DB productivity and so fort) and all that goes with VS license!&lt;br /&gt;&lt;br /&gt;The Getting Started page of Unit Testing framework can be found on &lt;a href="http://msdn.microsoft.com/en-US/library/ms243147%28v=VS.80%29.aspx"&gt;this MSDN's page&lt;/a&gt;. As ususal in unit testing, API from MS gives various assertions, implemented within few classes. I found interesting and most useful from my standpoint, the following classes and theirs polymorphic assertions methods:&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-US/library/microsoft.visualstudio.testtools.unittesting.assert_members%28v=VS.80%29.aspx"&gt;Assert&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-US/library/microsoft.visualstudio.testtools.unittesting.stringassert_members%28v=VS.80%29.aspx"&gt;StringAssert&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-US/library/microsoft.visualstudio.testtools.unittesting.collectionassert_members%28v=VS.80%29.aspx"&gt;CollectionAssert&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-US/library/microsoft.visualstudio.testtools.unittesting.assertfailedexception_members%28v=VS.80%29.aspx"&gt;AssertFailedException&lt;/a&gt;&lt;br /&gt;The polymorphic approach of assertions afford the abstract interface which ease programming by datatype independency. It means proper implemntation of a particular data type is an internal thing and yuo should not care about that, as well as type trating, code and workflow safety, error and exception handling, reporting. Check out the benefit, for example from &lt;a href="http://msdn.microsoft.com/en-US/library/microsoft.visualstudio.testtools.unittesting.assert.areequal%28v=VS.80%29.aspx"&gt;overloading list of Assert.AreEqual&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;Data-driven testing (DDT) is mostly  implemented as data native agnostic model and I found that DDT is provided in 2 classes: &lt;a href="http://msdn.microsoft.com/en-US/library/microsoft.visualstudio.testtools.unittesting.datasourceelement_members%28v=VS.80%29.aspx"&gt;DataSourceElement&lt;/a&gt; and&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-US/library/microsoft.visualstudio.testtools.unittesting.datasourceattribute_members%28v=VS.80%29.aspx"&gt;DataSourceAttribute&lt;/a&gt;. If you need to process details of a particular test, just instantinate an object of &lt;a href="http://msdn.microsoft.com/en-US/library/microsoft.visualstudio.testtools.unittesting.testcontext_members%28v=VS.80%29.aspx"&gt;TestContext&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To understand a standart unit test workflow, check out the excerpts (from MSDN):&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center; font-weight: bold;"&gt;the original calss implementation&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&lt;span style="color:Blue;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:Blue;"&gt;namespace&lt;/span&gt; SampleClassLib&lt;br /&gt;{&lt;br /&gt;&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;class&lt;/span&gt; DivideClass&lt;br /&gt;{&lt;br /&gt;&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;static&lt;/span&gt; &lt;span style="color:Blue;"&gt;int&lt;/span&gt; DivideMethod(&lt;span style="color:Blue;"&gt;int&lt;/span&gt; denominator)&lt;br /&gt;{&lt;br /&gt;  &lt;span style="color:Blue;"&gt;return&lt;/span&gt; (2 / denominator);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: center; font-weight: bold;"&gt;the testing code is&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color:Blue;"&gt;using&lt;/span&gt; Microsoft.VisualStudio.TestTools.UnitTesting;&lt;br /&gt;&lt;span style="color:Blue;"&gt;using&lt;/span&gt; SampleClassLib;&lt;br /&gt;&lt;span style="color:Blue;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color:Blue;"&gt;using&lt;/span&gt; System.IO;&lt;br /&gt;&lt;span style="color:Blue;"&gt;using&lt;/span&gt; System.Windows.Forms;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:Blue;"&gt;namespace&lt;/span&gt; TestNamespace&lt;br /&gt;{&lt;br /&gt;[TestClass()]&lt;br /&gt;&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;class&lt;/span&gt; DivideClassTest&lt;br /&gt;{&lt;br /&gt;[AssemblyInitialize()]&lt;br /&gt;&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;static&lt;/span&gt; &lt;span style="color:Blue;"&gt;void&lt;/span&gt; AssemblyInit(TestContext context)&lt;br /&gt;{&lt;br /&gt;MessageBox.Show(&lt;span style="color: rgb(163, 21, 21);"&gt;"Assembly Init"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;[ClassInitialize()]&lt;br /&gt;&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;static&lt;/span&gt; &lt;span style="color:Blue;"&gt;void&lt;/span&gt; ClassInit(TestContext context)&lt;br /&gt;{&lt;br /&gt;MessageBox.Show(&lt;span style="color: rgb(163, 21, 21);"&gt;"ClassInit"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;[TestInitialize()]&lt;br /&gt;&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;void&lt;/span&gt; Initialize()&lt;br /&gt;{&lt;br /&gt;MessageBox.Show(&lt;span style="color: rgb(163, 21, 21);"&gt;"TestMethodInit"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;[TestCleanup()]&lt;br /&gt;&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;void&lt;/span&gt; Cleanup()&lt;br /&gt;{&lt;br /&gt;MessageBox.Show(&lt;span style="color: rgb(163, 21, 21);"&gt;"TestMethodCleanup"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;[ClassCleanup()]&lt;br /&gt;&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;static&lt;/span&gt; &lt;span style="color:Blue;"&gt;void&lt;/span&gt; ClassCleanup()&lt;br /&gt;{&lt;br /&gt;MessageBox.Show(&lt;span style="color: rgb(163, 21, 21);"&gt;"ClassCleanup"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;[AssemblyCleanup()]&lt;br /&gt;&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;static&lt;/span&gt; &lt;span style="color:Blue;"&gt;void&lt;/span&gt; AssemblyCleanup()&lt;br /&gt;{&lt;br /&gt;MessageBox.Show(&lt;span style="color: rgb(163, 21, 21);"&gt;"AssemblyCleanup"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;[TestMethod()]&lt;br /&gt;[ExpectedException(&lt;span style="color:Blue;"&gt;typeof&lt;/span&gt;(System.DivideByZeroException))]&lt;br /&gt;&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;void&lt;/span&gt; DivideMethodTest()&lt;br /&gt;{&lt;br /&gt;DivideClass target = &lt;span style="color:Blue;"&gt;new&lt;/span&gt; DivideClass();&lt;br /&gt;&lt;span style="color:Blue;"&gt;int&lt;/span&gt; a = 0;&lt;br /&gt;&lt;span style="color:Blue;"&gt;int&lt;/span&gt; actual;&lt;br /&gt;actual = target.DivideMethod(a);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;If the shown snippets are not clear why and how, study the &lt;a href="http://msdn.microsoft.com/en-US/library/ms182517%28v=VS.80%29.aspx"&gt;Structure of Unit Tests page&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Looks like everything in the box.&lt;br /&gt;AND one more interesting feature in .Net Reflection - thus testers and developers see internal staff of implementation, such as all properties and methods of UI control and so forth. Btw, using that test code basic verification testing (aka baseline) can be generated on fly&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-634027590475559555?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/634027590475559555/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=634027590475559555&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/634027590475559555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/634027590475559555'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/08/microsoft-testing-framework.html' title='Microsoft Testing framework (Microsoft.VisualStudio.TestTools namespace) overview'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-6286560407855637325</id><published>2010-08-03T00:58:00.000-07:00</published><updated>2010-08-23T07:47:53.333-07:00</updated><title type='text'>This simple VBS script can be used to health monitor your infrastracture</title><content type='html'>This simple VBS script can be used to health monitor your infrastracture. Each monitored machine should have turn on RPC service.&lt;br /&gt;&lt;br /&gt;The provided code should be saved as .vbs, e.g. HostsHealthMon.vbs&lt;br /&gt;&lt;br /&gt;To call the script, run in CL this (or make cmd file to wrap this call):&lt;br /&gt;cscript.exe HostsHealthMonitor.vbs&gt;&gt;\\YouRStorage\HostsHealtMon_Log.txt&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Option&lt;/span&gt; Explicit&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Dim&lt;/span&gt; Hosts, RootUser, RootPwd, forceAlarmCPU, forceAlarmHD, forceAlarmRAM, forceAlarmConnection&lt;br /&gt;&lt;span class="kwrd"&gt;Dim&lt;/span&gt; ptr, partitionRedLimit, CPUUsageRedLimit, RAMFreeRedLimit, IterationDelay, resetCount&lt;br /&gt;&lt;span class="kwrd"&gt;Dim&lt;/span&gt; lastCacheLogPath&lt;br /&gt;&lt;span class="kwrd"&gt;Dim&lt;/span&gt; httpServerUrl&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;' Description:    The Sub is responsible for initialization and reseting (on beginning of each cycle) settings&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;' Populate this set of variables With your data as descibed in comments for each block to configure run&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Sub&lt;/span&gt; InitVars ()&lt;br /&gt;  &lt;br /&gt;   &lt;span class="rem"&gt;'Machines for checking details: host name or IP, User Id and password&lt;/span&gt;&lt;br /&gt;    Hosts = Array(&lt;span class="str"&gt;"host1"&lt;/span&gt;, &lt;span class="str"&gt;"10.90.23.255"&lt;/span&gt;, &lt;span class="str"&gt;"host02"&lt;/span&gt;, &lt;span class="str"&gt;"host03"&lt;/span&gt;, &lt;span class="str"&gt;"Server01"&lt;/span&gt;)&lt;br /&gt;    RootUser = Array(&lt;span class="str"&gt;"Admin"&lt;/span&gt;, &lt;span class="str"&gt;"User"&lt;/span&gt;, &lt;span class="str"&gt;"Admin"&lt;/span&gt;, &lt;span class="str"&gt;"User01"&lt;/span&gt;, &lt;span class="str"&gt;"TestUser"&lt;/span&gt;)&lt;br /&gt;    RootPwd = Array(&lt;span class="str"&gt;"123west"&lt;/span&gt;, &lt;span class="str"&gt;"123west"&lt;/span&gt;, &lt;span class="str"&gt;"123west"&lt;/span&gt;, &lt;span class="str"&gt;"123west"&lt;/span&gt;, &lt;span class="str"&gt;"123west"&lt;/span&gt;)&lt;br /&gt;   &lt;br /&gt;    &lt;span class="rem"&gt;'Flags reseting&lt;/span&gt;&lt;br /&gt;    forceAlarmConnection = Array (&lt;span class="kwrd"&gt;True&lt;/span&gt;, &lt;span class="kwrd"&gt;True&lt;/span&gt;, &lt;span class="kwrd"&gt;True&lt;/span&gt;, &lt;span class="kwrd"&gt;True&lt;/span&gt;, &lt;span class="kwrd"&gt;True&lt;/span&gt;)&lt;br /&gt;    forceAlarmCPU = Array (&lt;span class="kwrd"&gt;True&lt;/span&gt;, &lt;span class="kwrd"&gt;True&lt;/span&gt;, &lt;span class="kwrd"&gt;True&lt;/span&gt;, &lt;span class="kwrd"&gt;True&lt;/span&gt;, &lt;span class="kwrd"&gt;True&lt;/span&gt;)&lt;br /&gt;    forceAlarmHD = Array (&lt;span class="kwrd"&gt;True&lt;/span&gt;, &lt;span class="kwrd"&gt;True&lt;/span&gt;, &lt;span class="kwrd"&gt;True&lt;/span&gt;, &lt;span class="kwrd"&gt;True&lt;/span&gt;, &lt;span class="kwrd"&gt;True&lt;/span&gt;)&lt;br /&gt;    forceAlarmRAM = Array (&lt;span class="kwrd"&gt;True&lt;/span&gt;, &lt;span class="kwrd"&gt;True&lt;/span&gt;, &lt;span class="kwrd"&gt;True&lt;/span&gt;, &lt;span class="kwrd"&gt;True&lt;/span&gt;, &lt;span class="kwrd"&gt;True&lt;/span&gt;)&lt;br /&gt;   &lt;br /&gt;    &lt;span class="rem"&gt;'Threasholds&lt;/span&gt;&lt;br /&gt;    partitionRedLimit = &lt;span class="str"&gt;"5"&lt;/span&gt;&lt;br /&gt;    CPUUsageRedLimit = &lt;span class="str"&gt;"95"&lt;/span&gt;&lt;br /&gt;    RAMFreeRedLimit  = &lt;span class="str"&gt;"50"&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;    &lt;span class="rem"&gt;'Settings for defining frequency of the reporting&lt;/span&gt;&lt;br /&gt;    IterationDelay = 100&lt;br /&gt;    resetCount = 5&lt;br /&gt;   &lt;br /&gt;    &lt;span class="rem"&gt;'Only latest results will be stored in this file (no history). E.g. a host had a problem with CPU load in previous full iteration and now it soes not, then the log file will contain nothing about that&lt;/span&gt;&lt;br /&gt;    lastCacheLogPath = &lt;span class="str"&gt;"\\hostStorage\HostsHealtMon_Cache.txt"&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;Call&lt;/span&gt; Delete_File ( lastCacheLogPath )&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;' Description:    removes specified file&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;' Parameter       sFile - name of folder to be removed&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; Delete_File (&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; sFile)&lt;br /&gt;&lt;span class="kwrd"&gt;On&lt;/span&gt; &lt;span class="kwrd"&gt;Error&lt;/span&gt; &lt;span class="kwrd"&gt;Resume&lt;/span&gt; &lt;span class="kwrd"&gt;Next&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;Const&lt;/span&gt; c_Proc = &lt;span class="str"&gt;"Delete_File"&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;Const&lt;/span&gt; c_DeleteReadOnly = &lt;span class="kwrd"&gt;True&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;    &lt;span class="kwrd"&gt;Dim&lt;/span&gt; iResult, oFSO&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;' Define default error code&lt;/span&gt;&lt;br /&gt;    iResult = &lt;span class="kwrd"&gt;True&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;Set&lt;/span&gt; oFSO = CreateObject(&lt;span class="str"&gt;"Scripting.FileSystemObject"&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;' Check if specified folder exists&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;If&lt;/span&gt; &lt;span class="kwrd"&gt;Not&lt;/span&gt; oFSO.FileExists(sFile) &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;        iResult = &lt;span class="kwrd"&gt;True&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="rem"&gt;' The file found&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;Else&lt;/span&gt;&lt;br /&gt;       &lt;br /&gt;        &lt;span class="rem"&gt;' Remove specified folder&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;Call&lt;/span&gt; oFSO.DeleteFile (sFile, c_DeleteReadOnly)&lt;br /&gt;&lt;br /&gt;        &lt;span class="rem"&gt;' Check operation result&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;If&lt;/span&gt; Err.Number &amp;lt;&amp;gt; 0 &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;            Wscript.Echo &lt;span class="str"&gt;"Can't remove the file '"&lt;/span&gt; &amp;amp;amp; sFile&lt;br /&gt;            iResult = &lt;span class="kwrd"&gt;False&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;Else&lt;/span&gt;&lt;br /&gt;            iResult = &lt;span class="kwrd"&gt;True&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt; &lt;span class="rem"&gt;' The folder found&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;Set&lt;/span&gt; oFSO = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;&lt;br /&gt;    Delete_File = iResult&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;' Description:    Writes in file&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;' Parameters:    objFile - file object&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;'                strText - text to write&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;' Result:        True / False&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; FileWrite(&lt;span class="kwrd"&gt;ByRef&lt;/span&gt; sFile, &lt;span class="kwrd"&gt;ByVal&lt;/span&gt; sText)&lt;br /&gt;    &lt;span class="kwrd"&gt;Dim&lt;/span&gt; iResult&lt;br /&gt;    &lt;span class="kwrd"&gt;Dim&lt;/span&gt; objFSO, objFile&lt;br /&gt;    iResult = &lt;span class="kwrd"&gt;True&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;Const&lt;/span&gt; ForAppending = 8&lt;br /&gt;   &lt;br /&gt;    &lt;span class="kwrd"&gt;Set&lt;/span&gt; objFSO = CreateObject(&lt;span class="str"&gt;"Scripting.FileSystemObject"&lt;/span&gt;)&lt;br /&gt;       &lt;br /&gt;        Err.Clear&lt;br /&gt;        &lt;span class="kwrd"&gt;Set&lt;/span&gt; objFile = objFSO.OpenTextFile (sFile, ForAppending, &lt;span class="kwrd"&gt;True&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;If&lt;/span&gt; Err.Number &amp;lt;&amp;gt; 0 &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;            Wscript.Echo &lt;span class="str"&gt;"Error appending to file "&lt;/span&gt; &amp;amp;amp; sFile&lt;br /&gt;            iResult = &lt;span class="kwrd"&gt;False&lt;/span&gt;&lt;br /&gt;            Err.Clear&lt;br /&gt;            &lt;span class="kwrd"&gt;Else&lt;/span&gt;&lt;br /&gt;                objFile.WriteLine sText&lt;br /&gt;                objFile.Close&lt;br /&gt;           &lt;br /&gt;        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;&lt;br /&gt;               &lt;br /&gt;    &lt;span class="kwrd"&gt;Set&lt;/span&gt; objFSO = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;Set&lt;/span&gt; objFile = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;    FileWrite = iResult&lt;br /&gt;&lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Sub&lt;/span&gt; Main()&lt;br /&gt;&lt;br /&gt;    InitVars ()&lt;br /&gt;   &lt;br /&gt;    &lt;span class="kwrd"&gt;Do&lt;/span&gt; &lt;span class="kwrd"&gt;While&lt;/span&gt; &lt;span class="kwrd"&gt;True&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;On&lt;/span&gt; &lt;span class="kwrd"&gt;Error&lt;/span&gt; &lt;span class="kwrd"&gt;Resume&lt;/span&gt; &lt;span class="kwrd"&gt;Next&lt;/span&gt;&lt;br /&gt;        ptr=0&lt;br /&gt;        resetCount = resetCount - 1&lt;br /&gt;        &lt;span class="kwrd"&gt;For&lt;/span&gt; &lt;span class="kwrd"&gt;Each&lt;/span&gt; Host &lt;span class="kwrd"&gt;In&lt;/span&gt; Hosts&lt;br /&gt;            &lt;span class="kwrd"&gt;Set&lt;/span&gt; objSWbemLocator = CreateObject(&lt;span class="str"&gt;"WbemScripting.SWbemLocator"&lt;/span&gt;)&lt;br /&gt;           &lt;br /&gt;            &lt;span class="kwrd"&gt;Dim&lt;/span&gt; alarmStr, tmpStr&lt;br /&gt;            alarmStr = &lt;span class="str"&gt;""&lt;/span&gt;&lt;br /&gt;            tmpStr = &lt;span class="str"&gt;""&lt;/span&gt;&lt;br /&gt;           &lt;br /&gt;            Err.Clear&lt;br /&gt;            &lt;span class="kwrd"&gt;Set&lt;/span&gt; objWMIService = objSWbemLocator.ConnectServer(Host, &lt;span class="str"&gt;"root\CIMV2"&lt;/span&gt;, RootUser (ptr), RootPwd (ptr),  &lt;span class="str"&gt;"MS_409"&lt;/span&gt;)&lt;br /&gt;           &lt;br /&gt;            &lt;span class="kwrd"&gt;If&lt;/span&gt; Err.Number &amp;lt;&amp;gt; 0 &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;                &lt;span class="rem"&gt;'Wscript.Echo "Warning establishing RPC connection with " &amp;amp;amp; Host &amp;amp;amp; ": "&amp;amp;amp; Err.description&lt;/span&gt;&lt;br /&gt;                tmpStr = &lt;span class="kwrd"&gt;Date&lt;/span&gt; &amp;amp;amp; &lt;span class="str"&gt;" "&lt;/span&gt; &amp;amp;amp; Time &amp;amp;amp; &lt;span class="str"&gt;" "&lt;/span&gt; &amp;amp;amp; &lt;span class="str"&gt;"Error: Unable to establish RPC connection with "&lt;/span&gt; &amp;amp;amp; Host &amp;amp;amp; &lt;span class="str"&gt;": "&lt;/span&gt;&amp;amp;amp; Err.description&lt;br /&gt;                &lt;span class="kwrd"&gt;If&lt;/span&gt; &lt;span class="kwrd"&gt;CBool&lt;/span&gt;(forceAlarmConnection(ptr)) = &lt;span class="kwrd"&gt;True&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;                    Wscript.Echo tmpStr&lt;br /&gt;                    alarmStr = alarmStr &amp;amp;amp; &lt;span class="str"&gt;" &amp;lt;br /&amp;gt;"&lt;/span&gt; &amp;amp;amp; tmpStr&lt;br /&gt;                    forceAlarmConnection(ptr) = &lt;span class="kwrd"&gt;False&lt;/span&gt;&lt;br /&gt;                &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;   &lt;br /&gt;            &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;&lt;br /&gt;           &lt;br /&gt;            &lt;span class="rem"&gt;'Wscript.Echo Date &amp;amp;amp; " " &amp;amp;amp; Time &amp;amp;amp; " " &amp;amp;amp; Host&lt;/span&gt;&lt;br /&gt;           &lt;br /&gt;            &lt;span class="rem"&gt;'Show free space on logical disk&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;Set&lt;/span&gt; colItems = objWMIService.ExecQuery( _&lt;br /&gt;                &lt;span class="str"&gt;"SELECT * FROM Win32_LogicalDisk"&lt;/span&gt;,,48)&lt;br /&gt;            &lt;span class="kwrd"&gt;For&lt;/span&gt; &lt;span class="kwrd"&gt;Each&lt;/span&gt; objItem &lt;span class="kwrd"&gt;In&lt;/span&gt; colItems&lt;br /&gt;                &lt;span class="rem"&gt;'Wscript.Echo "FreeSpace: " &amp;amp;amp; objItem.FreeSpace&lt;/span&gt;&lt;br /&gt;                &lt;span class="kwrd"&gt;If&lt;/span&gt; objItem.FreeSpace &amp;lt;&amp;gt;&lt;span class="str"&gt;""&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;                    &lt;span class="kwrd"&gt;If&lt;/span&gt; &lt;span class="kwrd"&gt;CInt&lt;/span&gt;(Left(objItem.FreeSpace, Len(objItem.FreeSpace)- 9)) &amp;lt; &lt;span class="kwrd"&gt;CInt&lt;/span&gt;(partitionRedLimit) &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;                        tmpStr = &lt;span class="kwrd"&gt;Date&lt;/span&gt; &amp;amp;amp; &lt;span class="str"&gt;" "&lt;/span&gt; &amp;amp;amp; Time &amp;amp;amp; &lt;span class="str"&gt;" "&lt;/span&gt; &amp;amp;amp; &lt;span class="str"&gt;"ALARM event - Free space on a partition at : "&lt;/span&gt; &amp;amp;amp; Host &amp;amp;amp; &lt;span class="str"&gt;" = "&lt;/span&gt;  &amp;amp;amp; Left(objItem.FreeSpace, Len(objItem.FreeSpace)- 9) &amp;amp;amp; &lt;span class="str"&gt;" GBs"&lt;/span&gt;&lt;br /&gt;                        &lt;span class="kwrd"&gt;If&lt;/span&gt; &lt;span class="kwrd"&gt;CBool&lt;/span&gt;(forceAlarmHD(ptr)) = &lt;span class="kwrd"&gt;True&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;                            Wscript.Echo tmpStr&lt;br /&gt;                            alarmStr = alarmStr &amp;amp;amp; &lt;span class="str"&gt;" &amp;lt;br /&amp;gt;"&lt;/span&gt; &amp;amp;amp; tmpStr&lt;br /&gt;                            forceAlarmHD(ptr) = &lt;span class="kwrd"&gt;False&lt;/span&gt;&lt;br /&gt;                        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;&lt;br /&gt;                    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;&lt;br /&gt;                   &lt;br /&gt;                &lt;span class="rem"&gt;'Else&lt;/span&gt;&lt;br /&gt;                &lt;span class="rem"&gt;'    forceAlarmHD(ptr) = True       &lt;/span&gt;&lt;br /&gt;                &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;Next&lt;/span&gt;&lt;br /&gt;           &lt;br /&gt;            &lt;span class="rem"&gt;'Show CPU load percentage&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;Set&lt;/span&gt; colItems = objWMIService.ExecQuery( _&lt;br /&gt;                &lt;span class="str"&gt;"SELECT * FROM Win32_Processor"&lt;/span&gt;,,48)&lt;br /&gt;            &lt;span class="kwrd"&gt;For&lt;/span&gt; &lt;span class="kwrd"&gt;Each&lt;/span&gt; objItem &lt;span class="kwrd"&gt;In&lt;/span&gt; colItems&lt;br /&gt;                &lt;span class="rem"&gt;'Wscript.Echo "CPU load on: " &amp;amp;amp; Host &amp;amp;amp; " = "  &amp;amp;amp; objItem.LoadPercentage&lt;/span&gt;&lt;br /&gt;                &lt;span class="kwrd"&gt;If&lt;/span&gt; &lt;span class="kwrd"&gt;CInt&lt;/span&gt;(objItem.LoadPercentage) &amp;gt; &lt;span class="kwrd"&gt;CInt&lt;/span&gt;(CPUUsageRedLimit) &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;                    WScript.Sleep(3000)&lt;br /&gt;                    &lt;span class="kwrd"&gt;If&lt;/span&gt; &lt;span class="kwrd"&gt;CInt&lt;/span&gt;(objItem.LoadPercentage) &amp;gt; &lt;span class="kwrd"&gt;CInt&lt;/span&gt;(CPUUsageRedLimit) &lt;span class="kwrd"&gt;Then&lt;/span&gt; &lt;span class="rem"&gt;'Double check after 5 sec&lt;/span&gt;&lt;br /&gt;                   &lt;br /&gt;                        tmpStr = &lt;span class="kwrd"&gt;Date&lt;/span&gt; &amp;amp;amp; &lt;span class="str"&gt;" "&lt;/span&gt; &amp;amp;amp; Time &amp;amp;amp; &lt;span class="str"&gt;" "&lt;/span&gt; &amp;amp;amp; &lt;span class="str"&gt;"ALARM event - CPU usage on: "&lt;/span&gt; &amp;amp;amp; Host &amp;amp;amp; &lt;span class="str"&gt;" = "&lt;/span&gt;  &amp;amp;amp; objItem.LoadPercentage &amp;amp;amp; &lt;span class="str"&gt;" %"&lt;/span&gt;&lt;br /&gt;                       &lt;br /&gt;                        &lt;span class="kwrd"&gt;If&lt;/span&gt; &lt;span class="kwrd"&gt;CBool&lt;/span&gt;(forceAlarmCPU(ptr)) = &lt;span class="kwrd"&gt;True&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;                            Wscript.Echo tmpStr&lt;br /&gt;                            alarmStr = alarmStr &amp;amp;amp; &lt;span class="str"&gt;" &amp;lt;br /&amp;gt;"&lt;/span&gt; &amp;amp;amp; tmpStr&lt;br /&gt;                            forceAlarmCPU(ptr) = &lt;span class="kwrd"&gt;False&lt;/span&gt;&lt;br /&gt;                        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;&lt;br /&gt;                       &lt;br /&gt;                    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;&lt;br /&gt;                   &lt;br /&gt;                &lt;span class="rem"&gt;'Else&lt;/span&gt;&lt;br /&gt;                &lt;span class="rem"&gt;'    forceAlarmCPU(ptr) = True       &lt;/span&gt;&lt;br /&gt;                &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;Next&lt;/span&gt;&lt;br /&gt;           &lt;br /&gt;            &lt;span class="rem"&gt;'Show Memory MB free space&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;Set&lt;/span&gt; colItems = objWMIService.ExecQuery( _&lt;br /&gt;                &lt;span class="str"&gt;"SELECT * FROM Win32_PerfFormattedData_PerfOS_Memory"&lt;/span&gt;,,48)&lt;br /&gt;            &lt;span class="kwrd"&gt;For&lt;/span&gt; &lt;span class="kwrd"&gt;Each&lt;/span&gt; objItem &lt;span class="kwrd"&gt;In&lt;/span&gt; colItems&lt;br /&gt;&lt;br /&gt;                &lt;span class="kwrd"&gt;If&lt;/span&gt; &lt;span class="kwrd"&gt;CInt&lt;/span&gt;(objItem.AvailableMBytes) &amp;lt; &lt;span class="kwrd"&gt;CInt&lt;/span&gt;(RAMFreeRedLimit) &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;                    WScript.Sleep(1000)&lt;br /&gt;                    &lt;span class="kwrd"&gt;If&lt;/span&gt; &lt;span class="kwrd"&gt;CInt&lt;/span&gt;(objItem.AvailableMBytes) &amp;lt; &lt;span class="kwrd"&gt;CInt&lt;/span&gt;(RAMFreeRedLimit) &lt;span class="kwrd"&gt;Then&lt;/span&gt; &lt;span class="rem"&gt;'Double check after 5 sec&lt;/span&gt;&lt;br /&gt;                   &lt;br /&gt;                        tmpStr = &lt;span class="kwrd"&gt;Date&lt;/span&gt; &amp;amp;amp; &lt;span class="str"&gt;" "&lt;/span&gt; &amp;amp;amp; Time &amp;amp;amp; &lt;span class="str"&gt;" "&lt;/span&gt; &amp;amp;amp; &lt;span class="str"&gt;"ALARM event - RAM free space: "&lt;/span&gt; &amp;amp;amp; Host &amp;amp;amp; &lt;span class="str"&gt;" = "&lt;/span&gt;  &amp;amp;amp; objItem.AvailableMBytes &amp;amp;amp; &lt;span class="str"&gt;" MB"&lt;/span&gt;&lt;br /&gt;                       &lt;br /&gt;                        &lt;span class="kwrd"&gt;If&lt;/span&gt; &lt;span class="kwrd"&gt;CBool&lt;/span&gt;(forceAlarmRAM(ptr)) = &lt;span class="kwrd"&gt;True&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;                            Wscript.Echo tmpStr&lt;br /&gt;                            alarmStr = alarmStr &amp;amp;amp; &lt;span class="str"&gt;" &amp;lt;br /&amp;gt;"&lt;/span&gt; &amp;amp;amp; tmpStr&lt;br /&gt;                            forceAlarmRAM(ptr) = &lt;span class="kwrd"&gt;False&lt;/span&gt;&lt;br /&gt;                        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;                       &lt;br /&gt;                       &lt;br /&gt;                    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;   &lt;br /&gt;                   &lt;br /&gt;                &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;Next&lt;/span&gt;&lt;br /&gt;       &lt;br /&gt;        &lt;span class="rem"&gt;'Wscript.Echo alarmStr&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;If&lt;/span&gt; alarmStr&amp;lt;&amp;gt;&lt;span class="str"&gt;""&lt;/span&gt; &lt;span class="kwrd"&gt;And&lt;/span&gt; alarmStr&amp;lt;&amp;gt;&lt;span class="str"&gt;" &amp;lt;br /&amp;gt;"&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;Call&lt;/span&gt; FileWrite(lastCacheLogPath, alarmStr)&lt;br /&gt;        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;&lt;br /&gt;       &lt;br /&gt;        &lt;span class="kwrd"&gt;Set&lt;/span&gt; objSWbemLocator = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;&lt;br /&gt;        ptr = ptr + 1&lt;br /&gt;       &lt;br /&gt;        &lt;span class="kwrd"&gt;Next&lt;/span&gt;&lt;br /&gt;       &lt;br /&gt;        WScript.Sleep(IterationDelay)&lt;br /&gt;       &lt;br /&gt;        &lt;span class="kwrd"&gt;If&lt;/span&gt; resetCount &amp;lt;= 0 &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;Call&lt;/span&gt; InitVars()&lt;br /&gt;        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;&lt;br /&gt;       &lt;br /&gt;    &lt;span class="kwrd"&gt;Loop&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;&lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Call&lt;/span&gt; Main&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-6286560407855637325?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/6286560407855637325/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=6286560407855637325&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/6286560407855637325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/6286560407855637325'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/08/this-simple-vbs-script-can-be-used-to.html' title='This simple VBS script can be used to health monitor your infrastracture'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-2942255549906548752</id><published>2010-07-31T03:54:00.000-07:00</published><updated>2010-08-02T00:14:51.481-07:00</updated><title type='text'>Google Testing and Mocking frameworks overview</title><content type='html'>Google's guys that their Testing (&lt;a href="http://code.google.com/p/googletest/"&gt;take a look into the link to see the purpose&lt;/a&gt;) and Mocking (&lt;a href="http://code.google.com/p/googlemock/"&gt;take a look into the link to see the purpose&lt;/a&gt;) frameworks can provide ligtweight and rich solution for unit testing over xUnit. Sounds interesting for me but not as the solution user so far. Eventually I want walk through the source codes and documentations in order to grab potential patterns, practices and maybe one day will come up with reusing those fixtures.&lt;br /&gt;&lt;br /&gt;The detailed How to (not for dummies) are &lt;a href="http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide"&gt;here (Testing)&lt;/a&gt; and &lt;a href="http://code.google.com/p/googlemock/wiki/CookBook"&gt;here (Mocking)&lt;/a&gt;&lt;br /&gt;Super! The use and syntax are really easy as both give you high-level macro instructions and capability to manipulate various (sometimes tricky) parameters. Basically the parameters are designed in source as flag resolver. The Testing FW (framework) advanced things like parametrized and typed tests are implemented in polymorphic template style with some ugly code geration (gtes-param-test.h). It's interesting to note that Testing and Mocking FWs attempts to give you a tool to model behaviour and workflows, various assertions just can ease and reduce testing code but the set of verifiers will not make revolution in testing. Here is a mocking style example:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;using ::testing::InSequence;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;using ::testing::Return;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  InSequence s;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  for (int i = 1; i &lt;= n; i++) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-family:courier new;" &gt;    EXPECT_CALL(turtle, GetX())&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255); font-style: italic;font-family:courier new;" &gt;        .WillOnce(Return(10*i))&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255); font-style: italic;font-family:courier new;" &gt;        .RetiresOnSaturation();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;the Testing excercises:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;// Tests that the Foo::Bar() method does Abc.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;TEST_F(FooTest, MethodBarDoesAbc) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  const string input_filepath = "this/package/testdata/myinputfile.dat";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  const string output_filepath = "this/package/testdata/myoutputfile.dat";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  Foo f;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  &lt;span style="color: rgb(51, 102, 255); font-style: italic;"&gt;EXPECT_EQ(0, f.Bar(input_filepath, output_filepath));&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;// Tests that Foo does Xyz.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;TEST_F(FooTest, DoesXyz) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  // Exercises the Xyz feature of Foo.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}  // namespace&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;int main(int argc, char **argv) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(102, 102, 204);font-family:courier new;" &gt;  ::testing::InitGoogleTest(&amp;amp;argc, argv);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 204); font-style: italic;font-family:courier new;" &gt;  return RUN_ALL_TESTS();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You can easily inline your tests and mocks into source code (as well as make mocking as part of tests), just need to take care about proper headers inclusions.&lt;br /&gt;The implementation looks like standart xUnit's&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;namespace {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;// The fixture for testing class Foo.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;class FooTest : &lt;span style="color: rgb(102, 51, 255);"&gt;public ::testing::Test&lt;/span&gt; {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; protected:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  // You can remove any or all of the following functions if its body&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  // is empty.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  FooTest() {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    // You can do set-up work for each test here.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  virtual ~FooTest() {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    // You can do clean-up work that doesn't throw exceptions here.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  // If the constructor and destructor are not enough for setting up&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  // and cleaning up each test, you can define the following methods:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  virtual void &lt;span style="color: rgb(102, 51, 255);"&gt;SetUp&lt;/span&gt;() {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    // Code here will be called immediately after the constructor (right&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    // before each test).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  virtual void &lt;span style="color: rgb(102, 51, 255);"&gt;TearDown&lt;/span&gt;() {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    // Code here will be called immediately after each test (right&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    // before the destructor).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  // Objects declared here can be used by all tests in the test case for Foo.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The testing FW provides inheritance from Environment down to test case down to tests so that generic methods and properties will override parent's implementation.&lt;br /&gt;&lt;br /&gt;The Testing FW clasess self-explaining ones by the names - listed below (taken from internal namespace):&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;class AssertHelper;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;class DefaultGlobalTestPartResultReporter;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;class ExecDeathTest;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;class NoExecDeathTest;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;class FinalSuccessChecker;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;class GTestFlagSaver;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;class TestInfoImpl;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;class TestResultAccessor;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;class TestEventListenersAccessor;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;class TestEventRepeater;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;class WindowsDeathTest;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;class UnitTestImpl* GetUnitTestImpl();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;void ReportFailureInUnknownLocation(TestPartResult::Type result_type,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;                                    const String&amp;amp; message);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;class PrettyUnitTestResultPrinter;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:courier new;" &gt;class XmlUnitTestResultPrinter;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-2942255549906548752?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/2942255549906548752/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=2942255549906548752&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/2942255549906548752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/2942255549906548752'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/07/google-testing-and-mocking-frameworks.html' title='Google Testing and Mocking frameworks overview'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-955275926559323015</id><published>2010-07-18T03:59:00.000-07:00</published><updated>2010-07-18T05:26:40.399-07:00</updated><title type='text'>F-1 round ride Kremlin in Moscow today</title><content type='html'>Today I have watched  Formula-1 bolides nearby Kremlin in Moscow. It's warth to first time observe such road-jets (can't say cars) just in few steps from myself!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.bmcr.ru/upload/iblock/25e/517-BMCR_4559.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 563px; height: 375px;" src="http://www.bmcr.ru/upload/iblock/25e/517-BMCR_4559.JPG" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;These are very reactive and noisy. Actually the noise is felt by skin - FANTASTICALLY!&lt;br /&gt;The next time I hope I will see real race.&lt;br /&gt;&lt;br /&gt;Unfortunate thing - I did not take a camera, trying to catch on mobile phone was failed cause F-1 is very fast :)&lt;br /&gt;&lt;br /&gt;&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/0oVcPsm7sFA&amp;amp;hl=ru_RU&amp;amp;fs=1?color1=0xe1600f&amp;amp;color2=0xfebd01"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/0oVcPsm7sFA&amp;amp;hl=ru_RU&amp;amp;fs=1?color1=0xe1600f&amp;amp;color2=0xfebd01" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-955275926559323015?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/955275926559323015/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=955275926559323015&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/955275926559323015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/955275926559323015'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/07/f-1-round-ride-kremlin-in-moscow-today.html' title='F-1 round ride Kremlin in Moscow today'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-2540546818872818008</id><published>2010-07-05T12:12:00.000-07:00</published><updated>2010-07-05T01:35:39.920-07:00</updated><title type='text'>Code Refactoring - once you meet it...</title><content type='html'>The world changes continously, just so software code should pass through changes too. Basically lifecycle is following:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Prototype or simple model&lt;/li&gt;&lt;li&gt;Design as skeleton&lt;/li&gt;&lt;li&gt;Design refactoring&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Some stuff is implemented&lt;/li&gt;&lt;li&gt;Refactoring should be done over new stuff&lt;/li&gt;&lt;li&gt;Code and design are ready&lt;/li&gt;&lt;li&gt;But code and design fit badly (inefficient memory management, resource leaks, security flows, unstable run, weak code support, improper interfaces and technologies, code smells...)&lt;/li&gt;&lt;li&gt;Run new refactoring. Dangerous and nightmare as hard!&lt;/li&gt;&lt;/ol&gt;* This imagination from standpoint of refactoring only.  Change requests, new features and bugs and emergency wishes can appear between any of listed steps! Some projects recursively call Step #1 along any Step #X. Better case if you enjoy a few iterations 4-5-4, 6-7-6 or  7-3-7&lt;br /&gt;&lt;br /&gt;The tool for refactoring is refactoring :)&lt;br /&gt;The standard simple approach is to collect all code issues in defect tracker, assign to a proper player, come up with refactoring method, define expected results and benefits, estimate cost of fix and plan it. Once a refactoring item is ready - it should be tested inside and outside (Integration), unit tests (if exists) should give green (or rework them to meet with code changes). The last step is integration to production, QA testing and verification that "Refactoring is took place and results in expected out"&lt;br /&gt;&lt;br /&gt;Usually refactoring is a step after code review or informal design/code inspection. The motivation to run refactoring should be as inside as outside, i.e. inside - when lead developer or architect initiate code review process and outside - when QA or customers or management have complains on product quality caused by bad design or coding.&lt;br /&gt;&lt;br /&gt;Why refactoring is painful? Simply, more works done behind - more risks and potential affecting points on each refactoring item. And higher cost of refactoring. The same as for defects discovering and fixing - rate is continiously rising to production. Do you remeber this curve?&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_H8RIeuOZSco/TDGXYDl7ExI/AAAAAAAAD2g/2wcKbb0ZSK4/s1600/boehm-curve.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 175px;" src="http://3.bp.blogspot.com/_H8RIeuOZSco/TDGXYDl7ExI/AAAAAAAAD2g/2wcKbb0ZSK4/s320/boehm-curve.png" alt="" id="BLOGGER_PHOTO_ID_5490335860278366994" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Consequently, frequent code review - less painful refactoring and less cost totally on refactoring. The general motivation of refactoring should be improve quality  attributes of software, don't be driven by this task as something fancy  or trendy.&lt;br /&gt;&lt;br /&gt;Now, it's time for technical matter - some refactoring methods most used in industry. The good list of refactorings is listed &lt;a href="http://www.refactoring.com/catalog/"&gt;here (http://www.refactoring.com/catalog/)&lt;/a&gt;. The list is clearly complicated and easy to understand for those who are familiar with refactoring and coding practices, almost all links show up briefly meaning and how to apply with code excerpts and or UML diagrams. Most of the items can be fit and applied to automated testing either your code in scripting languages or real object oriented languages.&lt;br /&gt;&lt;br /&gt;Basically we can break down refactoring approached to 2 groups: running  top-down and running down-top. The first presumes review and  improvements from highest levels (architecture and design) lowering to  lines of code. The second method - is vice versa. Refactoring is not only finding and fixing issues in code pieces, it's also about designing proper patterns up to level of general architecture. Some time ago I made a post on patterns applied for automated testing&lt;a href="http://at4qa.blogspot.com/2010/01/20-essential-design-patterns-for.html"&gt; 20 Essential design patterns for automated testing&lt;/a&gt;, however we can use it to revise the current design.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-2540546818872818008?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/2540546818872818008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=2540546818872818008&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/2540546818872818008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/2540546818872818008'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/06/code-refactoring-once-you-meet-it.html' title='Code Refactoring - once you meet it...'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_H8RIeuOZSco/TDGXYDl7ExI/AAAAAAAAD2g/2wcKbb0ZSK4/s72-c/boehm-curve.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-4410777951923343336</id><published>2010-06-27T23:48:00.000-07:00</published><updated>2010-06-28T00:08:28.532-07:00</updated><title type='text'>And the Winner is (poll results)...</title><content type='html'>Hey guys,&lt;br /&gt;the voting of this poll &lt;a href="http://at4qa.blogspot.com/2010/05/poll-best-test-automation-ide.html"&gt;http://at4qa.blogspot.com/2010/05/poll-best-test-automation-ide.html &lt;/a&gt;  is closed. Thank you all who participated and responded!!!&lt;br /&gt;&lt;br /&gt;Shortly - facts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; there were 105 responds&lt;/li&gt;&lt;li&gt; Mercury/HP Quick Test Pro and Selenium share the first position as 24:24. I could outline the results as: Selenium - the best choice for Web (only), QTP - is the best choice for supporting various platforms and technologies; another observation - QTP is the best as proprietary and paid solution, Selenium - is the best as open solution. Sure Selenium can't replace QTP completely&lt;/li&gt;&lt;li&gt;... but TestComplete (2-nd) or MS' Tester edition / Test Automation FX (3-rd) - probably could&lt;/li&gt;&lt;li&gt;SilkTest is loosing market completely?&lt;/li&gt;&lt;li&gt;Full layout - on the image below:&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_H8RIeuOZSco/TChJDX4nK7I/AAAAAAAAD2M/4Ap1DQbsAe8/s1600/Best_IDE.PNG"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 817px; height: 375px;" src="http://3.bp.blogspot.com/_H8RIeuOZSco/TChJDX4nK7I/AAAAAAAAD2M/4Ap1DQbsAe8/s1600/Best_IDE.PNG" alt="" id="BLOGGER_PHOTO_ID_5487716468250848178" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-4410777951923343336?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/4410777951923343336/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=4410777951923343336&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/4410777951923343336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/4410777951923343336'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/06/and-winner-is-poll-results.html' title='And the Winner is (poll results)...'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_H8RIeuOZSco/TChJDX4nK7I/AAAAAAAAD2M/4Ap1DQbsAe8/s72-c/Best_IDE.PNG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-841725944608832985</id><published>2010-06-25T12:22:00.000-07:00</published><updated>2010-06-25T12:47:50.888-07:00</updated><title type='text'>James Whittaker's interview for uTest - thoughts of leadership</title><content type='html'>Today just have got email newspapper from uTest. I took an interest in recent interview with James Whittaker (Google's chief technologist and formely Microsoft's employee). See the original version here &lt;a href="http://blog.utest.com/testing-the-limits-with-james-whittaker-part-i/2010/06/"&gt;Part I&lt;/a&gt; and here &lt;a href="http://blog.utest.com/testing-the-limits-with-james-whittaker-part-ii/2010/06/"&gt;Part II&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Listed below are excerpts and trending things by James Whittaker, I found interesting:&lt;br /&gt;&lt;br /&gt;- Test Automation is highly in demand. Google invests bunch of  money and effort on &lt;br /&gt;automation&lt;br /&gt;&lt;br /&gt;- Right test automation is a part of innovation &lt;br /&gt;&lt;br /&gt;- Cloud testing and TesterNet (both automation and manual). I rather express it as raising abstraction and independency from technologies. Generally - simplification&lt;br /&gt;&lt;br /&gt;- Embedded test automation framework (e.g. Google's Web Test Framework for self-testing Google Chrome). It is not novice. Watchers and embedded tracers, debuggers were invented and used years ago. Embedding unit tests into User's experience with app is good idea but does not seem too innovative&lt;br /&gt;&lt;br /&gt;- Methodologies should not screw up real work effort and achivements. Using best practices which fit to project is right way, adoption and flexibility are must&lt;br /&gt;&lt;br /&gt;- Shortly we will get a book How we test in Google from James Whittaker (as inspiration by Alan Page's book, Microsoft)&lt;br /&gt;&lt;br /&gt;- James Whittaker looks like a fan of exploratory testing!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-841725944608832985?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/841725944608832985/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=841725944608832985&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/841725944608832985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/841725944608832985'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/06/james-whittakers-interview-for-utest.html' title='James Whittaker&apos;s interview for uTest - thoughts of leadership'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-1524674896590819602</id><published>2010-06-14T05:23:00.000-07:00</published><updated>2010-06-14T05:26:24.147-07:00</updated><title type='text'>Test Automation Infrastracture Architecture and Automation Practices Generalization</title><content type='html'>Hey friends,&lt;br /&gt;&lt;br /&gt;it looks like my time on blogging decreases day by day. I have less and less time to think up and then write something novice and interesting on test automation. Is it writer's block? Or Summer? :))))&lt;br /&gt;&lt;br /&gt;Inspiration will come but not today and may not in this month, so far I imbibe, learn and think. This post is just a bunch of technical and organizational things as conclusions and generalization on accumulated posts.&lt;br /&gt;&lt;br /&gt;While I'm preparing a presentation for high-management, want to share some pieces of that. The below diagram represents test automation infrastracture as whole picture to highlight scope of works and to inspire feel of confidence that we provide really professional test services and use advanced techniques and practices upon building the entire and completed automated system.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_H8RIeuOZSco/S3l7AL7WA7I/AAAAAAAADyc/IpcoDxDyrV8/s1600-h/test-automation_infrastructure_architecture.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 252px;" src="http://2.bp.blogspot.com/_H8RIeuOZSco/S3l7AL7WA7I/AAAAAAAADyc/IpcoDxDyrV8/s400/test-automation_infrastructure_architecture.PNG" alt="" id="BLOGGER_PHOTO_ID_5438513268158497714" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Another image represents our secured approach of code developement - nothing new - just following proper development practices.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_H8RIeuOZSco/S3l7OGKZkTI/AAAAAAAADyk/35MlzJeU18w/s1600-h/test-automation-practice.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 231px;" src="http://1.bp.blogspot.com/_H8RIeuOZSco/S3l7OGKZkTI/AAAAAAAADyk/35MlzJeU18w/s400/test-automation-practice.PNG" alt="" id="BLOGGER_PHOTO_ID_5438513507129200946" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Wherever you automates testing, it's suggested to invest in the best development practices that will return the investements down the road depending on project duration and long-term purposes.&lt;br /&gt;Some of that truly should be applied for serious test automation (formerly the posts of this blog):&lt;br /&gt;&lt;pre id="line1"&gt;&lt;a href="http://at4qa.blogspot.com/2009/12/roi-on-automation-testing-department.html"&gt;ROI on automation testing department establishment&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://at4qa.blogspot.com/2009/12/on-stabilization-test-suites-no-fuel.html"&gt;On stabilization test suites. No fuel but destination is too far&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre id="line1"&gt;&lt;a href="http://at4qa.blogspot.com/2009/12/naming-and-coding-conventions-are-they.html"&gt;Naming and coding conventions: are they important for test automation?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://at4qa.blogspot.com/2009/12/source-control-and-change-management-in.html"&gt;Source control and change management in test automation&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre id="line1"&gt;&lt;a href="http://at4qa.blogspot.com/2010/01/test-automation-dashboard-in-just-one.html"&gt;Test Automation Dashboard in just One day!&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://at4qa.blogspot.com/2010/01/20-essential-design-patterns-for.html"&gt;20 Essential design patterns for automated testing&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://at4qa.blogspot.com/2010/01/adopting-tdd-practices-into-white-box.html"&gt;Adopting TDD practices into white-box test automation&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://at4qa.blogspot.com/2010/01/measuring-test-manualautomation.html"&gt;Measuring test (manual/automation) effectiveness&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Lastly some things on organizational approaches and practices&lt;br /&gt;&lt;br /&gt;&lt;div style="width:425px" id="__ss_3848159"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/PeterBiz/automated-testing-for-qa-httpat4qablogspotcom" title="Automated Testing for QA http://at4qa.blogspot.com/"&gt;Automated Testing for QA http://at4qa.blogspot.com/&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse3848159" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=eqaengine-100120044819-phpapp01-100425092738-phpapp02&amp;rel=0&amp;stripped_title=automated-testing-for-qa-httpat4qablogspotcom" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse3848159" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=eqaengine-100120044819-phpapp01-100425092738-phpapp02&amp;rel=0&amp;stripped_title=automated-testing-for-qa-httpat4qablogspotcom" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/PeterBiz"&gt;Peter Ka&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-1524674896590819602?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/1524674896590819602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=1524674896590819602&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/1524674896590819602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/1524674896590819602'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/02/test-automation-infra-architecture.html' title='Test Automation Infrastracture Architecture and Automation Practices Generalization'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_H8RIeuOZSco/S3l7AL7WA7I/AAAAAAAADyc/IpcoDxDyrV8/s72-c/test-automation_infrastructure_architecture.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-6101819777927081037</id><published>2010-06-14T04:23:00.000-07:00</published><updated>2010-06-14T04:40:05.117-07:00</updated><title type='text'>Automated Testing in Java - Presentation with reach code excerpts</title><content type='html'>Very technical oriented presentation that i'd like to share with you. The embed slides are right here:&lt;br /&gt;&lt;br /&gt;&lt;div style="width:425px" id="__ss_2363004"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/franzsee/automated-testing-in-java" title="Automated Testing In Java"&gt;Automated Testing In Java&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse2363004" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=testing-in-java-v3-091027225042-phpapp02&amp;rel=0&amp;stripped_title=automated-testing-in-java" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse2363004" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=testing-in-java-v3-091027225042-phpapp02&amp;rel=0&amp;stripped_title=automated-testing-in-java" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/franzsee"&gt;franzsee&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-6101819777927081037?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/6101819777927081037/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=6101819777927081037&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/6101819777927081037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/6101819777927081037'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/06/automated-testing-in-java-presentation.html' title='Automated Testing in Java - Presentation with reach code excerpts'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-5121109135631931894</id><published>2010-05-28T09:13:00.000-07:00</published><updated>2010-05-30T04:26:11.216-07:00</updated><title type='text'>Poll: The best Functional Test Automation IDE for YOU is</title><content type='html'>&lt;script type="text/javascript" charset="utf-8" src="http://static.polldaddy.com/p/3268816.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;noscript&gt;&lt;br /&gt; &lt;a href="http://polldaddy.com/poll/3268816/"&gt;The best Functional Test Automation IDE for YOU is:&lt;/a&gt;&lt;span style="font-size:9px;"&gt;&lt;a href="http://polldaddy.com/features-surveys/"&gt;customer surveys&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;/noscript&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-5121109135631931894?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/5121109135631931894/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=5121109135631931894&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/5121109135631931894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/5121109135631931894'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/05/poll-best-test-automation-ide.html' title='Poll: The best Functional Test Automation IDE for YOU is'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-8305576298746269687</id><published>2010-05-25T11:31:00.000-07:00</published><updated>2010-05-25T10:54:16.180-07:00</updated><title type='text'>10 Objects to be Hand On!</title><content type='html'>This post is just short manual or reminder on generic system-available objects in Windows environments.&lt;br /&gt;&lt;span style="font-weight: bold; color: rgba(0, 2, 0, 0.3);font-family:verdana;font-size:680%;"  &gt;10&lt;/span&gt;&lt;span style="color: rgb(153, 153, 153);font-family:verdana;" &gt; &lt;/span&gt;So let's go and begin for instantination. In order to &lt;span style="font-style: italic;"&gt;unify &lt;/span&gt;and &lt;span style="font-style: italic;"&gt;isolate &lt;/span&gt;external objects management, I prefer either &lt;span style="font-weight: bold;"&gt;Singleton &lt;/span&gt;or &lt;span style="font-weight: bold;"&gt;Factory&lt;/span&gt; simple patterns (&lt;a href="http://at4qa.blogspot.com/2010/01/20-essential-design-patterns-for.html"&gt;http://at4qa.blogspot.com/2010/01/20-essential-design-patterns-for.html&lt;/a&gt;). They will take care about objects lifecycle management:&lt;br /&gt;- object creation if not exist in current context  or reference returning if an instance lives (singleton)&lt;br /&gt;- new instance creation (if factory)&lt;br /&gt;- dynamic object update when needed&lt;br /&gt;- object life finalization destroy and freeding memory as it actual for languages w/o garbage collection or with with weak one&lt;br /&gt;- protected/private use&lt;br /&gt;- logging and exception handling&lt;br /&gt;&lt;br /&gt;In VBScript new instance of object can be created as:&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;font-family:courier new;" &gt;Set Obj= CreateObject(ObjStrSemantic), &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;font-family:courier new;" &gt;e.g Set Obj= CreateObject("MSXML.DOMDocument")&lt;/span&gt;&lt;br /&gt;I will address objects by mean of string variable &lt;span style="font-weight: bold;"&gt;ObjStrSemantic&lt;/span&gt; down the road:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;"Scripting.FileSystemObject"&lt;/span&gt;    -    all operations over files and folders&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;"Shell.Application"&lt;/span&gt;    -    Standard shell Win object for running basic system operations&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;"WScript.Shell"&lt;/span&gt;        -    This is more prefearable object then listed above&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;"VBScript.RegExp"&lt;/span&gt;    -    Regular expressions object&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;"Scripting.Dictionary"&lt;/span&gt;    -    Dictionary object type. Basically, this structure is used in VBS or to create arguments of this type for subsequent calls&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;"WScript.Network"&lt;/span&gt;    -    Implements basic interfaces for networking&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;"InternetExplorer.Application"&lt;/span&gt;    -    can be used to manipulate on IE and can be candidate to replace testing tool functionality, clicking and so on&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;"ADODB.Connection"&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;"ADODB.Recordset"&lt;/span&gt;    -    basic object for obtaining connection with source through ADODB connector and object of Recordset type serving to store retrieved data from ADODB in memory&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;"MSXML.DOMDocument"("MSXML2.DOMDocument.3.0")  &lt;/span&gt;  -    essential object to process XML through standard DOM methods, XPath. Why you may need it? You can develop Web testing code omitting testing vendors tools which make the same but giving own custom interfaces. Desing data (DDT) or keyword-driven(KDT) testing framework leveraging power of XML. Check out my post about XML possible use (&lt;a href="http://at4qa.blogspot.com/2010/01/tools-xml-orm-for-efficient.html"&gt;http://at4qa.blogspot.com/2010/01/tools-xml-orm-for-efficient.html&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;"WbemScripting.SWbemLocator"&lt;/span&gt;    -    Windows Management Instrumentation (WMI) is really powerful tool to manipulate over various system operations (hardware and software). I think WMI covers all system capabilities including all related to administration, providing remote connection and querying using SQL-like language WQL and unified API for administration automation. The link &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=2cc30a64-ea15-4661-8da4-55bbc145c30e&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=2cc30a64-ea15-4661-8da4-55bbc145c30e&amp;amp;displaylang=en&lt;/a&gt; leads on download page of  WMI code editor tool from MS - indeed, this tool is simple and handy.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Simple WMI usage for local querying:&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;    &lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;font-family:courier new;" &gt;Set oWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &amp;amp; HostName &amp;amp; "\root\cimv2")&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;font-family:courier new;" &gt;    Set colOperatingSystems = oWMIService.ExecQuery ("Select * from Win32_OperatingSystem") 'Querying OS info&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Simple WMI usage for remoting:&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;font-family:courier new;" &gt;    Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator") &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;font-family:courier new;" &gt;    Set objWMIService = objSWbemLocator.ConnectServer(Host, "root\CIMV2", UID, Pwd,  "MS_409")&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;font-family:courier new;" &gt;    Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_LogicalDisk",,48) &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Working on test automation or infrastracture framework, it's better to design wrappers over methods, properties and events of appropriate objects and put these wrappers into appropriate custom &lt;span style="font-weight: bold;"&gt;Registry classes&lt;/span&gt; which will represent appropriate object interfaces. What you will get from that? At least:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Unified and safe access to objects, methods and properties (Registry class is better to implement using Singleton)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Your IDE/TDE will see instructions and Intellisense will work!&lt;/li&gt;&lt;li&gt;You will follow proper coding standards, you will avoid duplications and improper use. As result, you get back quality and code consistency&lt;/li&gt;&lt;li&gt;More long-term advantages...&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Let's perfect scripting skills, MSDN will help in that - don't forget to utilize Scripting Technet space where you can enjoy examples and practices, follow at &lt;a href="http://technet.microsoft.com/en-us/library/cc498722.aspx"&gt;http://technet.microsoft.com/en-us/library/cc498722.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-8305576298746269687?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/8305576298746269687/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=8305576298746269687&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/8305576298746269687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/8305576298746269687'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/03/10-objects-to-be-hand-on.html' title='10 Objects to be Hand On!'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-3614047822620193819</id><published>2010-05-24T02:14:00.000-07:00</published><updated>2010-05-24T02:35:03.772-07:00</updated><title type='text'>Model-Based test automation with randomization</title><content type='html'>There is a pure work articulating on Model-based testing and it looks like the page &lt;a href="http://www.goldpractices.com/practices/mbt/index.php"&gt;http://www.goldpractices.com/practices/mbt/index.php&lt;/a&gt; widely covers all about that. Though it's theoretical at most, this is good start point to acquire knowledge and apply on practice. Also I liked the case studies showing effectiveness of model-based testing.&lt;br /&gt;&lt;br /&gt;From test automation standpoint, this is really powerful thing which is not replacement of traditional static test design for BVT, extended tests. The automatic test suite modeling allow to run regression and exploratory tests which can cover much more s/w paths. It's true that covering all possible combinations is not efficient way even for automation as everything has limits. To run your test optimally, suggested use is applying:&lt;br /&gt;- limitations&lt;br /&gt;- preconditions&lt;br /&gt;- coverage control points (if previous test has visited that destination, why we should repeat that over?)&lt;br /&gt;- some randomization for both control flow operations (steps composition) and test data feeding on&lt;br /&gt;&lt;br /&gt;To build models, I'd suggest to use XML technologies as flexible approaches for relational data storage, querying and transformation. Look at some tips here &lt;a href="http://at4qa.blogspot.com/2010/01/tools-xml-orm-for-efficient.html"&gt;http://at4qa.blogspot.com/2010/01/tools-xml-orm-for-efficient.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-3614047822620193819?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/3614047822620193819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=3614047822620193819&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/3614047822620193819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/3614047822620193819'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/05/model-based-test-automation-with.html' title='Model-Based test automation with randomization'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-6700894400024362583</id><published>2010-05-20T23:49:00.000-07:00</published><updated>2010-05-21T06:48:45.856-07:00</updated><title type='text'>Importance of Basing on Testability in Automation</title><content type='html'>Greetings!&lt;br /&gt;&lt;br /&gt;I'm back after very hard work on &lt;span style="font-weight: bold;"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;K&lt;/span&gt;aspersky Antivirus&lt;/span&gt; new Release. We successfully passed technical Release. Our automated testing is proven and valuable weapon for daily build testing on a lot of test stands simulataneously. The automation is really indispensable on this project since it provides significant coverage and feel of confidence about each build quality.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_H8RIeuOZSco/S_Z4axw8DyI/AAAAAAAAD08/AfTIXT80k4M/s1600/ill2010_02.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 150px; height: 125px;" src="http://4.bp.blogspot.com/_H8RIeuOZSco/S_Z4axw8DyI/AAAAAAAAD08/AfTIXT80k4M/s400/ill2010_02.jpg" alt="" id="BLOGGER_PHOTO_ID_5473694798545948450" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The official Beta release of &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;K&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;aspersky Internet Security/Antivirus 2011&lt;/span&gt; is available of Company's forum here:&lt;br /&gt;&lt;a href="http://forum.kaspersky.com/index.php?s=22c83ab5a899d1bdafd4afc822a3ead6&amp;amp;showforum=16"&gt;http://forum.kaspersky.com/index.php?s=22c83ab5a899d1bdafd4afc822a3ead6&amp;amp;showforum=16&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The first thing i'd like to share with you is my thoughts about testability. This term can have relation to any software artifact: code, documentation, architecture, design, interface, structure, product and so on. In fact, the testability metric can be applied to any level of software, downside to code piece for unit testing. Let say if code piece is completely for protected usage, you can't pull interfaces of that class, so that testability is difficult and you need to invite workarounds like fake objects having rights to treat that class.&lt;br /&gt;&lt;br /&gt;For routine functional automated testing, product testability plays key role for defining whether s/w suitable&lt;span style="font-size: 12pt; line-height: 115%; font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;" lang="EN-US"&gt; &lt;/span&gt;for automation or not. Formally I suggest to come up and register the requirements to product testability within Project book and &lt;a href="http://at4qa.blogspot.com/2010/01/test-automation-strategy-as-part-of-qa.html"&gt;Testing Strategy&lt;/a&gt; documents. Believe me or not but this is a ground and shield for you in developed project especially in strongly formalized projects. If you provide external test automation services these requirements are must as early as possible on a project. In essence, testability requirements is a basis of constructive proposals, negotiations and argumentations during project progress.&lt;br /&gt;&lt;br /&gt;What kind of information should be listed out as requirements? Not sure I'm able to cover all things together but some general fitting to most  projects are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Changes in software external GUI interfaces to be addressed as part of appropriate change management procedures&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Changes in software external non GUI interfaces to be addressed as part of appropriate change management procedures&lt;/li&gt;&lt;li&gt;Changes in software internal tested interfaces to be addressed as part of appropriate change management procedures&lt;/li&gt;&lt;li&gt;All changes to be planned, discussed and notified when it takes place&lt;/li&gt;&lt;li&gt;All interfaces with which testing automated, should be frozen when the code freeze will take place&lt;/li&gt;&lt;li&gt;Changes in software interfaces should not reduce capabilities of approved testing tools or significantly affect test automation codebase.&lt;/li&gt;&lt;li&gt;All GUI objects should be recognizable by the use of approved testing tool&lt;/li&gt;&lt;li&gt;All GUI objects should be uniquely identifiable by the use of approved testing tool&lt;/li&gt;&lt;li&gt;All standard GUI objects' methods and properties to be accessible by the use of approved testing tool&lt;/li&gt;&lt;li&gt;All intermediate and low-level software interface used for automated testing should be stable&lt;/li&gt;&lt;li&gt;On All planned changes, appropriate persons should be notified prior the date of changes&lt;/li&gt;&lt;li&gt;The data structures processed by test automation should provide access to each granular element using conventional methods. For instance, DB querying, object deserialization, XPath, Registry, CSV, INI parsing and so on.&lt;/li&gt;&lt;li&gt;Access to GUI objects should be unified for identical object types. All custom objects should have minimal and similar access methods&lt;/li&gt;&lt;li&gt;Custom controls not supported by approved test automation tools should be either enriched by typical access methods or special tool should be provided capable to recognize those objects&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Preferably, all typical interfaces should be identical between related projects, i.e. development should try to come up with cross-project solution of interfaces design&lt;span style="font-size: 10pt; font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; letter-spacing: -0.25pt;" lang="EN-US"&gt; &lt;/span&gt;&lt;/li&gt;&lt;li&gt;Preferably, changes should be shown to automated testers before new deployment in order to adapt testing code in advance of deployment or releasing&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Some projects may have individual requirements, some - not. You are free to adopt the list above and propose on review and approve requirements. Anyway, I hope my list from past experience could help one day for someone.&lt;br /&gt;&lt;br /&gt;PS subscribe to dev codebase changelist to be prepared for changes in unstable project.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-6700894400024362583?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/6700894400024362583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=6700894400024362583&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/6700894400024362583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/6700894400024362583'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/05/importance-of-basing-on-testability-in.html' title='Importance of Basing on Testability in Automation'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_H8RIeuOZSco/S_Z4axw8DyI/AAAAAAAAD08/AfTIXT80k4M/s72-c/ill2010_02.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-6923822860557204850</id><published>2010-05-20T23:42:00.000-07:00</published><updated>2010-05-21T03:48:44.430-07:00</updated><title type='text'>My Presentation is Featured of the Day on SlideShare.net</title><content type='html'>Nice to be informed by SlideShare about my presentation "Effective QA as driver towards innovations..." was chosen as featured of the day. I'm really surprised as I did not expect whatever and did not prepare - just wrote down some thoughts and put some illustrations.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;11000&lt;/span&gt;+ views, shares and favorites. Looks like &lt;span style="font-weight:bold;"&gt;huge &lt;/span&gt;traffic!&lt;br /&gt;Link on the uploading:&lt;br /&gt;&lt;a href="http://www.slideshare.net/PeterBiz/automated-testing-for-qa-httpat4qablogspotcom"&gt;http://www.slideshare.net/PeterBiz/automated-testing-for-qa-httpat4qablogspotcom&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-6923822860557204850?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/6923822860557204850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=6923822860557204850&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/6923822860557204850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/6923822860557204850'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/05/my-presentation-is-featured-of-day-on.html' title='My Presentation is Featured of the Day on SlideShare.net'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-7536907006479036644</id><published>2010-04-24T05:47:00.000-07:00</published><updated>2010-04-24T06:11:24.018-07:00</updated><title type='text'>Interesting Pages from MicroSoft Tester Center</title><content type='html'>I've dug out a few really interesting pages from &lt;a href="http://msdn.microsoft.com/en-us/testing/default.aspx"&gt;Microsoft Tester center [http://msdn.microsoft.com/en-us/testing/default.aspx]&lt;/a&gt; space hosting on MSDN.&lt;br /&gt;&lt;br /&gt;The couple technical-oriented links talking about some Code/Design review aspects and practices at Microsoft:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ff519670%28v=MSDN.10%29.aspx"&gt;http://msdn.microsoft.com/en-us/library/ff519670%28v=MSDN.10%29.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ff521647%28v=MSDN.10%29.aspx"&gt;http://msdn.microsoft.com/en-us/library/ff521647%28v=MSDN.10%29.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The following 3 links from on management and improving processes from a personal blog of Microsoft Test manager &lt;br /&gt;&lt;a href="http://blogs.msdn.com/anitag/archive/2009/03/22/business-focused-vs-people-focused-managers.aspx"&gt;http://blogs.msdn.com/anitag/archive/2009/03/22/business-focused-vs-people-focused-managers.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/anitag/archive/2009/03/29/automation-maturity-what-should-a-test-manager-focus-on.aspx"&gt;http://blogs.msdn.com/anitag/archive/2009/03/29/automation-maturity-what-should-a-test-manager-focus-on.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/anitag/archive/2009/08/19/should-bvts-pass-100.aspx"&gt;http://blogs.msdn.com/anitag/archive/2009/08/19/should-bvts-pass-100.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I don't think that MS Tester center is super resource with always fresh and novice content. I believe it's a bit static and archaic but for someone it can be good start point in testing journey. More attractive and concrete Microsoft!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-7536907006479036644?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/7536907006479036644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=7536907006479036644&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/7536907006479036644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/7536907006479036644'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/04/interesting-pages-from-tester.html' title='Interesting Pages from MicroSoft Tester Center'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-4750921911264404437</id><published>2010-04-23T09:26:00.000-07:00</published><updated>2010-04-23T09:28:43.375-07:00</updated><title type='text'>Hybrid-level test automation is the most effective</title><content type='html'>Hey test automation gurus and those who just in the beginning of this challengeable road!&lt;br /&gt;&lt;br /&gt;After reading http://googletesting.blogspot.com/2010/04/googles-innovation-factory-and-how.html I’ve got some thoughts about test automation effectiveness from test-level point of view. Most of developed s/w products have various interfaces lying within different layers. Pulling these interfaces in tests we get some testing level coverage. Just for example, working through GUI, test likely to be called full System E2E level (aka Integration), going down we can call objects of GUI shell representing native methods and properties of GUI entities (calling Get/Post requests, working through DOM, COM objects). The last approach is still integration testing or system level but bits farther from User’s use case – it means we don’t test GUI itself.&lt;br /&gt;&lt;br /&gt;Component (module)-level functional testing is deeper one as tests here operate over a particular component using its native external interfaces. Let’s call it API-level testing. This approach requires being subscriber and maintainer of module API. Surely this testing is quicker and more robust at most cases due to absences of intermediate layers and integration containments.&lt;br /&gt;&lt;br /&gt;Components integration potentially can utilize different levels of interfaces but this is drawback of supporting different technologies. Here is example: run system job through Component A API, validate Component B response through GUI. The better case:  run system job through Component A API, validate Component B in database. The most valid case for this testing level: run system job through Component A API, validate Component B behavior using Component B API. The ideal case: Components A and B have single unified API or have higher layer inheriting and unifying all components API’s and externalizing secured API.&lt;br /&gt;&lt;br /&gt;The Unit-test level is when you test product’s code itself (Classes, methods and structures). This is important level which must be used for producing good apps. Unit testing to be relied on development resources.&lt;br /&gt;&lt;br /&gt;Hybrid-level model in essence is a mix of all (though probably but Unit-level). But the formula of proportions and efficacy is different from project to project. I just can show some examples of reasonable scenarios of combining different test levels:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;API level testing is using to manipulate system components, transmit data and trigger events. Verification is running on API-level, then in GUI as double checkpoint. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Integration between 2 components is verifying in module integration level (API). Integration with GUI layer is checking in GUI as checkpoints.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Change data in database (SQL scripting); checking results in API as checkpoint. And vice versa – change data using UI, validate on database side (SQL querying). Let’s complicate these cases by adding validation in intermediate layer (e.g. check Web service I/O, check queue object, check POST/GET Header and Body)&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-4750921911264404437?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/4750921911264404437/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=4750921911264404437&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/4750921911264404437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/4750921911264404437'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/04/hybrid-level-test-automation-is-most.html' title='Hybrid-level test automation is the most effective'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-5168104634060771284</id><published>2010-04-20T11:58:00.000-07:00</published><updated>2010-04-20T12:01:05.660-07:00</updated><title type='text'>Google Testing Blog: Google's Innovation Factory (and how testing adapts)</title><content type='html'>This is amazing that GoooGle reveal their some internals about testing, continious inegration, ROIs and savings of different approaches and digits. Really appreciated! See theirs presentation here:&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://docs.google.com/present/embed?id=dx5zxb8_7g6knqgxk&amp;interval=5&amp;size=m" frameborder="0" width="555" height="451"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-5168104634060771284?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/5168104634060771284/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=5168104634060771284&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/5168104634060771284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/5168104634060771284'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/04/google-testing-blog-googles-innovation.html' title='Google Testing Blog: Google&apos;s Innovation Factory (and how testing adapts)'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-4230611615511902062</id><published>2010-04-15T12:29:00.000-07:00</published><updated>2010-04-16T11:32:24.237-07:00</updated><title type='text'>Weekly Fun Relax on FR : QABurger</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_H8RIeuOZSco/S8drNE3H3VI/AAAAAAAAD0w/luaE1Y7JqXY/s1600/imagesCA6RN5M0.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 241px; height: 210px;" src="http://1.bp.blogspot.com/_H8RIeuOZSco/S8drNE3H3VI/AAAAAAAAD0w/luaE1Y7JqXY/s400/imagesCA6RN5M0.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5460450945597431122" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;What are differences between professional and matured QA and so-called QA as some organizations like to use this term but don't follow proper pracices? The answer is simple - they differ like different fast food and restaraunt meal cooked by skilled cooker.&lt;br /&gt;&lt;br /&gt;So to cook QABurger, you need to mix:&lt;br /&gt;- developers response for testing - so they combine development and testing;&lt;br /&gt;- practice Ad-hoc testing only without Test plans and schedules;&lt;br /&gt;- gather all issues and defects somewhere in any format - just write something to revisit one day;&lt;br /&gt;- don't prioritize and plan fixes and new features - let's to begin from easy task, then go down by fix/implementation complexity;&lt;br /&gt;- use very simple and clear metric of you quality attribute like number of defects - that's enough to make some judgements and to define scope of works;&lt;br /&gt;- simplify all processes - chaos is a pat of creativity;&lt;br /&gt;- deploy new features and fixes on production as soon as you can after checking on development machine - more frequent commits simplify and accelerate work&lt;br /&gt;- give your system for testing for potential Users - testing engineers will yield the same result but for money&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-4230611615511902062?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/4230611615511902062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=4230611615511902062&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/4230611615511902062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/4230611615511902062'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/04/weekly-fun-relax-on-fr-qaburger.html' title='Weekly Fun Relax on FR : QABurger'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_H8RIeuOZSco/S8drNE3H3VI/AAAAAAAAD0w/luaE1Y7JqXY/s72-c/imagesCA6RN5M0.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-7331326237925059786</id><published>2010-04-15T06:50:00.000-07:00</published><updated>2010-04-15T12:28:25.914-07:00</updated><title type='text'>Data Migration/Transformation testing tips</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_H8RIeuOZSco/S8dodceofNI/AAAAAAAAD0o/v0y3Xvwzm6E/s1600/hot-water-migration.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 252px;" src="http://3.bp.blogspot.com/_H8RIeuOZSco/S8dodceofNI/AAAAAAAAD0o/v0y3Xvwzm6E/s320/hot-water-migration.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5460447928280186066" /&gt;&lt;/a&gt;&lt;br /&gt;Data migration/transformation projects are actual in s/w industry especially because systems mature, systems integration, needs in transforming data from legacy systems, for data improvement, consolidation, separation and purifying tasks. Some data migration activities may be so complex that require involvemnet of significant resources, skilled professionals and special tools. It can be truly noticed that data transformation itself in modern projects is sophisticated and challengable solution requiring individual approach and process modeling.&lt;br /&gt;&lt;br /&gt;Data migration testing runs as grey or even white-box testing at most cases. Simple verification against on presentatoin layer can't gurantee good coverage, discovering hidden defects and this testing itself is not effective as requiring intensive data verification without deep inside research.&lt;br /&gt;&lt;br /&gt;Here are &lt;strong&gt;my tips &lt;/strong&gt;for testers who run or are going to test data migration:&lt;br /&gt;&lt;br /&gt;- learn purpose and business model of project and Company to realize migration target&lt;br /&gt;&lt;br /&gt;- study transformation schemas and scripts(XSD, SQL scripts)&lt;br /&gt;&lt;br /&gt;- study development algorithms which operate over original data to produce transformed one. Notice you have to correspond the algorithms with specifications and requirements on migration process&lt;br /&gt;&lt;br /&gt;- study database schemas (all from original to final through intermidiate states)&lt;br /&gt;&lt;br /&gt;- develop and check your own scripts (SQL, XML, XLS, XSLT) to retrieve data for testing&lt;br /&gt;&lt;br /&gt;- design sufficient and efficient data sets for testing data validity and integrity&lt;br /&gt;&lt;br /&gt;- store your scripts and data sets under version control and link with versions of AUT&lt;br /&gt;&lt;br /&gt;- run tests and store actual outputs in test logs.&lt;br /&gt; &lt;br /&gt;- Also consider saving test logs as database records in testing DB with linking on defect entries. This approach will allow to revisit test run results as soon as you need in structured view&lt;br /&gt;&lt;br /&gt;- Keep your knowledge about everything in product changes up to date&lt;br /&gt;&lt;br /&gt;- Check data transformation in all points where it's being transformed in a whole product (DB, presentation, services, batch jobs, intermidiate mediums, etc)&lt;br /&gt;&lt;br /&gt;- Make sure and double check correspondence and compatibility of original data types and transformed types for each entity, field and macro-data. This is a part of getting familiar with database architecture and schemas&lt;br /&gt;&lt;br /&gt;- Run test frequenly against various data sets representing various combinations and tricky moments (like using special characters, sontrol symbols, code snippets, too long strings, invalid types and mixed content; strings that potentially can be truncated, encoded or echoed)&lt;br /&gt;&lt;br /&gt;- More CREATIVITY and Hacking! You should BREAK IT!&lt;br /&gt;&lt;br /&gt;For those who need to continue learning this topic, take a look at Wikipedia's related pages and this article about Data warehouse testing&lt;br /&gt;&lt;div align="left"&gt;&lt;span style="font-size:+0;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://www.developeriq.in/articles/2010/mar/10/data-warehouse-testing/"&gt;http://www.developeriq.in/articles/2010/mar/10/data-warehouse-testing/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-7331326237925059786?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/7331326237925059786/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=7331326237925059786&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/7331326237925059786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/7331326237925059786'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/03/data-migrationtransformation-testing.html' title='Data Migration/Transformation testing tips'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_H8RIeuOZSco/S8dodceofNI/AAAAAAAAD0o/v0y3Xvwzm6E/s72-c/hot-water-migration.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-4918113894046011348</id><published>2010-03-29T12:35:00.000-07:00</published><updated>2010-03-29T07:22:32.216-07:00</updated><title type='text'>Normal distribution in action: defect distribution modeling and prediction</title><content type='html'>Preface: to be on the same page, it's recommended to review the following WP articles:&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Normal_distribution"&gt;http://en.wikipedia.org/wiki/Normal_distribution&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Theory_of_errors"&gt;http://en.wikipedia.org/wiki/Theory_of_errors&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Errors_and_residuals_in_statistics"&gt;http://en.wikipedia.org/wiki/Errors_and_residuals_in_statistics&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Though, the notion normal (Gaussian) distribution appears potentially helpful for s/w project planning and analysis, but it's strongly recommended to play with this tool carefully and what more important - with statistically sufficient and significant data set. Yes there is a constraint - the project should be big enough. However, does it really important to forecast new defects and persistent ones on a project having 5000 SLOC? Don't think so.&lt;br /&gt;&lt;br /&gt;Obviously this theory may help to:&lt;br /&gt;- estimate volume of non-covered/discovered defects. By this - rebuild test plan to achieve proper test coverage.&lt;br /&gt;- predict volume and distribution of newly revealed product defects. By this - come up and/or numerically adjust with project sign off date. Somehow metrics could shift project release or may play start point of more resources negotiation.&lt;br /&gt;- model efficient test automation (functional and unit) coverage. By this - achieve high ROI on automation.&lt;br /&gt;&lt;br /&gt;All you need is to:&lt;br /&gt;- select a sampling variable. In our case likely it is number of valid reported defects, e.g. weekly/daily. It depends periods you are going to operate on.&lt;br /&gt;- calculate mean over this variable&lt;br /&gt;- calculate variance of this sampling variable&lt;br /&gt;- Then build and graph &lt;a href="http://en.wikipedia.org/wiki/Probability_density_function"&gt;Probability density function (PDF) &lt;/a&gt;&lt;br /&gt;&lt;img class="tex" alt="\frac{1}{\sqrt{2\pi\sigma^2}}\; e^{ -\frac{(x-\mu)^2}{2\sigma^2} } " src="http://upload.wikimedia.org/math/1/8/4/184fa5540b76903b1653d9f83912265d.png" /&gt;&lt;br /&gt;&lt;br /&gt;This graph as well as mean and variance calculations are easy task using Excel formulas and graphs. The resulting graph should be build together with original sample in time series (histogram). The view of the curve itself shows "normality» of this sample. Overlapping of two graphs shows divergence of normality with real state. But don't hurry to make judgments on this curve it's just tip for you to feel confidence of project control. E.g. the curve with open tail (end in time series) may signal that testing should be prolonged as there are undiscovered defects as expected statistically.&lt;br /&gt;&lt;br /&gt;The next advanced application is prediction. To make it you need to build either ideal normal distribution or use existing one. Then the restore function will give you remaining sample sub-set (show future). So that, you may say how many defects will be found for example week by week. Or what functionality needs to be tested with more effort&lt;br /&gt;&lt;br /&gt;Finally to calculate precision over your calculations you have to come up with confidence intervals of your observations.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-4918113894046011348?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/4918113894046011348/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=4918113894046011348&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/4918113894046011348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/4918113894046011348'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/01/normal-distribution-in-action-defect.html' title='Normal distribution in action: defect distribution modeling and prediction'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-4762506325630066974</id><published>2010-03-23T06:31:00.000-07:00</published><updated>2010-03-23T07:25:35.529-07:00</updated><title type='text'>Myths and silly Viewpoints about Test Automation</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_H8RIeuOZSco/S6jPRspqz8I/AAAAAAAAD0g/mzlrYMhwaLQ/s1600-h/myths+012807.GIF"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 150px; height: 111px;" src="http://3.bp.blogspot.com/_H8RIeuOZSco/S6jPRspqz8I/AAAAAAAAD0g/mzlrYMhwaLQ/s200/myths+012807.GIF" alt="" id="BLOGGER_PHOTO_ID_5451835251882643394" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Test automation is just spending money without return&lt;/li&gt;&lt;li&gt;Automated testing is always profitable. Test automation fits to any kind of project&lt;/li&gt;&lt;li&gt;Unit testing is better and finds more defects then functional automated testing&lt;/li&gt;&lt;li&gt;Record-playback is automated testing&lt;/li&gt;&lt;li&gt;Any person with IT background can be auto tester&lt;/li&gt;&lt;li&gt;It's easy to combine both manual and automate dtesting in a single role person&lt;/li&gt;&lt;li&gt;Test automation ROI is impossible to predict and calculate&lt;/li&gt;&lt;li&gt;Test automation estimation is not real activity&lt;/li&gt;&lt;li&gt;Test automation completely differs from s/w development&lt;/li&gt;&lt;li&gt;Bad developer can be good enough for automation&lt;/li&gt;&lt;li&gt;Developers can effectively develop functional auto tests&lt;/li&gt;&lt;li&gt;Auto testing is not about QA&lt;/li&gt;&lt;li&gt;Auto testing should not be a part of overall QA and QC&lt;/li&gt;&lt;li&gt;Manual testing coverage is preferable on any project/functionality and any project phase&lt;/li&gt;&lt;li&gt;Nobody should rely on automated testing&lt;/li&gt;&lt;li&gt;It's impossible to create robust and efficient auto testing at all&lt;/li&gt;&lt;li&gt;Everything can be automated&lt;/li&gt;&lt;li&gt;Is auto testing a sort of machine intelligence? Though, I don't trust that&lt;/li&gt;&lt;li&gt;Test automation should be capable to predict any system and environmental outcomes. Whatever issue occur - auto test suite should remove a problem and/or think out a new workflow path, recovery scenario, invent workaround from a scratch&lt;/li&gt;&lt;li&gt;Test automation is about writing a few code lines which result in testing major functionality. It's easy!&lt;/li&gt;&lt;/ol&gt;I wish to hear more myths and strange points you ever met on test automation. Let's share yours here commenting to this post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-4762506325630066974?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/4762506325630066974/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=4762506325630066974&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/4762506325630066974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/4762506325630066974'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/03/myths-and-silly-viewpoints-about-test.html' title='Myths and silly Viewpoints about Test Automation'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_H8RIeuOZSco/S6jPRspqz8I/AAAAAAAAD0g/mzlrYMhwaLQ/s72-c/myths+012807.GIF' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-6060861762624787774</id><published>2010-03-20T04:05:00.000-07:00</published><updated>2010-03-20T04:20:10.329-07:00</updated><title type='text'>Looking for Contributors or Fellows for this Blog</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_H8RIeuOZSco/S6SvMpUzMnI/AAAAAAAAD0Y/zoXSJQAGHBg/s1600-h/How-Much-Can-I-Contribute-To-My-401k-Per-Year.jpg"&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; WIDTH: 123px; FLOAT: left; HEIGHT: 153px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5450674080811528818" border="0" alt="" src="http://4.bp.blogspot.com/_H8RIeuOZSco/S6SvMpUzMnI/AAAAAAAAD0Y/zoXSJQAGHBg/s200/How-Much-Can-I-Contribute-To-My-401k-Per-Year.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;Hey there!&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;If you have to tell something novice, interesting or maybe amazing - I'd like to see your content published here. Also, fell free to discuss oportunity of authorship on this blog too.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Have a nice holidays!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-6060861762624787774?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/6060861762624787774/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=6060861762624787774&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/6060861762624787774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/6060861762624787774'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/03/looking-for-contributors-or-fellows-for.html' title='Looking for Contributors or Fellows for this Blog'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_H8RIeuOZSco/S6SvMpUzMnI/AAAAAAAAD0Y/zoXSJQAGHBg/s72-c/How-Much-Can-I-Contribute-To-My-401k-Per-Year.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-6953141034379826771</id><published>2010-03-16T08:56:00.000-07:00</published><updated>2010-03-16T09:08:42.338-07:00</updated><title type='text'>My post is featured in Automated Software Testing Magazine !</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_H8RIeuOZSco/S5-sofFGB1I/AAAAAAAADz4/Q6exy6clK2Y/s1600-h/ASTm.PNG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 255px; height: 320px;" src="http://1.bp.blogspot.com/_H8RIeuOZSco/S5-sofFGB1I/AAAAAAAADz4/Q6exy6clK2Y/s320/ASTm.PNG" alt="" id="BLOGGER_PHOTO_ID_5449263885679200082" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Hey!&lt;br /&gt;&lt;br /&gt;it was nice to be informed my blog &lt;a href="http://at4qa.blogspot.com/2010/01/20-essential-design-patterns-for.html"&gt;20 Essential design patterns for automated testing&lt;/a&gt; (&lt;a href="http://at4qa.blogspot.com/2010/01/20-essential-design-patterns-for.html"&gt;http://at4qa.blogspot.com/2010/01/20-essential-design-patterns-for.html&lt;/a&gt;) had been chosen as featured in Automated Software Testing Magazine, Issue March 2010. I got the news while being in vacation - especially pleasant.&lt;br /&gt;&lt;br /&gt;Download the official e-version of this magazine &lt;a href="http://www.automatedtestinginstitute.com/home/ASTMagazine/2010/AutomatedSoftwareTestingMagazine_March2010.pdf"&gt;here&lt;/a&gt; [&lt;a href="http://www.automatedtestinginstitute.com/home/ASTMagazine/2010/AutomatedSoftwareTestingMagazine_March2010.pdf"&gt;http://www.automatedtestinginstitute.com/home/ASTMagazine/2010/AutomatedSoftwareTestingMagazine_March2010.pdf&lt;/a&gt;]. Then, flip to page 36 - there is my first column out there, cool!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-6953141034379826771?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/6953141034379826771/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=6953141034379826771&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/6953141034379826771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/6953141034379826771'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/03/my-post-is-featured-in-automated.html' title='My post is featured in Automated Software Testing Magazine !'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_H8RIeuOZSco/S5-sofFGB1I/AAAAAAAADz4/Q6exy6clK2Y/s72-c/ASTm.PNG' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-3902043834909671725</id><published>2010-03-16T08:40:00.000-07:00</published><updated>2010-03-16T08:55:43.173-07:00</updated><title type='text'>WMI Code creator from MS</title><content type='html'>Just stumbled on a post about MS tool to ease WMI querying/executing/eventing here&lt;br /&gt;&lt;a href="http://qtpcodes.blogspot.com/2010/03/use-wmi-code-creator-tool-for-quick-wmi.html"&gt;http://qtpcodes.blogspot.com/2010/03/use-wmi-code-creator-tool-for-quick-wmi.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The tool is downloadable from Microsoft site here:&lt;br /&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=2cc30a64-ea15-4661-8da4-55bbc145c30e&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=2cc30a64-ea15-4661-8da4-55bbc145c30e&amp;amp;displaylang=en&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;While trying it out, came up with a thought - this is really handy for testers, especially for automation ones. Btw, being hand on this tool, you can develop system-level and network-communication apps and utils using Scripting only utilizing powerful resource management tool!&lt;br /&gt;&lt;br /&gt;I'm going to deeply learn the supported WMI namespaces and classes and write some scripting hooks just for fun.&lt;br /&gt;&lt;br /&gt;PS Author(s) had provided capability to convert generated code snippets among C#, VB .Net and VBS languages&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-3902043834909671725?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/3902043834909671725/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=3902043834909671725&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/3902043834909671725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/3902043834909671725'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/03/wmi-code-creator-from-ms.html' title='WMI Code creator from MS'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-6262043140419228249</id><published>2010-03-04T07:08:00.000-08:00</published><updated>2010-03-04T07:46:52.515-08:00</updated><title type='text'>JSystem Test Automation Framework</title><content type='html'>&lt;strong&gt;Introduction&lt;/strong&gt;&lt;br /&gt;JSystem is an open-source framework for writing and managing automated system tests. The aim of JSystem is to provide one simple central framework for functional and system testing of software and embedded systems.&lt;br /&gt;&lt;br /&gt;JSystem is an open system that supports leading scripting languages (such as .Net, Python and Perl) and communication protocols. It also connects with leading testing tools, both open-source (Selenium, AutoIt, JUnit, etc.) and commercial (IXIA, Spirent, etc.).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The JSystem Architecture&lt;/strong&gt;&lt;br /&gt;The JSystem architecture comprises of the System under Test, the Automation Framework and Framework Services, outlined in the diagram below:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_H8RIeuOZSco/S4_RwOiGhoI/AAAAAAAADy4/JM-iSWJbvU8/s1600-h/first.png"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 237px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5444801100979275394" border="0" alt="" src="http://4.bp.blogspot.com/_H8RIeuOZSco/S4_RwOiGhoI/AAAAAAAADy4/JM-iSWJbvU8/s400/first.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The System Under Test (SUT) is the device or software that is being tested, as well as the equipment and applications that participate in the test setup.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.jsystemtest.org/sites/default/files/help/Chapter"&gt;The Automation Framework&lt;/a&gt; does the testing. The framework divides the testing process into four layers that separate between the actual writing of the tests (done in Java), and the grouping and re-grouping of the tests into different test-scenarios, as well as executing and analyzing them – all of which don't require any knowledge of code and are done with an intuitive &lt;a href="http://www.jsystemtest.org/sites/default/files/help/Chapter"&gt;GUI interface&lt;/a&gt; (JRun):&lt;br /&gt;&lt;br /&gt;The four Automation Framework layers are:&lt;br /&gt;- System Object layer: written in Java, these are the basic building blocks of the test.&lt;br /&gt;- Test-Case layer is used to create the tests.&lt;br /&gt;- Test-Scenario Layer: groups the tests within a test-scenario.&lt;br /&gt;- Management Layer: an application that executes analyzes and publishes the test results.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.jsystemtest.org/sites/default/files/help/Chapter"&gt;The Framework Services&lt;/a&gt;: provide the QA engineer with functionality that assists in testing.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;What Makes JSystem Unique?&lt;/strong&gt;&lt;br /&gt;The JSystem architecture builds tests out of basic building blocks that can be used and reused to create new tests; the clear distinction between business logic and GUI enables the tester to change one without affecting the other – all this translates into much more efficient testing.&lt;br /&gt;&lt;br /&gt;Because of its four-layer architecture, JSystem also enables to incorporate both QA people that write code, and QA people that don't. Although creating the System Objects is done in Java (albeit, very simple Java), creating the test-scenarios, executing and analyzing and then generating reports, is all done with the GUI interface (JRun). JRun enables creating test-scenarios with drag-and-drop. This is a screenshot of the JRun main menu:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_H8RIeuOZSco/S4_U1nM4gkI/AAAAAAAADzA/WyWDojccfZE/s1600-h/second.png"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 310px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5444804492035392066" border="0" alt="" src="http://4.bp.blogspot.com/_H8RIeuOZSco/S4_U1nM4gkI/AAAAAAAADzA/WyWDojccfZE/s400/second.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;JSystem also contains &lt;a href="http://www.jsystemtest.org/?q=DriversList"&gt;built-in drivers&lt;/a&gt; for all major testing tools, including freeware drivers for open-source tools (such as Selenium, JUnit and AutoIt) as well as commercial tools.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;JSystem Deployments&lt;/strong&gt;&lt;br /&gt;JSystem is a mature product with deployments is large organizations, including telecommunications labs in such companies as Juniper, Nokia-Siemens, ECI, Avaya and Ericsson. JSystem is deployed in testing Web applications by companies such as Alcatel-Lucent and Taiana, and in testing semiconductors in companies such as Intel, Altair and Metalink.&lt;br /&gt;&lt;br /&gt;For more information on JSystem, please go to their website: www.jsystemtest.org.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#666666;"&gt;DISCLAIMER: Copyright (c) Tal Harel. This article is prepared by Tal Harel as material for this Blog (http://at4qa.blogspot.com)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-6262043140419228249?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/6262043140419228249/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=6262043140419228249&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/6262043140419228249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/6262043140419228249'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/03/jsystem-test-automation-framework.html' title='JSystem Test Automation Framework'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_H8RIeuOZSco/S4_RwOiGhoI/AAAAAAAADy4/JM-iSWJbvU8/s72-c/first.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-4039770887793541024</id><published>2010-02-24T23:57:00.000-08:00</published><updated>2010-02-25T00:37:43.299-08:00</updated><title type='text'>"I'm doing what i'm being paid for..."</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_H8RIeuOZSco/S4Y2u6p27_I/AAAAAAAADys/8GPXeaP3c4M/s1600-h/Write-your-own-career-path.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 223px; height: 148px;" src="http://2.bp.blogspot.com/_H8RIeuOZSco/S4Y2u6p27_I/AAAAAAAADys/8GPXeaP3c4M/s400/Write-your-own-career-path.jpg" alt="" id="BLOGGER_PHOTO_ID_5442097379370528754" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;That stupid thinking of workers in IT is not acceptable since skilled IT guys should continuously move ahead, learn more things (in adjacent fields too) and grow value and contribution day by day by joint effort.&lt;br /&gt;&lt;br /&gt;If you hear from a guy such words as in the post title, probably there are 2 alternatives behind the sentence:&lt;br /&gt;- either this guy is really making great effort but is remained unmotivated by management, project progress, company culture/processes or anything else&lt;br /&gt;- or this guy is pushover and they whine is just attempt to defend themselves. Likely this person is not skilled, not experienced or does not correspond to requirements on that position.&lt;br /&gt;I like to meet guys that don't give in difficulties and don't afraid to face challenges even if s/he never run assigned duties. It's really cool to see how novice manages well something unfamiliar with.&lt;br /&gt;&lt;br /&gt;I wish good luck everyone in career path and keep faith - good managers keep watch on your effort!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-4039770887793541024?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/4039770887793541024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=4039770887793541024&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/4039770887793541024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/4039770887793541024'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/02/im-doing-what-im-being-paid-for.html' title='&quot;I&apos;m doing what i&apos;m being paid for...&quot;'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_H8RIeuOZSco/S4Y2u6p27_I/AAAAAAAADys/8GPXeaP3c4M/s72-c/Write-your-own-career-path.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-8178561664693767786</id><published>2010-02-11T05:33:00.000-08:00</published><updated>2010-02-11T07:16:52.577-08:00</updated><title type='text'>GUI Test automation using PowerShell</title><content type='html'>I dug MSDN's articles describing how to utilize PowerShell for test automation&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/magazine/cc163301.aspx"&gt;Win forms applications&lt;/a&gt; [http://msdn.microsoft.com/en-us/magazine/cc163301.aspx]&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/magazine/cc337896.aspx"&gt;Web applications&lt;/a&gt; [http://msdn.microsoft.com/en-us/magazine/cc337896.aspx]&lt;br /&gt;&lt;br /&gt;Also here is their blog [&lt;a href="http://testfirst.spaces.live.com/blog/"&gt;http://testfirst.spaces.live.com/blog/&lt;/a&gt;]. &lt;a href="http://powergui.org/index.jspa"&gt;PowerGUI &lt;/a&gt;is IDE for code development. Check out the highlighting video as demo &lt;a href="http://powergui.org/shares/powergui/sbin/docs/AutomatedTesting/PowerShell-Automated-Software-Testing.html"&gt;http://powergui.org/shares/powergui/sbin/docs/AutomatedTesting/PowerShell-Automated-Software-Testing.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;My critical review is below...&lt;br /&gt;&lt;br /&gt;As author of those articles &lt;strong&gt;Dr. James McCaffrey &lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;himself states that PowerShell can give lightweight solution for non-complex test automation. I rather agree with this point as PowerShell does not poses to be test automation environment but you can utilize his capabilities for automation too. It may be deal to use PowerShell scripting approach for supplementary action items in your overall test automation framework - that's like using OS objects (FileSystem, MMC, XMLDom, etc). Besides that you may consider to build own test framework basing on PowerShell, Visual Studio environment and moreover using .Net capabilities. This is a big deal that is requiring big effort and addressing &lt;span&gt;to figure out this project reasonability&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Restriction of supporting Microsoft's technologies only may be considered as improper solution of product automation. As I understood, for Win forms PowerShell can process COM and .Net controls, while for Web-based it can work in IE through DOM.&lt;br /&gt;&lt;br /&gt;So putting all together, appears for me that PowerShell is not "power" for test automation but it still can assist as part of whole test automation project; another way is to utilize PowerShell for small test projects and only over Microsoft's environments.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PS &lt;span style="font-weight: bold; font-style: italic;"&gt;cmdlet&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;sounds cool and smells Microsoft.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-8178561664693767786?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/8178561664693767786/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=8178561664693767786&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/8178561664693767786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/8178561664693767786'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/02/gui-test-automation-using-powershell.html' title='GUI Test automation using PowerShell'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-8255758165237205912</id><published>2010-02-03T07:28:00.000-08:00</published><updated>2010-02-03T08:58:12.609-08:00</updated><title type='text'>TOOLS: Diff with Sorting and RegExp filtering</title><content type='html'>Data comparison is one of essential parts of testing. There are varieties of assertion approaches which fulfill automatic checking of actual output against expected result (or etalon). I'd like to describe one completed recipe which consists of the following steps:&lt;br /&gt;&lt;ol&gt;&lt;li&gt; Select a proper diff tool (supporting CL). Basically this tool should be capable to run diff against files (one-to-one) and against folders (recursively over all files) and should have variety of options (filtering, exclusions, omitting, grouping, file names/extensions filtering, escaping and supplementary rules and options)&lt;/li&gt;&lt;li&gt; Specify filtering options using regular expressions: -excluding lines and - excluding substrings&lt;/li&gt;&lt;li&gt;Employ supplementary steps like lines ordering (e.g. sort command in Win CL), merging&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;#1-2 are supported in ExamDiffPro - I've used this tool with no problems. Another advantage of ExanDiffPro is capability to import/export settings. It's especially valuable if you need to run comparision under differenet options in CL. If you need to run comparison against huge data sets, try to look at comparing using checksum MD5&lt;br /&gt;&lt;br /&gt;That's all I have for this post. Your experience?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-8255758165237205912?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/8255758165237205912/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=8255758165237205912&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/8255758165237205912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/8255758165237205912'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/02/tools-diff-with-sorting-and-regexp.html' title='TOOLS: Diff with Sorting and RegExp filtering'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-79072154540505858</id><published>2010-02-02T11:30:00.000-08:00</published><updated>2010-02-02T07:10:32.693-08:00</updated><title type='text'>Cloud testing as SaaS is to kill performance and reliability testing vendor’s tools? {Generalized: ~Cloud~ for development}</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_H8RIeuOZSco/S2G-3-8qqXI/AAAAAAAADyM/xDyLyFTWu0E/s1600-h/question-cloud.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 253px; height: 400px;" src="http://1.bp.blogspot.com/_H8RIeuOZSco/S2G-3-8qqXI/AAAAAAAADyM/xDyLyFTWu0E/s400/question-cloud.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5431832494585063794" /&gt;&lt;/a&gt;&lt;br /&gt;Not sure I have enough time to run deep investigation whether this question answers Yes or No. But at first sight this approach is profitable against purchasing very costly tools like from HP or Borland. Hopefully the dynamic of expanding SaaS for testing will grow down the road. It seems the biggest player on the cloud testing is Amazon. If they really provide honest and cost-efficient plan with capability and flexibility of load testing model, so performance professionals should take a sharp look on this trending technology. Indeed, why should I pay thousands $$ for load testing especially for a single application/task?&lt;br /&gt;&lt;br /&gt;Eventually the SaaS will come to narrow segments like load testing, hosting specific environments like test stands, build and continuous integration servers.  I’m also interested if SaaS providers will place such plans like temporary/limited access to dedicated environments running various OSs, apps and services and as premium services they could prepare and let on lease required virtual machine configurations. I think this a great gate for vendors of professional toolkits, let say HP could provide such plans for their QC, QTP and LoadRunner. Here is a scheme: ready environment + preinstalled and configured vendor’s tool + supplementary package (like open source popular tools, e.g.  Subversion, notepad++, XAMPP, etc). That would be perfect for automated testing particularly on short and middle projects duration. Resulting in significant reduce of cost on environmental needs will cause many advantages such as test automation ROI improvement and removing overheads on administration and supporting environments.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_H8RIeuOZSco/S2G_CRoT3bI/AAAAAAAADyU/a5_1kab4lsI/s1600-h/cloud-computing.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="http://4.bp.blogspot.com/_H8RIeuOZSco/S2G_CRoT3bI/AAAAAAAADyU/a5_1kab4lsI/s400/cloud-computing.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5431832671398649266" /&gt;&lt;/a&gt;&lt;br /&gt;Such huge players like HP, Microsoft (Win Oss, Visual Studio, MS),  Oracle&amp;Sun made steps in this direction, the rest guys will move up too sooner. But I’d like to have their services more affordable, as well as with hosting specific dev/QA software and finally, I wish they propose flexible tariffs with “pay just for how long you use service”. Also there is a field to host, maintain and administrate Open source only, for instance – providing variations of preconfigured Linux distributives jointly with services – please don’t mix with hosting – I want various environments for development and testing with temporary ownership.  &lt;br /&gt;&lt;br /&gt;Is anyone who has success story of using SaaS for development and testing?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-79072154540505858?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/79072154540505858/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=79072154540505858&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/79072154540505858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/79072154540505858'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/01/cloud-testing-as-saas-is-to-kill.html' title='Cloud testing as SaaS is to kill performance and reliability testing vendor’s tools? {Generalized: ~Cloud~ for development}'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_H8RIeuOZSco/S2G-3-8qqXI/AAAAAAAADyM/xDyLyFTWu0E/s72-c/question-cloud.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-5895408066436549742</id><published>2010-02-02T05:10:00.000-08:00</published><updated>2010-02-02T05:23:13.430-08:00</updated><title type='text'>XML for building high-end test frameworks</title><content type='html'>The pasted slides below provides real technical-oriented review. I like such kind of content that does not wate time for nothing like guru's philospphy. Take a look at this:&lt;br /&gt;&lt;br /&gt;&lt;div style="width:425px;text-align:left" id="__ss_139013"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/diongillard/automated-testing-of-web-applications-using-x-m-l-v2" title="Automated  Testing Of  Web  Applications Using  XML"&gt;Automated  Testing Of  Web  Applications Using  XML&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=automated-testing-of-web-applications-using-x-m-l-v2-1192756071730188-2&amp;stripped_title=automated-testing-of-web-applications-using-x-m-l-v2" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=automated-testing-of-web-applications-using-x-m-l-v2-1192756071730188-2&amp;stripped_title=automated-testing-of-web-applications-using-x-m-l-v2" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View more &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/diongillard"&gt;diongillard&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-5895408066436549742?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/5895408066436549742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=5895408066436549742&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/5895408066436549742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/5895408066436549742'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/02/xml-for-building-high-end-test.html' title='XML for building high-end test frameworks'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-988766543077332869</id><published>2010-01-28T04:50:00.000-08:00</published><updated>2010-01-28T05:11:38.504-08:00</updated><title type='text'>iPad launch : antagonisms</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_H8RIeuOZSco/S2GM-EyJH8I/AAAAAAAADyE/cb11YSGKp0U/s1600-h/ipad.PNG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 226px;" src="http://1.bp.blogspot.com/_H8RIeuOZSco/S2GM-EyJH8I/AAAAAAAADyE/cb11YSGKp0U/s320/ipad.PNG" alt="" id="BLOGGER_PHOTO_ID_5431777623649361858" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;There were a lot of rumors and guesses about look and feel of being announced super new gadget with screen touch and multitouch revolutionary technologies and lots surprises for consumers. Yesterday they showed this as usually gracefully exposing mystery. Actually I did not pay attention on guesses how it will look like even from "trusted" sources. Why? Because of Apple's strategy is to run a few fake projects so that employment does not know what will be the real product on store shelf.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;By this tactic Apple:&lt;br /&gt;•    stirs up public&lt;br /&gt;•    minimizes risks of thefts&lt;br /&gt;So they launched iPad but results don't impress, moreover - mostly I see articles and posts with blaming containment. This one article seems better yet represents real thinks&lt;br /&gt;&lt;a href="http://mashable.com/2010/01/28/what-we-learned-about-apple-yesterday/"&gt;http://mashable.com/2010/01/28/what-we-learned-about-apple-yesterday/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Will see...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-988766543077332869?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/988766543077332869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=988766543077332869&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/988766543077332869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/988766543077332869'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/01/ipad-launch-antagonisms.html' title='iPad launch : antagonisms'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_H8RIeuOZSco/S2GM-EyJH8I/AAAAAAAADyE/cb11YSGKp0U/s72-c/ipad.PNG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-289152587363267659</id><published>2010-01-27T08:45:00.000-08:00</published><updated>2010-01-27T08:51:38.805-08:00</updated><title type='text'>An interesting post from Google's QA about patterns to testing</title><content type='html'>&lt;a href="http://googletesting.blogspot.com/2010/01/interviewing-insights-and-test.html"&gt;http://googletesting.blogspot.com/2010/01/interviewing-insights-and-test.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I think this is good point and reflection but IMO professional QA guys combine all the best from this classification and care this suite in daily activities. I don't like one-sided approach as it risky to limit own vision. Also flexibility should be a part of career path since different projects expect different approach as well as thinking.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-289152587363267659?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/289152587363267659/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=289152587363267659&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/289152587363267659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/289152587363267659'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/01/interesting-post-from-googles-qa-about.html' title='An interesting post from Google&apos;s QA about patterns to testing'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-4049771419185770204</id><published>2010-01-25T09:32:00.000-08:00</published><updated>2010-01-26T01:30:00.098-08:00</updated><title type='text'>Tools: XML ORM for efficient parameterization</title><content type='html'>&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;T&lt;/span&gt;&lt;/span&gt;est automation parameterization is a part of architecture, thus Object-relational mapping can significantly simplify your routine works and reduce risks of unprotected and unauthorized data access. Starting from scratch will require to learn and utilize some worked out technologies such as&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://www.w3schools.com/XPath/default.asp"&gt;XPATH&lt;/a&gt; for retrieving/modification/inserting data into XML&lt;br /&gt;- &lt;a href="http://www.w3schools.com/xquery/default.asp"&gt;XQUERY&lt;/a&gt; as unified SQL-like language&lt;br /&gt;- &lt;a href="http://msdn.microsoft.com/en-us/liDOM%20brary/ms757828%28VS.85%29.aspx"&gt;DOM&lt;/a&gt; model. This is like low-level or direct access to elements of DOM documents&lt;br /&gt;- New technology from Microsoft &lt;a href="http://msdn.microsoft.com/en-us/netframework/aa904594.aspx"&gt;LINQ&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I rather suggest to use &lt;a href="http://www.w3.org/TR/xml11/"&gt;XML 1.1 namespace&lt;/a&gt; (see difference 1.0 with 1.1 &lt;a href="http://www.ibm.com/developerworks/xml/library/x-xmlns11.html"&gt;here&lt;/a&gt;). Additionally, using schema binding to test data XML storages will bring you long-term benefits:&lt;br /&gt;- automatic validation (opening within browser or loading XML through Microsoft XMLDOM:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    oXML = CreateObject("microsoft.xmldom")&lt;/span&gt; &lt;span style="font-style: italic;"&gt;     oXML.load(sFile)&lt;/span&gt;&lt;br /&gt;- unified designed data structure with advantages of default values, flexible implication of entities, values lookup and restrictions and many more pros&lt;br /&gt;&lt;br /&gt;Basically you have to select a single approach: either your schemas defined in &lt;a href="http://www.w3schools.com/DTD/default.asp"&gt;DTD&lt;/a&gt; or in &lt;a href="http://www.w3schools.com/Schema/default.asp"&gt;XSD&lt;/a&gt;.&lt;br /&gt;Certainly big test and long test automation projects with intensive and heterogeneous data (and possibly tested objects mapping) parameterization will profit from careful data/objects designing through XML schema.&lt;br /&gt;&lt;br /&gt;You can build a hybrid model which will utilize several technologies in a single package encapsulating internal staff.&lt;br /&gt;&lt;br /&gt;One more good practice is to split up logical pieces of huge XML into several ones in order to simplify concurrent usage and change control, also think about keeping schema(s) itself as separate document and include properly, so that final model will have 3 layers:&lt;br /&gt;&lt;br /&gt;1. &lt;span style="font-weight:bold;"&gt;Schema &lt;/span&gt;definition (or multiple schemas)&lt;br /&gt;2. &lt;span style="font-weight:bold;"&gt;Common &lt;/span&gt;or master XML (which binds schema(s), describes common data and includes particular modules):&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_H8RIeuOZSco/S1607FGe0oI/AAAAAAAADx8/CVdXjcZxfjs/s1600-h/DTD_inclusions.bmp"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 169px;" src="http://3.bp.blogspot.com/_H8RIeuOZSco/S1607FGe0oI/AAAAAAAADx8/CVdXjcZxfjs/s320/DTD_inclusions.bmp" alt="" id="BLOGGER_PHOTO_ID_5430977127730041474" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;3. &lt;span style="font-weight:bold;"&gt;Specific &lt;/span&gt;test data description (test cases, tested objects specs... per component/module/test level)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-4049771419185770204?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/4049771419185770204/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=4049771419185770204&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/4049771419185770204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/4049771419185770204'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/01/tools-xml-orm-for-efficient.html' title='Tools: XML ORM for efficient parameterization'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_H8RIeuOZSco/S1607FGe0oI/AAAAAAAADx8/CVdXjcZxfjs/s72-c/DTD_inclusions.bmp' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-2862630189034763049</id><published>2010-01-24T12:38:00.000-08:00</published><updated>2010-01-25T01:32:37.301-08:00</updated><title type='text'>Test Automation Dashboard in just One day</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_H8RIeuOZSco/S11lB1oCrrI/AAAAAAAADx0/jO4y4PQ4gg8/s1600-h/traffic_lights.jpg"&gt;&lt;img style="MARGIN: 0px 0px 10px 10px; WIDTH: 240px; FLOAT: right; HEIGHT: 320px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5430607807927987890" border="0" alt="" src="http://1.bp.blogspot.com/_H8RIeuOZSco/S11lB1oCrrI/AAAAAAAADx0/jO4y4PQ4gg8/s320/traffic_lights.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;T&lt;/strong&gt;&lt;/span&gt;he value of automated testing is determined by reporting framework definetly at most. Your team must provide clear, in-time and customizable reporting for stakeholders. Nowadays data presentation plays vital role in assesssing whether your product is useful and useable or not.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The test reporting should be able to show various views of accumulated data. Someone will like to see graphs over all runs, someone will check daily runs carefully drilling down grids and logging lines, someone will want to see something like traffic lights (red, yellow, green).&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Development such system is the big deal as actually full-grown project. I developed this one with my team 2 years ago. That was Dashboard which was utilized over all test automation projects. We built the Dashboard using XAMPP (Apache, MySQL), plus some extra JS code and jQuery. To plot graphs we used jGraph open source library. I really like this app as it is flexible, has pretty presentation, navigation, filtering. Moreover we implemented test running and test stands dispatching through the web dashboard interface. Though this infrastructure project had been running in background, we spend on that good portion of our budget and tehnical skills.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;This challenge may frustrate if you have limited resources which are dedicated to developing tests only. There is a recipe! Likely your project uses defect-tracking system - so your task is simple utilization this tool for your daily runs. &lt;a href="http://www.atlassian.com/software/jira/"&gt;Atlassian Jira&lt;/a&gt; is perfect candidate to be reused for test automation as this very flexible and cusomizable system supporting a lot of technologies (just check 3-rd parties integration - &lt;a href="http://www.atlassian.com/software/jira/tour/plugins.jsp"&gt;http://www.atlassian.com/software/jira/tour/plugins.jsp&lt;/a&gt;). Nevertheless if you use Trac or BugZilla or ClearQuest - I believe (since I worked with them), you can apply the same approach.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;I see 2 options how to deploy this integration:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;1. Integration into project(s) structure with new ticket type (to isolate from regular project tickets)&lt;/div&gt;&lt;br /&gt;&lt;div&gt;2. Create new project wth required break down by components (test project or test level), releases, builds (e.g. each new run is a new build); fields customization and so on.&lt;/div&gt;&lt;br /&gt;&lt;strong&gt;How to tune up:&lt;br /&gt;&lt;/strong&gt;1. Customize ticket fields&lt;br /&gt;2. Identify rules on new build (e.g. each run) and ticket submission (each test case failure)&lt;br /&gt;* Preferably your reporting should be granular with proper rules of counting failured/not_run/passed steps. The perfect approach is to trace auto test against manual test case (failure in one or more step(s) mean test case fail)&lt;br /&gt;3. Create preliminary views in tracking system: spreadsheets, graphs using built-in filters&lt;br /&gt;4. Think out roles, assignements, priorities and other useful fields&lt;br /&gt;5. Teach your test automation framework to communicate with defect tracker:&lt;br /&gt;- come up with interface: GUI, API, DB, Web service...&lt;br /&gt;- new run submission&lt;br /&gt;- new ticket submission (form filling)&lt;br /&gt;- supplementary data retrieving/update/insert&lt;br /&gt;6. Create a single-view Dashboard page as container of customized gadgets through filtering (or querying)&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;The final dashboard look and feel is limited by your defect tracker. I like Jira's filtering options and graphs:&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_H8RIeuOZSco/S11jN--KtmI/AAAAAAAADxc/P62iYPaVITo/s1600-h/maximized-gadget.png"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 320px; DISPLAY: block; HEIGHT: 205px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5430605817571882594" border="0" alt="" src="http://1.bp.blogspot.com/_H8RIeuOZSco/S11jN--KtmI/AAAAAAAADxc/P62iYPaVITo/s320/maximized-gadget.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_H8RIeuOZSco/S11jkpjJ3iI/AAAAAAAADxs/VrTziyO6fT0/s1600-h/gadget-directory.png"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 320px; DISPLAY: block; HEIGHT: 256px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5430606206958427682" border="0" alt="" src="http://3.bp.blogspot.com/_H8RIeuOZSco/S11jkpjJ3iI/AAAAAAAADxs/VrTziyO6fT0/s320/gadget-directory.png" /&gt;&lt;/a&gt; &lt;/div&gt;&lt;div&gt;The last concern, what if your management will not like this idea to submit issue reports automatically? And here is your option - deploy your own bug tracker instance, establish project and required break down (components, releases, builds...) and integrate with test automation suite. Enjoy with your new reporting tool and don't forget to show your solution to everyone potentially interested. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-2862630189034763049?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/2862630189034763049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=2862630189034763049&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/2862630189034763049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/2862630189034763049'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/01/test-automation-dashboard-in-just-one.html' title='Test Automation Dashboard in just One day'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_H8RIeuOZSco/S11lB1oCrrI/AAAAAAAADx0/jO4y4PQ4gg8/s72-c/traffic_lights.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-1713757600735185965</id><published>2010-01-22T08:24:00.000-08:00</published><updated>2010-01-22T08:54:30.450-08:00</updated><title type='text'>FunRelax on FR: reflect Dr.House's "diagnose the undiagnosable" on Testing</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_H8RIeuOZSco/S1nXdefVQkI/AAAAAAAADxE/nRQVA3c-yu4/s1600-h/House-Group1.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 299px; height: 400px;" src="http://2.bp.blogspot.com/_H8RIeuOZSco/S1nXdefVQkI/AAAAAAAADxE/nRQVA3c-yu4/s400/House-Group1.jpg" alt="" id="BLOGGER_PHOTO_ID_5429607727172502082" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Hey everybody who visit me on Friday!&lt;br /&gt;It's friday, you know - so relax at the end of business day!&lt;br /&gt;&lt;br /&gt;Did you ever try to draw an analogy testing with diagnosis in medicine. Actually we work over similar hard problems occuring in our practices. Sure, usual common scenario is simple cases which we treat in routine scope. But sometimes we meet with challenge in our discovery - without that our job is boring. Wanna more? We both work on finding out defects and their root cause - medicine reveals them in health,  s/w testers run research against software products which are also complex system. Not so complex as human organism but anyway...&lt;br /&gt;&lt;br /&gt;House uses investigatory method is to eliminate diagnoses logically as they are proved impossible like did Sherlock Holmes. Or in proper terms &lt;a href="http://en.wikipedia.org/wiki/Inductive_reasoning" title="Inductive reasoning"&gt;inductive reasoning&lt;/a&gt;. Actually both characters are very similar.&lt;br /&gt;I think Software tester should be able to use this approach too, though it's limited by personal mentality. Testing is continious research resulting in discovery - move ahead in your mastery.&lt;br /&gt;But today - enjoy upcoming weekends!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_H8RIeuOZSco/S1nYAjEDSFI/AAAAAAAADxU/kmJdEHLXMO4/s1600-h/Berr+QA.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 317px;" src="http://1.bp.blogspot.com/_H8RIeuOZSco/S1nYAjEDSFI/AAAAAAAADxU/kmJdEHLXMO4/s320/Berr+QA.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5429608329695676498" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-1713757600735185965?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/1713757600735185965/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=1713757600735185965&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/1713757600735185965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/1713757600735185965'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/01/funrelax-on-fr-reflect-drhouses.html' title='FunRelax on FR: reflect Dr.House&apos;s &quot;diagnose the undiagnosable&quot; on Testing'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_H8RIeuOZSco/S1nXdefVQkI/AAAAAAAADxE/nRQVA3c-yu4/s72-c/House-Group1.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-2018150537272755151</id><published>2010-01-20T02:31:00.000-08:00</published><updated>2010-01-21T03:19:06.040-08:00</updated><title type='text'>Effective Quality Assurance as Driver towards Innovations  or  Building Сonsumer-Oriented Software Products</title><content type='html'>&lt;div style="width: 425px; text-align: left;" id="__ss_2954555"&gt;&lt;a style="margin: 12px 0pt 3px; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; display: block; text-decoration: underline;" href="http://www.slideshare.net/PeterBiz/effective-quality-assurance-as-sriver-towards-innovations-or-building-onsumeroriented-software-products-2954555" title="Effective Quality Assurance as Sriver towards Innovations  or  Building Сonsumer-Oriented Software Products"&gt;Effective Quality Assurance as Sriver towards Innovations  or  Building Сonsumer-Oriented Software Products&lt;/a&gt;&lt;object style="margin: 0px;" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=eqaengine-100120044819-phpapp01&amp;amp;rel=0&amp;amp;stripped_title=effective-quality-assurance-as-sriver-towards-innovations-or-building-onsumeroriented-software-products-2954555"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=eqaengine-100120044819-phpapp01&amp;amp;rel=0&amp;amp;stripped_title=effective-quality-assurance-as-sriver-towards-innovations-or-building-onsumeroriented-software-products-2954555" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;"&gt;View more &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/PeterBiz"&gt;PeterBiz&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-2018150537272755151?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/2018150537272755151/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=2018150537272755151&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/2018150537272755151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/2018150537272755151'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/01/effective-quality-assurance-as-sriver.html' title='Effective Quality Assurance as Driver towards Innovations  or  Building Сonsumer-Oriented Software Products'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-8817205547654109395</id><published>2010-01-19T01:28:00.000-08:00</published><updated>2010-03-23T06:29:31.060-07:00</updated><title type='text'>Non-verbose list of testing tools</title><content type='html'>Recently found the resource trying to list all Functional testing tools&lt;br /&gt;&lt;a href="http://www.opensourcetesting.org/functional.php"&gt;http://www.opensourcetesting.org/functional.php&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and all Unit testing tools&lt;br /&gt;&lt;a href="http://www.opensourcetesting.org/unit_ada.php"&gt;http://www.opensourcetesting.org/unit_ada.php&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-8817205547654109395?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/8817205547654109395/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=8817205547654109395&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/8817205547654109395'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/8817205547654109395'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/01/non-verbose-list-of-testing-tools.html' title='Non-verbose list of testing tools'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-1472996526032023770</id><published>2010-01-18T02:10:00.000-08:00</published><updated>2010-01-18T02:17:32.953-08:00</updated><title type='text'>20 Essential design patterns for automated testing</title><content type='html'>I’m follower of building automated testing by analogy with s/w development in most of practices. Some practices are being grown initially from testing or properly improved in testing as legacy development practice. Actually, I don’t like to separate professional automated testing and development. We produce the same code but having opposite purpose – to check and verify the code of developed software – it does not matter what kind of interfaces we use upon testing. Anyway we test application and by this we test s/w code itself either implicitly or explicitly.&lt;br /&gt;Design patterns have high importance for building cost-efficient products with high-degree of reusability and based on component oriented models. Design patterns provide abstraction and robust platform for reusable s/w design. My intention is to think over what existing design patterns fit to automated testing. Let’s do this!&lt;br /&gt;&lt;br /&gt;As a fan of Web 2.0 and Wikipedia, I’ll refer on definitions and articles by linking to Wikipedia pages. See full list of design patterns on &lt;a href="http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29"&gt;dedicated page&lt;/a&gt;. If you need to check details on a particular pattern, just click on appropriate link in Table listing all patterns within section “Classification and list”.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center; font-weight: bold; color: rgb(255, 153, 102);"&gt;&lt;span style="color: rgb(153, 51, 153); font-family: courier new;"&gt;Creational patterns&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;Abstract factory&lt;/span&gt;. This is a proper mechanism of building abstraction layer for derived object types. For instance, it may be useful for implementation a framework layer responsible for working with different control types (e.g. MFC controls, pure Java controls, .Net controls,…) but operating as a single interface.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Builder &lt;/span&gt;pattern can be employed on test data construction and as a helper in many cases. Also you can use this approach for test suite initialization, stand preparation&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Factory &lt;/span&gt;pattern can be used in any context for simplification object instantiation. There are a lot of places where you can fit this pattern for auto testing (dynamic and static test data instantiation; logging, reporting, test stand objects, etc)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Lazy initialization&lt;/span&gt; can be used to reduce expenses  of keeping objects in memory. The best way is to combine this approach with object clean up once it no longer is being used.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Prototype &lt;/span&gt;as creational pattern simplifies object instantiation and  avoids sub classing  like in abstraction factory model&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Singleton &lt;/span&gt;is a protected method of keeping only one object instance in memory. Where can be used: all objects which should follow through whole test cycle or round, for example, logging and stack trace, high-level test data, environmental data, 3rd party objects initialization to keep resources. If an object is dynamic one, you have to provide special interfaces like update(), rollback(). Also this pattern is proper way for developing high-performance models, optimization resource allocation and expenses and in environments with weak or absenting garbage collection and memory clean up.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center; font-family: courier new; font-weight: bold;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;Structural patterns&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;Adapter or wrapper&lt;/span&gt; can be used anywhere for resolving data compatibility  and interface simplification. Simple and basic pattern&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Composite &lt;/span&gt;patterns can be used for representation complex object like current test data set in a tree model (one to many relationships). I prefer to rely this approach on XML test data presentation as structured object model&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Decorator &lt;/span&gt;is proper way to extending functionality without affecting original code. I suggest to use it as helper or quick adding workaround s and backdoors&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Proxy &lt;/span&gt;as intermediate level for access control. I’m not sure about usage context in test automation but as this is essential one, I include this to the list. Who knows, maybe this guy can be used in some specific tested applications.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Facade &lt;/span&gt;pattern. I like to  use  this pattern for managing test data through uniform interface so that I don’t take care about used test data native. All specific code of data native processors placed somewhere inside, while decorator simply returns an object. Very handy.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center; font-weight: bold; font-family: courier new;"&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;Behavioral patterns&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;Chain of responsibilit&lt;/span&gt;y is  a proper pattern for designing own logging and stack trace&lt;br /&gt;Command pattern. It is extremely valuable for building keyword-driven test automation frameworks where provided interface operates with macro languages. Macro is a composite state which implements completed and composite User step which is actually intermediate level between granular steps and completed workflow (like Use case). The whole workflow (e.g. Use case) is being implemented in test scenario designed from a certain macros (steps).&lt;br /&gt;Another usage of this pattern is testing transactional logic by mirroring some part of transactional model of application itself on test code.&lt;br /&gt;&lt;br /&gt;In joint use with Abstract factory, you can build a layer for typed control of mixed technologies. In my practice, I build object loader and abstracted invoking object properties and methods for supporting different COM object versions at fly. You can go ahead and implement similar abstraction for different technologies, plus empower your design by invention composite commands for batch controls processing. For example, wizards processing by invoking meta-commands (like “set up default settings”)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Interpreter &lt;/span&gt;can be used to simplify working with custom string patterns. It’s really useful for substituting using predefined templates and for running code pieces using Eval() method&lt;br /&gt;Iterator is essential for handling  corresponding controls, like grids, tables, custom lists. Basic ally, iterator should have first(), last(), next(), add(), remove(), isLast() methods.&lt;br /&gt;Null object is a basic and helpful approach of default value implementation. I can state – this simplifies routine test development.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Observer &lt;/span&gt;pattern. I advice to be hand on with this guy especially for testing AJAX applications and other ones which are asynchronous in nature. This pattern can be used in designing event-based test auto9mation frameworks.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;State &lt;/span&gt;pattern. I did not use this one, though I believe it’s a basis of behavior-driven test frameworks&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Strategy &lt;/span&gt;pattern can serve for switching algorithms using polymorphism or reflection (btw, JS  implementation is really  fun). The Strategy perfectly correspond with Open/Closed principle&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Template method&lt;/span&gt; is a generic for designing reusable code (not only object-oriented) with overriding. I’d like to try this template  to implement advanced test data engine.&lt;br /&gt;&lt;br /&gt;I intentionally left TDD patterns out of this scope, since they are really specific ones, moreover I tried to highlight them (&lt;span style="font-style: italic;"&gt;stub, fixture, fake, mock, object mother, object registry, assertions&lt;/span&gt;) in a &lt;a href="http://at4qa.blogspot.com/2010/01/adopting-tdd-practices-into-white-box.html"&gt;separate post&lt;/a&gt;. Finally, most of the mentioned patterns are implementable in all modern  programming languages (both OO and scripting, like JS, VBS) .&lt;br /&gt;&lt;br /&gt;Well, enjoy designing patterns and inventing your own!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-1472996526032023770?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/1472996526032023770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=1472996526032023770&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/1472996526032023770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/1472996526032023770'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/01/20-essential-design-patterns-for.html' title='20 Essential design patterns for automated testing'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-7296753894763051609</id><published>2010-01-15T09:32:00.000-08:00</published><updated>2010-01-15T09:33:19.116-08:00</updated><title type='text'>Brainstorming or flip your mind</title><content type='html'>It’s well known about brainstorming as a powerful method to generate ideas, practices, grow team spirit and as result reinforce project timeline by sharing thoughts among team members. Sure it’s amazing way to motivate people, calm down some guys and optimize people effort. Indeed regular brainstorming sessions allows mentoring team indirectly, reveal talents and identify weak players for further decision making and training. What are the key success factors of brainstorming session? Here is my vision on that:&lt;br /&gt;&lt;br /&gt;1. Be prepared and relaxed – it’s not reporting meeting with your boss. No bosses in brainstorming – all are partners.&lt;br /&gt;&lt;br /&gt;2. Every participant should feel freedom to share and voice thoughts and ideas. Don’t make brainstorming as a necessary event – people don’t like when they are constrained. Say NO bureaucracy!&lt;br /&gt;&lt;br /&gt;3. Everyone should feel s/he is wanted to be listened. Interruption and switching to other speaker makes everyone unmotivated.&lt;br /&gt;&lt;br /&gt;4. Relax audience by jokes, fun plans and stories; imagine you are child and plays how you want&lt;br /&gt;&lt;br /&gt;5. Flip your mind and try to walk outside your habitual outlook. People often see things as in tunnel missing lots of things beyond. So be observer 360 degree.&lt;br /&gt;&lt;br /&gt;Someone should take about collecting of brainstorming outputs as all this matter may be useless today and come in handy tomorrow. Who knows? Things happen. And yes, even if you turn brainstorming to holiday or team building, you will see how the sessions appear more and more productive.&lt;br /&gt;&lt;br /&gt;Good luck in generating ideas!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-7296753894763051609?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/7296753894763051609/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=7296753894763051609&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/7296753894763051609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/7296753894763051609'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/01/brainstorming-or-flip-your-mind.html' title='Brainstorming or flip your mind'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-8876129329848790560</id><published>2010-01-15T01:45:00.000-08:00</published><updated>2010-01-15T02:05:53.536-08:00</updated><title type='text'>Advanced slides on QA and automation</title><content type='html'>As a big fan of Web 2.0 and social media, I like to find out some sort of interesting artifacts, people and trends. Recently I walked through SlideShare.com and found there some interesting presentations about QA, test automation and fitting QA to business. Once again I receive evidence that Internet is a heap of junk where everyone may find what they need and sometimes very very usable - the essence is to use mediators skilfully (search engines, forums, catalogs, reviews, social nets, etc.)&lt;br /&gt;So let's take a look at some interested selected presentations, perhaps there are some amusing details for you?&lt;br /&gt;&lt;br /&gt;&lt;div style="width:425px;text-align:left" id="__ss_576628"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/techdude/automated-web-application-testing-with-selenium" title="Automated web application testing with Selenium"&gt;Automated web application testing with Selenium&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=automated-web-application-testing-with-selenium-21750&amp;rel=0&amp;stripped_title=automated-web-application-testing-with-selenium" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=automated-web-application-testing-with-selenium-21750&amp;rel=0&amp;stripped_title=automated-web-application-testing-with-selenium" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View more &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/"&gt;documents&lt;/a&gt; from &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/techdude"&gt;techdude&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="width:425px;text-align:left" id="__ss_699502"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/nashjain/role-of-qa-and-testing-in-agile-presentation" title="Role Of QA And Testing In Agile"&gt;Role Of QA And Testing In Agile&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=role-of-qa-and-testing-in-agile-1225221397167302-8&amp;rel=0&amp;stripped_title=role-of-qa-and-testing-in-agile-presentation" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=role-of-qa-and-testing-in-agile-1225221397167302-8&amp;rel=0&amp;stripped_title=role-of-qa-and-testing-in-agile-presentation" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View more &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/nashjain"&gt;Naresh Jain&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="width:425px;text-align:left" id="__ss_382321"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/didev/automated-testing-vs-manual-testing" title="Automated Testing vs Manual Testing"&gt;Automated Testing vs Manual Testing&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=automated-testing-vs-manual-testing-1209588627912049-8&amp;rel=0&amp;stripped_title=automated-testing-vs-manual-testing" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=automated-testing-vs-manual-testing-1209588627912049-8&amp;rel=0&amp;stripped_title=automated-testing-vs-manual-testing" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View more &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/didev"&gt;didev&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="width:425px;text-align:left" id="__ss_208327"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/valicac/software-testing" title="Software Testing"&gt;Software Testing&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=software-testing-1198102207476437-4&amp;rel=0&amp;stripped_title=software-testing" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=software-testing-1198102207476437-4&amp;rel=0&amp;stripped_title=software-testing" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View more &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/valicac"&gt;Ecaterina Valica&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="width:425px;text-align:left" id="__ss_104909"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/guest0efb5e/software-testing-application-and-script-independent-automation-framework-the-need-for-data-normalization" title="Software Testing: Application And Script Independent Automation Framework: The Need For Data Normalization"&gt;Software Testing: Application And Script Independent Automation Framework: The Need For Data Normalization&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=software-testing-application-and-script-independent-automation-framework-the-need-for-data-normalization1842&amp;rel=0&amp;stripped_title=software-testing-application-and-script-independent-automation-framework-the-need-for-data-normalization" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=software-testing-application-and-script-independent-automation-framework-the-need-for-data-normalization1842&amp;rel=0&amp;stripped_title=software-testing-application-and-script-independent-automation-framework-the-need-for-data-normalization" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View more &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/guest0efb5e"&gt;guest0efb5e&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="width:425px;text-align:left" id="__ss_164289"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/gueste730d5/software-testing-life-cycle" title="Software Testing Life Cycle"&gt;Software Testing Life Cycle&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=software-testing-life-cycle-119493296625171-1&amp;rel=0&amp;stripped_title=software-testing-life-cycle" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=software-testing-life-cycle-119493296625171-1&amp;rel=0&amp;stripped_title=software-testing-life-cycle" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View more &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/gueste730d5"&gt;gueste730d5&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-8876129329848790560?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/8876129329848790560/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=8876129329848790560&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/8876129329848790560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/8876129329848790560'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/01/advanced-slides-on-qa-and-automation.html' title='Advanced slides on QA and automation'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-8226879700084834340</id><published>2010-01-14T08:55:00.000-08:00</published><updated>2010-01-14T09:05:12.831-08:00</updated><title type='text'>Helping in forming QA and testing KB on Wikipedia</title><content type='html'>I'm working from time to time on contributing to Software testing portal on Wikipedia (&lt;a href="http://en.wikipedia.org/wiki/Portal:Software_Testing"&gt;http://en.wikipedia.org/wiki/Portal:Software_Testing&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;If anyone can help to expand this KB - please don't hesitate - let's do it. Wikipedia is free space but high-quality content is a must.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;"Quality is like health: you can't buy it. Hovewer you can bring it up and then keep it up diligently"&lt;/span&gt;&lt;span style="font-style:italic;"&gt; (from myself)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-8226879700084834340?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/8226879700084834340/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=8226879700084834340&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/8226879700084834340'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/8226879700084834340'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/01/helping-in-forming-qa-and-testing-kb-on.html' title='Helping in forming QA and testing KB on Wikipedia'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-5849699778001068447</id><published>2010-01-14T08:48:00.000-08:00</published><updated>2010-01-14T08:55:30.218-08:00</updated><title type='text'>Fun but useful Testers categorization</title><content type='html'>Check &lt;a href="http://api.ning.com/files/i*eW06Cb6TvhaKiW0YMISUQISOfmspxyCh7YhHf8gBAsqGjSDdtadxvpDlGnfuTilR3pDuAbL27zmnMUQqiPzUDcWHmABRF6/testertypes.pdf"&gt;this paper&lt;/a&gt; out! IMHO this break down may fit to likely any profession.&lt;br /&gt;&lt;br /&gt;Where you are in your path? may be you jumb from one category to other?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-5849699778001068447?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/5849699778001068447/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=5849699778001068447&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/5849699778001068447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/5849699778001068447'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/01/fun-but-useful-testers-categorization.html' title='Fun but useful Testers categorization'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-7196340281778699675</id><published>2010-01-13T07:23:00.000-08:00</published><updated>2010-01-14T00:43:18.628-08:00</updated><title type='text'>End-to-End (E2E) testing with white-box technique</title><content type='html'>The importance of system testing also known as &lt;a href="http://mike2.openmethodology.org/wiki/End-to-End_Testing"&gt;E2E testing&lt;/a&gt; is very high especially on Product/Release delivery. This type of test basically requires running a continuous cycle against full path of system(s) under tests.  It involves integration testing with 3rd party components, internal systems and interfaces as well. For example, test is running on User presentation then acquired results are used for verification in back-end system. I prefer and suggest continuing this effort by checking collected data using grey-box technique on DB side, or checking XML responses from Web services, queuing system or any other sort of object. Surely it’s challenge for those who are not hand on with specific technologies but learning in action is the best practice than anything else like books reading.&lt;br /&gt;&lt;br /&gt;Another interesting thing is to automate E2E testing as complete cycle which follows data from birth to its death (CRUD: create-read, update, delete). In my previous project we had developed such monster. The basic idea behind the code is to collect all actual data from front-end tests. After that this data is picking up with new test project from SVN for feeding all the bunch of XMLs for verification in back-end system, checking DB views and pinging Web services. We used XML format as perfect data object which supports many-to-many associations and structured well for querying via XPath.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-7196340281778699675?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/7196340281778699675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=7196340281778699675&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/7196340281778699675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/7196340281778699675'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/01/end-to-end-e2e-testing-with-white-box.html' title='End-to-End (E2E) testing with white-box technique'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-5718457537219883851</id><published>2010-01-12T03:33:00.000-08:00</published><updated>2010-01-12T06:12:17.426-08:00</updated><title type='text'>Measuring test (manual/automation) effectiveness</title><content type='html'>The main metrics of testing quality are coverage and number of rejections. In terms of software testing, we have to move toward minimization of invalid found defects, minimization of non-found valid defects and maximization testing coverage. The same is valid for automated testing but basically measurements being performed in relation to manual effort, while manual testing is benchmarking against UAT, defects found in production by users and stakeholders.&lt;br /&gt;&lt;br /&gt;Scientifics interpret the same notions in terms of Errors:&lt;br /&gt;Error type I – false positive (false alarm) – when reported defect is invalid. &lt;br /&gt;Error type II – false negative (missing) – when defect was not revealed in testing. &lt;br /&gt;See more details on this theory on Wikipedia [&lt;a href="http://en.wikipedia.org/wiki/Type_I_and_type_II_errors"&gt;http://en.wikipedia.org/wiki/Type_I_and_type_II_errors&lt;/a&gt;]&lt;br /&gt;There are special statistical measures which operate with those notions (see below an excerpt from Wikipedia.org)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_H8RIeuOZSco/S0xfnyuVSmI/AAAAAAAADv8/n8ka1B5qBHI/s1600-h/measure_eff.GIF"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 272px; height: 400px;" src="http://3.bp.blogspot.com/_H8RIeuOZSco/S0xfnyuVSmI/AAAAAAAADv8/n8ka1B5qBHI/s400/measure_eff.GIF" border="0" alt=""id="BLOGGER_PHOTO_ID_5425816788310248034" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Full details on that see here: &lt;a href="http://en.wikipedia.org/wiki/Sensitivity_(tests)"&gt;http://en.wikipedia.org/wiki/Sensitivity_(tests)&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So one-two metrics can be employed for both manual and automated testing analysis in time (for instance showing up in QA reports as curves on a graph). I would select Accuracy (ACC), Precision (&lt;a href="http://en.wikipedia.org/wiki/Accuracy"&gt;http://en.wikipedia.org/wiki/Accuracy&lt;/a&gt;) and False discovery rate (FDR).&lt;br /&gt;&lt;br /&gt;For automated testing, I would suggest to measure against manual testing considering test automation coverage but not overall (manual+UAT+Production), so that false positive (false alarm) is when test automation reveals wrong defect, false negative – when automated test did not find defect when expected due to auto test covers that functionality.&lt;br /&gt;To test your auto test :), you may run pilot analysis using so called &lt;a href="http://c2.com/cgi/wiki?DefectSeeding"&gt;defect seeding&lt;/a&gt; technique.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-5718457537219883851?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/5718457537219883851/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=5718457537219883851&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/5718457537219883851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/5718457537219883851'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/01/measuring-test-manualautomation.html' title='Measuring test (manual/automation) effectiveness'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_H8RIeuOZSco/S0xfnyuVSmI/AAAAAAAADv8/n8ka1B5qBHI/s72-c/measure_eff.GIF' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-1460153955493281812</id><published>2010-01-12T02:59:00.000-08:00</published><updated>2010-01-12T09:28:38.964-08:00</updated><title type='text'>Couple excerpts from memories (JS, TestComplete)</title><content type='html'>I like to have facade for abstraction data retrieving from any supported source. Generally I used either CSV or XML as data natives. XML data source might contain instruction to build a randomized string by substitutable pattern or have instruction to run a DB query or finally the value might be simple string. This is a simple decision-maker excerpt (sorry this blog does not allow to insert well-looked code snippets):&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_H8RIeuOZSco/S0yuM0KiFzI/AAAAAAAADwM/vkoZlebrcQA/s1600-h/retrieve_value_snippet.GIF"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 247px;" src="http://4.bp.blogspot.com/_H8RIeuOZSco/S0yuM0KiFzI/AAAAAAAADwM/vkoZlebrcQA/s400/retrieve_value_snippet.GIF" alt="" id="BLOGGER_PHOTO_ID_5425903186259089202" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Another useful code which may help in tracing and problem localization is a custom exception handling wich also can be used as call chain mehanism in order to use as stack trace (Log4j is much better for this). The snippet below is serving as exception stack trace but that method can be easily transformed for use in any context.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_H8RIeuOZSco/S0yuaHaMWVI/AAAAAAAADwU/NvwRknOjxfY/s1600-h/exception_handlin_trc_snippet.GIF"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 295px;" src="http://3.bp.blogspot.com/_H8RIeuOZSco/S0yuaHaMWVI/AAAAAAAADwU/NvwRknOjxfY/s400/exception_handlin_trc_snippet.GIF" alt="" id="BLOGGER_PHOTO_ID_5425903414763346258" border="0" /&gt;&lt;/a&gt;Btw, TestComplete 7 has cool built-in stack trace so in that way problem localization becomes much quicker.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-1460153955493281812?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/1460153955493281812/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=1460153955493281812&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/1460153955493281812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/1460153955493281812'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/01/couple-excerpts-from-memories-js.html' title='Couple excerpts from memories (JS, TestComplete)'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_H8RIeuOZSco/S0yuM0KiFzI/AAAAAAAADwM/vkoZlebrcQA/s72-c/retrieve_value_snippet.GIF' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-28280840324573322</id><published>2010-01-12T02:31:00.000-08:00</published><updated>2010-01-12T02:47:20.962-08:00</updated><title type='text'>Free web rendering services: for testing, SEO and just for fun</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_H8RIeuOZSco/S0xS84aXm3I/AAAAAAAADvs/dpGwOc7WsEI/s1600-h/shredding-scissors-2-lg.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 300px; height: 240px;" src="http://1.bp.blogspot.com/_H8RIeuOZSco/S0xS84aXm3I/AAAAAAAADvs/dpGwOc7WsEI/s320/shredding-scissors-2-lg.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5425802856963218290" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Good time to share some Web-based tools which are very useful and handy to have in your bag!&lt;br /&gt;&lt;br /&gt;1. Have you ever run compatibility testing against different browsers/OSs? It’s very time-consuming and routine operation.  &lt;a href="http://browsershots.org/"&gt;http://browsershots.org/&lt;/a&gt; makes all that automatically in distributed way. Just feed needed page and wait for awhile.  Very handy!&lt;br /&gt;&lt;br /&gt;2. Would you like to take a look at how any site was presented in Internet? WayBackmachine (&lt;a href="http://www.archive.org/web/web.php"&gt;http://www.archive.org/web/web.php&lt;/a&gt;) is a powerful crawler of web pages, so that you can see site history in time. Also it may be useful to anyone who needs to check a history of a particular site for fun or for example, to check if you can trust this site or not (like Company history and survey). One limitation: if a site prohibits to be scanned (settings in Robot.txt), Waybackmachine could not return you result&lt;br /&gt;&lt;br /&gt;3. Essential tool for SEO is &lt;a href="http://www.seo-browser.com/"&gt;http://www.seo-browser.com/&lt;/a&gt; (SEO-browser). Check how a site is seen for search machines.&lt;br /&gt;4. Site performance optimization is very important to make it usable and reliable for visitors. So the following services can make analysis and advices on that:&lt;br /&gt;&lt;a href="http://www.websiteoptimization.com/"&gt;http://www.websiteoptimization.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://tools.pingdom.com"&gt;http://tools.pingdom.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;5. Want to know Internet speed and check your ISP quality of services? Run this guy &lt;a href="http://www.speedtest.net/"&gt;http://www.speedtest.net/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-28280840324573322?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/28280840324573322/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=28280840324573322&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/28280840324573322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/28280840324573322'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/01/good-time-to-share-some-web-based-tools.html' title='Free web rendering services: for testing, SEO and just for fun'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_H8RIeuOZSco/S0xS84aXm3I/AAAAAAAADvs/dpGwOc7WsEI/s72-c/shredding-scissors-2-lg.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-7350249361575158728</id><published>2010-01-11T20:18:00.000-08:00</published><updated>2010-01-11T09:18:59.734-08:00</updated><title type='text'>Adopting TDD practices into white-box test automation (part #1)</title><content type='html'>I will base on &lt;a href="http://www.amazon.com/Test-Driven-Practical-Acceptance-Developers/dp/1932394850/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1262854747&amp;sr=1-1"&gt;Lasse Koskela's book &lt;/a&gt; and &lt;a href="http://www.amazon.com/xUnit-Test-Patterns-Refactoring-Code/dp/0131495054/ref=sr_1_8?ie=UTF8&amp;s=books&amp;qid=1262854747&amp;sr=1-8"&gt;Gerard Meszaros book&lt;/a&gt; plus some my personal knowledges.&lt;br /&gt;&lt;br /&gt;So the first part will be analysis of “Practical TDD and Acceptance TDD for Java developers”.&lt;br /&gt;As usual I will try to be short and straightforward. I will paste some excerpts which seems are fit to black-box auto testing or can be adopted down the road, e.g. on new framework development. Let’s take a look on interesting excerpts below.&lt;br /&gt;&lt;span style="font-style:italic;"&gt;“A good test is atomic.&lt;br /&gt;A good test is isolated.” &lt;/span&gt;&lt;br /&gt;This sentence sounds reasonable for all types of tests – test should be granular, isolated (for user as test runner). My addition – a completed test round should leave the world in the same state as it starts.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;“That’s what I call the power of imagination! And it has a name, too. It’s called programming by intention. Programming by intention, the concept of writing code as if another piece of code exists—even if it doesn’t—is a technique that makes you focus on what we could have instead of working around what we have.”&lt;/span&gt;&lt;br /&gt;Good engineer should be able to follow this rule – be ready to use imagination (write test before actual code).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;“Take a moment to think about what we could improve in the test code. Duplication. Semantic redundancy. Anything that jumps out. Anything we perhaps should clean up.”&lt;/span&gt;&lt;br /&gt;Refactoring is important step on improving work entirely.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;“Happy path vs. error situations&lt;br /&gt;As a rule of thumb, I drive for the happy path first before proceeding to handle exceptional scenarios, such as exceptions thrown by third-party APIs, malformed input, and so forth. The reason for doing so is mostly about value. Even the most robust system capable of handling any conceivable error situation is practically useless when it isn’t able to perform its basic function. On the other hand, even a system that, for example, is prone to crash if the network is temporarily down still provides value as long as the network isn’t down.” &lt;/span&gt;&lt;br /&gt;Agree, first to implement a logic of happy path then all the rest branches. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;“To summarize the essence of fixtures, they’re the whole shebang—the state of the whole runtime environment—rather than just the instance variables of a test class instance and the internal state of those objects.&lt;br /&gt;…&lt;br /&gt;Experienced TDD’ers are often good at creating focused tests. A key to being able to have a focused test is to have a suitable fixture that brings the system and the objects involved to a state in which the test doesn’t need to do much more than a single assertion call, possibly after first invoking a one-liner on the object being tested.”&lt;/span&gt;&lt;br /&gt;Fixture is a essential pattern for robust and efficient test frameworks.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;“Stubs are essentially the simplest possible implementation of a given interface you can think of. For example, stubs’ methods typically return hardcoded, meaningless values.&lt;br /&gt;Fakes are a degree more sophisticated than stubs in that they can be considered an alternative implementation of the interface. In other words, a fake looks like a duck and walks like a duck even though it isn’t a real duck. In contrast, a stub only looks like a duck.&lt;br /&gt;Mocks can be considered even more sophisticated in terms of their implementation, because they incorporate assertions for verifying expected collaboration with other objects during a test. Depending on the implementation of a mock, it can be set up either to return hardcoded values or to provide a fake implementation of the logic. Mocks are typically generated dynamically with frameworks and libraries, such as EasyMock, but they can also be implemented by hand.”&lt;/span&gt;&lt;br /&gt;Those are again good patterns for employing in routine tasks. You may even design them unknowing that you use mock. At least the definitions are helpful for communicating on the same language of terms.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;“Aiming at helping you avoid creating testability challenges for yourself, here are a few simple design guidelines that we should pay attention to:&lt;br /&gt;- Choose composition over inheritance.&lt;br /&gt;- Avoid static and the Singleton.&lt;br /&gt;- Isolate dependencies.&lt;br /&gt;- Inject dependencies.”&lt;/span&gt;&lt;br /&gt;I agree with all these recommendations but second one - sometimes static and singletons may pay good result for quick and temporary  implementation. Also singleton is self-protection mechanism for reloading, instantiating more objects than one. &lt;br /&gt;&lt;br /&gt;Also Koskela provides some basic unit testing patterns that may be used upon building custom test automation frameworks. They are:&lt;br /&gt;• Assertions as exercises metods&lt;br /&gt;• Parametrized method creation (this guy easily implementing in JS :)&lt;br /&gt;• One more interesting pattern is Object mother: &lt;span style="font-style:italic;"&gt;"an object or a set of objects that does the following:&lt;br /&gt;- Provides a fully-formed business object along with all of its required attribute objects&lt;br /&gt;- Returns the requested object at any point in its lifecycle&lt;br /&gt;- Facilitates customization of the delivered object&lt;br /&gt;- Allows for updating of the object during the testing process&lt;br /&gt;- When required, terminates the object and all its related objects at the end of the test process"&lt;/span&gt;&lt;br /&gt;• Finally I like provided by author combination of Fixture setup, Teardown and Test object registry as a dedicated classes.  This approach simplifies instantiation, automatic object cleanup by triggering, protected access and all these together truly correspond with single responsibility principle. &lt;br /&gt;Regarding techniques on testing legacy code, there are highlighted just some common aspects. So I would recommend reading some special books like "Working Effectively with Legacy Code" by Michael Feathers, and books on code refactoring such as “Refactoring: Improving the Design of Existing Code”, MartinFowler et. all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-7350249361575158728?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/7350249361575158728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=7350249361575158728&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/7350249361575158728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/7350249361575158728'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/01/adopting-tdd-practices-into-white-box.html' title='Adopting TDD practices into white-box test automation (part #1)'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-2093947143127057649</id><published>2010-01-11T08:55:00.000-08:00</published><updated>2010-01-11T08:58:18.220-08:00</updated><title type='text'>Robot Framework</title><content type='html'>I found that interesting but not yet tried this framework.&lt;br /&gt;&lt;br /&gt;See details here&lt;br /&gt;http://code.google.com/p/robotframework/&lt;br /&gt;&lt;br /&gt;documentation:&lt;br /&gt;http://robotframework.googlecode.com/svn/tags/robotframework-2.1.2/doc/userguide/RobotFrameworkUserGuide.html&lt;br /&gt;&lt;br /&gt;Btw, I did not find out there whether it works with XML and schemas or not.&lt;br /&gt;&lt;br /&gt;Someone tried that guy?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-2093947143127057649?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/2093947143127057649/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=2093947143127057649&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/2093947143127057649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/2093947143127057649'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/01/robot-framework.html' title='Robot Framework'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-5635462688508158885</id><published>2010-01-11T07:10:00.000-08:00</published><updated>2010-01-11T09:32:56.570-08:00</updated><title type='text'>Who is ideal test automation engineer?</title><content type='html'>Ideally highly-professional test automation is hybrid of manual QA/testing and tests developers. I’m sure this is a rule for both project contribution and personalaqXC career path. If you are skilled QA analyst, test designer plus has broad knowledge and experience working with test automation professional environments, frameworks and besides all that may combine manual and automated effort – you are valuable for talent hunters!&lt;br /&gt;&lt;br /&gt;As QA analyst the person should have real experience in comprehensive testing, test design, planning, and risks assessment. Also this role requires being great team player with good communication skills, creativeness and non-stop drill down against AUT – your desire to break the system should be as instinct. So that testers have some freedom to break software using any tool and technique and this makes the role very interesting as you become investigator and subject matter over a particular application and business domain.&lt;br /&gt;&lt;br /&gt;Talking about automated testing, the core skills per me are:&lt;br /&gt;- Knowledge of internal mechanisms of interacted objects (e.g. DOM model, COM object, MFC, Pure Java).  Basically you have to be able to invent efficient object recognition model with high robustness on intermediate changes and proper control identification (avoiding concurrent identification)&lt;br /&gt;- Knowledge of test automation tool(s) itself&lt;br /&gt;- Familiar with programming language on which you are going to write tests&lt;br /&gt;- Knowledge of development practices, principles (like single responsibility Open/Closed, reusability, OOP, procedural approach…)  and common design patterns (singleton, decorator, factory, wrapper, etc)&lt;br /&gt;- Regular expressions. That’s a very powerful tool for us. Must to know concepts and how to use. Ideally you are ready to write any expression at fly.&lt;br /&gt;- Knowledge on performance testing, modeling and identification of bottlenecks (for load testing)&lt;br /&gt;- Knowledge of theory and practices on relational databases.&lt;br /&gt;- Good knowledge of one on-demand RDBMS, querying and performance analysis&lt;br /&gt;- XML –based technologies and service model (XML, XSLT, XSD, DTD, WSDL)&lt;br /&gt;- Experienced in version control systems&lt;br /&gt;- Experienced in tuning application/web/DB servers&lt;br /&gt;- Broad knowledge of operation systems (server and consumers solutions) as advanced user or as administrator.&lt;br /&gt;&lt;br /&gt;Yep, I forgot to mention that QA should be in-time and clear reporter (defects, issues, test logs). It appears the list of skills and responsibilities is long and ideal.  Surely project needs defines certain set of skills and responsibilities.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-5635462688508158885?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/5635462688508158885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=5635462688508158885&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/5635462688508158885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/5635462688508158885'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/01/who-is-ideal-test-automation-engineer.html' title='Who is ideal test automation engineer?'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-22119228096484234</id><published>2010-01-07T01:01:00.000-08:00</published><updated>2010-01-07T01:16:35.892-08:00</updated><title type='text'>Design patterns for automated testing</title><content type='html'>This post will be filled in soon with design patterns implementation that perfectly fit to our duties. As for now just announcing as reminders for myself.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-22119228096484234?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/22119228096484234/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=22119228096484234&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/22119228096484234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/22119228096484234'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/01/design-patterns-for-automated-testing.html' title='Design patterns for automated testing'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-7337966171575345410</id><published>2010-01-06T10:09:00.000-08:00</published><updated>2010-01-06T11:35:56.133-08:00</updated><title type='text'>Wwwidgets: socialize and share</title><content type='html'>Widgets are stedy becoming more and more popular and valuable tools for web developers and for social markeing.&lt;br /&gt;Here are my findings of most useful and easy to deploy widgets (the list is based on my opinion):&lt;br /&gt; &lt;span style="font-weight:bold;"&gt;Facebook group:&lt;/span&gt;&lt;br /&gt;I found useful &lt;a href="http://www.facebook.com/facebook-widgets/share.php"&gt;Share &lt;/a&gt;, &lt;a href="http://developers.facebook.com/tools.php?connect_wizard&amp;wizard=livestream"&gt;Live Stream&lt;/a&gt; and &lt;a href="http://www.facebook.com/facebook-widgets/fanbox.php"&gt;Fan-box&lt;/a&gt;&lt;br /&gt;&lt;br /&gt; &lt;span style="font-weight:bold;"&gt;LinkedIn&lt;/span&gt;&lt;br /&gt;Just &lt;a href="http://developer.linkedin.com/docs/DOC-1072"&gt;Profile &lt;/a&gt;widget looks interesting for now. Also for corporate sites may be it's good point to add &lt;a href="http://developer.linkedin.com/docs/DOC-1071"&gt;Company insider&lt;/a&gt; special widget&lt;br /&gt;&lt;br /&gt; &lt;span style="font-weight:bold;"&gt;Twitter and TweetMeme&lt;/span&gt;&lt;br /&gt;I think a pair of &lt;a href="http://twitter.com/goodies/widget_profile"&gt;Profile widget&lt;/a&gt; and &lt;a href="http://help.tweetmeme.com/2009/04/06/tweetmeme-button/"&gt;ReTweet&lt;/a&gt;button are enough for increasing conversation&lt;br /&gt;&lt;br /&gt; &lt;span style="font-weight:bold;"&gt;Digg&lt;/span&gt;&lt;br /&gt;I found only one their widget http://digg.com/add-digg&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Special buttons:&lt;/span&gt;&lt;br /&gt;my favorite button which gathered all stuff together (&lt;200 sites!) is AddThis - here is example &lt;a href="http://www.addthis.com/web-button?type=bm&amp;where=website&amp;url=&amp;bm=tb3&amp;analytics=0"&gt;http://www.addthis.com/web-button?type=bm&amp;where=website&amp;url=&amp;bm=tb3&amp;analytics=0&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Whatever you will use, my suggestion - don't overload your app by these plugins. The golden rule - 3 on a page are readbale (my blog is overloaded :) Yeah it goes against good practices.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I will continue this conversation about widgets (broken down by destinations) in the subsequent posts some time later. Please share all your knowledges about social and sharing widgets here. (I tried to cover most of popular systems but MySpace - i found API only)&lt;br /&gt;Disclaimer: this post tells about light-weight widgets only and does not consider serious APIs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-7337966171575345410?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/7337966171575345410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=7337966171575345410&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/7337966171575345410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/7337966171575345410'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/01/wwwidgets-socialize-and-share.html' title='Wwwidgets: socialize and share'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-4692833703581440144</id><published>2010-01-04T11:55:00.000-08:00</published><updated>2010-01-04T13:12:48.852-08:00</updated><title type='text'>Automated security testing</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_H8RIeuOZSco/S0JX28xrDwI/AAAAAAAADvc/QepgS3EUYzY/s1600-h/BugsLifeWallpaper800.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_H8RIeuOZSco/S0JX28xrDwI/AAAAAAAADvc/QepgS3EUYzY/s320/BugsLifeWallpaper800.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5422993502846521090" /&gt;&lt;/a&gt;&lt;br /&gt;Mostly testing relies on automated suites for functional testing according to provided test-cases (that can be used for manual replication too). I think it's good point to thinking about porting automation concept over other types of testing. First coming to the mind are: localization, compatibility, all types of performance, and all types of security and safety testing.&lt;br /&gt;&lt;br /&gt;The last two guys - security and safety - i believe are proper candidates to be automated. Why? Because of security flows can be introduced while any development and maintenance phase. You might polish out your s/w from security flows but new change request can bring a defect in design which may subsequently make your s/w unsecured (e.g. improper handling cookies or turning off fields validation common mechanism)&lt;br /&gt;&lt;br /&gt;Such tests like SQL injections, XSS, session hijacking, cookies substitutions, overflows (as negative tests) and unvalidated I/O, access and permissions control can be easily simulated by test automation and can be run repetitively.&lt;br /&gt;Btw, denial of services can be modeled with load, stress and volume testing.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The resource &lt;a href="http://owasp.org"&gt;owasp.org&lt;/a&gt; provides tons of info about security and hacking on Web. You can find there lots of helpful data.&lt;br /&gt;They have a comprehensive list of potential vulnerabilities in s/w:&lt;br /&gt;&lt;a href="http://www.owasp.org/index.php/Category:Vulnerability"&gt;http://www.owasp.org/index.php/Category:Vulnerability&lt;/a&gt;&lt;br /&gt;and a category of attacks:&lt;br /&gt;&lt;a href="http://www.owasp.org/index.php/Category:Attack"&gt;http://www.owasp.org/index.php/Category:Attack&lt;/a&gt;&lt;br /&gt;I strongly appreciate this society for their job!&lt;br /&gt;&lt;br /&gt;Handy add-ons to Firefox can simplify your process of developing and running hacks. The simple list of essential tools:&lt;br /&gt;Tamper Data&lt;br /&gt;SQL InjectMe&lt;br /&gt;XSSMe&lt;br /&gt;View Cookies&lt;br /&gt;CookieSwap&lt;br /&gt;HackBar&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-4692833703581440144?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/4692833703581440144/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=4692833703581440144&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/4692833703581440144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/4692833703581440144'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/01/automated-security-testing.html' title='Automated security testing'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_H8RIeuOZSco/S0JX28xrDwI/AAAAAAAADvc/QepgS3EUYzY/s72-c/BugsLifeWallpaper800.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-2605669191801266186</id><published>2010-01-04T11:24:00.000-08:00</published><updated>2010-01-04T11:53:20.531-08:00</updated><title type='text'>Test automation strategy as part of QA strategy</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_H8RIeuOZSco/S0JHJajBGdI/AAAAAAAADvU/1MkXlt3TEVk/s1600-h/strategy.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 212px;" src="http://3.bp.blogspot.com/_H8RIeuOZSco/S0JHJajBGdI/AAAAAAAADvU/1MkXlt3TEVk/s320/strategy.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5422975128378087890" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Happy new year all!&lt;br /&gt;&lt;br /&gt;Right at the start of this year I have a challengeable task - detail test automation strategy within overall QA strategy on anti-virus software (new Release) in our Company. Since we have taught schedule and intentions to improve processes by thought out documentation, formalization and model optimization, this is really important to plan and reflect all things together in a single artifact - test strategy (calling also test approach). Another reason to combine both manual and automated efforts - is to ease traceability between risks, dependencies and schedule over whole department. Applying mutual practices prepares manageable and unified processes.&lt;br /&gt;&lt;br /&gt;I'm going to highlight the following items in that test automation strategy:&lt;br /&gt;- Test objectives&lt;br /&gt;- Assumptions&lt;br /&gt;- Types of testing on automation&lt;br /&gt;- Test tools&lt;br /&gt;- Resources (money, time, skills)&lt;br /&gt;- Application under test specific details (technologies, quality attributes...)&lt;br /&gt;- Test environment (test labs, stands and infrastructure)&lt;br /&gt;- Test requirements (requirements to test cases on automation)&lt;br /&gt;- Entry/Exit criteria&lt;br /&gt;- Project plan (high-level and/or detailed as reference on appropriate artifact, deliverables and milestones)&lt;br /&gt;- Risks (impacts, likelihood, mitigation plans)&lt;br /&gt;- Review strategy&lt;br /&gt;&lt;br /&gt;Well done! Is there something more to add or making this list redundant? Your advices are always welcomed!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-2605669191801266186?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/2605669191801266186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=2605669191801266186&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/2605669191801266186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/2605669191801266186'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/01/test-automation-strategy-as-part-of-qa.html' title='Test automation strategy as part of QA strategy'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_H8RIeuOZSco/S0JHJajBGdI/AAAAAAAADvU/1MkXlt3TEVk/s72-c/strategy.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-4519892392247810145</id><published>2010-01-02T10:28:00.000-08:00</published><updated>2010-01-02T03:22:12.258-08:00</updated><title type='text'>On stabilization test suites. No fuel but destination is too far</title><content type='html'>This crazy activity is not only about debugging. More sophisticated your test automation framework and infrastructure – harder test suites stabilization. Under test suite I understand here a set of test cases, ready_to_go code, prepared environments, service utilities, auto running and so on. So that is a completed end-to-end package.&lt;br /&gt;Right now our brave team works on stabilization of test suite developed on overdesigned framework. And this seems eats about 60% of time on full task. As most of just have started to understand this framework, we hope this time will be significantly cut off on subsequent test suites but IMHO we will stabilize and debug 40% at least of total time on implementation. Will see.&lt;br /&gt;This activity requires strong concentration and tries your nerves on tuff. Especially debugging is time consuming because of auto tests runs workflow with long chain of calls and usually debugging runs altogether with real data.  I rather think debugging in test automation is much difficult than in development (if test framework is really framework) due to:&lt;br /&gt;- Mostly automated tests are developed on scripting languages and unmanaged code&lt;br /&gt;- Code is not compiling and running inline (so first error you may find somewhere deep)&lt;br /&gt;- Weak garbage collection&lt;br /&gt;- Weak test development environments and debugging mechanisms&lt;br /&gt;- I did not yet meet good stack trace for black-box automation (TestComplete works on that and it becomes better but it’s not yet cool as in Log4j)&lt;br /&gt;- Unstable test engines itself and communication with OS resources fails sometimes&lt;br /&gt;- Some scripting languages have poor automatic type casting (e.g. VBS)&lt;br /&gt;- Difficult or impossible to integrate new technologies to get higher abstraction (ORMs, patterns, logging, self-testing, reporting, external APIs with intellisense and ohers)&lt;br /&gt;Also test automation suites should have lots failover and preparation mechanisms to be more robust, for instance, initialization, clean up, terminations, checkers, workarounds, turn over, synchronizations, waiters and alternative recognizers, behavioral logic, logs lockers/unlockers, wake uppers, exit gates… Huge list and finally most of code should we wrapped in try-catch-finally  (it’s not about VBS, it has another pattern). If you are novice in test automation read on this. Professional automated test is a product as we know about software.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="320" height="265"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Pq6LHFM4JvE&amp;hl=ru_RU&amp;fs=1&amp;rel=0&amp;color1=0xcc2550&amp;color2=0xe87a9f"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/Pq6LHFM4JvE&amp;hl=ru_RU&amp;fs=1&amp;rel=0&amp;color1=0xcc2550&amp;color2=0xe87a9f" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="320" height="265"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-4519892392247810145?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/4519892392247810145/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=4519892392247810145&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/4519892392247810145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/4519892392247810145'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2009/12/on-stabilization-test-suites-no-fuel.html' title='On stabilization test suites. No fuel but destination is too far'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-7405142976476827986</id><published>2010-01-02T02:45:00.000-08:00</published><updated>2010-01-02T03:20:11.444-08:00</updated><title type='text'>Statistical and numerical analysis for QA and testing</title><content type='html'>Stat analysis appears very powerful tool in a hands of analyst if processing data set has significant number of entries, also the set should have normal distribution otherwise the processing will output wrong results. Let say if you processed all data from a segment A, then processed only 10% of data from B and 1% from segment C, resulted joint product of these observations will be uncertain. The bottom line: all your deals with statistics should be careful since it involves wide spread of theory and practice.&lt;br /&gt;Statistic and numerical analysis are very useful for the following QA practices:&lt;br /&gt;- density defects measurements&lt;br /&gt;- predicting defects quantity in developed s/w&lt;br /&gt;- DRE and other metrics&lt;br /&gt;- ROI calculations&lt;br /&gt;- planning&lt;br /&gt;- probabilities and likelihoods&lt;br /&gt;- design test data and steps (tools like pairwise testing, finite state machine, boundary testing, matrix of transitions and so on)&lt;br /&gt;&lt;br /&gt;For performance tests:&lt;br /&gt;- avg response time, std, min, max&lt;br /&gt;- measurements from uncertanity and independent sources&lt;br /&gt;&lt;br /&gt;For automated functional testing:&lt;br /&gt;- ROI (basing on accumulated data and assesement)&lt;br /&gt;- failure probabilities calculations&lt;br /&gt;- for building effective test automation suites - design parameters permutations for achieving best coverage and to reveal hidden defects&lt;br /&gt;- random data and variations&lt;br /&gt;- modeling system with feedback(s)&lt;br /&gt;&lt;br /&gt;Can you add some more?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1079818796674583384-7405142976476827986?l=at4qa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://at4qa.blogspot.com/feeds/7405142976476827986/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1079818796674583384&amp;postID=7405142976476827986&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/7405142976476827986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1079818796674583384/posts/default/7405142976476827986'/><link rel='alternate' type='text/html' href='http://at4qa.blogspot.com/2010/01/statistical-and-numerical-analysis-for.html' title='Statistical and numerical analysis for QA and testing'/><author><name>Searcher</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_H8RIeuOZSco/SzYd4Ryr1YI/AAAAAAAADug/a2kNqC_G3d4/S220/my_pic.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1079818796674583384.post-384268636545937225</id><published>2009-12-29T10:28:00.002-08:00</published><updated>2009-12-29T11:25:15.944-08:00</updated><title type='text'>Tuned up Agile in test automation</title><content type='html'>Once again very taught schedule and unreal project plan? I will add something more pessimistic - Not enough resources and limited budget. At the same time we have the same classic project triangle (“choose any 2 from 3”). I believe you ever face those challenges and mitigating plan can’t help you I think. I met these embarrassments over again right at these days, before New Year.  And I don’t want to leave for holidays with this unresolved stuff. How I can force against? Is there a sword which will help me to keep faith and win? I need it, you know. I can’t fit to schedule!&lt;br /&gt;First coming to the mind is to begin planning more pessimistically and make cycles longer with rare milestones.  Fantastic but customer wish to trace each our commits and don’t want to hear about long-term technical promises and issues. That’s fine since he dictate a model.&lt;br /&gt;And this seems normal approach to test automation entirely because nobody wants to wait for completion whole bunch of test cases and only after that to get first chance to run them. As usual, they want to run almost each newly created test case right within current scope.  So my suggestion if your situation is similar of mine think about incorporating agile. I practice this as it’s perfectly fits to common targets and intention of automation testing groups. &lt;br /&gt;Let’s see on some of key Agile(Scrum) moments and figure out if they can be used or not.&lt;br /&gt;• Short iterations and often deliverables.  Since we have to run right after implementation, this approach works by default&lt;br /&gt;• Fuzzy responsibility and Scrum master.  I think it fits even better than for s/w development.&lt;br /&gt;• Everyone may contribute to everything – no roles. We are all test automation engineers with different skills, so one may perfectly communicate, one may design data storage, one may grow infrastructure tool, etc. And everyone can change other one.&lt;br /&gt;• Scrum meetings and communication simplification (desks, video, verbal, sticks, calendar…).  All this speed up overall implementation process.&lt;br /&gt;• Clever reporting and coverage.  If test automation does not have that on bard, its value looks not high.&lt;br /&gt;Anything else? Of course, I just showed which I recalled while writing this post and if there are some missed points, don’t consider my faults seriously. Feel free to share your vision here.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_H8RIeuOZSco/SzpK7LRRQGI/AAAAAAAADvE/GDnkDLsrVJ4/s1600-h/rube_napkin.gif
