<?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-5047841583820836253</id><updated>2011-12-12T08:05:55.948+01:00</updated><category term='test'/><title type='text'>Stefan Thelenius about Software Testing</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>75</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-4105648248610511893</id><published>2011-11-08T20:39:00.000+01:00</published><updated>2011-11-08T20:39:31.712+01:00</updated><title type='text'>QTP: And I thought I knew QTP by Tarun Lalwani</title><content type='html'>&lt;br /&gt;Tarun Lalwani, one of the leading experts in the automation test tool QuickTest Professional™ (QTP) has recently released his second book: And I thought I knew QTP.&lt;br /&gt;&lt;br /&gt;This is most likely a unique book in this context: A technical novel! At least I have not read anything like it or heard about something simular to this concept.&lt;br /&gt;&lt;br /&gt;The story is about Nurat, an Indian consultant with 7 years experience of QTP. While considering a new career, he is called to a series of interviews for one the top companies in the IT-business. Those interviews are about every aspect of QTP you can think of (and some you did not knew about I can assure you). &lt;br /&gt;&lt;br /&gt;The question-answer format in combination with some practical hands-on tips makes this a great book about QTP whether you work (or want to) as an automation consultant or with other automation releated tasks such as framwork design for example.&lt;br /&gt;&lt;br /&gt;I got a feeling when reading this book that it has some elements of self-biography but it is my personal reflection. I guess only Tarun himself could measure with Nurat. Without reviling the end of this book I probably would not have passed these interviews since &lt;em&gt;I thought I knew QTP&lt;/em&gt; :-).&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-4105648248610511893?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/4105648248610511893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=4105648248610511893' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/4105648248610511893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/4105648248610511893'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2011/11/qtp-and-i-thought-i-knew-qtp-by-tarun.html' title='QTP: And I thought I knew QTP by Tarun Lalwani'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-3893452715830953577</id><published>2011-06-19T10:27:00.001+02:00</published><updated>2011-06-19T10:27:54.338+02:00</updated><title type='text'>Test case model - refactoring part 2</title><content type='html'>How to report function coverage using SBTM? Maybe the model should look like this:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://db.tt/JOxqyu1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;- Posted using BlogPress from my iPhone&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-3893452715830953577?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/3893452715830953577/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=3893452715830953577' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/3893452715830953577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/3893452715830953577'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2011/06/test-case-model-refactoring-part-2.html' title='Test case model - refactoring part 2'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-1128861925207506053</id><published>2011-05-06T16:27:00.002+02:00</published><updated>2011-05-06T16:40:44.030+02:00</updated><title type='text'>Testing dashboard part 3</title><content type='html'>&lt;div&gt;I am still a severe dashboard addict...and this new &lt;a href="http://code.google.com/apis/chart/interactive/docs/gallery/gauge.html"&gt;gauge&lt;/a&gt; from google is so cool (rendered within the browser).&lt;br /&gt;&lt;br /&gt;&lt;img src="http://dl.dropbox.com/u/8538167/Images/gauge.png" /&gt;&lt;br /&gt;&lt;br /&gt;What can it be used for in an SQA context?&lt;br /&gt;&lt;br /&gt;Severe bugs per day? Suggestions welcome...I must have it somewhere in our release status testing dashboard...&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/5047841583820836253-1128861925207506053?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/1128861925207506053/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=1128861925207506053' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/1128861925207506053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/1128861925207506053'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2011/05/testing-dashboard-part-3.html' title='Testing dashboard part 3'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-6335035191304334161</id><published>2011-04-30T23:58:00.000+02:00</published><updated>2011-05-02T13:28:28.299+02:00</updated><title type='text'>Test case model - refactoring</title><content type='html'>After very fruitful sessions with James Bach and addQ a lot of ideas are spinning in my head. &lt;br /&gt;&lt;br /&gt;I am definetly refactoring my test case model so Test Charters and Test sessions are included...&lt;br /&gt;&lt;br /&gt;Maybe it should look like this:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://dl.dropbox.com/u/8538167/Images/TestCaseModelDraft.png"/&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;- Posted using BlogPress from my iPhone&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/5047841583820836253-6335035191304334161?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/6335035191304334161/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=6335035191304334161' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/6335035191304334161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/6335035191304334161'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2010/12/test-case-model-refactoring.html' title='Test case model - refactoring'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-1937208962965648746</id><published>2011-03-17T13:25:00.003+01:00</published><updated>2011-03-17T13:54:34.400+01:00</updated><title type='text'>Pairwise test case design part four</title><content type='html'>New version of my &lt;a href="http://abouttesting.blogspot.com/2011/02/pairwise-test-case-design-part-three.html"&gt;PICT web shell&lt;/a&gt; is now available &lt;a href="http://dl.dropbox.com/u/8538167/TestFiles/PairWise%20v0_2.zip"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I got a &lt;a href="http://testzonen.se/?p=2129"&gt;request&lt;/a&gt; for allowing PICT option values so in the new version it is possible to set option values in an input field. In addition I have also implemented a parameter for setting the timeout value for creation of the output file (in previous version it was a hard coded value of 5 seconds).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-R1QXLRLulek/TYIDpHCCuCI/AAAAAAAAAG4/KNCkkM9lJbk/s1600/pict2.png"&gt;&lt;img border="0" alt="" src="http://3.bp.blogspot.com/-R1QXLRLulek/TYIDpHCCuCI/AAAAAAAAAG4/KNCkkM9lJbk/s1600/pict2.png" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-1937208962965648746?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/1937208962965648746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=1937208962965648746' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/1937208962965648746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/1937208962965648746'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2011/03/pairwise-test-case-design-part-four.html' title='Pairwise test case design part four'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-R1QXLRLulek/TYIDpHCCuCI/AAAAAAAAAG4/KNCkkM9lJbk/s72-c/pict2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-6095601308504241320</id><published>2011-02-27T16:06:00.004+01:00</published><updated>2011-02-27T16:45:37.305+01:00</updated><title type='text'>Pairwise test case design part three</title><content type='html'>I discovered the wonderful project &lt;a href="http://codemirror.net/"&gt;CodeMirror&lt;/a&gt; about a year ago where you can design a text editor in browser with syntax highlightning...&lt;br /&gt;&lt;br /&gt;...the other day when I edited a model file for PICT.exe I got the idea of a &lt;a href="http://dl.dropbox.com/u/8538167/TestFiles/PairWise.zip"&gt;deluxe version&lt;/a&gt; of my old &lt;a href="http://abouttesting.blogspot.com/2008/02/pairwise-test-case-design-part-two.html"&gt;PICT web shell&lt;/a&gt;. For more background about PICT and Pairwise test case design, please see my first &lt;a href="http://abouttesting.blogspot.com/2008/02/pairwise-test-case-design.html"&gt;post&lt;/a&gt; about it.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-awRVzCnY_EM/TWpwFOhya2I/AAAAAAAAAGw/Aks9Cd2f77c/s1600/pict.png"&gt;&lt;img src="http://3.bp.blogspot.com/-awRVzCnY_EM/TWpwFOhya2I/AAAAAAAAAGw/Aks9Cd2f77c/s1600/pict.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Key features:&lt;br /&gt;+ Syntax highlight for PICT model file content&lt;br /&gt;+ Test cases output file content visable in GUI&lt;br /&gt;+ Export to Excel&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dl.dropbox.com/u/8538167/TestFiles/PairWise.zip"&gt;Download&lt;/a&gt; and enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-6095601308504241320?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/6095601308504241320/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=6095601308504241320' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/6095601308504241320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/6095601308504241320'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2011/02/pairwise-test-case-design-part-three.html' title='Pairwise test case design part three'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-awRVzCnY_EM/TWpwFOhya2I/AAAAAAAAAGw/Aks9Cd2f77c/s72-c/pict.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-2764547269084135713</id><published>2010-12-20T22:02:00.001+01:00</published><updated>2010-12-20T22:02:39.379+01:00</updated><title type='text'>Long Time no...</title><content type='html'>...post&lt;br /&gt;&lt;br /&gt;Well since I am with iPhone nowadays maybe (no promises) I will post more often...I have some small projects I might publish soon, stay tuned...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;- Posted using BlogPress from my iPhone&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-2764547269084135713?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/2764547269084135713/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=2764547269084135713' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/2764547269084135713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/2764547269084135713'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2010/12/long-time-no.html' title='Long Time no...'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-8085241051115843905</id><published>2010-10-13T13:39:00.001+02:00</published><updated>2010-10-13T13:44:46.103+02:00</updated><title type='text'>Some source files are back...</title><content type='html'>...please let me know if there are some files missing or so...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-8085241051115843905?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/8085241051115843905/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=8085241051115843905' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/8085241051115843905'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/8085241051115843905'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2010/10/some-source-files-are-back.html' title='Some source files are back...'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-2651097900190609991</id><published>2010-08-01T10:25:00.002+02:00</published><updated>2010-08-01T10:29:01.073+02:00</updated><title type='text'>All source files...</title><content type='html'>are currently deleted by my file host provider...don't know why really but I guess you sometimes get what you pay for (free service vs quality)...however I will try to restore the content within a month...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-2651097900190609991?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/2651097900190609991/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=2651097900190609991' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/2651097900190609991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/2651097900190609991'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2010/08/all-source-files.html' title='All source files...'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-3771610598222669417</id><published>2010-03-04T13:45:00.003+01:00</published><updated>2010-04-30T10:06:23.359+02:00</updated><title type='text'>JavaScript or VBScript?</title><content type='html'>A relevant question...&lt;br /&gt;&lt;br /&gt;Lately I am more into JavaScript...why?&lt;br /&gt;&lt;br /&gt;One of the most important reason for me is that the error handling functionality is better in JavaScript (try...catch)...&lt;br /&gt;&lt;br /&gt;JavaScript seems also like a better long-time solution since it is more common than VBScript these days...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-3771610598222669417?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/3771610598222669417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=3771610598222669417' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/3771610598222669417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/3771610598222669417'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2010/03/javascript-or-vbscript.html' title='JavaScript or VBScript?'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-4766232878448603845</id><published>2010-01-26T14:15:00.002+01:00</published><updated>2010-01-26T14:20:31.059+01:00</updated><title type='text'>SQL: Database size management</title><content type='html'>Keep up good test effeciency often requires several test environments with various configuration and test data setups etc. Add the dimension multiple AUT release versions and you probably need more test sites than you can possible dream of.&lt;br /&gt;&lt;br /&gt;To handle multiple test environments properly requires technical knowledge, some programming skills and a good releationship with your system administrator :-)&lt;br /&gt;&lt;br /&gt;A very good idea is to have a test environment dashboard for survaillance of critical parameters. One of those parameters is database size. For large enterprise systems with high transaction rate, production-like copies often becomes quite large, hence you have to do some preventing actions in order to keep your disk quota. Some well targeted delete scripts in combination with shrink commands often does the trick. But how to check the current size?&lt;br /&gt;&lt;br /&gt;Fortunatly MS SQL Server has some built-in Store procedures for this:&lt;br /&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;span class="kwrd"&gt;Get&lt;/span&gt; total &lt;span class="kwrd"&gt;database&lt;/span&gt; &lt;span class="kwrd"&gt;size&lt;/span&gt; &lt;span class="kwrd"&gt;in&lt;/span&gt; MB including log &lt;span class="kwrd"&gt;file&lt;/span&gt;&lt;br /&gt;sp_spaceused&lt;br /&gt;&lt;br /&gt;database_name  database_size      unallocated &lt;span class="kwrd"&gt;space&lt;/span&gt;&lt;br /&gt;------------&lt;span class="rem"&gt;-- ------------------ ------------------&lt;/span&gt;&lt;br /&gt;MyDatabase     31877.31 MB        5382.25 MB&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;--&lt;span class="kwrd"&gt;Get&lt;/span&gt; remaining &lt;span class="kwrd"&gt;disk&lt;/span&gt; &lt;span class="kwrd"&gt;size&lt;/span&gt; &lt;span class="kwrd"&gt;for&lt;/span&gt; &lt;span class="kwrd"&gt;each&lt;/span&gt; drive &lt;span class="kwrd"&gt;on&lt;/span&gt; the &lt;span class="kwrd"&gt;database&lt;/span&gt; server&lt;br /&gt;xp_fixeddrives&lt;br /&gt;&lt;br /&gt;drive MB &lt;span class="kwrd"&gt;free&lt;/span&gt;&lt;br /&gt;---&lt;span class="rem"&gt;-- -----------&lt;/span&gt;&lt;br /&gt;C     8011&lt;br /&gt;D     90660&lt;br /&gt;E     23057&lt;br /&gt;&lt;br /&gt;--&lt;span class="kwrd"&gt;Get&lt;/span&gt; &lt;span class="kwrd"&gt;disk&lt;/span&gt; &lt;span class="kwrd"&gt;file&lt;/span&gt; name, &lt;span class="kwrd"&gt;size&lt;/span&gt; &lt;span class="kwrd"&gt;and&lt;/span&gt; drive&lt;br /&gt;&lt;span class="kwrd"&gt;select&lt;/span&gt; filename, (&lt;span class="kwrd"&gt;SUM&lt;/span&gt;(&lt;span class="kwrd"&gt;size&lt;/span&gt;)*8)/1024 &lt;span class="kwrd"&gt;As&lt;/span&gt; FileSizeInMB &lt;span class="kwrd"&gt;FROM&lt;/span&gt; master.dbo.sysaltfiles&lt;br /&gt;&lt;span class="kwrd"&gt;group&lt;/span&gt; &lt;span class="kwrd"&gt;by&lt;/span&gt; filename&lt;br /&gt;&lt;br /&gt;filename            FileSizeInMB&lt;br /&gt;---------------------&lt;span class="rem"&gt;--    ------------&lt;/span&gt;&lt;br /&gt;D:\MyDatabase.mdf        5806&lt;br /&gt;D:\MyDatabase_log.ldf    542&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-4766232878448603845?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/4766232878448603845/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=4766232878448603845' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/4766232878448603845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/4766232878448603845'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2010/01/sql-database-size-management.html' title='SQL: Database size management'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-6552142069602214037</id><published>2009-12-04T14:48:00.002+01:00</published><updated>2009-12-04T14:55:09.469+01:00</updated><title type='text'>SQL: Select your table rows gently...</title><content type='html'>How to get all rows in a table?&lt;br /&gt;&lt;br /&gt;Simple answer:&lt;br /&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;span class="kwrd"&gt;SELECT&lt;/span&gt; * &lt;span class="kwrd"&gt;FROM&lt;/span&gt; TABLE&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;BUT, a better practise is to&lt;br /&gt;&lt;br /&gt;1. Do a count first if you suspect it is a large table&lt;br /&gt;2. Use (nolock) in order not to lock the table during the query execution&lt;br /&gt;&lt;br /&gt;Syntax examples for MS SQL Server:&lt;br /&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;span class="kwrd"&gt;Count&lt;/span&gt; &lt;span class="kwrd"&gt;rows&lt;/span&gt; &lt;span class="kwrd"&gt;without&lt;/span&gt; locking &lt;span class="kwrd"&gt;table&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; &lt;span class="kwrd"&gt;COUNT&lt;/span&gt;(*) &lt;span class="kwrd"&gt;FROM&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt;(NOLOCK)&lt;br /&gt;&lt;br /&gt;--&lt;span class="kwrd"&gt;Get&lt;/span&gt; &lt;span class="kwrd"&gt;all&lt;/span&gt; &lt;span class="kwrd"&gt;rows&lt;/span&gt; &lt;span class="kwrd"&gt;without&lt;/span&gt; locking &lt;span class="kwrd"&gt;table&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; * &lt;span class="kwrd"&gt;FROM&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt;(NOLOCK)&lt;br /&gt;&lt;br /&gt;--&lt;span class="kwrd"&gt;Get&lt;/span&gt; the 1000 &lt;span class="kwrd"&gt;last&lt;/span&gt; entries based &lt;span class="kwrd"&gt;on&lt;/span&gt; &lt;span class="kwrd"&gt;primary&lt;/span&gt; &lt;span class="kwrd"&gt;key&lt;/span&gt; (assuming it &lt;span class="kwrd"&gt;is&lt;/span&gt; &lt;span class="kwrd"&gt;column&lt;/span&gt; #1)&lt;br /&gt;&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; &lt;span class="kwrd"&gt;TOP&lt;/span&gt; 1000 * &lt;span class="kwrd"&gt;FROM&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt;(NOLOCK) &lt;span class="kwrd"&gt;ORDER&lt;/span&gt; &lt;span class="kwrd"&gt;BY&lt;/span&gt; 1 DESC&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-6552142069602214037?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/6552142069602214037/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=6552142069602214037' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/6552142069602214037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/6552142069602214037'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2009/12/sql-select-your-table-rows-gently.html' title='SQL: Select your table rows gently...'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-5831653088934695435</id><published>2009-11-05T12:02:00.003+01:00</published><updated>2009-11-05T12:35:26.570+01:00</updated><title type='text'>Windows 7: Three steps back...</title><content type='html'>...since my new &lt;a href="http://abouttesting.blogspot.com/2009/11/windows-7-one-step-forward.html"&gt;Laptop&lt;/a&gt; has "freezed" three times during the last couple of weeks. Hardware reset has been the only option since the screen has became black and the activity handler does not respond within 10 minutes (which is so long my patience holds in these situations)...&lt;br /&gt;&lt;br /&gt;No traces whatsoever what could be the cause in the log files...Dell hardware, Windows7 or a combination?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-5831653088934695435?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/5831653088934695435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=5831653088934695435' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/5831653088934695435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/5831653088934695435'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2009/11/windows-7-three-steps-back.html' title='Windows 7: Three steps back...'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-4201789222728118303</id><published>2009-11-01T14:22:00.002+01:00</published><updated>2009-11-01T14:33:49.159+01:00</updated><title type='text'>Windows 7: One step forward...</title><content type='html'>...to faster start-up time (compared to XP)&lt;br /&gt;&lt;br /&gt;I recently switched laptop to a Dell with Windows7 onboard. So far I think it works pretty well...I really like the preview open documents functionality and the activity bar improvments which is a small productivity booster for those of us that works with many open windows.&lt;br /&gt;&lt;br /&gt;Although it was a bit sad to retire my old IBM T43...the most reliable and robust PC I have ever had (so far...)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-4201789222728118303?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/4201789222728118303/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=4201789222728118303' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/4201789222728118303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/4201789222728118303'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2009/11/windows-7-one-step-forward.html' title='Windows 7: One step forward...'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-2003870119931758919</id><published>2009-09-29T21:58:00.002+02:00</published><updated>2009-09-29T22:05:11.445+02:00</updated><title type='text'>SQL: MS SQL Server 2008 Management Studio - First impression</title><content type='html'>For those of you who are not familiar working with MS SQL Server product family, the program Mangagement Studio includes SQL Query and Object Explorer among a lot of other useful features for administration of databases. As a tester, &lt;a href="http://abouttesting.blogspot.com/2008/04/sql-testers-best-friend.html"&gt;knowing SQL and AUT Database objects is essential if you want to be really successful in your work&lt;/a&gt; in my opinion. Last week I upgraded to the 2008 version and found two new features:&lt;br /&gt;&lt;br /&gt;1. Debugging SQL/Store Procedures&lt;br /&gt;2. Intellisense writing SQL&lt;br /&gt;&lt;br /&gt;Need I say more?&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_4tHQNkQA_gI/SsJnI8oP3eI/AAAAAAAAAGQ/8YBHbO2iV9w/s1600-h/debugsql.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5386981507700088290" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 374px; CURSOR: hand; HEIGHT: 400px; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_4tHQNkQA_gI/SsJnI8oP3eI/AAAAAAAAAGQ/8YBHbO2iV9w/s400/debugsql.png" 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/5047841583820836253-2003870119931758919?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/2003870119931758919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=2003870119931758919' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/2003870119931758919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/2003870119931758919'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2009/09/sql-ms-sql-server-2008-management.html' title='SQL: MS SQL Server 2008 Management Studio - First impression'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_4tHQNkQA_gI/SsJnI8oP3eI/AAAAAAAAAGQ/8YBHbO2iV9w/s72-c/debugsql.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-3779170064260255351</id><published>2009-08-14T15:19:00.003+02:00</published><updated>2009-08-14T15:28:48.616+02:00</updated><title type='text'>Testing Dashboard part 2</title><content type='html'>As you already may know...I like &lt;a href="http://abouttesting.blogspot.com/2008/06/testing-dashboard.html"&gt;dashboards&lt;/a&gt; (probably too much...)&lt;br /&gt;&lt;br /&gt;After I was being aware of the &lt;a href="http://code.google.com/intl/sv/apis/chart/"&gt;Google Chart API&lt;/a&gt; and I also found &lt;a href="http://www.solutoire.com/gchart"&gt;this&lt;/a&gt; JavaScript implementation, I am thinking of using the Google-o-meters showing different coverage metrics in my auto-generated real-time test report which is based on both on subjective conclusions as well as logged regression test result data...&lt;br&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_4tHQNkQA_gI/SoVky-BvzFI/AAAAAAAAAGI/vh2Bfqz72to/s1600-h/chartSample.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 200px;" src="http://2.bp.blogspot.com/_4tHQNkQA_gI/SoVky-BvzFI/AAAAAAAAAGI/vh2Bfqz72to/s400/chartSample.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5369808957515746386" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;Building dashboards is rather simple, the hard part is to collect proper test status data...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-3779170064260255351?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/3779170064260255351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=3779170064260255351' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/3779170064260255351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/3779170064260255351'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2009/08/testing-dashboard-part-2.html' title='Testing Dashboard part 2'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_4tHQNkQA_gI/SoVky-BvzFI/AAAAAAAAAGI/vh2Bfqz72to/s72-c/chartSample.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-5890015169855334252</id><published>2009-07-01T08:20:00.003+02:00</published><updated>2009-07-01T08:53:28.714+02:00</updated><title type='text'>QTP: QuickTest Professional Unplugged by Tarun Lalwani</title><content type='html'>Tarun Lalwani's book &lt;a href="http://knowledgeinbox.com/books/"&gt;QuickTest Professional Unplugged&lt;/A&gt; covers QTP basic as well as advanced features.&lt;br /&gt;&lt;br /&gt;I have used QTP since 2001 (version 6.x) and if I have had this book from the start, a lot of hours and frustration had been saved. &lt;br /&gt;&lt;br /&gt;Tarun has prior the book, contributed to the QTP community with numerous of high quality articles and forum post replies over the years. I recall an old article about Descriptive programming (DP) which made me switch from OR to DP Big-bang style (I don't regret it...).&lt;br /&gt;&lt;br /&gt;My favorite parts in the book are the chapters regarding RegExp, IE/Word/Excel objects, HTML DOM and of course the advanced section at the end. But this book &lt;a href="http://knowledgeinbox.com/demos/QuickTestProfessional_Book_preview.pdf"&gt;include&lt;/a&gt; a lot of other QTP/VBScript features as well and is well suited both for newbies (you should have some programming experience at least) and advanced users.&lt;br /&gt;&lt;br /&gt;This is a must have for any person using QTP and/or VBScript-based automation!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-5890015169855334252?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/5890015169855334252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=5890015169855334252' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/5890015169855334252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/5890015169855334252'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2009/07/qtp-quicktest-professional-unplugged-by.html' title='QTP: QuickTest Professional Unplugged by Tarun Lalwani'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-241374226701816146</id><published>2009-06-10T16:21:00.003+02:00</published><updated>2009-06-11T07:22:02.113+02:00</updated><title type='text'>Watij: Brief progress report</title><content type='html'>I have been evaluating &lt;a href="http://www.watij.com/"&gt;Watij&lt;/a&gt; lately and here are my conclusions so far for some automation features important to me:&lt;br /&gt;&lt;br /&gt;&lt;B&gt;IDE&lt;/B&gt;&lt;br /&gt;&lt;br /&gt;Since I am from the QTP/VBScript world I still struggle a bit with the Java syntax and OO...furtunatly my IDE (IntelliJ IDEA) has very good refactoring features (and other develop-friendly features as well) so it is not necessary to make perfect code/structure from the start.&lt;br /&gt;&lt;br /&gt;&lt;B&gt;GUI test execution speed&lt;/B&gt;&lt;br /&gt;&lt;br /&gt;Not as fast as QTP but very close. Since the source code is available I managed to change a hard-coded timeout property and I guess there are several others that you could tweek for faster performance.&lt;br /&gt;&lt;br /&gt;&lt;B&gt;Test object model&lt;/B&gt;&lt;br /&gt;&lt;br /&gt;Quite simular to Descriptive programing in QTP.&lt;br /&gt;&lt;br /&gt;QTP example: Browser("Google").Page("Google").WebEdit("q").Set "Watij"&lt;br /&gt;Watij example: ie.textField(name,"q").set("Watij");&lt;br /&gt;&lt;br /&gt;Have not explored all possibilities with dynamic test object handling in Watij yet but at least getting all links in a frame into an array was very simple.&lt;br /&gt;&lt;br /&gt;&lt;B&gt;Community&lt;/B&gt; &lt;br /&gt;&lt;br /&gt;The QTP community is awesome and Watij's dito seems ok but rather small.&lt;br /&gt;&lt;br /&gt;&lt;B&gt;Pop-up handling&lt;/B&gt; &lt;br /&gt;&lt;br /&gt;QTP is very good handling pop-ups but have a weakness running such actions in a locked workstation. Watij has so far also been very good at this (except for an authentication dialog which I handled with a quick and dirty java robot solution) and IT WORKS IN LOCKED MODE! This feature alone allows unattended GUI tests being run 24x7...This seems to good to be true so I will do some more testing on this using remote desktop -&gt; server...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-241374226701816146?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/241374226701816146/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=241374226701816146' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/241374226701816146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/241374226701816146'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2009/06/watij-brief-progress-report.html' title='Watij: Brief progress report'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-5976492890403791302</id><published>2009-05-14T11:14:00.005+02:00</published><updated>2009-05-14T12:51:07.785+02:00</updated><title type='text'>Test framework - Multiple tool support</title><content type='html'>To design a robust and cost effective automation framework is a complex task...&lt;br /&gt;&lt;br /&gt;This morning a read a good post about &lt;a href="http://blogs.msdn.com/imtesty/archive/2009/05/14/programming-paradigms-in-test-automation.aspx"&gt;Programming Paradigms in Test Automation&lt;/a&gt; which I can recommend reading. &lt;br /&gt;&lt;br /&gt;I have on my agenda to switch from VBScript to Java in my framework. I have realized that this process is going to take a while since I have not yet found a decent tool for the GUI testing part...&lt;br /&gt;&lt;br /&gt;I am currently evaluating &lt;a href="http://www.watij.com/"&gt;Watij&lt;/a&gt; and so far it seems really promising since it can deal with pop-ups much better than &lt;a href="http://abouttesting.blogspot.com/2008/07/selenium-ide-first-impressions.html"&gt;Selenium&lt;/a&gt;. However, test execution speed is not that good when running Watij (&lt;a href="http://abouttesting.blogspot.com/2008/05/qtp-test-execution-performance.html"&gt;QTP&lt;/a&gt; or worse) from IDEA so next step is to see how it handles stand-alone execution...stay tuned&lt;br /&gt;&lt;br /&gt;Since I want to support multiple tools/langauges in my framework I have decided to move all SQL from code to Store procedures for easier maintenance. Here is an overview picture of how it will look like when implemented:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_4tHQNkQA_gI/Sgv0PpasHuI/AAAAAAAAAGA/No15V0NhjaM/s1600-h/OverViewTestFramework.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 366px;" src="http://4.bp.blogspot.com/_4tHQNkQA_gI/Sgv0PpasHuI/AAAAAAAAAGA/No15V0NhjaM/s400/OverViewTestFramework.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5335626733203496674" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-5976492890403791302?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/5976492890403791302/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=5976492890403791302' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/5976492890403791302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/5976492890403791302'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2009/05/test-framework-multiple-tool-support.html' title='Test framework - Multiple tool support'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4tHQNkQA_gI/Sgv0PpasHuI/AAAAAAAAAGA/No15V0NhjaM/s72-c/OverViewTestFramework.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-7021778165182040519</id><published>2009-05-05T09:03:00.003+02:00</published><updated>2009-05-05T16:37:40.886+02:00</updated><title type='text'>VBScript: Sending e-mail</title><content type='html'>Sending e-mail automaticly at various test contexts could be a useful feature (beware of "spam" if you are sending mail to a shared address...) so as a follow-up to this post: &lt;a href="http://abouttesting.blogspot.com/2008/01/cdomessage.html"&gt;http://abouttesting.blogspot.com/2008/01/cdomessage.html&lt;/a&gt; I thought I would share an example on how to send an HTML-based e-mail using CDO:&lt;br /&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;span class="rem"&gt;'Sending E-mail sample&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;strEmailSubject = &lt;span class="str"&gt;"Testing CDO"&lt;/span&gt;&lt;br /&gt;strMessageFrom = &lt;span class="str"&gt;"myemailfrom@mydomain.com"&lt;/span&gt;&lt;br /&gt;strMessageTo = &lt;span class="str"&gt;"myemailto@mydomain.com"&lt;/span&gt;&lt;br /&gt;strHTMLBody = &lt;span class="str"&gt;"&amp;lt;B&amp;gt;Bold&amp;lt;/B&amp;gt;&amp;amp;nbsp;example"&lt;/span&gt;&lt;br /&gt;strSMTPServer = &lt;span class="str"&gt;"mail.mydomain.com"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;SendEmail strEmailSubject, strMessageFrom, strMessageTo, strHTMLBody, strSMTPServer&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Function&lt;/span&gt; SendEmail (strEmailSubject, strMessageFrom, strMessageTo, strHTMLBody, strSMTPServer)&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; objMessage = CreateObject(&lt;span class="str"&gt;"CDO.Message"&lt;/span&gt;) &lt;br /&gt;objMessage.Subject = strEmailSubject&lt;br /&gt;objMessage.From = strMessageFrom&lt;br /&gt;objMessage.&lt;span class="kwrd"&gt;To&lt;/span&gt; = strMessageTo&lt;br /&gt;&lt;span class="rem"&gt;'The line below shows how to send using HTML included directly in your script&lt;/span&gt;&lt;br /&gt;objMessage.HTMLBody = strHTMLBody&lt;br /&gt;&lt;span class="kwrd"&gt;Const&lt;/span&gt; cdoSendUsingPickup = 1 &lt;span class="rem"&gt;'Send message using the local SMTP service pickup directory. &lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Const&lt;/span&gt; cdoSendUsingPort = 2 &lt;span class="rem"&gt;'Send the message using the network (SMTP over the network). &lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Const&lt;/span&gt; cdoAnonymous = 0 &lt;span class="rem"&gt;'Do not authenticate&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Const&lt;/span&gt; cdoBasic = 1 &lt;span class="rem"&gt;'basic (clear-text) authentication&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Const&lt;/span&gt; cdoNTLM = 2 &lt;span class="rem"&gt;'NTLM&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;'==This section provides the configuration information for the remote SMTP server.&lt;/span&gt;&lt;br /&gt;objMessage.Configuration.Fields.Item _&lt;br /&gt;(&lt;span class="str"&gt;"http://schemas.microsoft.com/cdo/configuration/sendusing"&lt;/span&gt;) = 2 &lt;br /&gt;&lt;span class="rem"&gt;'Name or IP of Remote SMTP Server&lt;/span&gt;&lt;br /&gt;objMessage.Configuration.Fields.Item _&lt;br /&gt;(&lt;span class="str"&gt;"http://schemas.microsoft.com/cdo/configuration/smtpserver"&lt;/span&gt;) = strSMTPServer&lt;br /&gt;&lt;span class="rem"&gt;'Type of authentication, NONE, Basic (Base64 encoded), NTLM&lt;/span&gt;&lt;br /&gt;objMessage.Configuration.Fields.Item _&lt;br /&gt;(&lt;span class="str"&gt;"http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"&lt;/span&gt;) = cdoAnonymous&lt;br /&gt;&lt;span class="rem"&gt;'Server port (typically 25)&lt;/span&gt;&lt;br /&gt;objMessage.Configuration.Fields.Item _&lt;br /&gt;(&lt;span class="str"&gt;"http://schemas.microsoft.com/cdo/configuration/smtpserverport"&lt;/span&gt;) = 25 &lt;br /&gt;&lt;span class="rem"&gt;'Use SSL for the connection (False or True)&lt;/span&gt;&lt;br /&gt;objMessage.Configuration.Fields.Item _&lt;br /&gt;(&lt;span class="str"&gt;"http://schemas.microsoft.com/cdo/configuration/smtpusessl"&lt;/span&gt;) = &lt;span class="kwrd"&gt;False&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;'Connection Timeout in seconds (the maximum time CDO will try to establish a connection to the SMTP server)&lt;/span&gt;&lt;br /&gt;objMessage.Configuration.Fields.Item _&lt;br /&gt;(&lt;span class="str"&gt;"http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout"&lt;/span&gt;) = 60&lt;br /&gt;objMessage.Configuration.Fields.Update&lt;br /&gt;&lt;span class="rem"&gt;'==End remote SMTP server configuration section==&lt;/span&gt;&lt;br /&gt;objMessage.Send&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;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br&gt;&lt;br&gt;&lt;br /&gt;&lt;br /&gt;You can download the script here:&lt;br /&gt;&lt;a href="http://abouttesting.fileave.com/SendEmail.zip"&gt;http://abouttesting.fileave.com/SendEmail.zip&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-7021778165182040519?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/7021778165182040519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=7021778165182040519' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/7021778165182040519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/7021778165182040519'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2009/05/vbscript-sending-e-mail.html' title='VBScript: Sending e-mail'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-2361034884054194127</id><published>2009-05-04T15:24:00.002+02:00</published><updated>2009-05-04T15:49:02.224+02:00</updated><title type='text'>Test framework - Multi-threading</title><content type='html'>From &lt;A href="http://abouttesting.blogspot.com/2008/06/test-framework-brief-description.html"&gt;http://abouttesting.blogspot.com/2008/06/test-framework-brief-description.html&lt;/A&gt;&lt;br /&gt;&lt;br /&gt;&lt;I&gt;Known limits:&lt;br /&gt;Parallel execution is not implemented (you cannot use multiple test tool instances for a test run in order to decrease test execution time).&lt;/I&gt;&lt;br /&gt;&lt;br /&gt;Check. Implemented today :-)&lt;br /&gt;&lt;br /&gt;Solution: Call a Store procedure with test run id and test run option id (including test tool type) and it returns next compatible test case in the execution queue including Go/NoGo (if NoGo wait until Go critera is met).&lt;br /&gt;&lt;br /&gt;Is this a necessary feature?&lt;br /&gt;&lt;br /&gt;I have many test suites that are End-to-end based and spans over several test days. Since each day requires a lot of batch processing (included in test suite as well) you want to combine a lot of test scenarios in one test suite instead of having one test suite/test scenario. The largest test suite has now over 900 test cases (multi steps)...so anything that reduces overall execution time is very welcome :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-2361034884054194127?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/2361034884054194127/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=2361034884054194127' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/2361034884054194127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/2361034884054194127'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2009/05/test-framework-multi-threading.html' title='Test framework - Multi-threading'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-2951679798252530609</id><published>2009-04-21T17:16:00.003+02:00</published><updated>2010-10-13T13:38:24.604+02:00</updated><title type='text'>Test data model part 2</title><content type='html'>A snapshot document of my test framework data model is now available for download:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dl.dropbox.com/u/8538167/TestFiles/TEST_DATA_MODEL_090420.zip"&gt;http://dl.dropbox.com/u/8538167/TestFiles/TEST_DATA_MODEL_090420.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;What to use it for? &lt;br /&gt;&lt;br /&gt;I think it mainly can serve as an inspiration source on how to (or how not to...) model your test framework as it is difficult to use it "as is" since it requires SQL logic (in code or in store procedures) and a bunch of GUIs (some has been published earlier).&lt;br /&gt;&lt;br /&gt;When I read the document I realize that some things should be refactored (bit instead of varchar for True/False columns for example) but all design decisions made sense to me at the time of creation. The database is "hand-made" from scratch using SQL Server GUI to create and change tables. Columns and tables have been added from time to time ever since.&lt;br /&gt;&lt;br /&gt;One of the reason why I choosed to use SQL Server instead of excel was that my AUT required of lot of parameters...if I do &lt;code&gt;select distinct test_case_parameter_name from test_case_parameter&lt;/code&gt; the answer is 192...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-2951679798252530609?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/2951679798252530609/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=2951679798252530609' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/2951679798252530609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/2951679798252530609'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2009/04/test-data-model-part-2.html' title='Test data model part 2'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-8390607356396885923</id><published>2009-03-20T16:15:00.002+01:00</published><updated>2009-03-20T16:27:17.302+01:00</updated><title type='text'>Test framework - 'stop if too many errors feature'</title><content type='html'>Another feature I implemented a few weeks ago is 'stop if too many errors'.&lt;br /&gt;&lt;br /&gt;Since an e-mail is sent for each test case failure, the e-mail inbox could be flooded if for example, an unhandled test environment issue occurs or the AUT build is completely broken. So to prevent that I have a parameter for how many test case failures that are tolerated before stopping a test run. Not that complicated either but good to have (especially if the e-mails are sent to a shared address...) &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/5047841583820836253-8390607356396885923?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/8390607356396885923/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=8390607356396885923' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/8390607356396885923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/8390607356396885923'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2009/03/test-framework-stop-if-too-many-errors.html' title='Test framework - &apos;stop if too many errors feature&apos;'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-9067690318884261674</id><published>2009-03-13T16:19:00.002+01:00</published><updated>2009-03-13T16:41:56.898+01:00</updated><title type='text'>Test framework - Stop feature</title><content type='html'>I implemented a new feature in my automation framework today...&lt;br /&gt;&lt;br /&gt;My test suites are usually very long scenarios and sometimes it takes hours to get to a test case which is by the end of a scenario. Imagine creating new test cases at the end, running the suite and a script failure occurs which in worst case require total rerun (that is also a major reason why I have a 'Resume' test feature)...&lt;br /&gt;&lt;br /&gt;...so I thought a stop feature would be nice to have so I implemented a new state/status for a test case run status; 'Stop'&lt;br /&gt;&lt;br /&gt;It work like this: Once a test run is created (more clues about my data model will be published here within a month or so, I hope) you set test case run status to Stop for a test case (via Report GUI) and the test execution will stop when the test case is up next in the test case execution queue (and sending an e-mail about it). Now, you can resume the test in debug mode and fix errors on the fly (remember to change status to 'No run' first). Or perhaps backup the AUT database before you continue?&lt;br /&gt;&lt;br /&gt;That's it, not that complicated (I wonder why I haven't thought of it before)...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-9067690318884261674?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/9067690318884261674/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=9067690318884261674' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/9067690318884261674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/9067690318884261674'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2009/03/test-framework-stop-feature.html' title='Test framework - Stop feature'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-9122167569946540311</id><published>2009-02-25T13:13:00.003+01:00</published><updated>2009-02-25T13:34:50.206+01:00</updated><title type='text'>SQL: Copy/Paste a database...</title><content type='html'>...could be a handy function.&lt;br /&gt;&lt;br /&gt;Sometimes your test data gets corrupted or outdated i.e. useless in a quality context. If so make sure to have a set of backups with good valid test data. If the backup size is huge (deidentified production copies for example) it could be hours in performing backup/restore...so in order to skip the waiting part of the backup to finish you can do the backup/restore using one SQL script like this:&lt;br /&gt;&lt;BR&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;/* Copy a &lt;span class="kwrd"&gt;database&lt;/span&gt; &lt;span class="kwrd"&gt;to&lt;/span&gt; another &lt;span class="kwrd"&gt;on&lt;/span&gt; the same db server */&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;declare&lt;/span&gt; @databaseFrom &lt;span class="kwrd"&gt;varchar&lt;/span&gt;(100)&lt;br /&gt;&lt;span class="kwrd"&gt;declare&lt;/span&gt; @databaseTo &lt;span class="kwrd"&gt;varchar&lt;/span&gt;(100)&lt;br /&gt;&lt;span class="kwrd"&gt;declare&lt;/span&gt; @databaseCopyName &lt;span class="kwrd"&gt;varchar&lt;/span&gt;(500)&lt;br /&gt;&lt;span class="kwrd"&gt;declare&lt;/span&gt; @randomNumber &lt;span class="kwrd"&gt;varchar&lt;/span&gt;(50)&lt;br /&gt;&lt;span class="kwrd"&gt;declare&lt;/span&gt; @&lt;span class="kwrd"&gt;date&lt;/span&gt; &lt;span class="kwrd"&gt;varchar&lt;/span&gt;(50)&lt;br /&gt;&lt;span class="kwrd"&gt;set&lt;/span&gt; @&lt;span class="kwrd"&gt;date&lt;/span&gt; = Replace(Replace(getDate(),&lt;span class="str"&gt;' '&lt;/span&gt;,&lt;span class="str"&gt;'_'&lt;/span&gt;),&lt;span class="str"&gt;':'&lt;/span&gt;,&lt;span class="str"&gt;'_'&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;-- *** User input ************************&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;-- Database to copy&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;set&lt;/span&gt; @databaseFrom =    &lt;span class="str"&gt;'MyFavoriteDataBase'&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;-- Target database &lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;set&lt;/span&gt; @databaseTo =    &lt;span class="str"&gt;'OtherDataBase'&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;-- ***************************************&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;--Perform &lt;span class="kwrd"&gt;backup&lt;/span&gt; &lt;span class="kwrd"&gt;and&lt;/span&gt; &lt;span class="kwrd"&gt;restore&lt;/span&gt; (Do &lt;span class="kwrd"&gt;not&lt;/span&gt; forget &lt;span class="kwrd"&gt;to&lt;/span&gt; remove &lt;span class="kwrd"&gt;all&lt;/span&gt; connections &lt;span class="kwrd"&gt;on&lt;/span&gt; target &lt;span class="kwrd"&gt;database&lt;/span&gt; &lt;span class="kwrd"&gt;prior&lt;/span&gt; &lt;span class="kwrd"&gt;restore&lt;/span&gt;!)&lt;br /&gt;&lt;span class="kwrd"&gt;set&lt;/span&gt; @randomNumber = Round((RAND()*1000000),0)&lt;br /&gt;&lt;span class="kwrd"&gt;set&lt;/span&gt; @databaseCopyName = &lt;span class="str"&gt;'\\myServer\myDrive$\myFolder\'&lt;/span&gt;+@databaseFrom+&lt;span class="str"&gt;'_'&lt;/span&gt;+@&lt;span class="kwrd"&gt;date&lt;/span&gt;+&lt;span class="str"&gt;'_'&lt;/span&gt;+@randomNumber&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Print&lt;/span&gt; &lt;span class="str"&gt;'Database '&lt;/span&gt; + @databaseFrom + &lt;span class="str"&gt;' will be saved as: '&lt;/span&gt; + @databaseCopyName&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;declare&lt;/span&gt; @databaseCopyBackupName &lt;span class="kwrd"&gt;varchar&lt;/span&gt;(500)&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; @databaseCopyBackupName = @databaseFrom+&lt;span class="str"&gt;'-Full Database Backup'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;BACKUP&lt;/span&gt; &lt;span class="kwrd"&gt;DATABASE&lt;/span&gt; &lt;br /&gt;@databaseFrom&lt;br /&gt;&lt;span class="kwrd"&gt;TO&lt;/span&gt;  &lt;span class="kwrd"&gt;DISK&lt;/span&gt; = &lt;br /&gt;@databaseCopyName&lt;br /&gt;&lt;span class="kwrd"&gt;WITH&lt;/span&gt; NOFORMAT, NOINIT,  NAME = &lt;br /&gt;@databaseCopyBackupName,&lt;br /&gt;SKIP, NOREWIND, NOUNLOAD,  STATS = 10&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Print&lt;/span&gt; &lt;span class="str"&gt;'Database '&lt;/span&gt; + @databaseFrom + &lt;span class="str"&gt;' were saved as: '&lt;/span&gt; + @databaseCopyName&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Print&lt;/span&gt; &lt;span class="str"&gt;'Starting restore to '&lt;/span&gt; + @databaseTo&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;RESTORE&lt;/span&gt; &lt;span class="kwrd"&gt;DATABASE&lt;/span&gt; @databaseTo &lt;span class="kwrd"&gt;FROM&lt;/span&gt;  &lt;br /&gt;&lt;span class="kwrd"&gt;DISK&lt;/span&gt; = @databaseCopyName&lt;br /&gt;&lt;span class="kwrd"&gt;WITH&lt;/span&gt;  &lt;span class="kwrd"&gt;FILE&lt;/span&gt; = 1,  NOUNLOAD,  REPLACE,  STATS = 10&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Print&lt;/span&gt; &lt;span class="str"&gt;'Restore of '&lt;/span&gt; + @databaseCopyName + &lt;span class="str"&gt;' to '&lt;/span&gt; + @databaseTo + &lt;span class="str"&gt;' is done!'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-9122167569946540311?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/9122167569946540311/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=9122167569946540311' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/9122167569946540311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/9122167569946540311'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2009/02/sql-copypaste-database.html' title='SQL: Copy/Paste a database...'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-3480683149339912977</id><published>2009-02-03T13:47:00.005+01:00</published><updated>2010-10-13T13:39:01.642+02:00</updated><title type='text'>Test data modell 1: Table overview and TEST_CASE</title><content type='html'>I have been very busy the last months both at work and at home (we have switched from a house to an apartment)...&lt;br /&gt;&lt;br /&gt;...but now I thought I should try to explain my test data modell which I use for administrating tests and test environments.&lt;br /&gt;&lt;br /&gt;First out is an overview picture of all tables and perhaps the most important table, TEST_CASE including some brief information. I will gather all table information in an RTF-document which should be available for download here: &lt;a href="http://dl.dropbox.com/u/8538167/TestFiles/TEST_DATA_MODEL.zip"&gt;http://dl.dropbox.com/u/8538167/TestFiles/TEST_DATA_MODEL.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_4tHQNkQA_gI/SYhKCqT9_HI/AAAAAAAAAFg/yh4xMEzjL0s/s1600-h/Part1.png"&gt;&lt;img src="http://2.bp.blogspot.com/_4tHQNkQA_gI/SYhKCqT9_HI/AAAAAAAAAFg/yh4xMEzjL0s/s400/Part1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5298566371179625586" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-3480683149339912977?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/3480683149339912977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=3480683149339912977' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/3480683149339912977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/3480683149339912977'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2009/02/test-data-modell-1-table-overview-and.html' title='Test data modell 1: Table overview and TEST_CASE'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_4tHQNkQA_gI/SYhKCqT9_HI/AAAAAAAAAFg/yh4xMEzjL0s/s72-c/Part1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-4058538054260702689</id><published>2008-12-02T09:16:00.001+01:00</published><updated>2008-12-02T09:17:40.330+01:00</updated><title type='text'>QTP: Record &amp; Playback part 2...</title><content type='html'>...just changed my mind...will add some verification steps as well...&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/5047841583820836253-4058538054260702689?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/4058538054260702689/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=4058538054260702689' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/4058538054260702689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/4058538054260702689'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/12/qtp-record-playback-part-2.html' title='QTP: Record &amp; Playback part 2...'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-885724994179679451</id><published>2008-12-02T08:53:00.002+01:00</published><updated>2008-12-02T09:03:32.034+01:00</updated><title type='text'>QTP: Record &amp; Playback...</title><content type='html'>...is in some cases very cost effective. A recent test took me &lt; 10 minutes to record, adjust some objects with dynamic DP and add 140 records to datatable:&lt;br /&gt;&lt;br /&gt;Search data&lt;br /&gt;Click on some objects&lt;br /&gt;Send page to printer&lt;br /&gt;Click some more objects&lt;br /&gt;Order another printout&lt;br /&gt;&lt;br /&gt;I could have add some verifying logic as well but since this is a one-time test (bug investigation) I will check the printouts manually and I guess the overall ROI for this test is quite ok anyway.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-885724994179679451?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/885724994179679451/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=885724994179679451' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/885724994179679451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/885724994179679451'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/12/qtp-record-playback.html' title='QTP: Record &amp; Playback...'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-5739458799345211027</id><published>2008-11-18T21:41:00.003+01:00</published><updated>2008-11-18T21:46:18.380+01:00</updated><title type='text'>Some blogs about testing/automation...</title><content type='html'>...are listed &lt;a href="http://motevich.blogspot.com/2008/11/top-40-automated-testing-blogs.html"&gt;Here&lt;/a&gt;. I don't know how the ranking system works in detail but it feels good to be on the list (I like lists...).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-5739458799345211027?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/5739458799345211027/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=5739458799345211027' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/5739458799345211027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/5739458799345211027'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/11/some-blogs-about-testingautomation.html' title='Some blogs about testing/automation...'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-4258438185798164113</id><published>2008-10-24T10:22:00.002+02:00</published><updated>2008-10-24T10:50:33.478+02:00</updated><title type='text'>SQL: Script traceability</title><content type='html'>A small snippet for automaticly in SQL Server get date and user name into columns like CREATED_DATE, CREATED_BY, LATEST_UPDATED_BY etc:&lt;br /&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;span class="kwrd"&gt;BEGIN&lt;/span&gt; &lt;span class="kwrd"&gt;TRAN&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;UPDATE&lt;/span&gt; [&lt;span class="kwrd"&gt;table&lt;/span&gt;]&lt;br /&gt;&lt;span class="kwrd"&gt;SET&lt;/span&gt; &lt;br /&gt;LATEST_CHANGED_DATE = getDate(), &lt;br /&gt;LATEST_CHANGED_BY = &lt;span class="kwrd"&gt;SYSTEM_USER&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;WHERE&lt;/span&gt; [critera] = &lt;span class="str"&gt;'True'&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;COMMIT&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;In table:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier;"&gt;&lt;br /&gt;LATEST_CHANGED_DATE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LATEST_CHANGED_BY&lt;br /&gt;2008-10-24 10:37:26.470&amp;nbsp;&amp;nbsp;&amp;nbsp;Stefan&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-4258438185798164113?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/4258438185798164113/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=4258438185798164113' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/4258438185798164113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/4258438185798164113'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/10/sql-script-traceability.html' title='SQL: Script traceability'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-6430271417467279950</id><published>2008-10-02T15:34:00.003+02:00</published><updated>2008-10-02T15:50:37.507+02:00</updated><title type='text'>SQL: Multiple insert</title><content type='html'>I do some SQL scriptning for various testing purposes sometimes and I sure miss array functionality in SQL. There are however some workarounds... &lt;br /&gt;&lt;br /&gt;One is to create temporary tables and fill it with data. It works excellent if you combine INSERT with SELECT FROM [TABLE] but what if you want to fill your table with hard-coded data? Here is one possible solution:&lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;--Example &lt;span class="kwrd"&gt;of&lt;/span&gt; multiple &lt;span class="kwrd"&gt;insert&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;--&lt;span class="kwrd"&gt;Create&lt;/span&gt; temp &lt;span class="kwrd"&gt;table&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;CREATE&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt; #fpp([RID] &lt;span class="kwrd"&gt;int&lt;/span&gt; &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt; &lt;span class="kwrd"&gt;IDENTITY&lt;/span&gt; (1, 1) &lt;span class="kwrd"&gt;PRIMARY&lt;/span&gt; &lt;span class="kwrd"&gt;KEY&lt;/span&gt;, [MY_DATA] &lt;span class="kwrd"&gt;varchar&lt;/span&gt;(30))&lt;br /&gt;&lt;span class="kwrd"&gt;go&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;--&lt;span class="kwrd"&gt;Insert&lt;/span&gt; multiple &lt;span class="kwrd"&gt;data&lt;/span&gt; &lt;span class="kwrd"&gt;using&lt;/span&gt; &lt;span class="kwrd"&gt;union&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;insert&lt;/span&gt; &lt;span class="kwrd"&gt;into&lt;/span&gt; #fpp ([MY_DATA])&lt;br /&gt;&lt;span class="kwrd"&gt;select&lt;/span&gt; &lt;br /&gt;(&lt;span class="kwrd"&gt;select&lt;/span&gt; &lt;span class="str"&gt;'data1'&lt;/span&gt;) &lt;span class="kwrd"&gt;union&lt;/span&gt;&lt;br /&gt;(&lt;span class="kwrd"&gt;select&lt;/span&gt; &lt;span class="str"&gt;'data2'&lt;/span&gt;) &lt;span class="kwrd"&gt;union&lt;/span&gt;&lt;br /&gt;(&lt;span class="kwrd"&gt;select&lt;/span&gt; &lt;span class="str"&gt;'data3'&lt;/span&gt;) &lt;span class="kwrd"&gt;union&lt;/span&gt;&lt;br /&gt;(&lt;span class="kwrd"&gt;select&lt;/span&gt; &lt;span class="str"&gt;'date4'&lt;/span&gt;)&lt;br /&gt;&lt;span class="kwrd"&gt;go&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;select&lt;/span&gt; * &lt;span class="kwrd"&gt;from&lt;/span&gt; #fpp&lt;br /&gt;&lt;br /&gt;--Clean up&lt;br /&gt;&lt;span class="kwrd"&gt;drop&lt;/span&gt; &lt;span class="kwrd"&gt;table&lt;/span&gt; #fpp&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-6430271417467279950?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/6430271417467279950/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=6430271417467279950' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/6430271417467279950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/6430271417467279950'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/10/sql-multiple-insert.html' title='SQL: Multiple insert'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-494560688457064478</id><published>2008-09-25T12:26:00.004+02:00</published><updated>2008-09-25T12:59:12.893+02:00</updated><title type='text'>Java: Test Frameworks and the weather</title><content type='html'>I have come to a conclusion to use existing test frameworks (JUnit...) in combination with my own when converting tests from VBScript into Java so I do not need to "re-invent the wheel". However I will reuse some features in my own framework which I have not found in  existing ones.&lt;br /&gt;&lt;br /&gt;The biggest advantage so far using Java instead of VBScript is that it makes it easier to collaborate with the Dev guys since we now "speaks the same langauge". So now we have a common build and testing project where we have set up a &lt;a href="https://hudson.dev.java.net/"&gt;Hudson&lt;/a&gt; project where builds and tests runs several times a day continously. You get a dashboard view of the status for each release:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_4tHQNkQA_gI/SNtnm6Ob3DI/AAAAAAAAADI/WZ4nITtbRvY/s1600-h/weather.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5249903708792937522" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_4tHQNkQA_gI/SNtnm6Ob3DI/AAAAAAAAADI/WZ4nITtbRvY/s400/weather.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Did I mentioned I love dashboards...and being a Swede, also talking about the weather...&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/5047841583820836253-494560688457064478?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/494560688457064478/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=494560688457064478' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/494560688457064478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/494560688457064478'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/09/java-test-frameworks-and-weather.html' title='Java: Test Frameworks and the weather'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_4tHQNkQA_gI/SNtnm6Ob3DI/AAAAAAAAADI/WZ4nITtbRvY/s72-c/weather.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-552795170206549233</id><published>2008-08-22T15:35:00.003+02:00</published><updated>2008-08-22T15:53:56.352+02:00</updated><title type='text'>Java: Display Java code in HTML</title><content type='html'>It was rather difficult to find a utility for Java code export to HTML but at last I found a free tool called Java Code Export which do a decent job but requires some manual steps after a conversion, why I am not 100% satisfied with this solution. Any tips are welcome in this subject.&lt;br /&gt;&lt;br /&gt;For formating testing purposes I publish this tiny Java method for creating random numbers:&lt;br /&gt;    &lt;style type="text/css"&gt;&lt;br /&gt;    /*&lt;![CDATA[*/&lt;br /&gt; span.c5 {color: #000000; font-family: Courier New; font-size: 80%}&lt;br /&gt; b.c4 {color: #0000FF; font-family: Courier New; font-size: 80%}&lt;br /&gt; span.c3 {font-family: Courier New; font-size: 80%}&lt;br /&gt; i.c2 {color: #808080; font-family: Courier New; font-size: 80%}&lt;br /&gt; span.c1 {color: #000000; font-family: Courier New; font-size: 80%}&lt;br /&gt;    /*]]&gt;*/&lt;br /&gt;    &lt;/style&gt;&lt;br /&gt;    &lt;span class="c1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;i class="c2"&gt;/**&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="c3"&gt;&lt;i class="c2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="c3"&gt;&lt;i class="c2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;lowerLimit&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="c3"&gt;&lt;i class="c2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;upperLimit&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="c3"&gt;&lt;i class="c2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@return&amp;nbsp;A&amp;nbsp;random&amp;nbsp;integer&amp;nbsp;number&amp;nbsp;between&amp;nbsp;lowerLimit&amp;nbsp;and&amp;nbsp;upperLimit&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="c3"&gt;&lt;i class="c2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="c1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;b class="c4"&gt;static&lt;/b&gt;&lt;span class="c5"&gt;&amp;nbsp;&lt;/span&gt;&lt;b class="c4"&gt;int&lt;/b&gt;&lt;span class="c5"&gt;&amp;nbsp;createRandomNumberInt&amp;nbsp;(&lt;/span&gt;&lt;b class="c4"&gt;int&lt;/b&gt;&lt;span class="c5"&gt;&amp;nbsp;lowerLimit,&amp;nbsp;&lt;/span&gt;&lt;b class="c4"&gt;int&lt;/b&gt;&lt;span class="c5"&gt;&amp;nbsp;upperLimit)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="c1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Random&amp;nbsp;generator&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;b class="c4"&gt;new&lt;/b&gt;&lt;span class="c5"&gt;&amp;nbsp;Random();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="c1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;b class="c4"&gt;return&lt;/b&gt;&lt;span class="c5"&gt;&amp;nbsp;generator.nextInt&amp;nbsp;(upperLimit-lowerLimit)&amp;nbsp;+&amp;nbsp;lowerLimit;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="c1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-552795170206549233?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/552795170206549233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=552795170206549233' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/552795170206549233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/552795170206549233'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/08/java-display-java-code-in-html.html' title='Java: Display Java code in HTML'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-3860829911582912644</id><published>2008-08-13T14:00:00.002+02:00</published><updated>2008-08-13T14:04:54.606+02:00</updated><title type='text'>Java: My first Class...</title><content type='html'>...is ready and seems to work!&lt;br /&gt;&lt;br /&gt;My programming experience has envolved some languages over the years and here is a summary:&lt;br /&gt;&lt;br /&gt;1984-1990 Basic on Sinclair Spectrum (developing small simple games at home)&lt;br /&gt;1990      Pascal on PC/Windows (small simple programs at high school)&lt;br /&gt;1991      C on Unix and PC/Windows (simple programs at high school)&lt;br /&gt;1991      Assembler (simple robot programs at high scool)&lt;br /&gt;1994-     JavaScript (web and test tool utilities at home and at work)&lt;br /&gt;1998-2000 LabView (programs for hardware interaction at work)&lt;br /&gt;2000-     VBScript (automation and test tools utilities at work)&lt;br /&gt;2002-     SQL (various scripts at work including Store procedure programming)&lt;br /&gt;2002-2006 Loadrunner "C" (performance scripts at work)&lt;br /&gt;&lt;br /&gt;and now I can add&lt;br /&gt;&lt;br /&gt;2008-     Java (automation and test tools at work)&lt;br /&gt;&lt;br /&gt;I have read a couple of Java books during my vacation and hopefully I understand a bit more about the OO concept than before as well as the Java syntax.&lt;br /&gt;&lt;br /&gt;I have started off with a simple Class for test data utilities and I have rewritten some of my old VBScript functions into Java methods. And so far it works pretty well. One of the major benefits is that I now got an decent IDE in ItelliJ IDEA compared to using QTP's native IDE for VBScript.&lt;br /&gt;&lt;br /&gt;My initial goal is to rework my test framework for Web Service testing as there are some powerful utilites available for Java (generate test classes from WSDL for example).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-3860829911582912644?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/3860829911582912644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=3860829911582912644' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/3860829911582912644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/3860829911582912644'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/08/java-my-first-class.html' title='Java: My first Class...'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-2539538594873512578</id><published>2008-07-11T09:22:00.002+02:00</published><updated>2008-07-11T09:27:13.925+02:00</updated><title type='text'>Selenium IDE: First impressions</title><content type='html'>Installation of Selenium IDE went very smooth including installing FireFox 3.0 at first. Had to tweek some security settings in order to get proper access to our test environments but after that all went well accessing the AUT directly or via Selenium.&lt;br /&gt;&lt;br /&gt;Did some basic AUT actions using Record/Replay in Selenium IDE and it worked pretty well considering it is a free tool. I had to adjust replay speed (the tests runs very fast at highest speed setting) in order for some objects to get recognized since I did not find any proper "wait...exists" command at first.&lt;br /&gt;&lt;br /&gt;Unfortunate I could confirm that Selenium could not handle pop-up dialogs which it is a critical requirement for my AUT. I found some possible workarounds when googled on the subject but have not tried them yet (any tips are welcome!). So for the moment I put Selenium on hold.&lt;br /&gt;&lt;br /&gt;Currently I am on vacation but my summer reading are books about Java and OO. Hopefully I soon have enough knowledge to start re-write some of my test utilites into Java using OO design. I've got IntelliJ IDEA installed which seems to be a very good Java IDE...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-2539538594873512578?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/2539538594873512578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=2539538594873512578' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/2539538594873512578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/2539538594873512578'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/07/selenium-ide-first-impressions.html' title='Selenium IDE: First impressions'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-6773493892065642246</id><published>2008-06-25T09:40:00.002+02:00</published><updated>2008-06-25T09:51:26.526+02:00</updated><title type='text'>Test framework brief description</title><content type='html'>Here is a brief description what happens when running tests using my test automation framework (and some future plans).&lt;br /&gt;&lt;br /&gt;Data model:&lt;br /&gt;Each test suite has one or more test scenarios which has one or more test cases.&lt;br /&gt;When running test suites, a unique test run is created which has one or more test case execution queues.&lt;br /&gt;All data is in a MS SQL Server database.&lt;br /&gt;&lt;br /&gt;In automation GUI:&lt;br /&gt;1. Select run mode, New or Resume (If resume select a test run which is not completed).&lt;br /&gt;2. Select one or more test suites if New.&lt;br /&gt;3. For each test suite select test level, test days duration, test environment and test tool if New.&lt;br /&gt;4. For each test tool instance, select global run options like reporting, e-mail etc.&lt;br /&gt;5. Press run button for each test tool instance which is not aleady running.&lt;br /&gt;6. Test run is started for each test tool instance via Scheduled tasks.&lt;br /&gt;&lt;br /&gt;For each test tool:&lt;br /&gt;7a. Execute each test case in queue until all is executed or cancelled (could happen if a prevoius nested test case fails).&lt;br /&gt;&lt;br /&gt;In test run report GUI:&lt;br /&gt;7b. Follow test run progress during run-time (now also reporting at step basis).&lt;br /&gt;&lt;br /&gt;In test case dashboard GUI:&lt;br /&gt;7c. Latest test case result are shown during run-time for each version och configuration.&lt;br /&gt;&lt;br /&gt;Known limits:&lt;br /&gt;Parallel execution is not implemented (you cannot use multiple test tool instances for a test run in order to decrease test execution time).&lt;br /&gt;&lt;br /&gt;Supported tools:&lt;br /&gt;QTP&lt;br /&gt;TestBatchRunner (home made tool for running java batch jobs)&lt;br /&gt;TestAPIRunner (home made tool for Web Service, XML API and http requests)&lt;br /&gt;&lt;br /&gt;Future plans:&lt;br /&gt;Implement support for more tools (thinking of trying Selenium).&lt;br /&gt;Learn Java and OO (natural language choice since our AUT is written in Java and allowing for more collaboration with Development).&lt;br /&gt;Rewrite test framework using OO-concept in Java (currently in VBScript and JavaScript) if Selenium works OK.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-6773493892065642246?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/6773493892065642246/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=6773493892065642246' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/6773493892065642246'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/6773493892065642246'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/06/test-framework-brief-description.html' title='Test framework brief description'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-3969403816745821994</id><published>2008-06-18T12:45:00.005+02:00</published><updated>2010-10-13T13:28:23.206+02:00</updated><title type='text'>Testing dashboard</title><content type='html'>I like dashboards...both using them as well as developing them. If based on proper metrics they give a good picture of the current status in a single view. However, finding good metrics in testing is not a trivial task since counting test cases is not a good idea (especially for those of us who mainly do exploratory testing instead of executing scripted test cases).&lt;br /&gt;&lt;br /&gt;I took the "Rapid Software Testing" course by James Bach about a year ago and he introduced me to "The Dashboard Concept" (see slide 138 in &lt;a href="http://www.satisfice.com/rst.pdf"&gt;RST Slides&lt;/a&gt;). We had at the time a simular concept in an Excel sheet where colors were changed based on certain keywords but Excel has some limits when it comes to concurrent usage.&lt;br /&gt;&lt;br /&gt;Now we are evaluting the use of my latest creation: &lt;a href="http://dl.dropbox.com/u/8538167/TestFiles/AUTDashboard.zip"&gt;AUTDashboard.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_4tHQNkQA_gI/SaZLICiokmI/AAAAAAAAAFw/MultyX008So/s1600-h/sample.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 364px; height: 254px;" src="http://1.bp.blogspot.com/_4tHQNkQA_gI/SaZLICiokmI/AAAAAAAAAFw/MultyX008So/s400/sample.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5307011812395881058" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I have removed the Effort column from James' dashboard and I will probably add some extra columns for latest changed date and other things later on.&lt;br /&gt;&lt;br /&gt;The dashboard aims at showing the test and quality status for an AUT, based on subjective conclusions for all test activities in a release/project.&lt;br /&gt;&lt;br /&gt;If want to try it out, download it and place the files in C:\ if you don't want edit the html file. You also have to answer yes to all security warnings in order to get it to work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-3969403816745821994?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/3969403816745821994/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=3969403816745821994' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/3969403816745821994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/3969403816745821994'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/06/testing-dashboard.html' title='Testing dashboard'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_4tHQNkQA_gI/SaZLICiokmI/AAAAAAAAAFw/MultyX008So/s72-c/sample.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-6493032680440460786</id><published>2008-06-13T15:11:00.004+02:00</published><updated>2010-10-13T13:37:23.609+02:00</updated><title type='text'>Test automation report - source code</title><content type='html'>Here you can find the source code for my node report (see previous post): &lt;a href="http://dl.dropbox.com/u/8538167/TestFiles/wwwroot.zip"&gt;wwwroot.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I have enclosed an excel file instead of my database but if you take a look at the sheets you get some clues how my test case data model is like.&lt;br /&gt;&lt;br /&gt;Place the files under c:\Inetpub\wwwroot\ if you want to run immediatly else you have to alter some hardcoded filepaths in the html-files.&lt;br /&gt;&lt;br /&gt;If you have local IIS you open the report by this URL:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://localhost/Index.html?1"&gt;http://localhost/Index.html?1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;where the number after the ? is input parameter which test run report to show.&lt;br /&gt;&lt;br /&gt;If you are successful in installation the page should look like this:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp0.blogger.com/_4tHQNkQA_gI/SFJ050YZerI/AAAAAAAAAC4/yxbHwj8X_88/s1600-h/sample.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5211356255483427506" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://bp0.blogger.com/_4tHQNkQA_gI/SFJ050YZerI/AAAAAAAAAC4/yxbHwj8X_88/s400/sample.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The report uses both VBScript and JavaScript (client side, that is why security warning will occur) and the components enclosed is free to use.&lt;br /&gt;&lt;br /&gt;Good luck! I am off sailing this weekend so don't expect any support for a few days :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-6493032680440460786?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/6493032680440460786/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=6493032680440460786' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/6493032680440460786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/6493032680440460786'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/06/test-automation-report-source-code.html' title='Test automation report - source code'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_4tHQNkQA_gI/SFJ050YZerI/AAAAAAAAAC4/yxbHwj8X_88/s72-c/sample.png' height='72' width='72'/><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-4607544063742170602</id><published>2008-06-04T14:13:00.004+02:00</published><updated>2008-06-04T14:51:09.086+02:00</updated><title type='text'>Test automation report</title><content type='html'>Ever since my first QTP crash back in early 2000 I have disliked the QTP native report. The layout and content is OK but the fact that the result is not available until after the test run (and if QTP did not crash) is not satisfying according to my reuqirements in automation.&lt;br /&gt;&lt;br /&gt;So about a year ago I began to log test result outside QTP so the it becomes available during run-time. When switching from Excel to SQL Server I did some web GUIs so it would be easier to follow the test progress...and now my latest report is looking quite good I think (it reminds a bit of QTP's native):&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp0.blogger.com/_4tHQNkQA_gI/SEaJkP2UK2I/AAAAAAAAACo/hDVv_OF7FXs/s1600-h/Report_1.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5208001274923199330" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://bp0.blogger.com/_4tHQNkQA_gI/SEaJkP2UK2I/AAAAAAAAACo/hDVv_OF7FXs/s400/Report_1.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The concept is simply like this:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1. Read selected data from db&lt;br /&gt;2. Render frames based on the data using JavaScript and VBScript (the pie chart requires Flashplayer)&lt;br /&gt;3. Press update or refresh to get the latest results (if the test is running)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It is based on my test case data model and I use a JS Tree to generate test case nodes:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://bp2.blogger.com/_4tHQNkQA_gI/SEaJ5nHEg5I/AAAAAAAAACw/DcmJSmIXohA/s1600-h/Report_2.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5208001641944744850" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://bp2.blogger.com/_4tHQNkQA_gI/SEaJ5nHEg5I/AAAAAAAAACw/DcmJSmIXohA/s400/Report_2.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;If you click on a test case all related data is shown in the main frame as well as clicking on test suite node (one report can have one or more test suites).&lt;/p&gt;&lt;p&gt;Does this look interesting? I will make an deidentified code copy and publish it later. The report does not require QTP and can be used with any tool which allows custom reporting. Must of the job is to implement a good custom reporting (prefeble to a database) from your test tool and have a good test case data model.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-4607544063742170602?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/4607544063742170602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=4607544063742170602' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/4607544063742170602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/4607544063742170602'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/06/test-automation-report.html' title='Test automation report'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_4tHQNkQA_gI/SEaJkP2UK2I/AAAAAAAAACo/hDVv_OF7FXs/s72-c/Report_1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-1303036611083327660</id><published>2008-05-29T13:16:00.004+02:00</published><updated>2010-10-13T13:39:48.144+02:00</updated><title type='text'>Test suite driver script</title><content type='html'>As a follow-up to this week posts I thought I should share my automation &lt;a href="http://dl.dropbox.com/u/8538167/TestFiles/TestSuiteDriver.zip"&gt;test driver script&lt;/a&gt;. This contains my test case driver logic. All administration of the tests are handled via Web pages and the data is in an SQL Server database. The script is in the Script.mts file in a QTP Test and can be used in QTP (obvious) and for non-GUI tests via vbs standalone as shown in yesterdays post.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span class="rem"&gt;'**************************************&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;'***    test suite driver script    ***&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;'**************************************&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;'Get and set test run options for QTP&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;If&lt;/span&gt; intTestRunOptionID = &lt;span class="str"&gt;""&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt; intTestRunOptionID = 1&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;'Execute main&lt;/span&gt;&lt;br /&gt;Main intTestRunOptionID&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Sub&lt;/span&gt; Main (intTestRunOptionID)&lt;br /&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;Set&lt;/span&gt; objTestRun = GetTestRunOptions (intTestRunOptionID)&lt;br /&gt;   &lt;br /&gt;    &lt;span class="rem"&gt;'Check Global run status and stop test if requested&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;If&lt;/span&gt; objTestRun(&lt;span class="str"&gt;"TEST_RUN"&lt;/span&gt;) = &lt;span class="str"&gt;"True"&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;        &lt;span class="rem"&gt;'Start test and report&lt;/span&gt;&lt;br /&gt;        ResetTestRun intTestRunOptionID, &lt;span class="str"&gt;"TestStart"&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;Else&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;If&lt;/span&gt; objTestRun(&lt;span class="str"&gt;"TEST_RUN_TOOL"&lt;/span&gt;) = &lt;span class="str"&gt;"QuickTestPro"&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt; CloseAllBrowsers&lt;br /&gt;        &lt;span class="kwrd"&gt;Exit&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&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;'*** Handle Result Records ****&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;Select&lt;/span&gt; &lt;span class="kwrd"&gt;Case&lt;/span&gt; objTestRun(&lt;span class="str"&gt;"TEST_RESULT_OPTION"&lt;/span&gt;)&lt;br /&gt;        &lt;span class="kwrd"&gt;Case&lt;/span&gt; &lt;span class="str"&gt;"New"&lt;/span&gt;&lt;br /&gt;            &lt;span class="rem"&gt;'Create new result set&lt;/span&gt;&lt;br /&gt;            intTestRunResultID = CreateAndUpdateNewResult (intTestRunOptionID, _&lt;br /&gt;            &lt;span class="str"&gt;"TestRun_"&lt;/span&gt; &amp;amp; Now(), objTestRun(&lt;span class="str"&gt;"REPORT_TO_NET"&lt;/span&gt;) )&lt;br /&gt;            &lt;span class="rem"&gt;'Create summary result&lt;/span&gt;&lt;br /&gt;            CreateSummaryResult intTestRunResultID, intTestRunOptionID&lt;br /&gt;            &lt;span class="rem"&gt;'Create result rows&lt;/span&gt;&lt;br /&gt;            CreateResultRows intTestRunResultID, intTestRunOptionID&lt;br /&gt;        &lt;span class="kwrd"&gt;Case&lt;/span&gt; &lt;span class="str"&gt;"Resume"&lt;/span&gt;&lt;br /&gt;            intTestRunResultID = objTestRun(&lt;span class="str"&gt;"TEST_RUN_RESULT_ID"&lt;/span&gt;)&lt;br /&gt;    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Select&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;    &lt;span class="rem"&gt;'Initialize&lt;/span&gt;&lt;br /&gt;    blnAllTestRunsExecuted = &lt;span class="kwrd"&gt;False&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;    &lt;span class="kwrd"&gt;Do&lt;/span&gt; &lt;span class="kwrd"&gt;Until&lt;/span&gt; blnAllTestRunsExecuted&lt;br /&gt;   &lt;br /&gt;        &lt;span class="rem"&gt;'Get and set global test run data&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;Set&lt;/span&gt; objTCGlobalParameter = GetGlobalTestParameters (intTestRunResultID)&lt;br /&gt;        &lt;span class="kwrd"&gt;If&lt;/span&gt; objTCGlobalParameter(&lt;span class="str"&gt;"TEST_RUN_RESULT_SUMMARY_ID"&lt;/span&gt;) = &lt;span class="str"&gt;""&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;            blnAllTestRunsExecuted = &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;If&lt;/span&gt; blnAllTestRunsExecuted &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;            objTCGlobalParameter(&lt;span class="str"&gt;"TEST_RUN_STATE"&lt;/span&gt;) = &lt;span class="str"&gt;"finished"&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;Exit&lt;/span&gt; &lt;span class="kwrd"&gt;Do&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;Else&lt;/span&gt;&lt;br /&gt;            objTCGlobalParameter(&lt;span class="str"&gt;"TEST_RUN_STATE"&lt;/span&gt;) = &lt;span class="str"&gt;"started"&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;'Initialize&lt;/span&gt;&lt;br /&gt;        blnAllTestCasesExecuted = &lt;span class="kwrd"&gt;False&lt;/span&gt;&lt;br /&gt;       &lt;br /&gt;        &lt;span class="rem"&gt;'*** Open application and/or get version***&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;If&lt;/span&gt; objTestRun(&lt;span class="str"&gt;"TEST_RUN_TOOL"&lt;/span&gt;) = &lt;span class="str"&gt;"QuickTestPro"&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;            objTCGlobalParameter(&lt;span class="str"&gt;"Version"&lt;/span&gt;) = Trim(OpenApplication _&lt;br /&gt;            (objTCGlobalParameter(&lt;span class="str"&gt;"TEST_ENVIRONMENT_ALIAS"&lt;/span&gt;), &lt;span class="str"&gt;"TestHost"&lt;/span&gt;, &lt;span class="str"&gt;"MyAUT"&lt;/span&gt;, &lt;span class="str"&gt;"Start"&lt;/span&gt;))&lt;br /&gt;            &lt;span class="kwrd"&gt;Else&lt;/span&gt;&lt;br /&gt;            objTCGlobalParameter(&lt;span class="str"&gt;"Version"&lt;/span&gt;) = GetAUTVersion _&lt;br /&gt;            (objTCGlobalParameter(&lt;span class="str"&gt;"TEST_ENVIRONMENT_ALIAS"&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;        objTCGlobalParameter(&lt;span class="str"&gt;"Release"&lt;/span&gt;) = GetRelease (objTCGlobalParameter(&lt;span class="str"&gt;"Version"&lt;/span&gt;))       &lt;br /&gt;&lt;br /&gt;        &lt;span class="rem"&gt;'Update summary with version&lt;/span&gt;&lt;br /&gt;        UpdateSummary objTCGlobalParameter(&lt;span class="str"&gt;"TEST_RUN_RESULT_SUMMARY_ID"&lt;/span&gt;), &lt;span class="str"&gt;"TEST_RUN_VERSION"&lt;/span&gt;, _&lt;br /&gt;        objTCGlobalParameter(&lt;span class="str"&gt;"Version"&lt;/span&gt;)&lt;br /&gt;       &lt;br /&gt;        &lt;span class="kwrd"&gt;If&lt;/span&gt; objTestRun(&lt;span class="str"&gt;"EMAIL_OPTION"&lt;/span&gt;) = &lt;span class="str"&gt;"True"&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;            objTestRun(&lt;span class="str"&gt;"EMAIL_SUBJECT"&lt;/span&gt;) = GetTestSuiteSummary (objTCGlobalParameter)&lt;br /&gt;            objTestRun(&lt;span class="str"&gt;"HTML_BODY"&lt;/span&gt;) = GetTestCaseResultRowsHTML(objTCGlobalParameter)&lt;br /&gt;            SendEmail objTestRun&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;'*** Execute Test Cases ***&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;Do&lt;/span&gt; &lt;span class="kwrd"&gt;Until&lt;/span&gt; blnAllTestCasesExecuted&lt;br /&gt;            &lt;span class="rem"&gt;'Check Global run status and stop test if requested&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;Set&lt;/span&gt; objTestRun = GetTestRunOptions (intTestRunOptionID)&lt;br /&gt;            &lt;span class="kwrd"&gt;If&lt;/span&gt; objTestRun(&lt;span class="str"&gt;"TEST_RUN"&lt;/span&gt;) = &lt;span class="str"&gt;"True"&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;                &lt;span class="rem"&gt;'Continue&lt;/span&gt;&lt;br /&gt;                &lt;span class="kwrd"&gt;Else&lt;/span&gt;&lt;br /&gt;                &lt;span class="kwrd"&gt;If&lt;/span&gt; objTestRun(&lt;span class="str"&gt;"TEST_RUN_TOOL"&lt;/span&gt;) = &lt;span class="str"&gt;"QuickTestPro"&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;                    CloseAllBrowsers&lt;br /&gt;                &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;&lt;br /&gt;                objTCGlobalParameter(&lt;span class="str"&gt;"TEST_RUN_STATE"&lt;/span&gt;) = &lt;span class="str"&gt;"stopped"&lt;/span&gt;&lt;br /&gt;                &lt;span class="kwrd"&gt;If&lt;/span&gt; objTestRun(&lt;span class="str"&gt;"EMAIL_OPTION"&lt;/span&gt;) = &lt;span class="str"&gt;"True"&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;                    objTestRun(&lt;span class="str"&gt;"EMAIL_SUBJECT"&lt;/span&gt;) = GetTestSuiteSummary (objTCGlobalParameter)&lt;br /&gt;                    objTestRun(&lt;span class="str"&gt;"HTML_BODY"&lt;/span&gt;) = GetTestCaseResultRowsHTML(objTCGlobalParameter)&lt;br /&gt;                    SendEmail objTestRun&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="rem"&gt;'Reset TestRun option&lt;/span&gt;&lt;br /&gt;                ResetTestRun intTestRunOptionID, &lt;span class="str"&gt;"TestStop"&lt;/span&gt;&lt;br /&gt;                &lt;span class="kwrd"&gt;Exit&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&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="rem"&gt;'Get and set test scenario data&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;Set&lt;/span&gt; objCurrentTestProperties = GetCurrentTestProperties _&lt;br /&gt;            (intTestRunResultID, objTCGlobalParameter(&lt;span class="str"&gt;"TEST_SUITE_ID"&lt;/span&gt;))&lt;br /&gt;            &lt;span class="kwrd"&gt;If&lt;/span&gt; objCurrentTestProperties(&lt;span class="str"&gt;"TEST_RUN_RESULT_ROW_ID"&lt;/span&gt;) = &lt;span class="str"&gt;""&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;                blnAllTestCasesExecuted = &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;span class="kwrd"&gt;If&lt;/span&gt; blnAllTestCasesExecuted &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;                &lt;span class="kwrd"&gt;Exit&lt;/span&gt; &lt;span class="kwrd"&gt;Do&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="rem"&gt;'Get reference test data&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;Set&lt;/span&gt; objReferenceTestData = GetTestReferenceData _&lt;br /&gt;            (objCurrentTestProperties(&lt;span class="str"&gt;"TEST_RUN_RESULT_ROW_ID"&lt;/span&gt;))           &lt;br /&gt;            &lt;span class="rem"&gt;'Get test case parameters&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;Set&lt;/span&gt; objTCParameter = GetTestCaseParameters _&lt;br /&gt;            (objCurrentTestProperties(&lt;span class="str"&gt;"TEST_CASE_ID"&lt;/span&gt;))&lt;br /&gt;           &lt;br /&gt;            &lt;span class="rem"&gt;'Merge all parameters into one Dictionary&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;Set&lt;/span&gt; objTCParameter = MergeDictionaries (objTCParameter, objTCGlobalParameter)&lt;br /&gt;            &lt;span class="kwrd"&gt;Set&lt;/span&gt; objTCParameter = MergeDictionaries (objTestRun, objTCParameter)&lt;br /&gt;            &lt;span class="kwrd"&gt;Set&lt;/span&gt; objTCParameter = MergeDictionaries (objTCParameter, objCurrentTestProperties)&lt;br /&gt;            &lt;span class="kwrd"&gt;Set&lt;/span&gt; objTCParameter = MergeDictionaries (objTCParameter, objReferenceTestData)&lt;br /&gt;   &lt;br /&gt;            &lt;span class="rem"&gt;'Clean up&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;Set&lt;/span&gt; objCurrentTestProperties = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;Set&lt;/span&gt; objReferenceTestData = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;            &lt;span class="rem"&gt;'Report test case start&lt;/span&gt;&lt;br /&gt;            UpdateTestCaseStart objTCParameter&lt;br /&gt;            &lt;span class="kwrd"&gt;If&lt;/span&gt; objTCParameter(&lt;span class="str"&gt;"TEST_RUN_TOOL"&lt;/span&gt;) = &lt;span class="str"&gt;"QuickTestPro"&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;                &lt;span class="rem"&gt;'Initalize report dictionary&lt;/span&gt;&lt;br /&gt;                &lt;span class="kwrd"&gt;Set&lt;/span&gt; dicMetaDescription = CreateObject(&lt;span class="str"&gt;"Scripting.Dictionary"&lt;/span&gt;)&lt;br /&gt;                dicMetaDescription(&lt;span class="str"&gt;"Status"&lt;/span&gt;) = micDone &lt;span class="rem"&gt;'Default value&lt;/span&gt;&lt;br /&gt;                dicMetaDescription(&lt;span class="str"&gt;"PlainTextNodeName"&lt;/span&gt;) = _&lt;br /&gt;                &lt;span class="str"&gt;"Test Case#"&lt;/span&gt; &amp;amp; objTCParameter(&lt;span class="str"&gt;"TEST_SCENARIO_ID"&lt;/span&gt;) &amp;amp; &lt;span class="str"&gt;"."&lt;/span&gt; &amp;amp; objTCParameter(&lt;span class="str"&gt;"TEST_CASE_ID"&lt;/span&gt;) &amp;amp; &lt;span class="str"&gt;" - "&lt;/span&gt; &amp;amp; _&lt;br /&gt;                objTCParameter(&lt;span class="str"&gt;"TEST_CASE_DESCRIPTION"&lt;/span&gt;)&lt;br /&gt;                dicMetaDescription(&lt;span class="str"&gt;"StepHtmlInfo"&lt;/span&gt;) = objTCParameter(&lt;span class="str"&gt;"TEST_CASE_CATEGORY_NAME"&lt;/span&gt;) &amp;amp; _&lt;br /&gt;                &lt;span class="str"&gt;"&amp;lt;BR&amp;gt;&amp;lt;BR&amp;gt;"&lt;/span&gt; &amp;amp; objTCParameter(&lt;span class="str"&gt;"TEST_CASE_DESCRIPTION"&lt;/span&gt;)&lt;br /&gt;                &lt;span class="rem"&gt;'Some backdoor settings&lt;/span&gt;&lt;br /&gt;                dicMetaDescription(&lt;span class="str"&gt;"DllIconIndex"&lt;/span&gt;) = 206&lt;br /&gt;                dicMetaDescription(&lt;span class="str"&gt;"DllIconSelIndex"&lt;/span&gt;) = 206&lt;br /&gt;                dicMetaDescription(&lt;span class="str"&gt;"DllPAth"&lt;/span&gt;) = _&lt;br /&gt;                &lt;span class="str"&gt;"C:\Program Files\Mercury Interactive\QuickTest Professional\bin\ContextManager.dll"&lt;/span&gt;&lt;br /&gt;                intContext = Reporter.LogEvent(&lt;span class="str"&gt;"User"&lt;/span&gt;, dicMetaDescription, Reporter.GetContext)&lt;br /&gt;                &lt;span class="rem"&gt;'Set test case node as a parent&lt;/span&gt;&lt;br /&gt;                Reporter.SetContext intContext&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="rem"&gt;'Log all input parameters&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;If&lt;/span&gt; objTCParameter(&lt;span class="str"&gt;"TEST_RUN_TOOL"&lt;/span&gt;) = &lt;span class="str"&gt;"QuickTestPro"&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;                strTestCaseParameters = &lt;span class="str"&gt;""&lt;/span&gt;&lt;br /&gt;                allKeys = ArraySort_asc(allKeys)&lt;span class="rem"&gt;'Sort&lt;/span&gt;&lt;br /&gt;                &lt;span class="kwrd"&gt;For&lt;/span&gt; i = 0 &lt;span class="kwrd"&gt;to&lt;/span&gt; UBound(allKeys)&lt;br /&gt;                    strTestCaseParameters =  strTestCaseParameters &amp;amp; &lt;span class="str"&gt;"&amp;lt;TR&amp;gt;&amp;lt;TD&amp;gt;&amp;lt;B&amp;gt;"&lt;/span&gt; &amp;amp; _&lt;br /&gt;                    allKeys(i) &amp;amp; &lt;span class="str"&gt;"&amp;lt;/B&amp;gt;&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt; "&lt;/span&gt; &amp;amp; objTCParameter(allKeys(i)) &amp;amp; &lt;span class="str"&gt;"&amp;lt;/TD&amp;gt;&amp;lt;/TR&amp;gt;"&lt;/span&gt;&lt;br /&gt;                &lt;span class="kwrd"&gt;Next&lt;/span&gt;&lt;br /&gt;                dicMetaDescription(&lt;span class="str"&gt;"PlainTextNodeName"&lt;/span&gt;) = &lt;span class="str"&gt;"Input parameters"&lt;/span&gt;&lt;br /&gt;                dicMetaDescription(&lt;span class="str"&gt;"StepHtmlInfo"&lt;/span&gt;) = &lt;span class="str"&gt;"&amp;lt;DIV align=left&amp;gt;&amp;lt;TABLE STYLE="&lt;/span&gt;&lt;span class="str"&gt;"font-size: 8pt"&lt;/span&gt;&lt;span class="str"&gt;"&amp;gt;"&lt;/span&gt; &amp;amp; _&lt;br /&gt;                strTestCaseParameters &amp;amp; &lt;span class="str"&gt;"&amp;lt;/TABLE&amp;gt;&amp;lt;/DIV&amp;gt;"&lt;/span&gt;&lt;br /&gt;                Reporter.LogEvent &lt;span class="str"&gt;"User"&lt;/span&gt;, dicMetaDescription, Reporter.GetContext&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;'**********************************************************&lt;/span&gt;&lt;br /&gt;            &lt;span class="rem"&gt;'****** Execute test case and store output in object ******&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;Set&lt;/span&gt; objTCData = ExecuteTestCase (objTCParameter)&lt;span class="rem"&gt;'**********&lt;/span&gt;&lt;br /&gt;            &lt;span class="rem"&gt;'**********************************************************&lt;/span&gt;&lt;br /&gt;            &lt;span class="rem"&gt;'**********************************************************&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;            &lt;span class="rem"&gt;'Save output values&lt;/span&gt;&lt;br /&gt;            objTCData(&lt;span class="str"&gt;"TEST_RUN_RESULT_ROW_ID"&lt;/span&gt;) = objTCParameter(&lt;span class="str"&gt;"TEST_RUN_RESULT_ROW_ID"&lt;/span&gt;)&lt;br /&gt;            UpdateTestCaseOutParameters objTCData&lt;br /&gt;&lt;br /&gt;            &lt;span class="rem"&gt;'Log all output parameters and test result&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;If&lt;/span&gt; objTCParameter(&lt;span class="str"&gt;"TEST_RUN_TOOL"&lt;/span&gt;) = &lt;span class="str"&gt;"QuickTestPro"&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;                allKeysOut = objTCData.Keys   &lt;span class="rem"&gt;'Get all the keys into an array&lt;/span&gt;&lt;br /&gt;                allValuesOut = objTCData.Items   &lt;span class="rem"&gt;'Get all the items into an array&lt;/span&gt;&lt;br /&gt;                strTestCaseParameters = &lt;span class="str"&gt;""&lt;/span&gt;&lt;br /&gt;                allKeysOut = ArraySort_asc(allKeysOut)&lt;span class="rem"&gt;'Sort&lt;/span&gt;&lt;br /&gt;                &lt;span class="kwrd"&gt;For&lt;/span&gt; i = 0 &lt;span class="kwrd"&gt;to&lt;/span&gt; UBound(allKeysOut)&lt;br /&gt;                    &lt;span class="kwrd"&gt;If&lt;/span&gt; allValuesOut(i) &amp;lt;&amp;gt; &lt;span class="str"&gt;""&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;span class="rem"&gt;'Log parameters with values only&lt;/span&gt;&lt;br /&gt;                        strTestCaseParameters =  strTestCaseParameters &amp;amp; &lt;span class="str"&gt;"&amp;lt;TR&amp;gt;&amp;lt;TD&amp;gt;&amp;lt;B&amp;gt;"&lt;/span&gt; &amp;amp; allKeysOut(i) &amp;amp; _&lt;br /&gt;                        &lt;span class="str"&gt;"&amp;lt;/B&amp;gt;&amp;lt;/TD&amp;gt;&amp;lt;TD&amp;gt; "&lt;/span&gt; &amp;amp; objTCData.Item(allKeysOut(i)) &amp;amp; &lt;span class="str"&gt;"&amp;lt;/TD&amp;gt;&amp;lt;/TR&amp;gt;"&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;span class="rem"&gt;'Set test case result&lt;/span&gt;&lt;br /&gt;                &lt;span class="kwrd"&gt;Select&lt;/span&gt; &lt;span class="kwrd"&gt;Case&lt;/span&gt; objTCData(&lt;span class="str"&gt;"TEST_CASE_RESULT"&lt;/span&gt;)&lt;br /&gt;                    &lt;span class="kwrd"&gt;Case&lt;/span&gt; &lt;span class="str"&gt;"Passed"&lt;/span&gt;&lt;br /&gt;                        dicMetaDescription(&lt;span class="str"&gt;"Status"&lt;/span&gt;) = micPass&lt;br /&gt;                    &lt;span class="kwrd"&gt;Case&lt;/span&gt; &lt;span class="str"&gt;"Failed"&lt;/span&gt;&lt;br /&gt;                        dicMetaDescription(&lt;span class="str"&gt;"Status"&lt;/span&gt;) = micFail&lt;br /&gt;                    &lt;span class="kwrd"&gt;Case&lt;/span&gt; &lt;span class="str"&gt;"Warning"&lt;/span&gt;&lt;br /&gt;                        dicMetaDescription(&lt;span class="str"&gt;"Status"&lt;/span&gt;) = micWarning&lt;br /&gt;                    &lt;span class="kwrd"&gt;Case&lt;/span&gt; &lt;span class="kwrd"&gt;Else&lt;/span&gt;&lt;br /&gt;                        dicMetaDescription(&lt;span class="str"&gt;"Status"&lt;/span&gt;) = micDone&lt;br /&gt;                &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Select&lt;/span&gt;&lt;br /&gt;                dicMetaDescription(&lt;span class="str"&gt;"PlainTextNodeName"&lt;/span&gt;) = &lt;span class="str"&gt;"Output parameters"&lt;/span&gt;&lt;br /&gt;                dicMetaDescription(&lt;span class="str"&gt;"StepHtmlInfo"&lt;/span&gt;) = &lt;span class="str"&gt;"&amp;lt;DIV align=left&amp;gt;&amp;lt;TABLE STYLE="&lt;/span&gt;&lt;span class="str"&gt;"font-size: 8pt"&lt;/span&gt;&lt;span class="str"&gt;"&amp;gt;"&lt;/span&gt; &amp;amp; _&lt;br /&gt;                strTestCaseParameters &amp;amp; &lt;span class="str"&gt;"&amp;lt;/TABLE&amp;gt;&amp;lt;/DIV&amp;gt;"&lt;/span&gt;&lt;br /&gt;                Reporter.LogEvent &lt;span class="str"&gt;"User"&lt;/span&gt;, dicMetaDescription, Reporter.GetContext&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;'Merge data&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;Set&lt;/span&gt; objTCParameter = MergeDictionaries (objTCParameter, objTCData)&lt;br /&gt;   &lt;br /&gt;            &lt;span class="rem"&gt;'Report test case result&lt;/span&gt;&lt;br /&gt;            UpdateTestCaseStop objTCParameter&lt;br /&gt;            StoreTestCaseResult objTCParameter&lt;br /&gt;        &lt;br /&gt;            &lt;span class="rem"&gt;'In case of failure&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;If&lt;/span&gt; objTCParameter(&lt;span class="str"&gt;"TEST_CASE_RESULT"&lt;/span&gt;) = &lt;span class="str"&gt;"Failed"&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;                &lt;span class="rem"&gt;'Set UI type&lt;/span&gt;&lt;br /&gt;                &lt;span class="kwrd"&gt;If&lt;/span&gt; objTCParameter(&lt;span class="str"&gt;"TEST_CASE_GROUP_ID"&lt;/span&gt;) = &lt;span class="str"&gt;"5"&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;                    objTCParameter(&lt;span class="str"&gt;"TEST_INTERFACE"&lt;/span&gt;) = &lt;span class="str"&gt;"API"&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;Set&lt;/span&gt; objError = CreateErrorFiles (objTCParameter)&lt;br /&gt;                &lt;span class="kwrd"&gt;Set&lt;/span&gt; objTCParameter = MergeDictionaries (objTCParameter, objError)&lt;br /&gt;                &lt;span class="kwrd"&gt;If&lt;/span&gt; objTestRun(&lt;span class="str"&gt;"EMAIL_OPTION"&lt;/span&gt;) = &lt;span class="str"&gt;"True"&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;                    objTestRun(&lt;span class="str"&gt;"EMAIL_SUBJECT"&lt;/span&gt;) = &lt;span class="str"&gt;"Test case ID:"&lt;/span&gt; &amp;amp; objTCParameter(&lt;span class="str"&gt;"TEST_CASE_ID"&lt;/span&gt;) &amp;amp; &lt;span class="str"&gt;" - "&lt;/span&gt; &amp;amp; _&lt;br /&gt;                    objTCParameter(&lt;span class="str"&gt;"TEST_CASE_DESCRIPTION"&lt;/span&gt;) &amp;amp; &lt;span class="str"&gt;" failed"&lt;/span&gt;&lt;br /&gt;                    objTestRun(&lt;span class="str"&gt;"HTML_BODY"&lt;/span&gt;) = GetTestCaseErrorHTML(objTCParameter)&lt;br /&gt;                    SendEmail objTestRun&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;ElseIf&lt;/span&gt; objTCParameter(&lt;span class="str"&gt;"TEST_CASE_RESULT"&lt;/span&gt;) = &lt;span class="str"&gt;"Warning"&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;                    &lt;span class="kwrd"&gt;If&lt;/span&gt; objTestRun(&lt;span class="str"&gt;"TEST_RUN_TOOL"&lt;/span&gt;) = &lt;span class="str"&gt;"QuickTestPro"&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt; CloseAllBrowsers&lt;br /&gt;                    objTCGlobalParameter(&lt;span class="str"&gt;"TEST_RUN_STATE"&lt;/span&gt;) = &lt;span class="str"&gt;"stopped due to Warning"&lt;/span&gt;&lt;br /&gt;                &lt;span class="kwrd"&gt;If&lt;/span&gt; objTestRun(&lt;span class="str"&gt;"EMAIL_OPTION"&lt;/span&gt;) = &lt;span class="str"&gt;"True"&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;                    objTestRun(&lt;span class="str"&gt;"EMAIL_SUBJECT"&lt;/span&gt;) = GetTestSuiteSummary (objTCGlobalParameter)&lt;br /&gt;                    objTestRun(&lt;span class="str"&gt;"HTML_BODY"&lt;/span&gt;) = GetTestCaseResultRowsHTML(objTCGlobalParameter)&lt;br /&gt;                    SendEmail objTestRun&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="rem"&gt;'ExitTest&lt;/span&gt;&lt;br /&gt;                &lt;span class="kwrd"&gt;Exit&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&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;'Reset QTP report node&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;If&lt;/span&gt; objTestRun(&lt;span class="str"&gt;"TEST_RUN_TOOL"&lt;/span&gt;) = &lt;span class="str"&gt;"QuickTestPro"&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt; Reporter.UnSetContext&lt;br /&gt;   &lt;br /&gt;            &lt;span class="rem"&gt;'Reset test data&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;Set&lt;/span&gt; objTCData = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;             &lt;span class="rem"&gt;'Reset test case data&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;Set&lt;/span&gt; objTCParameter = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;&lt;br /&gt;           &lt;br /&gt;        &lt;span class="kwrd"&gt;Loop&lt;/span&gt; &lt;span class="rem"&gt;'Get next test case&lt;/span&gt;&lt;br /&gt;       &lt;br /&gt;        &lt;span class="rem"&gt;'Close all browsers&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;If&lt;/span&gt; objTestRun(&lt;span class="str"&gt;"TEST_RUN_TOOL"&lt;/span&gt;) = &lt;span class="str"&gt;"QuickTestPro"&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;            CloseAllBrowsers&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;        objTCGlobalParameter(&lt;span class="str"&gt;"TEST_RUN_STATE"&lt;/span&gt;) = &lt;span class="str"&gt;"finished"&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;If&lt;/span&gt; objTestRun(&lt;span class="str"&gt;"EMAIL_OPTION"&lt;/span&gt;) = &lt;span class="str"&gt;"True"&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;            objTestRun(&lt;span class="str"&gt;"EMAIL_SUBJECT"&lt;/span&gt;) = GetTestSuiteSummary (objTCGlobalParameter)&lt;br /&gt;            objTestRun(&lt;span class="str"&gt;"HTML_BODY"&lt;/span&gt;) = GetTestCaseResultRowsHTML (objTCGlobalParameter)&lt;br /&gt;            SendEmail objTestRun&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;'Update Test summary&lt;/span&gt;&lt;br /&gt;        UpdateSummary objTCGlobalParameter(&lt;span class="str"&gt;"TEST_RUN_RESULT_SUMMARY_ID"&lt;/span&gt;), &lt;span class="str"&gt;"TEST_RUN_STATUS"&lt;/span&gt;, &lt;span class="str"&gt;"Complete"&lt;/span&gt;&lt;br /&gt;        UpdateSummary objTCGlobalParameter(&lt;span class="str"&gt;"TEST_RUN_RESULT_SUMMARY_ID"&lt;/span&gt;), &lt;span class="str"&gt;"TEST_RUN_STOP"&lt;/span&gt;, &lt;span class="kwrd"&gt;Cstr&lt;/span&gt;(Now())&lt;br /&gt;   &lt;br /&gt;        &lt;span class="rem"&gt;'Clean&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;Set&lt;/span&gt; objTCGlobalParameter = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;&lt;br /&gt;       &lt;br /&gt;    &lt;span class="kwrd"&gt;Loop&lt;/span&gt; &lt;span class="rem"&gt;'Get next test run&lt;/span&gt;&lt;br /&gt;   &lt;br /&gt;    &lt;span class="rem"&gt;'Reset TestRun option&lt;/span&gt;&lt;br /&gt;    ResetTestRun intTestRunOptionID, &lt;span class="str"&gt;"TestDone"&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="rem"&gt;'***********&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;'*** END ***&lt;/span&gt;&lt;br /&gt;'***********&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-1303036611083327660?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/1303036611083327660/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=1303036611083327660' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/1303036611083327660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/1303036611083327660'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/05/test-suite-driver-script.html' title='Test suite driver script'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-4431501205851127971</id><published>2008-05-28T12:43:00.002+02:00</published><updated>2008-05-28T13:01:49.279+02:00</updated><title type='text'>Sharing Code base with QTP</title><content type='html'>As I mentioned before some test automation can be executed via a vbs stand-alone file instead of using QTP. How do you do that without the need of multiple code basis or branches?&lt;br /&gt;&lt;br /&gt;The solution (the function getTextFileContent can be found in a previous post):&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span class="rem"&gt;'************************************&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;'*** AUT test suite driver script ***&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;'*** vbs standalone version       ***&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;'*** by Stefan Thelenius May 2008 ***&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;'************************************&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;'Load common functions from library&lt;/span&gt;&lt;br /&gt;Execute getTextFileContent(&lt;span class="str"&gt;"\\server\path\libraryFileName"&lt;/span&gt;,&lt;span class="str"&gt;"Unicode"&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;'Set initial test run option parameter&lt;/span&gt;&lt;br /&gt;strRunCode = &lt;span class="str"&gt;"intTestRunOptionId = 2"&lt;/span&gt; &amp;amp; vbLF&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;'Load QTP test code&lt;/span&gt;&lt;br /&gt;strRunCode = strRunCode &amp;amp; _&lt;br /&gt;getTextFileContent(&lt;span class="str"&gt;"\\server\path\yourQTPTestName\Action1\Script.mts"&lt;/span&gt;,&lt;span class="str"&gt;"utf-8"&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;'Execute test&lt;/span&gt;&lt;br /&gt;Execute strRunCode&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Pros:&lt;br /&gt;Faster execution time&lt;br /&gt;Licence free&lt;br /&gt;&lt;br /&gt;Cons:&lt;br /&gt;No run-time debugging&lt;br /&gt;Not possible to use QTP features (Test object model...)&lt;br /&gt;Need to implement parameter "TestTool" (If objParameter("TestTool") = "QTP" Then) for all QTP specific code lines, for example using the QTP native Reporter object.&lt;br /&gt;&lt;br /&gt;I use it for Web Service testing and some URL bases web testing. Those test can executed via QTP as well using this concept (just change one parameter) so I usally run the test via QTP at first so debugging is possible and when stable I use my vbs-file instead.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-4431501205851127971?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/4431501205851127971/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=4431501205851127971' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/4431501205851127971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/4431501205851127971'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/05/sharing-code-base-with-qtp.html' title='Sharing Code base with QTP'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-492101449414266899</id><published>2008-05-27T11:38:00.003+02:00</published><updated>2008-05-27T11:49:29.584+02:00</updated><title type='text'>QTP: Test execution performance</title><content type='html'>One of my Web Service test suites has 174 test cases and it takes QTP 7 minutes to execute them all. At first it may seems to be a resonable amount of time, especially compared to simular GUI operations which would have taken hours in test execution.&lt;br /&gt;&lt;br /&gt;When I execute the same test suite running as a vbs-file instead I'm down to 1 minute and 45 seconds!&lt;br /&gt;&lt;br /&gt;What are the differences? The code is the same apart from that all QTP specific log functions like Reporter are replaced by custom logging to files (which should be slower since 1 folder and 2 xml-files are created for each test case).&lt;br /&gt;&lt;br /&gt;My conclusion is that QTP has a lot of overhead features which affects test execution performance in a negative way, especially considering that must features are not that useful in the long run (at least not for me).&lt;br /&gt;&lt;br /&gt;Ps. My QTP settings are Run mode "fast" and no QTP recovery scenario is involved&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-492101449414266899?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/492101449414266899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=492101449414266899' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/492101449414266899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/492101449414266899'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/05/qtp-test-execution-performance.html' title='QTP: Test execution performance'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-8448496416572517965</id><published>2008-05-23T11:48:00.003+02:00</published><updated>2008-05-24T09:05:37.871+02:00</updated><title type='text'>Handling of different AUT versions/configurations in automation</title><content type='html'>My main AUT is a standard system for pension, insurance and fund administration. Since business logic is complex for those areas, the AUT is also a very complex system with lots of functionality which normally for a typical major finance company are distributed at several different systems.&lt;br /&gt;&lt;br /&gt;The AUT has a release cycle of at least 4 major releases/year and some test object properties changes for each release. In addition the AUT has different customer configurations which in worst case results in slightly different ways to handle the business logic.&lt;br /&gt;&lt;br /&gt;How to handle that situation in automation in a cost effective way?&lt;br /&gt;&lt;br /&gt;Well, totally unaware of what best practise is in this area I have implemented the following solution:&lt;br /&gt;&lt;br /&gt;1. One of my favorite developers did on my request a web service where you get the AUT release number.&lt;br /&gt;2. Using the WS I begin each test suite execution to store the release number into a parameter which is passed to most functions via a Dictionary (see prevoius posts).&lt;br /&gt;3. Each test case data set has a customer configuration id which is also becomes a "global" parameter.&lt;br /&gt;4. Within each test case code I use the parameters to handle release/customer specific behaviour by using if or select statements (not nice but it works)&lt;br /&gt;&lt;br /&gt;If objParameter("Release") &lt;= "2.3.1" Then&lt;br /&gt;'Do the old way&lt;br /&gt;Else&lt;br /&gt;'Do the new way&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;5. When a release no longer is supported (after a year or so) I remove statements which is absolete.&lt;br /&gt;&lt;br /&gt;In some rare cases I have to branch a test scenario data set (which is a set of nested test cases) if for example the test case execution order changes due to major change of business logic.&lt;br /&gt;&lt;br /&gt;Fortunatly in most cases a generic behaviour/test properties works for all releases and customer configurations...which is main idea for a standard system :-)&lt;br /&gt;&lt;br /&gt;One advantage with this approach is that I need only one set of "production" automation code (no code branching which I guess is the main alternative) which can be executed to different test environments containing different versions/configurations at any time.&lt;br /&gt;&lt;br /&gt;Since we also handle AUT service updates between the major releases for each customer this is quite handy I think since it allows for backward automation compability as well as new automation features does not have to be implemented to several code basis.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-8448496416572517965?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/8448496416572517965/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=8448496416572517965' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/8448496416572517965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/8448496416572517965'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/05/handling-of-different-aut.html' title='Handling of different AUT versions/configurations in automation'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-2948823404845504122</id><published>2008-05-08T10:46:00.002+02:00</published><updated>2008-05-08T10:53:26.159+02:00</updated><title type='text'>"...test data independant"</title><content type='html'>"...test data independant" (from post last week)&lt;br /&gt;&lt;br /&gt;What do I mean by that ?&lt;br /&gt;&lt;br /&gt;In automation, I try to avoid hard-coded test data which depends on whether the AUT database is in "start-position" or not.&lt;br /&gt;&lt;br /&gt;Mostly I create test data during run-time using random values or getting random data from the AUT database which match my critera for the specific test case.&lt;br /&gt;&lt;br /&gt;Consider a test case where you want to change an address for example. Here is an approach you could use (in pseudo-code]:&lt;br /&gt;&lt;br /&gt;Select top 1 [myAddressColumns] from ADDRESS where [myCritera = True] order by newid() 'Note! Newid() MS SQL Server specificOptional&lt;br /&gt;If blnNoAddressFound Then call createAddress 'In case of empty database call test case/method for create an address&lt;br /&gt;&lt;br /&gt;Advantages:&lt;br /&gt;Test case can be executed to any AUT database (empty or full)&lt;br /&gt;You get test data variation using random values&lt;br /&gt;&lt;br /&gt;Disadvantages:&lt;br /&gt;It is more difficult to implement compare methods (but not impossible)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-2948823404845504122?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/2948823404845504122/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=2948823404845504122' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/2948823404845504122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/2948823404845504122'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/05/test-data-independant.html' title='&quot;...test data independant&quot;'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-8167072952685823708</id><published>2008-04-25T10:41:00.005+02:00</published><updated>2008-04-27T19:34:44.911+02:00</updated><title type='text'>SQL - a tester's best friend?</title><content type='html'>If you work with applications which has a database, good skills in SQL are required in order to be an efficiant tester (unless you sitting next to a friendly DBA).&lt;br /&gt;&lt;br /&gt;With SQL (and other database operations) you can:&lt;br /&gt;&lt;br /&gt;1. Find, change, create or delete test data&lt;br /&gt;2. Do backup and restore of databases&lt;br /&gt;3. Plus a lot of other useful things, for example you learn much about the application through the database/data model&lt;br /&gt;&lt;br /&gt;If you cannot perform 1 and 2 by yourself you will encounter serious bottlenecks in your testing progress.&lt;br /&gt;&lt;br /&gt;So, what you need are:&lt;br /&gt;&lt;br /&gt;1. Learn basic SQL (select)&lt;br /&gt;2. Get proper account settings in your test environment(s) database(s) - read only&lt;br /&gt;3. Learn advanced SQL (join, update, insert, store procedures, backup/restore, temp tables etc)&lt;br /&gt;4. Get proper account settings in your test environment(s) database(s) - SA or at least anything close&lt;br /&gt;&lt;br /&gt;Beware, you must prove yourself worthy for the DBA to achieve no. 4&lt;br /&gt;&lt;br /&gt;I went from stage 1 to 4 in a few months just by self-study articles and other people's SQL. I am not considering myself being a skilled DBA but for my testing purposes I am doing quite OK. Also in automation knowing SQL is priceless in order to get your automation test case dynamic and testdata independant. Further more you can build a lot of AUT specfic test tools which will improve your testing dramaticly.&lt;br /&gt;&lt;br /&gt;Over and out...&lt;br /&gt;&lt;br /&gt;ps.&lt;br /&gt;&lt;br /&gt;Here is a list of my favourite database engines which I have worked with in my testing over the years (ranked from a user friendly perspective):&lt;br /&gt;&lt;br /&gt;1. Microsoft SQL Server 2005&lt;br /&gt;2. Oracle (don't remember version no)&lt;br /&gt;3. DB2 (don't remember version no)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-8167072952685823708?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/8167072952685823708/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=8167072952685823708' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/8167072952685823708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/8167072952685823708'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/04/sql-testers-best-friend.html' title='SQL - a tester&apos;s best friend?'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-441869762839230985</id><published>2008-04-11T10:23:00.002+02:00</published><updated>2008-04-11T10:45:41.485+02:00</updated><title type='text'>VBScript: Reading text files</title><content type='html'>Until now I have used the FileSystemObject (FSO) when reading text files in automation but this week I wanted to read a utf-8 encoded file which did not work using FSO. I used my standard approach dealing with this kind of problem:&lt;br /&gt;&lt;br /&gt;1. Collect information about the issue (mainly using Google)&lt;br /&gt;2. Analyze information and design solution&lt;br /&gt;3. Implement solution&lt;br /&gt;&lt;br /&gt;So I found another COM-object which can be used reading files which seems to manage most of the Char Sets I normally deal with: Adodb.Stream&lt;br /&gt;&lt;br /&gt;The result (&lt;a href="http://abouttesting.fileave.com/getFileContent.vbs"&gt;getFileContent.vbs&lt;/a&gt;):&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span class="kwrd"&gt;Function&lt;/span&gt; getTextFileContent (strFileName, strCharSet)&lt;br /&gt;&lt;span class="kwrd"&gt;Const&lt;/span&gt; adTypeBinary = 1 &lt;span class="rem"&gt;'not used&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Const&lt;/span&gt; adTypeText = 2&lt;br /&gt;&lt;span class="rem"&gt;'Set default CharSet&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;If&lt;/span&gt; strCharSet = &lt;span class="str"&gt;""&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt; strCharSet = &lt;span class="str"&gt;"ASCII"&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;' *** CharSets ***&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;'    Windows-1252&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;'    Windows-1257&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;'    UTF-16&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;'    UTF-8&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;'    UTF-7&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;'    ASCII&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;'    X-ANSI&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;'   iso-8859-2&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; objStreamFile = CreateObject(&lt;span class="str"&gt;"Adodb.Stream"&lt;/span&gt;)&lt;br /&gt;&lt;span class="kwrd"&gt;With&lt;/span&gt; objStreamFile&lt;br /&gt;    .CharSet = strCharSet&lt;br /&gt;    .Type= adTypeText&lt;br /&gt;    .Open&lt;br /&gt;    .LoadFromFile strFileName&lt;br /&gt;    getTextFileContent = .readText&lt;br /&gt;    .Close&lt;br /&gt;&lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;With&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; objStreamFile = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-441869762839230985?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/441869762839230985/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=441869762839230985' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/441869762839230985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/441869762839230985'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/04/vbscript-reading-text-files.html' title='VBScript: Reading text files'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-6405775088260704436</id><published>2008-04-02T10:26:00.006+02:00</published><updated>2008-04-02T15:32:44.106+02:00</updated><title type='text'>QTP: Debug class for Dictionary</title><content type='html'>As I mentioned earlier, I use the Dictionary object a lot in my test framework. However it requires some extra efforts when debugging in QTP compared to ordinary variables since your Keys and Items are not visable by default in Debug viewer's Variables tab. You either manually add Keys to the Watch tab or add extra code where your Dictionary Keys and Items are stored in an array:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;arrKeys = objDictionary.Keys&lt;br /&gt;arrValues = objDictionary.Items&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The last couple of days I have tried to learn a bit about Classes in VBScript and I noticed that a class public variables are available in QTP's Debug Variables tab in alphabetic order. That made me come up with this crazy idea to maybe replace the use of Dictionary object with a custom class instead...but Classes in VBScript seems a bit limited according to my requirements. However, for debugging purposes it could be nice to create a "Class copy object" of a Dictionary:&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span style="font-size:85%;"&gt;&lt;span class="rem"&gt;'Create a dictionary object and add some parameters&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; objDictionary = CreateObject(&lt;span class="str"&gt;"Scripting.Dictionary"&lt;/span&gt;)&lt;br /&gt;objDictionary.Add &lt;span class="str"&gt;"A_Parameter"&lt;/span&gt;,&lt;span class="str"&gt;"47"&lt;/span&gt;&lt;br /&gt;objDictionary.Add &lt;span class="str"&gt;"Z_Parameter"&lt;/span&gt;,&lt;span class="str"&gt;""&lt;/span&gt;&lt;br /&gt;objDictionary.Add &lt;span class="str"&gt;"C_Parameter"&lt;/span&gt;,&lt;span class="str"&gt;"11"&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;'Create a class out of the dictionary and a new debug object&lt;/span&gt;&lt;br /&gt;Execute CreateClass(&lt;span class="str"&gt;"DebugDictionary"&lt;/span&gt;, objDictionary)&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; objDictionaryDebug = &lt;span class="kwrd"&gt;New&lt;/span&gt; DebugDictionary&lt;br /&gt;&lt;span class="rem"&gt;'Display A_Parameter value&lt;/span&gt;&lt;br /&gt;Msgbox objDictionaryDebug.C_Parameter&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; objDictionaryDebug = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; objDictionary = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Function&lt;/span&gt; CreateClass (strClassName, objDictionary)&lt;br /&gt;&lt;span class="rem"&gt;'* Create Class string from Dictionary object&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;'* By Stefan Thelenius 2008-04-02&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;'* Usage example: Execute CreateClass("MyClass", objDictionary)&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;'Get keys and values into arrays&lt;/span&gt;&lt;br /&gt;arrKeys = objDictionary.Keys&lt;br /&gt;arrValues = objDictionary.Items&lt;br /&gt;&lt;span class="kwrd"&gt;For&lt;/span&gt; i = 0 &lt;span class="kwrd"&gt;to&lt;/span&gt; UBound(arrKeys)&lt;br /&gt;    &lt;span class="rem"&gt;'Create Public variables&lt;/span&gt;&lt;br /&gt;    strClassPublicVar = strClassPublicVar &amp;amp; &lt;span class="str"&gt;"Public "&lt;/span&gt; &amp;amp; arrKeys(i) &amp;amp; vbLf&lt;br /&gt;    &lt;span class="rem"&gt;'Set default values to variables&lt;/span&gt;&lt;br /&gt;    strClassPublicInit = strClassPublicInit &amp;amp; arrKeys(i) &amp;amp; &lt;span class="str"&gt;"="&lt;/span&gt;&lt;span class="str"&gt;""&lt;/span&gt; &amp;amp; arrValues(i) &amp;amp; &lt;span class="str"&gt;""&lt;/span&gt;&lt;span class="str"&gt;""&lt;/span&gt; &amp;amp; vbLf&lt;br /&gt;&lt;span class="kwrd"&gt;Next&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;'Add number of Keys as Count Int&lt;/span&gt;&lt;br /&gt;strClassPublicVar = strClassPublicVar &amp;amp; &lt;span class="str"&gt;"Public Count"&lt;/span&gt; &amp;amp; vbLf&lt;br /&gt;strClassPublicInit = strClassPublicInit &amp;amp; &lt;span class="str"&gt;"Count="&lt;/span&gt; &amp;amp; UBound(arrKeys)+1 &amp;amp; vbLf&lt;br /&gt;&lt;span class="rem"&gt;'Set Class and initializer&lt;/span&gt;&lt;br /&gt;strClassStart = &lt;span class="str"&gt;"Class "&lt;/span&gt; &amp;amp; strClassName &amp;amp; vbLf&lt;br /&gt;strClassEnd = &lt;span class="str"&gt;"End Class"&lt;/span&gt;&lt;br /&gt;strClassInitStart = &lt;span class="str"&gt;"Private Sub Class_Initialize"&lt;/span&gt; &amp;amp; vbLf&lt;br /&gt;strClassInitEnd = &lt;span class="str"&gt;"End Sub"&lt;/span&gt; &amp;amp; vbLf&lt;br /&gt;&lt;span class="rem"&gt;'Return class string&lt;/span&gt;&lt;br /&gt;CreateClass = strClassStart &amp;amp; strClassPublicVar &amp;amp; strClassInitStart &amp;amp; strClassPublicInit &amp;amp; _&lt;br /&gt;    strClassInitEnd &amp;amp; strClassEnd&lt;br /&gt;&lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;Above code example is available for download here: &lt;a href="http://abouttesting.fileave.com/DictionaryClass.vbs"&gt;http://abouttesting.fileave.com/DictionaryClass.vbs&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;When using QTP the debug view looks like this:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp3.blogger.com/_4tHQNkQA_gI/R_Nf7F_Si5I/AAAAAAAAACg/TychZUNKsGU/s1600-h/debug.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184593064858127250" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_4tHQNkQA_gI/R_Nf7F_Si5I/AAAAAAAAACg/TychZUNKsGU/s400/debug.PNG" 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/5047841583820836253-6405775088260704436?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/6405775088260704436/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=6405775088260704436' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/6405775088260704436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/6405775088260704436'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/04/qtp-debug-class-for-dictionary.html' title='QTP: Debug class for Dictionary'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_4tHQNkQA_gI/R_Nf7F_Si5I/AAAAAAAAACg/TychZUNKsGU/s72-c/debug.PNG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-8092056449187457896</id><published>2008-03-25T09:42:00.011+01:00</published><updated>2010-09-03T08:31:40.915+02:00</updated><title type='text'>XML automation - Part V - Validate XML response</title><content type='html'>This is the last part...but I will try to summarize the posts in an article later on...maybe I will add more features, for example how to handle attributes and multiple elements.&lt;br /&gt;&lt;br /&gt;All the example code and files are available in compressed format &lt;a href="http://dl.dropbox.com/u/8538167/TestFiles/WebServiceExample.zip"&gt;here&lt;/a&gt; for download.&lt;br /&gt;&lt;br /&gt;Please note that I have changed the test case parameter ConvertTempResult to #ConvertTempResult in order to mark up output parameters.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp0.blogger.com/_4tHQNkQA_gI/R-jHZF_Si4I/AAAAAAAAACY/s3oaFvOcRxk/s1600-h/tc.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5181610605208046466" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_4tHQNkQA_gI/R-jHZF_Si4I/AAAAAAAAACY/s3oaFvOcRxk/s400/tc.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here is the function for response validation:&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span class="kwrd"&gt;Function&lt;/span&gt; validateXMLResponse (objDictionary)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; xmlDoc = CreateObject(&lt;span class="str"&gt;"Msxml2.DOMDocument"&lt;/span&gt;)&lt;br /&gt;&lt;span class="rem"&gt;'loadXML&lt;/span&gt;&lt;br /&gt;xmlDoc.loadXML(objDictionary.Item(&lt;span class="str"&gt;"XMLResponse"&lt;/span&gt;))&lt;br /&gt;&lt;span class="rem"&gt;'Check XML syntax&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;If&lt;/span&gt; (xmlDoc.parseError.errorCode &amp;lt;&amp;gt; 0) &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; myErr = xmlDoc.parseError&lt;br /&gt;objDictionary.Item(&lt;span class="str"&gt;"XMLResponseResult"&lt;/span&gt;) = &lt;span class="str"&gt;"Failed"&lt;/span&gt;&lt;br /&gt;objDictionary.Item(&lt;span class="str"&gt;"XMLResponseResultDetails"&lt;/span&gt;) = &lt;span class="str"&gt;"ERROR: "&lt;/span&gt; &amp;amp; myErr.reason&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; validateXMLResponse = objDictionary&lt;br /&gt;&lt;span class="kwrd"&gt;Exit&lt;/span&gt; &lt;span class="kwrd"&gt;Function&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;Set&lt;/span&gt; root = xmlDoc.documentElement&lt;br /&gt;&lt;span class="rem"&gt;'Put all test parameters in array&lt;/span&gt;&lt;br /&gt;arrAllKeys = objDictionary.Keys&lt;br /&gt;arrAllValues = objDictionary.Items&lt;br /&gt;&lt;span class="rem"&gt;'Update values&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;For&lt;/span&gt; i = 0 &lt;span class="kwrd"&gt;to&lt;/span&gt; Ubound(arrAllKeys)&lt;br /&gt;&lt;span class="rem"&gt;'Only process #-type parameters&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;If&lt;/span&gt; Left(arrAllKeys(i),1) = &lt;span class="str"&gt;"#"&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;strParameterElementName = arrAllKeys(i)&lt;br /&gt;strParameterElementName = Right(strParameterElementName,Len(strParameterElementName)-1)&lt;br /&gt;strParameterElementValueExpected = arrAllValues(i)&lt;br /&gt;&lt;span class="rem"&gt;'Get element and value&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; node = root.getElementsByTagName(strParameterElementName)&lt;br /&gt;&lt;span class="kwrd"&gt;If&lt;/span&gt; node.Length &amp;gt; 0 &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;For&lt;/span&gt; n = 0 &lt;span class="kwrd"&gt;to&lt;/span&gt; node.Length-1&lt;br /&gt;&lt;span class="rem"&gt;'Return actual value in [element]_Out&lt;/span&gt;&lt;br /&gt;objDictionary.Item(strParameterElementName &amp;amp; &lt;span class="str"&gt;"_Out"&lt;/span&gt;) = node.Item(n).Text&lt;br /&gt;strParameterElementValueActual = node.Item(n).Text&lt;br /&gt;&lt;span class="rem"&gt;'Set result&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;If&lt;/span&gt; strParameterElementValueExpected = strParameterElementValueActual &lt;span class="kwrd"&gt;AND&lt;/span&gt; _&lt;br /&gt;objDictionary.Item(&lt;span class="str"&gt;"XMLResponseResult"&lt;/span&gt;) &amp;lt;&amp;gt; &lt;span class="str"&gt;"Failed"&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;objDictionary.Item(&lt;span class="str"&gt;"XMLResponseResult"&lt;/span&gt;) = &lt;span class="str"&gt;"Passed"&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Else&lt;/span&gt;&lt;br /&gt;objDictionary.Item(&lt;span class="str"&gt;"XMLResponseResult"&lt;/span&gt;) = &lt;span class="str"&gt;"Failed"&lt;/span&gt;&lt;br /&gt;objDictionary.Item(&lt;span class="str"&gt;"XMLResponseResultDetails"&lt;/span&gt;) = objDictionary.Item(&lt;span class="str"&gt;"XMLResponseResultDetails"&lt;/span&gt;) &amp;amp; _&lt;br /&gt;strParameterElementName &amp;amp; &lt;span class="str"&gt;" = "&lt;/span&gt; &amp;amp; strParameterElementValueActual &amp;amp; &lt;span class="str"&gt;" , expected value "&lt;/span&gt; &amp;amp; _&lt;br /&gt;strParameterElementValueExpected &amp;amp; &lt;span class="str"&gt;" ;"&lt;/span&gt; &lt;span class="rem"&gt;'use ; as separator&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;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;Set&lt;/span&gt; node = &lt;span class="kwrd"&gt;Nothing&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;span class="rem"&gt;'Return&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; validateXMLResponse = objDictionary&lt;br /&gt;&lt;span class="rem"&gt;'Clean up&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; root = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; xmlDoc = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;End Function&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;So finally we have these steps all together:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="rem"   style="font-family:courier new;font-size:85%;"&gt;' Example of XML/Web Service automation in VBScript using WinHttp, XML DOM and ADO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span class="rem"&gt;' by Stefan Thelenius march 2008&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;'Set test case id and data source file&lt;/span&gt;&lt;br /&gt;intTestCaseID = 1&lt;br /&gt;strMyDataFile = &lt;span class="str"&gt;"c:\MyTestData.xls"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;'Get test case parameters&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; objMyTestParameters = getTestParametersIntoDictionary (strMyDataFile, _&lt;br /&gt;&lt;span class="str"&gt;"TestCase"&lt;/span&gt;, &lt;span class="str"&gt;"TestCaseID"&lt;/span&gt;, intTestCaseID)&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;'Get global parameters&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; objMyGlobalParameters = getTestParametersIntoDictionary (strMyDataFile, _&lt;br /&gt;&lt;span class="str"&gt;"Global"&lt;/span&gt;, &lt;span class="str"&gt;"GlobalID"&lt;/span&gt;, objMyTestParameters.Item(&lt;span class="str"&gt;"GlobalID"&lt;/span&gt;))&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;'Merge parameters&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; objMyTestParameters = mergeDictionaries (objMyGlobalParameters, objMyTestParameters)&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;'Create request from template&lt;/span&gt;&lt;br /&gt;objMyTestParameters.Item(&lt;span class="str"&gt;"XMLRequest"&lt;/span&gt;) = getXMLTemplate (objMyTestParameters.Item(&lt;span class="str"&gt;"XMLTemplateFile"&lt;/span&gt;), _&lt;br /&gt;objMyTestParameters.Item(&lt;span class="str"&gt;"XMLTemplate"&lt;/span&gt;))&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;'Insert test parameters&lt;/span&gt;&lt;br /&gt;objMyTestParameters.Item(&lt;span class="str"&gt;"XMLRequest"&lt;/span&gt;) = setTestParametersInXMLRequest (objMyTestParameters)&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;'Send request&lt;/span&gt;&lt;br /&gt;objMyTestParameters.Item(&lt;span class="str"&gt;"XMLResponse"&lt;/span&gt;) = sendXMLRequest (objMyTestParameters)&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;'Validate response&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; objMyTestParameters = validateXMLResponse (objMyTestParameters)&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;'Display output&lt;/span&gt;&lt;br /&gt;Msgbox objMyTestParameters.Item(&lt;span class="str"&gt;"XMLResponse"&lt;/span&gt;)&lt;br /&gt;Msgbox objMyTestParameters.Item(&lt;span class="str"&gt;"XMLResponseResult"&lt;/span&gt;)&lt;br /&gt;Msgbox objMyTestParameters.Item(&lt;span class="str"&gt;"XMLResponseResultDetails"&lt;/span&gt;)&lt;br /&gt;Msgbox objMyTestParameters.Item(&lt;span class="str"&gt;"ConvertTempResult_Out"&lt;/span&gt;)&lt;/span&gt; &lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-8092056449187457896?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/8092056449187457896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=8092056449187457896' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/8092056449187457896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/8092056449187457896'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/03/xml-automation-part-v-validate-xml.html' title='XML automation - Part V - Validate XML response'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_4tHQNkQA_gI/R-jHZF_Si4I/AAAAAAAAACY/s3oaFvOcRxk/s72-c/tc.png' height='72' width='72'/><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-4598167667843581245</id><published>2008-03-19T20:08:00.002+01:00</published><updated>2008-03-19T20:30:47.273+01:00</updated><title type='text'>AdvancedQTP</title><content type='html'>I am joining forces with the team behind &lt;a href="http://www.advancedqtp.com/"&gt;AdvancedQTP&lt;/a&gt; as a moderator for some of their forums. The site is an excellent resource regarding QTP and vbScript and I strongly recommend it as first stop knowledge base since HP/Mercury's dito is hard to find these days...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-4598167667843581245?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/4598167667843581245/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=4598167667843581245' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/4598167667843581245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/4598167667843581245'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/03/advancedqtp.html' title='AdvancedQTP'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-4404728683536276403</id><published>2008-03-11T13:57:00.006+01:00</published><updated>2008-03-11T14:52:23.384+01:00</updated><title type='text'>XML automation - Part IV - Sending XML request</title><content type='html'>This week it is time to send the Web Service request and recieve a response...I have also added some Global parameters in a new sheet in my Excel file so that we can handle test environment properties and so on:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp1.blogger.com/_4tHQNkQA_gI/R9aEgLnpgtI/AAAAAAAAACQ/fJr-lq_NVMY/s1600-h/global.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5176470510118732498" style="CURSOR: hand" alt="" src="http://bp1.blogger.com/_4tHQNkQA_gI/R9aEgLnpgtI/AAAAAAAAACQ/fJr-lq_NVMY/s400/global.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A also added a function for merging Dictionary objects which I use sometimes in my framework. It might not be the best code design approach but I think the concept works well, create a number of dictionaries, merge them together and pass one dictionary to the test case including all test parameters. &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;Function&lt;/span&gt; mergeDictionaries (objDIC1, objDIC2)&lt;br /&gt;&lt;span class="kwrd"&gt;If&lt;/span&gt; IsObject(objDIC2) &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;    allKeys = objDIC2.Keys&lt;br /&gt;    allItems = objDIC2.Items&lt;br /&gt;    &lt;span class="kwrd"&gt;For&lt;/span&gt; i = 0 &lt;span class="kwrd"&gt;To&lt;/span&gt; objDIC2.Count - 1 &lt;span class="rem"&gt;'Iterate through the array&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;If&lt;/span&gt; objDIC1.Exists(allKeys(i)) &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;            &lt;span class="rem"&gt;'Value in objDIC2 is master&lt;/span&gt;&lt;br /&gt;            objDIC1.Item(allKeys(i)) = allItems(i)&lt;br /&gt;            &lt;span class="kwrd"&gt;Else&lt;/span&gt;&lt;br /&gt;            objDIC1.Add allKeys(i),allItems(i)&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;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;Set&lt;/span&gt; mergeDictionaries = objDIC1&lt;br /&gt;&lt;span class="kwrd"&gt;End&lt;/span&gt; Function&lt;/pre&gt;And finally the funcion for sending the request&lt;br /&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;span class="kwrd"&gt;Function&lt;/span&gt; sendXMLRequest (objDictionary)&lt;br /&gt;&lt;span class="kwrd"&gt;Dim&lt;/span&gt; WinHttpReq&lt;br /&gt;&lt;span class="kwrd"&gt;Const&lt;/span&gt; HTTPREQUEST_SETCREDENTIALS_FOR_SERVER = 0&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; WinHttpReq = CreateObject(&lt;span class="str"&gt;"WinHttp.WinHttpRequest.5.1"&lt;/span&gt;)&lt;br /&gt;WinHttpReq.Open &lt;span class="str"&gt;"POST"&lt;/span&gt;, objDictionary.Item(&lt;span class="str"&gt;"PostURL"&lt;/span&gt;), &lt;span class="kwrd"&gt;False&lt;/span&gt;&lt;br /&gt;WinHttpReq.setRequestHeader &lt;span class="str"&gt;"Content-Type"&lt;/span&gt;, &lt;span class="str"&gt;"text/xml;charset=utf-8"&lt;/span&gt;&lt;br /&gt;WinHttpReq.setRequestHeader &lt;span class="str"&gt;"Accept"&lt;/span&gt;, _&lt;br /&gt;&lt;span class="str"&gt;"text/xml, multipart/related, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"&lt;/span&gt;&lt;br /&gt;WinHttpReq.setRequestHeader &lt;span class="str"&gt;"Content-Transfer-Encoding"&lt;/span&gt;, &lt;span class="str"&gt;"binary"&lt;/span&gt;&lt;br /&gt;WinHttpReq.setRequestHeader &lt;span class="str"&gt;"Connection"&lt;/span&gt;, &lt;span class="str"&gt;"keep-alive"&lt;/span&gt;&lt;br /&gt;WinHttpReq.setRequestHeader &lt;span class="str"&gt;"SOAPAction"&lt;/span&gt;, objDictionary.Item(&lt;span class="str"&gt;"SOAPAction"&lt;/span&gt;)&lt;br /&gt;&lt;span class="kwrd"&gt;If&lt;/span&gt; objDictionary.Item(&lt;span class="str"&gt;"UserName"&lt;/span&gt;) &amp;lt;&amp;gt; &lt;span class="str"&gt;""&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;    &lt;br /&gt;    WinHttpReq.SetCredentials objDictionary.Item(&lt;span class="str"&gt;"UserName"&lt;/span&gt;), objDictionary.Item(&lt;span class="str"&gt;"Password"&lt;/span&gt;), _&lt;br /&gt;    HTTPREQUEST_SETCREDENTIALS_FOR_SERVER&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="rem"&gt;'Add WS header and foot if SOAP&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;If&lt;/span&gt; objDictionary.Item(&lt;span class="str"&gt;"RequestType"&lt;/span&gt;) = &lt;span class="str"&gt;"SOAP"&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;    strHeader = &lt;span class="str"&gt;"&amp;lt;?xml version="&lt;/span&gt;&lt;span class="str"&gt;"1.0"&lt;/span&gt;&lt;span class="str"&gt;" encoding="&lt;/span&gt;&lt;span class="str"&gt;"utf-8"&lt;/span&gt;&lt;span class="str"&gt;"?&amp;gt;"&lt;/span&gt; &amp;amp;_&lt;br /&gt;        &lt;span class="str"&gt;"&amp;lt;soap:Envelope xmlns:xsi="&lt;/span&gt;&lt;span class="str"&gt;"http://www.w3.org/2001/XMLSchema-instance"&lt;/span&gt;&lt;span class="str"&gt;""&lt;/span&gt; &amp;amp;_&lt;br /&gt;        &lt;span class="str"&gt;" xmlns:xsd="&lt;/span&gt;&lt;span class="str"&gt;"http://www.w3.org/2001/XMLSchema"&lt;/span&gt;&lt;span class="str"&gt;""&lt;/span&gt; &amp;amp;_&lt;br /&gt;        &lt;span class="str"&gt;" xmlns:soap="&lt;/span&gt;&lt;span class="str"&gt;"http://schemas.xmlsoap.org/soap/envelope/"&lt;/span&gt;&lt;span class="str"&gt;"&amp;gt;"&lt;/span&gt; &amp;amp;_&lt;br /&gt;        &lt;span class="str"&gt;"&amp;lt;soap:Body&amp;gt;"&lt;/span&gt;&lt;br /&gt;    strFoot =  &lt;span class="str"&gt;"&amp;lt;/soap:Body&amp;gt;&amp;lt;/soap:Envelope&amp;gt;"&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;WinHttpReq.Send(strHeader &amp;amp; objDictionary.Item(&lt;span class="str"&gt;"XMLRequest"&lt;/span&gt;) &amp;amp; strFoot)&lt;br /&gt;sendXMLRequest = WinHttpReq.ResponseText&lt;br /&gt;&lt;span class="kwrd"&gt;End&lt;/span&gt; Function&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So all together it should look like this:&lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;intTestCaseID = 1&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; objMyTestParameters = getTestParametersIntoDictionary (&lt;span class="str"&gt;"c:\MyTestData.xls"&lt;/span&gt;, _&lt;br /&gt;&lt;span class="str"&gt;"TestCase"&lt;/span&gt;, &lt;span class="str"&gt;"TestCaseID"&lt;/span&gt;, intTestCaseID)&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; objMyGlobalParameters = getTestParametersIntoDictionary (&lt;span class="str"&gt;"c:\MyTestData.xls"&lt;/span&gt;, _&lt;br /&gt;&lt;span class="str"&gt;"Global"&lt;/span&gt;, &lt;span class="str"&gt;"GlobalID"&lt;/span&gt;, objMyTestParameters.Item(&lt;span class="str"&gt;"GlobalID"&lt;/span&gt;))&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; objMyTestParameters = mergeDictionaries (objMyGlobalParameters, objMyTestParameters)&lt;br /&gt;objMyTestParameters.Item(&lt;span class="str"&gt;"XMLRequest"&lt;/span&gt;) = getXMLTemplate (objMyTestParameters.Item(&lt;span class="str"&gt;"XMLTemplateFile"&lt;/span&gt;), _&lt;br /&gt;objMyTestParameters.Item(&lt;span class="str"&gt;"XMLTemplate"&lt;/span&gt;))&lt;br /&gt;objMyTestParameters.Item(&lt;span class="str"&gt;"XMLRequest"&lt;/span&gt;) = setTestParametersInXMLRequest (objMyTestParameters)&lt;br /&gt;objMyTestParameters.Item(&lt;span class="str"&gt;"XMLResponse"&lt;/span&gt;) = sendXMLRequest (objMyTestParameters)&lt;br /&gt;Msgbox objMyTestParameters.Item(&lt;span class="str"&gt;"XMLResponse"&lt;/span&gt;)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Up next: Part V - Validate the response&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-4404728683536276403?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/4404728683536276403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=4404728683536276403' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/4404728683536276403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/4404728683536276403'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/03/xml-automation-part-iv-sending-xml.html' title='XML automation - Part IV - Sending XML request'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_4tHQNkQA_gI/R9aEgLnpgtI/AAAAAAAAACQ/fJr-lq_NVMY/s72-c/global.png' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-7114665914238725093</id><published>2008-03-03T14:17:00.004+01:00</published><updated>2008-03-03T14:42:45.034+01:00</updated><title type='text'>XML automation - part III (test parameters)</title><content type='html'>Now it is time to set some test parameters in our XML template (see previous post). In my test framework I handle test parameters in an SQL Server database but in my examples here I use good old Excel instead.&lt;br /&gt;&lt;br /&gt;First, create and save an Excel file with your test parameters:&lt;br /&gt;&lt;a href="http://bp1.blogger.com/_4tHQNkQA_gI/R8v9RMnw1KI/AAAAAAAAACI/_qJ9HJoo2MA/s1600-h/tcxls.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5173507068852753570" style="CURSOR: hand" alt="" src="http://bp1.blogger.com/_4tHQNkQA_gI/R8v9RMnw1KI/AAAAAAAAACI/_qJ9HJoo2MA/s400/tcxls.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Second, new functions for reading parameters into Dictionary Object and set parameters in an xml:&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span style="font-size:85%;"&gt;strXMLTemplateFile = &lt;span class="str"&gt;"c:\Templates.xml"&lt;/span&gt;&lt;br /&gt;intTestCaseID = 1&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; objMyTestParameters = getTestParametersIntoDictionary (&lt;span class="str"&gt;"c:\MyTestData.xls"&lt;/span&gt;, &lt;span class="str"&gt;"TestCase"&lt;/span&gt;, &lt;span class="str"&gt;"TestCaseID"&lt;/span&gt;, intTestCaseID)&lt;br /&gt;objMyTestParameters.Item(&lt;span class="str"&gt;"XMLRequest"&lt;/span&gt;) = getXMLTemplate (strXMLTemplateFile, objMyTestParameters.Item(&lt;span class="str"&gt;"XMLTemplate"&lt;/span&gt;))&lt;br /&gt;objMyTestParameters.Item(&lt;span class="str"&gt;"XMLRequest"&lt;/span&gt;) = setTestParametersInXMLRequest (objMyTestParameters)&lt;br /&gt;Msgbox objMyTestParameters.Item(&lt;span class="str"&gt;"XMLRequest"&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Function&lt;/span&gt; getTestParametersIntoDictionary (strFileName, strSheetName, strKeyColumn, intKeyID)&lt;br /&gt;&lt;span class="rem"&gt;'Initiate Dictionary&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; getTestParametersIntoDictionary = CreateObject(&lt;span class="str"&gt;"Scripting.Dictionary"&lt;/span&gt;)&lt;br /&gt;&lt;span class="rem"&gt;'Initiate Database connection&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; objDB = CreateObject(&lt;span class="str"&gt;"ADODB.Connection"&lt;/span&gt;)&lt;br /&gt;&lt;span class="rem"&gt;'Open connection&lt;/span&gt;&lt;br /&gt;objDB.Open &lt;span class="str"&gt;"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&lt;/span&gt;&amp;amp;strFileName&amp;amp;_&lt;br /&gt;&lt;span class="str"&gt;";Extended Properties="&lt;/span&gt;&lt;span class="str"&gt;"Excel 8.0;HDR=Yes;IMEX=1"&lt;/span&gt;&lt;span class="str"&gt;";"&lt;/span&gt;&lt;br /&gt;strQuery=&lt;span class="str"&gt;"select * from ["&lt;/span&gt; &amp;amp; strSheetName &amp;amp; &lt;span class="str"&gt;"$] where "&lt;/span&gt; &amp;amp; strKeyColumn &amp;amp; &lt;span class="str"&gt;"="&lt;/span&gt; &amp;amp; intKeyID&lt;br /&gt;&lt;span class="rem"&gt;'Create a record set, execute query and store in dictionary&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; objRec = objDB.Execute(strQuery)&lt;br /&gt;&lt;span class="kwrd"&gt;Do&lt;/span&gt; &lt;span class="kwrd"&gt;Until&lt;/span&gt; objRec.EOF&lt;br /&gt;    &lt;span class="kwrd"&gt;For&lt;/span&gt; &lt;span class="kwrd"&gt;Each&lt;/span&gt; x &lt;span class="kwrd"&gt;In&lt;/span&gt; objRec.Fields&lt;br /&gt;        &lt;span class="rem"&gt;'Convert NULL to empty string or clean from spaces&lt;/span&gt;&lt;br /&gt;        strCurrentValue = x.Value&lt;br /&gt;        &lt;span class="kwrd"&gt;If&lt;/span&gt; IsNull(strCurrentValue) &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;            strCurrentValue = &lt;span class="str"&gt;""&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;Else&lt;/span&gt;&lt;br /&gt;            strCurrentValue = Trim(strCurrentValue)&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="rem"&gt;'Add to dictionay&lt;/span&gt;&lt;br /&gt;        getTestParametersIntoDictionary.Add Trim(x.Name), strCurrentValue&lt;br /&gt;    &lt;span class="kwrd"&gt;Next&lt;/span&gt;&lt;br /&gt;    objRec.MoveNext&lt;br /&gt;&lt;span class="kwrd"&gt;Loop&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;'Clean up&lt;/span&gt;&lt;br /&gt;objRec.Close&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; objRec = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;&lt;br /&gt;objDB.Close&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; objDB = &lt;span class="kwrd"&gt;Nothing&lt;/span&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="kwrd"&gt;Function&lt;/span&gt; setTestParametersInXMLRequest (objDictionary)&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; xmlDoc = CreateObject(&lt;span class="str"&gt;"Msxml2.DOMDocument"&lt;/span&gt;)&lt;br /&gt;&lt;span class="rem"&gt;'loadXML&lt;/span&gt;&lt;br /&gt;xmlDoc.loadXML(objDictionary.Item(&lt;span class="str"&gt;"XMLRequest"&lt;/span&gt;))&lt;br /&gt;&lt;span class="rem"&gt;'Check XML syntax&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;If&lt;/span&gt; (xmlDoc.parseError.errorCode &amp;lt;&amp;gt; 0) &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;Set&lt;/span&gt; myErr = xmlDoc.parseError&lt;br /&gt;   Msgbox &lt;span class="str"&gt;"ERROR: "&lt;/span&gt; &amp;amp; myErr.reason&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;Set&lt;/span&gt; root = xmlDoc.documentElement&lt;br /&gt;&lt;span class="rem"&gt;'Put all test parameters in array&lt;/span&gt;&lt;br /&gt;arrAllKeys = objDictionary.Keys&lt;br /&gt;arrAllValues = objDictionary.Items&lt;br /&gt;&lt;span class="rem"&gt;'Update values&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;For&lt;/span&gt; i = 0 &lt;span class="kwrd"&gt;to&lt;/span&gt; Ubound(arrAllKeys)&lt;br /&gt;    &lt;span class="rem"&gt;'Only process $-type parameters and where values &amp;lt;&amp;gt; ""&lt;/span&gt;&lt;br /&gt;    &lt;span class="kwrd"&gt;If&lt;/span&gt; Left(arrAllKeys(i),1) = &lt;span class="str"&gt;"$"&lt;/span&gt; &lt;span class="kwrd"&gt;AND&lt;/span&gt; arrAllValues(i) &amp;lt;&amp;gt; &lt;span class="str"&gt;""&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;        strParameterElementName = arrAllKeys(i)&lt;br /&gt;        strParameterElementName = Right(strParameterElementName,Len(strParameterElementName)-1)&lt;br /&gt;        strParameterElementValue = arrAllValues(i)&lt;br /&gt;        &lt;span class="rem"&gt;'Insert element and value&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;Set&lt;/span&gt; node = root.getElementsByTagName(strParameterElementName)&lt;br /&gt;        &lt;span class="kwrd"&gt;If&lt;/span&gt; node.Length &amp;gt; 0 &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;For&lt;/span&gt; n = 0 &lt;span class="kwrd"&gt;to&lt;/span&gt; node.Length-1&lt;br /&gt;                &lt;span class="rem"&gt;'Replace all&lt;/span&gt;&lt;br /&gt;                node.Item(n).Text = strParameterElementValue&lt;br /&gt;            &lt;span class="kwrd"&gt;Next&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;Set&lt;/span&gt; node = &lt;span class="kwrd"&gt;Nothing&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;span class="rem"&gt;'Return xml request&lt;/span&gt;&lt;br /&gt;setTestParametersInXMLRequest = root.xml&lt;br /&gt;&lt;span class="rem"&gt;'Clean up&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; root = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; xmlDoc = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;End&lt;/span&gt; Function&lt;/span&gt;&lt;/pre&gt;Up next: Part IV - Sending XML request&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-7114665914238725093?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/7114665914238725093/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=7114665914238725093' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/7114665914238725093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/7114665914238725093'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/03/xml-automation-part-iii-test-parameters.html' title='XML automation - part III (test parameters)'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_4tHQNkQA_gI/R8v9RMnw1KI/AAAAAAAAACI/_qJ9HJoo2MA/s72-c/tcxls.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-5576022615128036609</id><published>2008-03-03T10:42:00.006+01:00</published><updated>2008-03-03T11:14:06.769+01:00</updated><title type='text'>XML automation Part I and II re-make</title><content type='html'>I found some public Web Services the other day (&lt;a href="http://www.webservicex.net/"&gt;http://www.webservicex.net/&lt;/a&gt;) and thought using them in my examples would make it a bit more realistic...&lt;br /&gt;&lt;br /&gt;So I have reworked my previous examples:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Test client&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span style="font-size:85%;"&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;*********************************************************************************************************************&lt;br /&gt;Purpose:              &lt;span class="kwrd"&gt;To&lt;/span&gt; send XML http request.&lt;br /&gt;Assumptions:          Proper security settings &lt;span class="kwrd"&gt;in&lt;/span&gt; browser &lt;span class="kwrd"&gt;and&lt;/span&gt; DLL &lt;span class="kwrd"&gt;for&lt;/span&gt; WinHttp5.1 &lt;span class="kwrd"&gt;object&lt;/span&gt;&lt;br /&gt;Author:                  Stefan Thelenius 2008-03-03.&lt;br /&gt;&lt;span class="rem"&gt;'********************************************************************************************************************&lt;/span&gt;&lt;br /&gt;--&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Web Service Test Tool&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;script language=&lt;span class="str"&gt;"JavaScript"&lt;/span&gt;&amp;gt;&lt;br /&gt;self.resizeTo(screen.width,screen.height)&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;style&amp;gt;&lt;br /&gt;&lt;span class="kwrd"&gt;select&lt;/span&gt; {font-family: verdana; font-size: 8pt; font-weight: 500;}&lt;br /&gt;input {font-family: verdana; font-size: 8pt; font-weight: 500;}&lt;br /&gt;textarea {font-family: verdana; font-size: 8pt; font-weight: 500;}&lt;br /&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;FONT FACE=&lt;span class="str"&gt;"verdana"&lt;/span&gt; SIZE=3&amp;gt;&lt;br /&gt;&amp;lt;center&amp;gt;Web Service Test Tool&amp;lt;/center&amp;gt;&lt;br /&gt;&amp;lt;FONT FACE=&lt;span class="str"&gt;"verdana"&lt;/span&gt; SIZE=1&amp;gt;&lt;br /&gt;&amp;lt;FORM NAME=&lt;span class="str"&gt;"form"&lt;/span&gt;&amp;gt;&lt;br /&gt;&amp;lt;SCRIPT LANGUAGE=&lt;span class="str"&gt;"vbscript"&lt;/span&gt;&amp;gt;&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;table width="&lt;/span&gt;&lt;span class="str"&gt;"100%"&lt;/span&gt;&lt;span class="str"&gt;" border="&lt;/span&gt;&lt;span class="str"&gt;"0"&lt;/span&gt;&lt;span class="str"&gt;" cellspacing="&lt;/span&gt;&lt;span class="str"&gt;"0"&lt;/span&gt;&lt;span class="str"&gt;" cellpadding="&lt;/span&gt;&lt;span class="str"&gt;"0"&lt;/span&gt;&lt;span class="str"&gt;"&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;tr&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;td&amp;gt;&amp;lt;left&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;FONT FACE="&lt;/span&gt;&lt;span class="str"&gt;"verdana"&lt;/span&gt;&lt;span class="str"&gt;" SIZE=1&amp;gt;URL&amp;amp;nbsp"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;INPUT TYPE="&lt;/span&gt;&lt;span class="str"&gt;"text"&lt;/span&gt;&lt;span class="str"&gt;" NAME="&lt;/span&gt;&lt;span class="str"&gt;"url"&lt;/span&gt;&lt;span class="str"&gt;" SIZE=70 TITLE="&lt;/span&gt;&lt;span class="str"&gt;"URL"&lt;/span&gt;&lt;span class="str"&gt;"&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;FONT FACE="&lt;/span&gt;&lt;span class="str"&gt;"verdana"&lt;/span&gt;&lt;span class="str"&gt;" SIZE=1&amp;gt;&amp;amp;nbspSOAPAction&amp;amp;nbsp"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;INPUT TYPE="&lt;/span&gt;&lt;span class="str"&gt;"text"&lt;/span&gt;&lt;span class="str"&gt;" NAME="&lt;/span&gt;&lt;span class="str"&gt;"soap"&lt;/span&gt;&lt;span class="str"&gt;" SIZE=70 TITLE="&lt;/span&gt;&lt;span class="str"&gt;"SOAP Action"&lt;/span&gt;&lt;span class="str"&gt;"&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;tr&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;td&amp;gt;&amp;lt;left&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;FONT FACE="&lt;/span&gt;&lt;span class="str"&gt;"verdana"&lt;/span&gt;&lt;span class="str"&gt;" SIZE=1&amp;gt;Username&amp;amp;nbsp"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;INPUT TYPE="&lt;/span&gt;&lt;span class="str"&gt;"text"&lt;/span&gt;&lt;span class="str"&gt;" NAME="&lt;/span&gt;&lt;span class="str"&gt;"username"&lt;/span&gt;&lt;span class="str"&gt;" SIZE=20 TITLE="&lt;/span&gt;&lt;span class="str"&gt;"UserName"&lt;/span&gt;&lt;span class="str"&gt;"&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;FONT FACE="&lt;/span&gt;&lt;span class="str"&gt;"verdana"&lt;/span&gt;&lt;span class="str"&gt;" SIZE=1&amp;gt;&amp;amp;nbsp&amp;amp;nbspPassword&amp;amp;nbsp"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;INPUT TYPE="&lt;/span&gt;&lt;span class="str"&gt;"password"&lt;/span&gt;&lt;span class="str"&gt;" NAME="&lt;/span&gt;&lt;span class="str"&gt;"password"&lt;/span&gt;&lt;span class="str"&gt;" SIZE=12&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;/left&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;FONT FACE="&lt;/span&gt;&lt;span class="str"&gt;"verdana"&lt;/span&gt;&lt;span class="str"&gt;" SIZE=1&amp;gt;&amp;amp;nbsp&amp;amp;nbspResponse to Clipboard"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;input type="&lt;/span&gt;&lt;span class="str"&gt;"checkbox"&lt;/span&gt;&lt;span class="str"&gt;" name="&lt;/span&gt;&lt;span class="str"&gt;"blnSave"&lt;/span&gt;&lt;span class="str"&gt;"&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;br&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;table width="&lt;/span&gt;&lt;span class="str"&gt;"100%"&lt;/span&gt;&lt;span class="str"&gt;" border="&lt;/span&gt;&lt;span class="str"&gt;"0"&lt;/span&gt;&lt;span class="str"&gt;" cellspacing="&lt;/span&gt;&lt;span class="str"&gt;"0"&lt;/span&gt;&lt;span class="str"&gt;" cellpadding="&lt;/span&gt;&lt;span class="str"&gt;"0"&lt;/span&gt;&lt;span class="str"&gt;"&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;tr&amp;gt;"&lt;/span&gt;)&lt;br /&gt;&lt;span class="rem"&gt;'Autofit request and response textarea&lt;/span&gt;&lt;br /&gt;intWidth = screen.width / 13&lt;br /&gt;intHeight = screen.height / 23&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;td&amp;gt;&amp;lt;FONT FACE="&lt;/span&gt;&lt;span class="str"&gt;"verdana"&lt;/span&gt;&lt;span class="str"&gt;" SIZE=1&amp;gt;Request&amp;lt;BR&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;textarea name="&lt;/span&gt;&lt;span class="str"&gt;"IN"&lt;/span&gt;&lt;span class="str"&gt;" rows="&lt;/span&gt;&lt;span class="str"&gt;""&lt;/span&gt; &amp;amp; intHeight &amp;amp; &lt;span class="str"&gt;""&lt;/span&gt;&lt;span class="str"&gt;" cols="&lt;/span&gt;&lt;span class="str"&gt;""&lt;/span&gt; &amp;amp; intWidth &amp;amp; &lt;span class="str"&gt;""&lt;/span&gt;&lt;span class="str"&gt;"&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;/textarea&amp;gt;&amp;lt;/td&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;td&amp;gt;&amp;lt;FONT FACE="&lt;/span&gt;&lt;span class="str"&gt;"verdana"&lt;/span&gt;&lt;span class="str"&gt;" SIZE=1&amp;gt;Response&amp;lt;BR&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;textarea name="&lt;/span&gt;&lt;span class="str"&gt;"OUT"&lt;/span&gt;&lt;span class="str"&gt;" rows="&lt;/span&gt;&lt;span class="str"&gt;""&lt;/span&gt; &amp;amp; intHeight &amp;amp; &lt;span class="str"&gt;""&lt;/span&gt;&lt;span class="str"&gt;" cols="&lt;/span&gt;&lt;span class="str"&gt;""&lt;/span&gt; &amp;amp; intWidth &amp;amp; &lt;span class="str"&gt;""&lt;/span&gt;&lt;span class="str"&gt;"&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;/textarea&amp;gt;&amp;lt;/td&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;INPUT TYPE="&lt;/span&gt;&lt;span class="str"&gt;"button"&lt;/span&gt;&lt;span class="str"&gt;" NAME="&lt;/span&gt;&lt;span class="str"&gt;"cmdSend"&lt;/span&gt;&lt;span class="str"&gt;" VALUE="&lt;/span&gt;&lt;span class="str"&gt;"Send"&lt;/span&gt;&lt;span class="str"&gt;" onclick="&lt;/span&gt;&lt;span class="str"&gt;"SendRequest()"&lt;/span&gt;&lt;span class="str"&gt;"&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;amp;nbsp&amp;lt;INPUT TYPE="&lt;/span&gt;&lt;span class="str"&gt;"button"&lt;/span&gt;&lt;span class="str"&gt;" NAME="&lt;/span&gt;&lt;span class="str"&gt;"cmdPretty"&lt;/span&gt;&lt;span class="str"&gt;" VALUE="&lt;/span&gt;&lt;span class="str"&gt;"Parse input"&lt;/span&gt;&lt;span class="str"&gt;" onclick="&lt;/span&gt;&lt;span class="str"&gt;"ParseInput()"&lt;/span&gt;&lt;span class="str"&gt;"&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;amp;nbsp&amp;lt;INPUT TYPE="&lt;/span&gt;&lt;span class="str"&gt;"button"&lt;/span&gt;&lt;span class="str"&gt;" NAME="&lt;/span&gt;&lt;span class="str"&gt;"cmdClean"&lt;/span&gt;&lt;span class="str"&gt;" VALUE="&lt;/span&gt;&lt;span class="str"&gt;"Clean output"&lt;/span&gt;&lt;span class="str"&gt;" onclick="&lt;/span&gt;&lt;span class="str"&gt;"CleanResponse()"&lt;/span&gt;&lt;span class="str"&gt;"&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;/td&amp;gt;&amp;lt;td id="&lt;/span&gt;&lt;span class="str"&gt;"tid"&lt;/span&gt;&lt;span class="str"&gt;"&amp;gt;&amp;lt;FONT FACE="&lt;/span&gt;&lt;span class="str"&gt;"verdana"&lt;/span&gt;&lt;span class="str"&gt;" SIZE=1&amp;gt;&amp;amp;nbsp&amp;lt;/td&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;/FORM&amp;gt;"&lt;/span&gt;)&lt;br /&gt;&lt;span class="rem"&gt;'Get current user as default&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Dim&lt;/span&gt; objNet&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; objNet = CreateObject(&lt;span class="str"&gt;"WScript.NetWork"&lt;/span&gt;)&lt;br /&gt;form.username.Value = objNet.UserDomain &amp;amp; &lt;span class="str"&gt;"\"&lt;/span&gt; &amp;amp; objNet.UserName&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; objNet = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Sub&lt;/span&gt; SendRequest&lt;br /&gt;&lt;span class="kwrd"&gt;Dim&lt;/span&gt; WinHttpReq&lt;br /&gt;&lt;span class="kwrd"&gt;Const&lt;/span&gt; HTTPREQUEST_SETCREDENTIALS_FOR_SERVER = 0&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; WinHttpReq = CreateObject(&lt;span class="str"&gt;"WinHttp.WinHttpRequest.5.1"&lt;/span&gt;)&lt;br /&gt;strStart = Timer&lt;br /&gt;WinHttpReq.Open &lt;span class="str"&gt;"POST"&lt;/span&gt;, form.url.Value, &lt;span class="kwrd"&gt;False&lt;/span&gt;&lt;br /&gt;WinHttpReq.setRequestHeader &lt;span class="str"&gt;"Content-Type"&lt;/span&gt;, &lt;span class="str"&gt;"text/xml;charset=utf-8"&lt;/span&gt;&lt;br /&gt;WinHttpReq.setRequestHeader &lt;span class="str"&gt;"Accept"&lt;/span&gt;, _&lt;br /&gt;&lt;span class="str"&gt;"text/xml, multipart/related, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"&lt;/span&gt;&lt;br /&gt;WinHttpReq.setRequestHeader &lt;span class="str"&gt;"Content-Transfer-Encoding"&lt;/span&gt;, &lt;span class="str"&gt;"binary"&lt;/span&gt;&lt;br /&gt;WinHttpReq.setRequestHeader &lt;span class="str"&gt;"Connection"&lt;/span&gt;, &lt;span class="str"&gt;"keep-alive"&lt;/span&gt;&lt;br /&gt;WinHttpReq.setRequestHeader &lt;span class="str"&gt;"SOAPAction"&lt;/span&gt;, form.soap.Value&lt;br /&gt;WinHttpReq.SetCredentials form.username.Value, form.password.Value, _&lt;br /&gt;HTTPREQUEST_SETCREDENTIALS_FOR_SERVER&lt;br /&gt;WinHttpReq.Send(form.&lt;span class="kwrd"&gt;IN&lt;/span&gt;.Value)&lt;br /&gt;strStop = Timer&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; xmlDoc = CreateObject(&lt;span class="str"&gt;"Msxml2.DOMDocument"&lt;/span&gt;)&lt;br /&gt;&lt;span class="rem"&gt;'Parse output&lt;/span&gt;&lt;br /&gt;xmlDoc.loadXML(WinHttpReq.ResponseText)&lt;br /&gt;&lt;span class="kwrd"&gt;If&lt;/span&gt; (xmlDoc.parseError.errorCode &amp;lt;&amp;gt; 0) &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;   form.OUT.Value = WinHttpReq.ResponseText&lt;br /&gt;   &lt;span class="kwrd"&gt;Else&lt;/span&gt;&lt;br /&gt;   form.OUT.Value = xmlDoc.xml&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;Set&lt;/span&gt; xmlDoc = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;&lt;br /&gt;strTime = strStop - strStart&lt;br /&gt;strTime = FormatNumber(strTime,2)&lt;br /&gt;tid.Innertext = &lt;span class="str"&gt;"Response time: "&lt;/span&gt; &amp;amp; strTime &amp;amp; &lt;span class="str"&gt;" s"&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; WinHttpReq = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;'Set clipboard = output&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;If&lt;/span&gt; form.blnSave.Value = &lt;span class="kwrd"&gt;True&lt;/span&gt; &lt;span class="kwrd"&gt;Then&lt;/span&gt; window.clipboardData.setData &lt;span class="str"&gt;"Text"&lt;/span&gt;,form.OUT.Value&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;span class="kwrd"&gt;Sub&lt;/span&gt; ParseInput&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; xmlDoc = CreateObject(&lt;span class="str"&gt;"Msxml2.DOMDocument"&lt;/span&gt;)&lt;br /&gt;xmlDoc.loadXML(form.&lt;span class="kwrd"&gt;IN&lt;/span&gt;.Value)&lt;br /&gt;&lt;span class="kwrd"&gt;If&lt;/span&gt; (xmlDoc.parseError.errorCode &amp;lt;&amp;gt; 0) &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;Set&lt;/span&gt; myErr = xmlDoc.parseError&lt;br /&gt;   Msgbox &lt;span class="str"&gt;"ERROR: "&lt;/span&gt; &amp;amp; myErr.reason&lt;br /&gt;   &lt;span class="kwrd"&gt;Set&lt;/span&gt; myErr = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;Set&lt;/span&gt; xmlDoc = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;Exit&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&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;form.&lt;span class="kwrd"&gt;IN&lt;/span&gt;.Value = xmlDoc.xml&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; xmlDoc = &lt;span class="kwrd"&gt;Nothing&lt;/span&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;span class="kwrd"&gt;Sub&lt;/span&gt; CleanResponse&lt;br /&gt;form.OUT.Value = &lt;span class="str"&gt;""&lt;/span&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;&amp;lt;/SCRIPT&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;strong&gt;XML Templates (save into file c:\Templates.xml)&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span style="font-size:85%;"&gt;&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;="1.0"&lt;/span&gt; ?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Templates&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;myTemplate_01&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ConvertTemp&lt;/span&gt; &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;="http://www.webserviceX.NET/"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Temperature&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;10&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Temperature&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;FromUnit&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;degreeCelsius&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;FromUnit&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ToUnit&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;degreeFahrenheit&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ToUnit&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ConvertTemp&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;myTemplate_01&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;myTemplate_02&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ConvertTemp&lt;/span&gt; &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;="http://www.webserviceX.NET/"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Temperature&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;60&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Temperature&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;FromUnit&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;degreeFahrenheit&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;FromUnit&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ToUnit&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;degreeCelsius&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ToUnit&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ConvertTemp&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;myTemplate_02&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Templates&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;strong&gt;XML template function&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span style="font-size:85%;"&gt;strXMLTemplateFile = &lt;span class="str"&gt;"c:\Templates.xml"&lt;/span&gt;&lt;br /&gt;strMyTemplate = &lt;span class="str"&gt;"myTemplate_01"&lt;/span&gt;&lt;br /&gt;Msgbox getXMLTemplate (strXMLTemplateFile, strMyTemplate)&lt;br /&gt;&lt;span class="kwrd"&gt;Function&lt;/span&gt; getXMLTemplate (strXMLTemplateFile, strMyTemplate)&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; xmlDoc = CreateObject(&lt;span class="str"&gt;"Msxml2.DOMDocument"&lt;/span&gt;)&lt;br /&gt;&lt;span class="rem"&gt;'loadXML&lt;/span&gt;&lt;br /&gt;xmlDoc.load(strXMLTemplateFile)&lt;br /&gt;&lt;span class="rem"&gt;'Check XML syntax&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;If&lt;/span&gt; (xmlDoc.parseError.errorCode &amp;lt;&amp;gt; 0) &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;Set&lt;/span&gt; myErr = xmlDoc.parseError&lt;br /&gt;   Msgbox &lt;span class="str"&gt;"ERROR: "&lt;/span&gt; &amp;amp; myErr.reason&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;Set&lt;/span&gt; root = xmlDoc.documentElement&lt;br /&gt;&lt;span class="rem"&gt;'Select template and return&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; node = root.selectNodes(&lt;span class="str"&gt;"//"&lt;/span&gt; &amp;amp; strMyTemplate)&lt;br /&gt;&lt;span class="kwrd"&gt;If&lt;/span&gt; node.Length &amp;gt; 0 &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;    getXMLTemplate = node.Item(0).childNodes.Item(0).xml&lt;br /&gt;    &lt;span class="kwrd"&gt;Else&lt;/span&gt;&lt;br /&gt;    getXMLTemplate = &lt;span class="str"&gt;"No template found!"&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="rem"&gt;'Clean up&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; xmlDoc = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; root = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; node = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-5576022615128036609?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/5576022615128036609/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=5576022615128036609' title='25 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/5576022615128036609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/5576022615128036609'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/03/xml-automation-part-i-and-ii-re-make.html' title='XML automation Part I and II re-make'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>25</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-9154046355239805256</id><published>2008-02-28T09:41:00.002+01:00</published><updated>2008-02-28T10:26:18.419+01:00</updated><title type='text'>Code format...at last</title><content type='html'>I appologize for the bad code format in my previous examples...but I have found a good site which can return well formated code: &lt;a href="http://manoli.net/csharpformat/format.aspx"&gt;http://manoli.net/csharpformat/format.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So from now on I hope my examples becomes more readable...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-9154046355239805256?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/9154046355239805256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=9154046355239805256' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/9154046355239805256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/9154046355239805256'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/02/code-formatat-last.html' title='Code format...at last'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-1263533641327860474</id><published>2008-02-25T07:47:00.008+01:00</published><updated>2008-02-28T10:21:46.916+01:00</updated><title type='text'>XML automation - part II (XML templates)</title><content type='html'>&lt;span style="color:#000000;"&gt;When I automate XML requests I normally use templates for my requests.&lt;br /&gt;&lt;br /&gt;Usage example:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre class="csharpcode"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#000000;"&gt;&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;="1.0"&lt;/span&gt; ?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Templates&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;myTemplate_01&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;createNewSomething&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;anElement&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;somevalue&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;anElement&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;anotherElement&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;someothervalue&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;anotherElement&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;createNewSomething&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;myTemplate_01&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;myTemplate_02&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;createNewSomething&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;anElement&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;somevalue&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;anElement&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;anotherElement&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;someothervalue&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;anotherElement&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;optionalElement&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;yetanothervalue&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;optionalElement&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;createNewSomething&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;myTemplate_02&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Templates&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="color:#000000;"&gt;So to use a template in an automated test case you need to pass a parameter which template to use&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre class="csharpcode"&gt;&lt;span style="font-size:85%;"&gt;strXML = &lt;span class="str"&gt;"&amp;lt;?xml version="&lt;/span&gt;&lt;span class="str"&gt;"1.0"&lt;/span&gt;&lt;span class="str"&gt;" ?&amp;gt;&amp;lt;Templates&amp;gt;&amp;lt;myTemplate_01&amp;gt;"&lt;/span&gt; &amp;amp;_&lt;br /&gt;&lt;span class="str"&gt;"&amp;lt;createNewSomething&amp;gt;&amp;lt;anElement&amp;gt;somevalue&amp;lt;/anElement&amp;gt;"&lt;/span&gt; &amp;amp;_&lt;br /&gt;&lt;span class="str"&gt;"&amp;lt;anotherElement&amp;gt;someothervalue&amp;lt;/anotherElement&amp;gt;"&lt;/span&gt; &amp;amp;_&lt;br /&gt;&lt;span class="str"&gt;"&amp;lt;/createNewSomething&amp;gt;&amp;lt;/myTemplate_01&amp;gt;&amp;lt;myTemplate_02&amp;gt;"&lt;/span&gt; &amp;amp;_&lt;br /&gt;&lt;span class="str"&gt;"&amp;lt;createNewSomething&amp;gt;&amp;lt;anElement&amp;gt;somevalue&amp;lt;/anElement&amp;gt;"&lt;/span&gt; &amp;amp;_&lt;br /&gt;&lt;span class="str"&gt;"&amp;lt;anotherElement&amp;gt;someothervalue&amp;lt;/anotherElement&amp;gt;"&lt;/span&gt; &amp;amp;_&lt;br /&gt;&lt;span class="str"&gt;"&amp;lt;optionalElement&amp;gt;yetanothervalue&amp;lt;/optionalElement&amp;gt;"&lt;/span&gt; &amp;amp;_&lt;br /&gt;&lt;span class="str"&gt;"&amp;lt;/createNewSomething&amp;gt;&amp;lt;/myTemplate_02&amp;gt;&amp;lt;/Templates&amp;gt;"&lt;/span&gt;&lt;br /&gt;strMyTemplate = &lt;span class="str"&gt;"myTemplate_01"&lt;/span&gt;&lt;br /&gt;Msgbox getXMLTemplate (strXML, strMyTemplate)&lt;br /&gt;&lt;span class="kwrd"&gt;Function&lt;/span&gt; getXMLTemplate (strXML, strMyTemplate)&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; xmlDoc = CreateObject(&lt;span class="str"&gt;"Msxml2.DOMDocument"&lt;/span&gt;)&lt;br /&gt;&lt;span class="rem"&gt;'loadXML&lt;/span&gt;&lt;br /&gt;xmlDoc.loadXML(strXML)&lt;br /&gt;&lt;span class="rem"&gt;'Check XML syntax&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;If&lt;/span&gt; (xmlDoc.parseError.errorCode &amp;lt;&amp;gt; 0) &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;  &lt;span class="kwrd"&gt;Set&lt;/span&gt; myErr = xmlDoc.parseError&lt;br /&gt;  Msgbox &lt;span class="str"&gt;"ERROR: "&lt;/span&gt; &amp;amp; myErr.reason&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;Set&lt;/span&gt; root = xmlDoc.documentElement&lt;br /&gt;&lt;span class="rem"&gt;'Select template and return&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; node = root.selectNodes(&lt;span class="str"&gt;"//"&lt;/span&gt; &amp;amp; strMyTemplate)&lt;br /&gt;&lt;span class="kwrd"&gt;If&lt;/span&gt; node.Length &amp;gt; 0 &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;  getXMLTemplate = node.Item(0).childNodes.Item(0).xml&lt;br /&gt;  &lt;span class="kwrd"&gt;Else&lt;/span&gt;&lt;br /&gt;  getXMLTemplate = &lt;span class="str"&gt;"No template found!"&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="rem"&gt;'Clean up&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; xmlDoc = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; root = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Set&lt;/span&gt; node = &lt;span class="kwrd"&gt;Nothing&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;End&lt;/span&gt; Function&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-family:verdana;color:#000000;"&gt;Up next: Part III - Insert test parameters into XML&lt;/span&gt;&lt;pre class="csharpcode"&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-1263533641327860474?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/1263533641327860474/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=1263533641327860474' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/1263533641327860474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/1263533641327860474'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/02/xml-automation-part-ii-xml-templates.html' title='XML automation - part II (XML templates)'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-5063275688899151922</id><published>2008-02-18T13:50:00.004+01:00</published><updated>2008-02-18T14:29:50.792+01:00</updated><title type='text'>XML automation - part I</title><content type='html'>"...next mission is to build a test driver for our API which can be executed stand-alone in parallell with QTP"&lt;br /&gt;&lt;br /&gt;Done!&lt;br /&gt;&lt;br /&gt;I've recently got several requests on how to use the COM-object WinHttp, so I thought I would try to explain how I use the object in my test framework in a series of posts.&lt;br /&gt;&lt;br /&gt;Part I - Building a simple client in order to send XML-request using WinHttp:&lt;br /&gt;&lt;br /&gt;See html-source code below. I have removed some specific features (XML-templates and log handling) which I use internally.&lt;br /&gt;&lt;br /&gt;Why this tool when there are several free tools out there? Well, it is a light-weight client (one html-file) which is easy to customize and it is a good way to get familiar with the WinHttp-object which you can use heavily in VBScript-based automation.&lt;br /&gt;&lt;br /&gt;Up next: Part II - Using XML templates&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;html&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;&amp;lt;!-- &lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;*********************************************************************************************************************&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;Purpose:              To send XML http request.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;Assumptions:          Proper security settings in browser and DLL for WinHttp5.1 object&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;Author:                  Stefan Thelenius 2008-02-18.&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;'********************************************************************************************************************&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;--&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Web Service Test Tool&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;language&lt;/span&gt;&lt;span class="kwrd"&gt;="JavaScript"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;self.resizeTo(screen.width,screen.height)&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;style&amp;gt;&lt;br /&gt;select {font-family: verdana; font-size: 8pt; font-weight: 500;}&lt;br /&gt;input {font-family: verdana; font-size: 8pt; font-weight: 500;}&lt;br /&gt;textarea {font-family: verdana; font-size: 8pt; font-weight: 500;}&lt;br /&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;FONT FACE=&lt;span class="str"&gt;"verdana"&lt;/span&gt; SIZE=3&amp;gt;&lt;br /&gt;&amp;lt;center&amp;gt;Web Service Test Tool&amp;lt;/center&amp;gt;&lt;br /&gt;&amp;lt;FONT FACE=&lt;span class="str"&gt;"verdana"&lt;/span&gt; SIZE=1&amp;gt;&lt;br /&gt;&amp;lt;FORM NAME=&lt;span class="str"&gt;"frmForm1"&lt;/span&gt;&amp;gt;&lt;br /&gt;&amp;lt;SCRIPT LANGUAGE=&lt;span class="str"&gt;"vbscript"&lt;/span&gt;&amp;gt;&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;table width="&lt;/span&gt;&lt;span class="str"&gt;"100%"&lt;/span&gt;&lt;span class="str"&gt;" border="&lt;/span&gt;&lt;span class="str"&gt;"0"&lt;/span&gt;&lt;span class="str"&gt;" cellspacing="&lt;/span&gt;&lt;span class="str"&gt;"0"&lt;/span&gt;&lt;span class="str"&gt;" cellpadding="&lt;/span&gt;&lt;span class="str"&gt;"0"&lt;/span&gt;&lt;span class="str"&gt;"&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;tr&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;td&amp;gt;&amp;lt;left&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;FONT FACE="&lt;/span&gt;&lt;span class="str"&gt;"verdana"&lt;/span&gt;&lt;span class="str"&gt;" SIZE=1&amp;gt;URL&amp;amp;nbsp"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;INPUT TYPE="&lt;/span&gt;&lt;span class="str"&gt;"text"&lt;/span&gt;&lt;span class="str"&gt;" NAME="&lt;/span&gt;&lt;span class="str"&gt;"url"&lt;/span&gt;&lt;span class="str"&gt;" SIZE=70 TITLE="&lt;/span&gt;&lt;span class="str"&gt;"URL"&lt;/span&gt;&lt;span class="str"&gt;"&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;FONT FACE="&lt;/span&gt;&lt;span class="str"&gt;"verdana"&lt;/span&gt;&lt;span class="str"&gt;" SIZE=1&amp;gt;&amp;amp;nbsp&amp;amp;nbspUser&amp;amp;nbsp"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;INPUT TYPE="&lt;/span&gt;&lt;span class="str"&gt;"text"&lt;/span&gt;&lt;span class="str"&gt;" NAME="&lt;/span&gt;&lt;span class="str"&gt;"username"&lt;/span&gt;&lt;span class="str"&gt;" SIZE=20 TITLE="&lt;/span&gt;&lt;span class="str"&gt;"UserName"&lt;/span&gt;&lt;span class="str"&gt;"&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;FONT FACE="&lt;/span&gt;&lt;span class="str"&gt;"verdana"&lt;/span&gt;&lt;span class="str"&gt;" SIZE=1&amp;gt;&amp;amp;nbsp&amp;amp;nbspPassword&amp;amp;nbsp"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;INPUT TYPE="&lt;/span&gt;&lt;span class="str"&gt;"password"&lt;/span&gt;&lt;span class="str"&gt;" NAME="&lt;/span&gt;&lt;span class="str"&gt;"password"&lt;/span&gt;&lt;span class="str"&gt;" SIZE=12&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;/left&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;FONT FACE="&lt;/span&gt;&lt;span class="str"&gt;"verdana"&lt;/span&gt;&lt;span class="str"&gt;" SIZE=1&amp;gt;&amp;amp;nbsp&amp;amp;nbspResponse to Clipboard&amp;lt;input type="&lt;/span&gt;&lt;span class="str"&gt;"checkbox"&lt;/span&gt;&lt;span class="str"&gt;" name="&lt;/span&gt;&lt;span class="str"&gt;"blnSave"&lt;/span&gt;&lt;span class="str"&gt;"&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;br&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;table width="&lt;/span&gt;&lt;span class="str"&gt;"100%"&lt;/span&gt;&lt;span class="str"&gt;" border="&lt;/span&gt;&lt;span class="str"&gt;"0"&lt;/span&gt;&lt;span class="str"&gt;" cellspacing="&lt;/span&gt;&lt;span class="str"&gt;"0"&lt;/span&gt;&lt;span class="str"&gt;" cellpadding="&lt;/span&gt;&lt;span class="str"&gt;"0"&lt;/span&gt;&lt;span class="str"&gt;"&amp;gt;"&lt;/span&gt;)&lt;br /&gt;document.write(&lt;span class="str"&gt;"&amp;lt;tr&amp;gt;"&lt;/span&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span class="str"&gt;'Autofit request and response textarea&lt;br /&gt;intWidth = screen.width / 13&lt;br /&gt;intHeight = screen.height / 23&lt;br /&gt;document.write("&amp;lt;td&amp;gt;&amp;lt;FONT FACE=""verdana"" SIZE=1&amp;gt;Request&amp;lt;BR&amp;gt;")&lt;br /&gt;document.write("&amp;lt;textarea name=""IN"" rows=""" &amp;amp; intHeight &amp;amp; """ cols=""" &amp;amp; intWidth &amp;amp; """&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;/td&amp;gt;")&lt;br /&gt;document.write("&amp;lt;td&amp;gt;&amp;lt;FONT FACE=""verdana"" SIZE=1&amp;gt;Response&amp;lt;BR&amp;gt;")&lt;br /&gt;document.write("&amp;lt;textarea name=""OUT"" rows=""" &amp;amp; intHeight &amp;amp; """ cols=""" &amp;amp; intWidth &amp;amp; """&amp;gt;&amp;lt;/textarea&amp;gt;&amp;lt;/td&amp;gt;")&lt;br /&gt;document.write("&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;INPUT TYPE=""button"" NAME=""cmdSend"" VALUE=""Send"" onclick=""SendRequest()""&amp;gt;")&lt;br /&gt;document.write("&amp;amp;nbsp&amp;lt;INPUT TYPE=""button"" NAME=""cmdPretty"" VALUE=""Parse input"" onclick=""ParseInput()""&amp;gt;")&lt;br /&gt;document.write("&amp;amp;nbsp&amp;lt;INPUT TYPE=""button"" NAME=""cmdClean"" VALUE=""Clean output"" onclick=""CleanResponse()""&amp;gt;")&lt;br /&gt;document.write("&amp;lt;/td&amp;gt;&amp;lt;td id=""tid""&amp;gt;&amp;lt;FONT FACE=""verdana"" SIZE=1&amp;gt;&amp;amp;nbsp&amp;lt;/td&amp;gt;")&lt;br /&gt;document.write("&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;/FORM&amp;gt;")&lt;br /&gt;'&lt;/span&gt;Get current user &lt;span class="kwrd"&gt;as&lt;/span&gt; &lt;span class="kwrd"&gt;default&lt;/span&gt;&lt;br /&gt;Dim objNet&lt;br /&gt;Set objNet = CreateObject(&lt;span class="str"&gt;"WScript.NetWork"&lt;/span&gt;)&lt;br /&gt;frmForm1.username.Value = objNet.UserDomain &amp;amp; &lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span class="str"&gt;"\" &amp;amp; objNet.UserName&lt;br /&gt;Set objNet = Nothing&lt;br /&gt;Sub SendRequest&lt;br /&gt;Dim WinHttpReq&lt;br /&gt;Const HTTPREQUEST_SETCREDENTIALS_FOR_SERVER = 0&lt;br /&gt;Set WinHttpReq = CreateObject("&lt;/span&gt;WinHttp.WinHttpRequest.5.1&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span class="str"&gt;")&lt;br /&gt;strStart = Timer&lt;br /&gt;WinHttpReq.Open "&lt;/span&gt;POST&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span class="str"&gt;", frmForm1.url.Value, False&lt;br /&gt;WinHttpReq.setRequestHeader "&lt;/span&gt;Content-Type&lt;span class="str"&gt;", "&lt;/span&gt;text/xml;charset=utf-8&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span class="str"&gt;"&lt;br /&gt;WinHttpReq.setRequestHeader "&lt;/span&gt;Accept&lt;span class="str"&gt;", "&lt;/span&gt;text/xml, multipart/related, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span class="str"&gt;"&lt;br /&gt;WinHttpReq.setRequestHeader "&lt;/span&gt;Content-Transfer-Encoding&lt;span class="str"&gt;", "&lt;/span&gt;binary&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span class="str"&gt;"&lt;br /&gt;WinHttpReq.setRequestHeader "&lt;/span&gt;Connection&lt;span class="str"&gt;", "&lt;/span&gt;keep-alive&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span class="str"&gt;"&lt;br /&gt;WinHttpReq.SetCredentials frmForm1.username.Value, frmForm1.password.Value, HTTPREQUEST_SETCREDENTIALS_FOR_SERVER&lt;br /&gt;WinHttpReq.Send(frmForm1.IN.Value)&lt;br /&gt;strStop = Timer&lt;br /&gt;Set xmlDoc = CreateObject("&lt;/span&gt;Msxml2.DOMDocument&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span class="str"&gt;")&lt;br /&gt;'Parse output&lt;br /&gt;xmlDoc.loadXML(WinHttpReq.ResponseText)&lt;br /&gt;If (xmlDoc.parseError.errorCode &amp;lt;&amp;gt; 0) Then&lt;br /&gt;   frmForm1.OUT.Value = WinHttpReq.ResponseText&lt;br /&gt;   Else&lt;br /&gt;   frmForm1.OUT.Value = xmlDoc.xml&lt;br /&gt;End If&lt;br /&gt;Set xmlDoc = Nothing&lt;br /&gt;strTime = strStop - strStart&lt;br /&gt;strTime = FormatNumber(strTime,2)&lt;br /&gt;tid.Innertext = "&lt;/span&gt;Response time: &lt;span class="str"&gt;" &amp;amp; strTime &amp;amp; "&lt;/span&gt; s&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span class="str"&gt;"&lt;br /&gt;Set WinHttpReq = Nothing&lt;br /&gt;'Set clipboard = output&lt;br /&gt;If frmForm1.blnSave.Value = True Then window.clipboardData.setData "&lt;/span&gt;Text&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span class="str"&gt;",frmForm1.OUT.Value&lt;br /&gt;End Sub&lt;br /&gt;Sub ParseInput&lt;br /&gt;Set xmlDoc = CreateObject("&lt;/span&gt;Msxml2.DOMDocument&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span class="str"&gt;")&lt;br /&gt;xmlDoc.loadXML(frmForm1.IN.Value)&lt;br /&gt;If (xmlDoc.parseError.errorCode &amp;lt;&amp;gt; 0) Then&lt;br /&gt;   Set myErr = xmlDoc.parseError&lt;br /&gt;   Msgbox "&lt;/span&gt;ERROR: &lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span class="str"&gt;" &amp;amp; myErr.reason&lt;br /&gt;   Set myErr = Nothing&lt;br /&gt;   Set xmlDoc = Nothing&lt;br /&gt;   Exit Sub&lt;br /&gt;End If&lt;br /&gt;frmForm1.IN.Value = xmlDoc.xml&lt;br /&gt;Set xmlDoc = Nothing&lt;br /&gt;End Sub&lt;br /&gt;Sub CleanResponse&lt;br /&gt;frmForm1.OUT.Value = "&lt;/span&gt;"&lt;br /&gt;End Sub&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;SCRIPT&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;html&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-5063275688899151922?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/5063275688899151922/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=5063275688899151922' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/5063275688899151922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/5063275688899151922'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/02/xml-automation-part-i.html' title='XML automation - part I'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-7505917451916614991</id><published>2008-02-13T16:17:00.004+01:00</published><updated>2008-02-13T20:29:42.236+01:00</updated><title type='text'>Pairwise test case design part two</title><content type='html'>I got a request to share the code for the "web shell", which I mentioned in earlier post.&lt;br /&gt;&lt;br /&gt;I did a fast translation from Swedish to English and here is the result (please read PICT help file for proper format of the input file):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;************************************************************************************&lt;br /&gt;Purpose: To generate testcase file.&lt;br /&gt;Assumptions: Proper security settings in browser&lt;br /&gt;Inputs: Inputfile, Outputfile&lt;br /&gt;Returns: Formated XLS Outputfile&lt;br /&gt;Author: Stefan Thelenius 2007-01-09.&lt;br /&gt;'***********************************************************************************&lt;br /&gt;--&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Create PairWise Test Cases&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;SCRIPT LANGUAGE="vbscript"&amp;gt;&lt;br /&gt;Sub CreateTest&lt;br /&gt;strInputFile = frmForm1.txtC.Value&lt;br /&gt;strOutputFile = frmForm1.txtB.Value&lt;br /&gt;frmForm1.Ptxt.Value = CreateTestCase(strInputFile, strOutputFile)&lt;br /&gt;End Sub&lt;br /&gt;Function CreateTestCase(strInputFile, strOutputFile)&lt;br /&gt;'Set path to PICT program&lt;br /&gt;strPath = "cmd /K C:\Program\Pict\pict.exe "&lt;br /&gt;Dim fso&lt;br /&gt;Set fso = CreateObject("Scripting.FileSystemObject")&lt;br /&gt;'Copy input file to temp file&lt;br /&gt;fso.CopyFile strInPutFile, "c:\temp.txt"&lt;br /&gt;Dim oShell&lt;br /&gt;Set oShell = CreateObject ("Wscript.shell")&lt;br /&gt;'Run PICT&lt;br /&gt;Set oExec = oShell.Exec(strPath &amp;amp; "c:\temp.txt &amp;gt; c:\Testfall.xls")&lt;br /&gt;Set oExec = Nothing&lt;br /&gt;Set oShell = Nothing&lt;br /&gt;strCall = "FormatXLFile(""" &amp;amp; strOutputFile &amp;amp; """)"&lt;br /&gt;kaka = setTimeout (strCall,10000,"VBScript")&lt;br /&gt;Set fso = Nothing&lt;br /&gt;CreateTestCase = "Creating file, please wait..."&lt;br /&gt;End Function&lt;br /&gt;Function FormatXLFile(strOutputFile)&lt;br /&gt;Set ExcelObj = CreateObject("Excel.Application")&lt;br /&gt;ExcelObj.Workbooks.Close&lt;br /&gt;'Open file created by PICT&lt;br /&gt;ExcelObj.Workbooks.Open "c:\Testfall.xls"&lt;br /&gt;Set NewSheet = ExcelObj.Sheets.Item(1)&lt;br /&gt;NewSheet.Activate&lt;br /&gt;'Format&lt;br /&gt;NewSheet.Rows(1).Font.Bold = True&lt;br /&gt;NewSheet.Columns("A:AA").AutoFit&lt;br /&gt;ExcelObj.ActiveWorkbook.Saved = True&lt;br /&gt;NewSheet.Copy&lt;br /&gt;'Save to output files&lt;br /&gt;ExcelObj.ActiveWorkbook.SaveAs strOutputFile&lt;br /&gt;ExcelObj.ActiveWorkbook.Saved = True&lt;br /&gt;ExcelObj.Application.Quit&lt;br /&gt;Set NewSheet = Nothing&lt;br /&gt;Set ExcelObj = Nothing&lt;br /&gt;Set ExcelObj = CreateObject("Excel.Application")&lt;br /&gt;ExcelObj.Workbooks.Close&lt;br /&gt;ExcelObj.Workbooks.Open strOutputFile&lt;br /&gt;ExcelObj.Application.Visible = True&lt;br /&gt;FormatXLFile = "Ready"&lt;br /&gt;Set fso = CreateObject("Scripting.FileSystemObject")&lt;br /&gt;'Delete temp files&lt;br /&gt;fso.DeleteFile("c:\temp.txt")&lt;br /&gt;fso.DeleteFile("c:\Testfall.xls")&lt;br /&gt;Set fso = Nothing&lt;br /&gt;frmForm1.Ptxt.Value = "File ready"&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;&amp;lt;/SCRIPT&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;BODY BGCOLOR="white"&amp;gt;&lt;br /&gt;&amp;lt;FONT FACE="verdana" SIZE=1&amp;gt;&lt;br /&gt;&amp;lt;FORM NAME="frmForm1"&amp;gt;&lt;br /&gt;&amp;lt;table width="300" border="0" cellspacing="0" cellpadding="0" align="left"&amp;gt;&lt;br /&gt;&amp;lt;FONT FACE="verdana" SIZE=1&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;H3&amp;gt;&amp;lt;Center&amp;gt;Create test cases&amp;lt;Center/&amp;gt;&amp;lt;/H3&amp;gt;&lt;br /&gt;&amp;lt;FONT FACE="verdana" SIZE=1&amp;gt;&lt;br /&gt;Input File syntax: [infilename.txt]&amp;lt;br /&amp;gt;&lt;br /&gt;Output File syntax: [outfilename.xls]&amp;lt;br /&amp;gt;&lt;br /&gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;&amp;lt;table width="300" border="0" cellspacing="0" cellpadding="0" align="left"&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&lt;br /&gt;&amp;lt;Left&amp;gt;&lt;br /&gt;&amp;lt;FONT FACE="verdana" SIZE=1&amp;gt;&lt;br /&gt;Infile&lt;br /&gt;&amp;lt;/Left&amp;gt;&lt;br /&gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&lt;br /&gt;&amp;lt;INPUT TYPE="file" NAME="txtC" SIZE=40&amp;gt;&lt;br /&gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&lt;br /&gt;&amp;lt;Left&amp;gt;&lt;br /&gt;&amp;lt;FONT FACE="verdana" SIZE=1&amp;gt;&lt;br /&gt;Outfile&lt;br /&gt;&amp;lt;/Left&amp;gt;&lt;br /&gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&lt;br /&gt;&amp;lt;INPUT TYPE="file" NAME="txtB" SIZE=40&amp;gt;&lt;br /&gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&lt;br /&gt;&amp;lt;Center&amp;gt;&lt;br /&gt;&amp;lt;FONT FACE="verdana" SIZE=1&amp;gt;&lt;br /&gt;&amp;lt;INPUT TYPE="button" NAME="cmdCalc" VALUE="Create file" onclick="CreateTest"&amp;gt;&lt;br /&gt;&amp;lt;/Center&amp;gt;&lt;br /&gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&lt;br /&gt;&amp;lt;INPUT TYPE="text" NAME="Ptxt" SIZE=40&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;amp;nbsp&amp;amp;nbsp&amp;amp;nbsp&amp;amp;nbsp&amp;amp;nbsp&amp;amp;nbsp&amp;amp;nbsp&amp;amp;nbsp&amp;amp;nbsp&amp;amp;nbsp&lt;br /&gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;/FORM&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-7505917451916614991?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/7505917451916614991/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=7505917451916614991' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/7505917451916614991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/7505917451916614991'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/02/pairwise-test-case-design-part-two.html' title='Pairwise test case design part two'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-1236885258451047251</id><published>2008-02-13T08:25:00.003+01:00</published><updated>2008-02-13T08:47:37.925+01:00</updated><title type='text'>Pairwise test case design</title><content type='html'>I've found a good site about pairwise testing the other day: &lt;br /&gt;&lt;a href="http://www.pairwise.org/"&gt;http://www.pairwise.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;About a year ago I implemented the use of tool which generates test cases accordingly to the pairwise technique: &lt;a href="http://download.microsoft.com/download/f/5/5/f55484df-8494-48fa-8dbd-8c6f76cc014b/pict33.msi"&gt;PICT&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Since I prefer web-based UI rather than command-line dito I've created a web shell on top of PICT which makes it a little bit easier to use. In addition I use the Excel COM-object to make a nice format of the output file:&lt;br /&gt;&lt;a href="http://bp0.blogger.com/_4tHQNkQA_gI/R7KfyU9DPiI/AAAAAAAAAA4/7kT9M8BShqY/s1600-h/output.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_4tHQNkQA_gI/R7KfyU9DPiI/AAAAAAAAAA4/7kT9M8BShqY/s320/output.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5166367409514429986" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-1236885258451047251?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/1236885258451047251/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=1236885258451047251' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/1236885258451047251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/1236885258451047251'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/02/pairwise-test-case-design.html' title='Pairwise test case design'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_4tHQNkQA_gI/R7KfyU9DPiI/AAAAAAAAAA4/7kT9M8BShqY/s72-c/output.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-5444261279676906267</id><published>2008-01-30T13:53:00.000+01:00</published><updated>2008-01-30T14:05:13.474+01:00</updated><title type='text'>A day in my test-life...using my test tools</title><content type='html'>A day in my test-life...using my test tools&lt;br /&gt;&lt;br /&gt;08.00 Arrives at work, connects (dual monitors) and starts my laptop.&lt;br /&gt;08.08 Logged in at last (crypted hard drives)!&lt;br /&gt;08.09 Check emergency e-mail from production or test (if any)&lt;br /&gt;08.10 Check status for all ten test environments (available in i single web page, VBScript-based)&lt;br /&gt;08.11 Test environment maintaince&lt;br /&gt;08.20 Check regression test dashboard (available in i single web page, VBScript-based) wheather to start some automated test suites or not&lt;br /&gt;08.30 Check for bug fixes and new builds&lt;br /&gt;08.31 Retesting bugs&lt;br /&gt;09.15 Short test meeting regarding release status&lt;br /&gt;09.30 Manual test session based on my product areas in the release (using my test tools for test data).&lt;br /&gt;11.30 Lunch&lt;br /&gt;12.15 Maintainance of test framework&lt;br /&gt;14.00 Manual test session based on my product areas in the release (using my test tools for test data)&lt;br /&gt;17.00 Going home&lt;br /&gt;&lt;br /&gt;This is of course in case all things runs smoothly...&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/5047841583820836253-5444261279676906267?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/5444261279676906267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=5444261279676906267' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/5444261279676906267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/5444261279676906267'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/01/day-in-my-test-lifeusing-my-test-tools.html' title='A day in my test-life...using my test tools'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-7511636766788073507</id><published>2008-01-25T09:42:00.000+01:00</published><updated>2008-01-25T09:51:46.294+01:00</updated><title type='text'>Test framework data model snapshot</title><content type='html'>One of the most essential parts of my framework is the data model and the database. Here is a snapshot of some of the most important tables and their relationsship to each other:&lt;br /&gt;&lt;br&gt;&lt;a href="http://bp3.blogger.com/_4tHQNkQA_gI/R5mi-SwXAwI/AAAAAAAAAAo/FeE49NAMVf4/s1600-h/testdatamodel.PNG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_4tHQNkQA_gI/R5mi-SwXAwI/AAAAAAAAAAo/FeE49NAMVf4/s400/testdatamodel.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5159334039199875842" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-7511636766788073507?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/7511636766788073507/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=7511636766788073507' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/7511636766788073507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/7511636766788073507'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/01/test-framework-data-model-snapshot.html' title='Test framework data model snapshot'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_4tHQNkQA_gI/R5mi-SwXAwI/AAAAAAAAAAo/FeE49NAMVf4/s72-c/testdatamodel.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-5679779173893605463</id><published>2008-01-18T12:57:00.000+01:00</published><updated>2008-01-18T15:41:02.890+01:00</updated><title type='text'>Create Dictionary Object from a record set</title><content type='html'>Here is a function for creating a Dictionary Object out of a record set:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp2.blogger.com/_4tHQNkQA_gI/R5C6cX-7BpI/AAAAAAAAAAg/oEIi0CNyv3Y/s1600-h/DBDO.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_4tHQNkQA_gI/R5C6cX-7BpI/AAAAAAAAAAg/oEIi0CNyv3Y/s400/DBDO.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5156826569976252050" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-5679779173893605463?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/5679779173893605463/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=5679779173893605463' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/5679779173893605463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/5679779173893605463'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/01/create-dictionary-object-from-record.html' title='Create Dictionary Object from a record set'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_4tHQNkQA_gI/R5C6cX-7BpI/AAAAAAAAAAg/oEIi0CNyv3Y/s72-c/DBDO.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-6423909057404393620</id><published>2008-01-15T21:22:00.000+01:00</published><updated>2008-01-15T21:29:26.129+01:00</updated><title type='text'>CDO.Message</title><content type='html'>I would recommend &lt;a href="http://www.paulsadowski.com/WSH/cdo.htm"&gt;this site&lt;/a&gt; for learning about the CDO object which is perfect for creating and sending mail in automation.&lt;br /&gt;&lt;br /&gt;For example when a test case fail I use CDO to send a mail with test case id and a screen shot of the error...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-6423909057404393620?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/6423909057404393620/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=6423909057404393620' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/6423909057404393620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/6423909057404393620'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2008/01/cdomessage.html' title='CDO.Message'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-8533419411516207455</id><published>2007-12-19T11:11:00.000+01:00</published><updated>2007-12-19T14:20:32.753+01:00</updated><title type='text'>SQL Store Procedures</title><content type='html'>Yes! I wrote my first SP yesterday and it works excellent. The SP returns test case and results statistics from test framework database and is called from our Intranet. Response time for the page is now 1 second which I think is reasonable...&lt;br /&gt;&lt;br /&gt;My form for register regression test cases and their result is now ready and our test group has began using it. Since I am resusing my test framework of course all results are published in real-time at our Intranet (using the SP from above)...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-8533419411516207455?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/8533419411516207455/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=8533419411516207455' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/8533419411516207455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/8533419411516207455'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2007/12/sql-store-procedures.html' title='SQL Store Procedures'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-4199742573994109901</id><published>2007-11-27T21:41:00.000+01:00</published><updated>2007-11-27T21:52:56.899+01:00</updated><title type='text'>My test framework...</title><content type='html'>...is starting to payoff a bit I guess&lt;br /&gt;&lt;br /&gt;I now use it in QTP, web-based test tools and in vbs-files. All test result is stored in a test database and Dashboard views are available via our Intranet. For example: We have scheduled batch jobs running nighly which actually is test cases so their result is stored as well.&lt;br /&gt;&lt;br /&gt;I am also planning to have a simple form where manual regression test result can be registered  (some sort of QC light). The main reason is to have better overview which parts were tested when and by whom. This does not include testing new functionality since we use ET and test sheets...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-4199742573994109901?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/4199742573994109901/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=4199742573994109901' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/4199742573994109901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/4199742573994109901'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2007/11/my-test-framework.html' title='My test framework...'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-3712126067668881754</id><published>2007-10-08T11:17:00.000+02:00</published><updated>2007-10-08T11:20:31.943+02:00</updated><title type='text'>QTP: Done framework migration</title><content type='html'>Done!&lt;br /&gt;&lt;br /&gt;I Guess I will alter the data model some more but all data and scripts are converted...&lt;br /&gt;&lt;br /&gt;...next mission is to build a test driver for our API which can be executed stand-alone in parallell with QTP&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-3712126067668881754?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/3712126067668881754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=3712126067668881754' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/3712126067668881754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/3712126067668881754'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2007/10/qtp-done-framework-migration.html' title='QTP: Done framework migration'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-111659430437778927</id><published>2007-09-27T20:12:00.000+02:00</published><updated>2007-09-27T20:16:31.552+02:00</updated><title type='text'>QTP: Migration part 4</title><content type='html'>I started my test tool career about ten years ago with a custom tool in MS Access. Now ten years later I find this wonderful feature in MS Access 2003, create a web page with MS SQL Server underneath...&lt;br /&gt;&lt;br /&gt;You can build a real handy GUI in just minutes...which I did (4 and counting...)&lt;br /&gt;&lt;br /&gt;Almost done migration, have a few test scenarios to manually convert left...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-111659430437778927?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/111659430437778927/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=111659430437778927' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/111659430437778927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/111659430437778927'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2007/09/qtp-migration-part-4.html' title='QTP: Migration part 4'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-5693349505878587009</id><published>2007-09-19T21:26:00.000+02:00</published><updated>2007-09-19T21:29:50.140+02:00</updated><title type='text'>QTP: Migration part 3</title><content type='html'>Puh...&lt;br /&gt;&lt;br /&gt;Done converting Test Case Functions with my new Dictionary Object concept, works fine so far...&lt;br /&gt;&lt;br /&gt;Next...create web GUIs to handle the database&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-5693349505878587009?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/5693349505878587009/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=5693349505878587009' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/5693349505878587009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/5693349505878587009'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2007/09/qtp-migration-part-3.html' title='QTP: Migration part 3'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-1244052421481236359</id><published>2007-09-13T07:56:00.000+02:00</published><updated>2007-09-13T07:59:54.707+02:00</updated><title type='text'>QTP: Migration part 2b</title><content type='html'>Sorry...&lt;br /&gt;&lt;br /&gt;You can see values of a Dictionary Object when debugging...&lt;br /&gt;&lt;br /&gt;Add to Watch panel:&lt;br /&gt;&lt;br /&gt;objMyDictionary.Item("MyParameter")&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-1244052421481236359?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/1244052421481236359/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=1244052421481236359' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/1244052421481236359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/1244052421481236359'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2007/09/qtp-migration-part-2b.html' title='QTP: Migration part 2b'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-4917395590234170349</id><published>2007-09-12T07:53:00.000+02:00</published><updated>2007-09-12T08:06:04.160+02:00</updated><title type='text'>QTP: Migration part 2</title><content type='html'>Done converting xls -&gt; SQL Server...so far everything seems OK&lt;br /&gt;&lt;br /&gt;Last week I 'discovered' the Dictionary Object...seems perfect when to pass/get parameters from a function (I don't use Actions). So now I am converting my test case functions using Dictionary Object instead of ordinary variables.&lt;br /&gt;&lt;br /&gt;+ Easy to add parameters&lt;br /&gt;+ Allows optional parameters&lt;br /&gt;+ Allows multiple output values&lt;br /&gt;+ Since my test parameters are now in a table (pair-wise) I can have a Dictionary Object with the entire recordset (select parameter_name, parameter_value where test_case_id = ...) which is easy to merge with my global test parameters (test environment etc) and have it in my call to a test case.&lt;br /&gt;&lt;br /&gt;Set objTCOutputData = MyTestCase (objTCInputData)&lt;br /&gt;&lt;br /&gt;- Values in a Dictionary Object are not visible when debugging :-(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-4917395590234170349?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/4917395590234170349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=4917395590234170349' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/4917395590234170349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/4917395590234170349'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2007/09/qtp-migration-part-2.html' title='QTP: Migration part 2'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-3694327383839776785</id><published>2007-09-08T17:21:00.000+02:00</published><updated>2007-09-08T17:29:33.723+02:00</updated><title type='text'>QTP: Migration part 1</title><content type='html'>I have always been a big fan of Excel, but last week when one of my test case files got corrupt after an update I decided it was to time to move forward...&lt;br /&gt;&lt;br /&gt;...to have all my test data in MS SQL Server instead of xls-files.&lt;br /&gt;&lt;br /&gt;So during this week I have been modifying my data model and created a database which will contain all my test case data. Currently I'm writing migration scripts which will transfer all my data from the xls-files to the new database...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-3694327383839776785?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/3694327383839776785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=3694327383839776785' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/3694327383839776785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/3694327383839776785'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2007/09/qtp-migration-part-1.html' title='QTP: Migration part 1'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-6913387226214005850</id><published>2007-09-01T08:48:00.000+02:00</published><updated>2007-09-01T08:58:30.012+02:00</updated><title type='text'>QTP: Functions vs Actions</title><content type='html'>I started my QTP career with Actions but are now only using Functions. Why?&lt;br /&gt;&lt;br /&gt;- All variables are shown when debugging (action parameters don't)&lt;br /&gt;- Easier to add parameters&lt;br /&gt;- Faster to load test that has only one Action (the default one)&lt;br /&gt;- No need to bother where reusable Actions are located.&lt;br /&gt;- Possible to edit the functions without have to load other test containing reusable actions&lt;br /&gt;&lt;br /&gt;Conclusion: Faster, Easier and more cost effective...&lt;br /&gt;&lt;br /&gt;...but it is also a matter of automation taste...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-6913387226214005850?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/6913387226214005850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=6913387226214005850' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/6913387226214005850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/6913387226214005850'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2007/09/qtp-functions-vs-actions.html' title='QTP: Functions vs Actions'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-5976686911674390145</id><published>2007-08-21T08:01:00.000+02:00</published><updated>2007-08-21T08:18:00.233+02:00</updated><title type='text'>Automation using QuickTest Pro</title><content type='html'>QTP has a lot of features which looks nice at first but are not cost effective to use in the long run. I have created a framework with custom functions instead which is handy to work with. Here are the main features:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Custom reporting. Write the results to xls using ADO and use QTP report for detailed logging only. The results are presented at our Intranet in real-time. In case of test case failure, an e-mail is sent with a screenshot of the AUT.&lt;/li&gt;&lt;li&gt;DP instead of OR. Quicker to work with and easy maintainance.&lt;/li&gt;&lt;li&gt;Functions instead of Actions. Quicker to work with and easy maintainance.&lt;/li&gt;&lt;li&gt;Test cases in custom xls using ADO instead of the DataSheet.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;More about this later on...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-5976686911674390145?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/5976686911674390145/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=5976686911674390145' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/5976686911674390145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/5976686911674390145'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2007/08/automation-using-quicktest-pro.html' title='Automation using QuickTest Pro'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-2076131973483788819</id><published>2007-06-28T08:42:00.000+02:00</published><updated>2007-12-20T08:21:47.690+01:00</updated><title type='text'>Part-time automation...</title><content type='html'>Is it possible to have succes in automation without have at least one dedicated, full-time resource?&lt;br /&gt;&lt;br /&gt;In most cases no, but in my case yes...&lt;br /&gt;&lt;br /&gt;I probably spend 30% of my time in automation and the rest for sapient testing (see &lt;A HREF="http://www.satisfice.com/blog/archives/99"&gt;James Bach Blog&lt;/A&gt;). Of course during some periods the automation efforts have to be higher (during implementation, creating a framework among other things) but once settled (if you have a good framework) a relative small effort in maintanance, running tests and creating new tests could still be worth while...&lt;br /&gt;&lt;br /&gt;In my case this is possible due to the following:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Previous experience in automation&lt;/li&gt;&lt;li&gt;An automation-friendly AUT (framework-based prefereble)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;More about my automation framework later on...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-2076131973483788819?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/2076131973483788819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=2076131973483788819' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/2076131973483788819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/2076131973483788819'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2007/06/part-time-automation.html' title='Part-time automation...'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-2069627516550509066</id><published>2007-06-01T09:02:00.000+02:00</published><updated>2007-06-28T08:40:39.455+02:00</updated><title type='text'>Get random test data into Clipboard</title><content type='html'>&lt;span style="font-family:verdana;"&gt;OK,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Then we know how to get random data from SQL Server. Would be nice to build a public web page around this where testers easily can get test data for immidiate pasting into the AUT.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Something like this maybe:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;1. Specify data to get and from which test environment&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;2. Click on a button and display the test data and put automaticly in clipboard&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;3. Paste into the AUT&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Solution:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Create a web form and include&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt;vbscript&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt;&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Sub GetTestData&lt;br /&gt;&lt;span style="color:#33ff33;"&gt;'Set test environment and test data&lt;/span&gt;&lt;br /&gt;strTestEnvironment = formname.TestEnvironment.Value&lt;span style="color:#33ff33;"&gt;'Form reference not used in this example&lt;/span&gt;&lt;br /&gt;intTestDataIndex = formname.RandomTestData.SelectedIndex&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;If intTestDataIndex = 0 Then&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;strSQL = &lt;span style="color:#ff9900;"&gt;"SELECT top 1 testdata1 FROM table where testdatatype1 is not NULL ORDER BY NEWID()"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ElseIf intTestDataIndex = 1 Then&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;strSQL = &lt;span style="color:#ff9900;"&gt;"SELECT top 1 testdata2 FROM table where testdatatype2 is not NULL ORDER BY NEWID()"&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#ff9900;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;End If&lt;br /&gt;&lt;span style="color:#33ff33;"&gt;'****** Initialization ******&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#33ff33;"&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;'Set test environment parameters&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;strDataBase = &lt;span style="color:#ff9900;"&gt;"DRIVER=SQL Server; DATABASE=[databasename];APP=[testtool];SERVER=[servername];Description=Testconnection"&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#33ff33;"&gt;'****** Data base call ******&lt;/span&gt;&lt;br /&gt;Dim objDB&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Set objDB = CreateObject("ADODB.Connection")&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;objDB.Open(strDataBase)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Set objRecordSet = objDB.Execute(strSQL)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Dim strResult&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;If objRecordSet.BOF = True And objRecordSet.EOF = True Then &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;strTestData = &lt;span style="color:#ff9900;"&gt;""&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Else &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;strResult = objRecordSet.GetString &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;strTestData = Left((Trim(strResult)),Len(Trim(strResult))-1)&lt;span style="color:#33ff33;"&gt;'Format data&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;End If&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;objDB.Close&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Set objDB = Nothing&lt;br /&gt;formname.TestData.Value = strTestData&lt;br /&gt;End Sub&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;and finally&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;JavaScript&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;function copytestdata(input) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;GetTestData();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;window.clipboardData.setData('Text',input.value);&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:verdana;"&gt;Start the sequence by using the tag&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;INPUT TYPE&lt;span style="color:#000000;"&gt;="button"&lt;/span&gt; NAME="cmdGetTestData" VALUE="GetTestData" onclick="copytestdata(formname.TestData)"&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Done!&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/5047841583820836253-2069627516550509066?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/2069627516550509066/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=2069627516550509066' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/2069627516550509066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/2069627516550509066'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2007/06/hmta-slumpvis-testdata-och-lgg-i.html' title='Get random test data into Clipboard'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-93111951106539508</id><published>2007-05-22T08:14:00.000+02:00</published><updated>2007-06-14T12:32:55.300+02:00</updated><title type='text'>Randomize test data</title><content type='html'>&lt;span style="font-family:verdana;"&gt;Random test data could be a good thing in certain situations in software testing.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt;If your AUT (application under test) is running on MS SQL Server there is a smart function in&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;order by newid()&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:verdana;"&gt;By using this the record set will sorted randomly.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;"&gt;To get one record randomly syntax will be&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;select top 1&lt;br /&gt;mydata&lt;br /&gt;from mytable&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;where&lt;br /&gt;mydata = mytestdatarequirement&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;order by newid() &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:verdana;"&gt;With this you can easily build small web apps. for testing using vbScript and/or JavaScript. More about that later...&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-93111951106539508?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/93111951106539508/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=93111951106539508' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/93111951106539508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/93111951106539508'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2007/05/slumpa-fram-testdata.html' title='Randomize test data'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5047841583820836253.post-2675125906828150204</id><published>2007-05-18T13:30:00.000+02:00</published><updated>2007-06-14T09:09:01.047+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='test'/><title type='text'>In the beginning...</title><content type='html'>Why a blog? Well, all testers that matters seems to have one so I better join the crowd. Will be blogging mainly about software testing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5047841583820836253-2675125906828150204?l=abouttesting.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abouttesting.blogspot.com/feeds/2675125906828150204/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5047841583820836253&amp;postID=2675125906828150204' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/2675125906828150204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5047841583820836253/posts/default/2675125906828150204'/><link rel='alternate' type='text/html' href='http://abouttesting.blogspot.com/2007/05/allt-har-en-brjan.html' title='In the beginning...'/><author><name>Stefan</name><uri>http://www.blogger.com/profile/14073416685551547144</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://3.bp.blogspot.com/_4tHQNkQA_gI/SNvrXnJbrlI/AAAAAAAAAEE/WKfjQ0dhsZM/S220/me.png'/></author><thr:total>2</thr:total></entry></feed>
