<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.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" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0"><id>tag:blogger.com,1999:blog-8291059916253528224</id><updated>2011-12-21T20:45:33.086-08:00</updated><category term="VBScript" /><category term="ITC Template" /><category term="QTP Advance Commands" /><category term="ATC Template" /><category term="Test Estimation Template" /><category term="Optional Steps in QTP" /><category term="QTP Settings Best Practices" /><category term="Active Screen" /><category term="time and quality" /><category term="Data Constraint" /><category term="Delphi" /><category term="Agile Reporting" /><category term="QTP Edit" /><category term="Test Set" /><category term="Rational Quality Management Solutions" /><category term="Solution" /><category term="Challenges" /><category term="Oracle Constraint" /><category term="Right Join" /><category term="Truncate" /><category term="Scalar Function" /><category term="Test Driven Development" /><category term="Test Plan" /><category term="Testing Expert" /><category term="Self Join" /><category term="Database Layer" /><category term="HP QTP" /><category term="Customer" /><category term="Feature Point" /><category term="Drop Table" /><category term="Line of Code" /><category term="Function Point" /><category term="FP" /><category term="Agile Nature" /><category term="UTC Template" /><category term="blackbox" /><category term="design" /><category term="DQL" /><category term="Website Testing Tool" /><category term="Like Predicate" /><category term="whitebox" /><category term="QTP New Test" /><category term="Truncate Table" /><category term="Between Operator" /><category term="Environment Variable" /><category term="Arithmetic Operator" /><category term="Software Testing" /><category term="prevention" /><category term="Database Concept" /><category term="Whitepaper" /><category term="2NF" /><category term="Insert Table" /><category term="Defect Assignment" /><category term="Oracle Operation" /><category term="Software Books" /><category term="Function Generator" /><category term="Testing issues" /><category term="Estimation Risk" /><category term="Default Value" /><category term="Test Plan Template" /><category term="Mantis Installation" /><category term="Software Development" /><category term="program" /><category term="QTP Start Transaction" /><category term="Priority List" /><category term="Defect Life Cycle" /><category term="SQL Query" /><category term="Validation" /><category term="GROUP BY" /><category term="Having" /><category term="Foreign Key" /><category term="THETA Style" /><category term="Unique Key" /><category term="Tester Database Knowledge" /><category term="Not Null Constraint" /><category term="Delete Table" /><category term="Update Table" /><category term="Business Layer" /><category term="Mantis Email Configuration" /><category term="Logical Operator" /><category term="QTP Resources" /><category term="IN Predicate" /><category term="XML File" /><category term="Email Configuration" /><category term="HP QTP Best Practices" /><category term="PERT" /><category term="Delete" /><category term="INTERSECT Clause" /><category term="UAT" /><category term="requirement" /><category term="Presentation Layer" /><category term="ANSI Style" /><category term="QTP Checkpoint" /><category term="Quality" /><category term="Productivity" /><category term="QTP Parameter" /><category term="Inner Join" /><category term="Business Component" /><category term="QTP Function" /><category term="Aggregare Function" /><category term="DCL" /><category term="Automation Framework" /><category term="Equi Join" /><category term="UNION Clause" /><category term="QTP Action" /><category term="Verification" /><category term="Wide Band Delphi" /><category term="QTP Object Property" /><category term="Coverage Testing" /><category term="QTP Framework" /><category term="testing cost" /><category term="Integration Testing" /><category term="XP Framework" /><category term="QTP Split Action" /><category term="Test Strategy" /><category term="MINUS Clause" /><category term="Defect Closure" /><category term="Test Factor Matrix" /><category term="Testing Books" /><category term="DML" /><category term="SQL Commands" /><category term="Codds Rule" /><category term="Testing Certification" /><category term="3NF" /><category term="QTP Tutorial" /><category term="QTP Run Option" /><category term="Shop Online" /><category term="$g_database_name" /><category term="Stop Testing" /><category term="Reliability" /><category term="DBMS" /><category term="correctness" /><category term="testing history" /><category term="Usability" /><category term="DUAL function" /><category term="Testing Practices" /><category term="debugging" /><category term="ChildObject" /><category term="Workshop for HP Mercury QTP" /><category term="Primary Key" /><category term="Complexity and Testing" /><category term="Report" /><category term="Security" /><category term="TAW-it" /><category term="Date Function" /><category term="Agile testing" /><category term="Correlated Subquery" /><category term="Defect Reporting" /><category term="Agility" /><category term="QTP Function Library" /><category term="Nested Query" /><category term="QTP Settings" /><category term="Test First Then Code" /><category term="Estimation" /><category term="Action Parameter" /><category term="Difference Between Primary Key and Foreign Key" /><category term="QTP Toolbars" /><category term="Link" /><category term="Defects" /><category term="Describe Table" /><category term="QC Connection" /><category term="QTP XML" /><category term="Unit Testing" /><category term="Craftsmanship to engineering" /><category term="Normalization" /><category term="Left Join" /><category term="Pixel Ruler" /><category term="Project Creation" /><category term="Capability" /><category term="budget" /><category term="QTP Datatable" /><category term="Quality Management" /><category term="Synchronization Point" /><category term="QTP Insert Commands" /><category term="Alter Table" /><category term="Web Developer" /><category term="Reusable Function" /><category term="Defect Management Tool" /><category term="Performance Testing" /><category term="Source Code" /><category term="Export QTP Test" /><category term="Quality vs Cost" /><category term="DDL" /><category term="Test Lab" /><category term="Create Table" /><category term="Subquery" /><category term="RDMS" /><category term="1NF" /><category term="Delete QTP Action" /><category term="QTP Addins" /><category term="QTP Environment Variables" /><category term="Metrics" /><category term="Check Constraint" /><category term="Risk Based Testing" /><title type="text">All about Software Testing</title><subtitle type="html">The site contain information about testing. You can search our articles for latest in Testing field, types of testing, test template, automation testing, automation tools and many un-heard information about testing.
&lt;strong&gt;&lt;br&gt;WE ALREADY STARTED QTP LEARNING SERIES. PLEASE MAKE OPTIMUM USE OF THE SITE TO LEARN QTP. VERY SOON WE WILL ALSO BE STARTING  WITH SELENIUM SERIES.&lt;/strong&gt;</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://buildtesting.blogspot.com/feeds/posts/full" /><link rel="alternate" type="text/html" href="http://buildtesting.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/full?start-index=26&amp;max-results=25" /><author><name>Sachin Kumar</name><uri>http://www.blogger.com/profile/08030029569880551521</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://bp2.blogger.com/_A4WiZotKHb8/SDMMSRhQ2eI/AAAAAAAAAgQ/e8XAvQopCOg/S220/S7300265.JPG" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>38</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/buildtesting" /><feedburner:info uri="buildtesting" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by/2.0/" /><logo>http://creativecommons.org/images/public/somerights20.gif</logo><feedburner:emailServiceId>buildtesting</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry><id>tag:blogger.com,1999:blog-8291059916253528224.post-1123508285392400627</id><published>2011-07-18T18:06:00.001-07:00</published><updated>2011-07-18T18:08:00.580-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="QTP Start Transaction" /><category scheme="http://www.blogger.com/atom/ns#" term="QTP Insert Commands" /><category scheme="http://www.blogger.com/atom/ns#" term="QTP Function" /><category scheme="http://www.blogger.com/atom/ns#" term="Function Generator" /><category scheme="http://www.blogger.com/atom/ns#" term="QTP Tutorial" /><category scheme="http://www.blogger.com/atom/ns#" term="QTP Checkpoint" /><category scheme="http://www.blogger.com/atom/ns#" term="QTP Action" /><category scheme="http://www.blogger.com/atom/ns#" term="Synchronization Point" /><title type="text">HP QTP Tutorial Chapter 5</title><content type="html">&lt;h3&gt;&lt;a name="_Toc298819932"&gt;1 Insert&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;The Insert Menu will help you in inserting various verification points, New Steps, Function, and Call to Action etc. While describing the various commands which are available in Insert Menu, I will also be mentioning the hot keys to access some of the commands. See the below screen shot what command is available in the INSERT Menu:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-0reJT-NJNT0/TiTYJzoQ7BI/AAAAAAAACZQ/9i5d5ryalKg/s1600-h/clip_image0023.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://lh4.ggpht.com/-Dkq8X7Y25kA/TiTYKjPZSdI/AAAAAAAACZU/LVE69tH0G8Q/clip_image002_thumb.jpg?imgmax=800" width="133" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc298819933"&gt;1.1 Checkpoint&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;Let me first describe what a checkpoint is all about. The Checkpoints feature is provided in Automation Tool for simplifying the test case automation where you need to validate the state of the application. For e.g. You might want to test that when you open a web page or form, you will be able to see 5 Input Boxes and 2 Buttons. Out of the 5 Input Boxes, 3 should be editable, 2 should be ready only. Likewise 2 Buttons – 1 will be disabled by default and 1 will be enabled by default. In such a case you can use Tool Checkpoint feature. I hope this now clarify what is a checkpoint and its usage. If you read the QTP documentation it will talk of various checkpoint like Text, Text area, Table, Standard etc. In this tutorial I will talk about the checkpoint but not in a detail manner as I am writing another chapter dedicated to Checkpoints.&lt;/p&gt;  &lt;p&gt;You can access Checkpoint: INSERT-&amp;gt;CHECKPOINT (See the below screen shot)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-AMrJDPHZ5Nc/TiTYLQgdBmI/AAAAAAAACZY/W2z_Z3zusrw/s1600-h/clip_image0043.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://lh3.ggpht.com/-lVbVhUS7nUw/TiTYMVx9uiI/AAAAAAAACZc/uAaFLDRK1Ac/clip_image004_thumb.jpg?imgmax=800" width="244" height="113" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The commands which are in disabled mode will be enabled when you start your script recording. There are only two commands namely Database checkpoint and XML checkpoint which are available in enabled mode by default. There is reason behind it, if you see these checkpoints they do not have dependency on AUT as they are interacting with database and XML which can be loaded from server or local directory.&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc298819934"&gt;1.2 Output Value&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;The Output Value is mainly used wherein you want to capture the value from AUT. For e.g. I am creating an Account in my application which provide me with an Account number after successful creation of an account. I want to use this account number for validating some scenario which can be done only through search module of the application. In such a scenario I can use Output feature in QTP so that the value can be used as an input in another part of AUT. You can access Output Value: INSERT-&amp;gt;OUTPUT VALUE (See the below screen shot)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-X3wfmykSxiY/TiTYNJ47ZQI/AAAAAAAACZg/fGGZbgzyvNA/s1600-h/clip_image0063.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image006" border="0" alt="clip_image006" src="http://lh6.ggpht.com/-26fdIxL3A-c/TiTYNzeKZrI/AAAAAAAACZk/uOadR9eMXFg/clip_image006_thumb.jpg?imgmax=800" width="244" height="93" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I will talk more about Checkpoint and Output value in the next chapter. Keep checking my blog.&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc298819935"&gt;1.3 Step Generator&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;As you start with your scripting, you need to use inbuilt functions, customized functions to design a robust testing framework. The Step Generator aids your scripting by providing help on 3 categories: &lt;u&gt;Test Objects&lt;/u&gt;, &lt;u&gt;Utility Objects&lt;/u&gt;, &lt;u&gt;Functions&lt;/u&gt;. As you select any of these categories QTP allows you to add respective steps in your script. This tool is very handy for beginner as it really makes their life easy while scripting. You can access the Step Generator by pressing shortcut key of F7 or navigating to INSERT-&amp;gt;STEP GENERATOR ( See the below screen shot of Step Generator):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-fnWyQmg7tuM/TiTYO2pC-CI/AAAAAAAACZo/XynOhGv5JmU/s1600-h/clip_image0083.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image008" border="0" alt="clip_image008" src="http://lh5.ggpht.com/-J8ieN8ru0_E/TiTYPpiy6dI/AAAAAAAACZs/blMs-aKS4mQ/clip_image008_thumb.jpg?imgmax=800" width="177" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I will talk about the details in next the chapter of this tutorial series.&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc298819936"&gt;1.4 Function Definition Generator&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;This utility or command in QTP aids you in defining the Function Skelton. You can define Function or Sub Procedure using Function Definition Generator. You can define even register your function with a Test Object so that you can achieve the desired result on the Test Object action. I will not delve into much detail at this point of time as it is more advance topic. So as of now if you are beginner and new to scripting, this is the utility for you. You can access the utility by navigating to INSERT-&amp;gt; Function Definition Generator. See the below screen shot:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-fOc7wEKLPYo/TiTYQmZE77I/AAAAAAAACZw/uXFgmjQoy3g/s1600-h/clip_image0103.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image010" border="0" alt="clip_image010" src="http://lh6.ggpht.com/-to5XAasKPDc/TiTYRX6swGI/AAAAAAAACZ0/RKCPOnz1EZc/clip_image010_thumb.jpg?imgmax=800" width="187" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc298819937"&gt;1.5 Synchronization Point&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;This is one of very useful command in QTP. This will be used very frequently in your scripting. There might be a situation wherein you have to wait till the time page get loaded or input field get enabled, progress bar reach 100% etc. Any scenario where next action depends on the completion of previous action, you have to use Synchronization Point in your script. This command will get enabled when you are in recoding mode. Just try your hand on this utility and see the generated script. Seeing the name you will understand that you have to wait till some property get satisfied. You can access this command from INSERT-&amp;gt; Synchronization Point (See below screen shot)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-oUq4dioGW_E/TiTYSBPuTJI/AAAAAAAACZ4/vLo_qVtxtyo/s1600-h/clip_image0123.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image012" border="0" alt="clip_image012" src="http://lh5.ggpht.com/-JjXERwXaoHo/TiTYTIDgQvI/AAAAAAAACZ8/NFGc9ivDYHM/clip_image012_thumb.jpg?imgmax=800" width="241" height="134" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc298819938"&gt;1.6 New Step &amp;amp; New Step after Block&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;Suppose you have done 50% or 20% of your scripting and then you realize that you have to add some more steps which are in between of some existing steps, then you can use New Step command. This command is available to you in Keyword view only. First you need to place select the step in Keyword view, then navigate to INSERT-&amp;gt;NEW STEP or press F8, as soon as you do this you will see a drop down from where you can select any test object , function to insert in your script. See the below screen shot:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-RyKP-t34TyY/TiTYT2pbNaI/AAAAAAAACaA/gs6HZgdgIJE/s1600-h/clip_image0143.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image014" border="0" alt="clip_image014" src="http://lh6.ggpht.com/-fPuygg2Ello/TiTYUS-kk0I/AAAAAAAACaE/Pt_ESNhETnE/clip_image014_thumb.jpg?imgmax=800" width="213" height="170" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Similarly if you want to add anything after a conditional block (IF ELSE) or loop (FOR, WHILE etc), then you can make use of INSERT-&amp;gt; New Step after Block or press SHIFT+ F8&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-6aywEhNk1l4/TiTYVNZ0qpI/AAAAAAAACaI/2kh14YnXvCE/s1600-h/clip_image0163.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image016" border="0" alt="clip_image016" src="http://lh4.ggpht.com/-IKfPM3-Nxzg/TiTYWOrz-ZI/AAAAAAAACaM/-PF2vikUqQw/clip_image016_thumb.jpg?imgmax=800" width="213" height="187" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;See the above screen shot wherein you can see the block of If statement in blue.&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc298819939"&gt;1.7 Comment&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;If you want to insert the comment in your scripting, use this command to provide the line comments, comments before a line of code etc. Navigate to INSERT-&amp;gt;COMMENT. You can also provide Line comments by filling the comment column of your keyword view. Please see the below screen shot:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-4-MtXvIGwRQ/TiTYYR8joLI/AAAAAAAACaY/FFaAI1Ctylk/s1600-h/clip_image0193.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image019" border="0" alt="clip_image019" src="http://lh3.ggpht.com/-33yftZu7pfE/TiTYZOG2seI/AAAAAAAACac/zl5FOgoWFvk/clip_image019_thumb.jpg?imgmax=800" width="244" height="105" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-dnHpmsiKFAc/TiTYZ4oQhjI/AAAAAAAACag/tJIxy2OMomA/s1600-h/clip_image0213.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image021" border="0" alt="clip_image021" src="http://lh4.ggpht.com/-9qfYMKFcbws/TiTYaoj5k2I/AAAAAAAACak/Bpiu_9IEcEg/clip_image021_thumb.jpg?imgmax=800" width="244" height="20" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc298819940"&gt;1.8 Report&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;This command is used to report the Pass, Fail, Warning, Done status to execution result. To add Report statement, select the step in keyword view after which Report statement need to be added, navigate to INSERT-&amp;gt;REPORT. See the below screen shot. You have to select the status, enter the name and description and then you are done:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-Nlg7xeOW1QA/TiTYbWEnxoI/AAAAAAAACao/mB22z65Trow/s1600-h/clip_image0233.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image023" border="0" alt="clip_image023" src="http://lh5.ggpht.com/-vxzwGtJxOiM/TiTYcV_PPhI/AAAAAAAACas/FvSoajXHhG4/clip_image023_thumb.jpg?imgmax=800" width="244" height="145" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc298819941"&gt;1.9 Conditional Statement&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;As the name suggests, if you want to define some logic, then you have to use the Conditional statement. This is very useful command to build a robust script. The usage of conditional statement and result reporting goes hand in hand. One has to ensure that wherever they are using Report statement, it should always be inside conditional statement. For e.g If I have to validate that button exists or not, then I will use conditional statement to report my result. See below pseudo code:&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;IF BUTTON EXIST&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;REPORT&lt;/b&gt;&lt;b&gt; PASS&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;ELSE&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;REPORT FAIL&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;END IF&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;You can access the Conditional statement command from INSERT=&amp;gt;Conditional Statement. See below screen shot which is self explanatory.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/--cCmehoIUL8/TiTYdBtbktI/AAAAAAAACaw/Kz686P45Kog/s1600-h/clip_image0253.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image025" border="0" alt="clip_image025" src="http://lh6.ggpht.com/-u_41_om7478/TiTYd1TybcI/AAAAAAAACa0/sDhT_t7s6NI/clip_image025_thumb.jpg?imgmax=800" width="244" height="203" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc298819942"&gt;1.10 &lt;/a&gt;Loop Statement&lt;/h3&gt;  &lt;p&gt;Like Conditional Statement you can also use Loop Statement where you have to use different set of data for your script. Without Loop statement, you can make your data driven framework (wait till advance version of tutorial get released). To insert Loop statement, select the step after which you want to have Loop statement, and then navigate to INSERT-&amp;gt;Loop Statement. See below screen shot:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-Safom_DvB7M/TiTYerZW4aI/AAAAAAAACa4/47WLXNitEQI/s1600-h/clip_image0273.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image027" border="0" alt="clip_image027" src="http://lh4.ggpht.com/-tzJQV3R5gvI/TiTYfY-uKgI/AAAAAAAACa8/H8ZIp8MLooU/clip_image027_thumb.jpg?imgmax=800" width="244" height="60" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc298819943"&gt;1.11 Call to New Action&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;As in my previous chapter I mentioned about action. Call to New Action is the command which can be accessed from INSERT-&amp;gt; Call to New Action. The call to new action command is calling a new action which does not have any script written. The new action is blank without any commands. You have to define the New Action after which it will perform the desired action and make your requirement fulfilled. See the below screen shots:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-pA3m6hy1SpI/TiTYgMKzwfI/AAAAAAAACbA/-AyNDRLO1eM/s1600-h/clip_image0293.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image029" border="0" alt="clip_image029" src="http://lh3.ggpht.com/-czogt40OV28/TiTYhFsqKpI/AAAAAAAACbE/AEzXBrICUZE/clip_image029_thumb.jpg?imgmax=800" width="244" height="213" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;After you define the New Action, you can make it reusable if you wish to use it in other Actions.&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc298819944"&gt;1.12 Call to Copy of Action&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;This is calling an existing action but with a copy of it so that you can customized as per your need. When saved a copy of previous action will be saved. This is the same thing wherein you are making use of existing code with some modification to speed up the scripting process. To access Call to Copy of Action, navigate to INSERT-&amp;gt;Call to Copy of Action (See below screen shot)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-OrDNjTcAEPE/TiTYh3HOawI/AAAAAAAACbI/rDXGvltHkxU/s1600-h/clip_image0313.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image031" border="0" alt="clip_image031" src="http://lh3.ggpht.com/-aPSiidAvV-A/TiTYi_Q_WLI/AAAAAAAACbM/n7rwSi8rnTw/clip_image031_thumb.jpg?imgmax=800" width="185" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc298819945"&gt;1.13 Call to Existing Action&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;This is very frequently used while doing scripting. Your test script is a combination of multiple actions like Login, Logout, Navigation, Specific Function etc. As a best practice what we normally do is we identify actions which get used most of the time. We make such action reusable and ask other scripter to call this Action without making any changes. The same is called Call to Existing Action. You cannot make any changes in Original Action. To add existing action, navigate to INSERT-&amp;gt;Call to Existing Action (See below screen shot)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-IxZQs2LSzBc/TiTYjk2EOxI/AAAAAAAACbQ/ykhF_8xiVnI/s1600-h/clip_image0333.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image033" border="0" alt="clip_image033" src="http://lh6.ggpht.com/-86Pm30ZMBpY/TiTYkSnUJRI/AAAAAAAACbU/8nW4ZINt91E/clip_image033_thumb.jpg?imgmax=800" width="198" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc298819946"&gt;1.14 Call to Winrunner&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;As the name suggest that you can call Winrunner Test or Function as well. This utility is given by HP so that any organization which has major enterprise automation library developed in Winrunner 8.2, they can make most use out of it without rewriting the library from scratch. This command will normally not used when doing fresh automation in QTP. Another pre-requisite to access this command is that you must have WinRunner 8.2 or higher version installed in your machine.&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc298819947"&gt;1.15 Start Transaction and End Transaction&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;Suppose I want to measure the time taken in inserting 1 record in the database. This information will tell me the transaction time. This is useful only when I want to make this information available to LoadRunner or Business Availability Center for measuring the performance of the application. You can insert Transaction time by putting the start time and end time between 2 points. To access the above command navigate to INSERT-&amp;gt;Start Transaction and End Transaction. This measures the time taken to complete the required piece of transaction. For e.g. how much time system is taking to return the search result. Here I will start transaction wherein I am inserting search text and clicking the search button, I will end my transaction when I got the required search result. When I run this script, I will have my search timings. &lt;/p&gt;  &lt;p&gt;I hope you must have got it what I intend to say.&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc298819948"&gt;2 References&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;Quick Test Professional Tool.&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc298819949"&gt;3 additional information&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;You can email me on &lt;a href="mailto:Sachin.vasudha@gmail.com"&gt;Sachin.vasudha@gmail.com&lt;/a&gt; with any query.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8291059916253528224-1123508285392400627?l=buildtesting.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/buildtesting/~4/Ktscp5O7NH4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://buildtesting.blogspot.com/feeds/1123508285392400627/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8291059916253528224&amp;postID=1123508285392400627&amp;isPopup=true" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/1123508285392400627" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/1123508285392400627" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/buildtesting/~3/Ktscp5O7NH4/hp-qtp-tutorial-chapter-5.html" title="HP QTP Tutorial Chapter 5" /><author><name>Sachin Kumar</name><uri>http://www.blogger.com/profile/08030029569880551521</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://bp2.blogger.com/_A4WiZotKHb8/SDMMSRhQ2eI/AAAAAAAAAgQ/e8XAvQopCOg/S220/S7300265.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/-Dkq8X7Y25kA/TiTYKjPZSdI/AAAAAAAACZU/LVE69tH0G8Q/s72-c/clip_image002_thumb.jpg?imgmax=800" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://buildtesting.blogspot.com/2011/07/hp-qtp-tutorial-chapter-5.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-8291059916253528224.post-8654643242576972870</id><published>2011-03-16T16:56:00.001-07:00</published><updated>2011-03-16T16:56:57.231-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="QTP Toolbars" /><category scheme="http://www.blogger.com/atom/ns#" term="HP QTP" /><category scheme="http://www.blogger.com/atom/ns#" term="QTP Tutorial" /><category scheme="http://www.blogger.com/atom/ns#" term="QTP Datatable" /><category scheme="http://www.blogger.com/atom/ns#" term="Active Screen" /><category scheme="http://www.blogger.com/atom/ns#" term="HP QTP Best Practices" /><title type="text">HP QTP Tutorial Chapter 4</title><content type="html">&lt;h3&gt;&lt;a name="_Toc288024991"&gt;1 View Menu&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;The View Menu will provide you the options for setting the view of your Test. You can choose to view or hide the various options available under View Menu. The below section will outline the important information on the options of View Menu. See the below screen shot for the options available under View Menu:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_A4WiZotKHb8/TYFNt-iNS-I/AAAAAAAACRI/ePxGe16F-28/s1600-h/clip_image002%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://lh4.ggpht.com/_A4WiZotKHb8/TYFNu5-jmKI/AAAAAAAACRM/1-KuxvY0oFw/clip_image002_thumb.jpg?imgmax=800" width="130" height="244" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc288024992"&gt;1.1 Active Screen&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;The Active Screen is a screen which shows the Screen Shot capture while doing the recording. You will be able to see the Screen Shot, if your QTP Settings allow capturing Active Screen. &lt;/p&gt;  &lt;p&gt;If you are not able to see the Active Screen after recording is completed, just goto View-&amp;gt;Active Screen (Check for a tick mark against this option in View Menu). See the bottom panel where you will see an Active Screen Tab. (See screen shot below)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_A4WiZotKHb8/TYFNwCl2glI/AAAAAAAACRQ/I0Um9hykC2Y/s1600-h/clip_image004%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://lh3.ggpht.com/_A4WiZotKHb8/TYFNwwROXfI/AAAAAAAACRU/RjLpu9DJFDs/clip_image004_thumb.jpg?imgmax=800" width="244" height="134" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;As a best practice, you can enable this option but while saving the Test, do not save Active Screen with your test; it will unnecessarily increase the resources on your drive. &lt;/u&gt;&lt;/p&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;&lt;a name="_Toc288024993"&gt;1.2 Available Keywords&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;This is a new feature of QTP 10.0 which helps you in doing your scripting in a much easier way. You can simply drag and drop the keywords in expert view and a corresponding code will get inserted automatically. For e.g. If I have a button on my home page, then when I will drag and drop that button in the expert view, a complete statement consisting Browser, Page, Web Button, Click will get added. This feature will come very handy while doing scripting, as you can directly insert the Function Call, OR events etc. See the below screen shot:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_A4WiZotKHb8/TYFNxiFKvxI/AAAAAAAACRY/XrZ5xXhSERc/s1600-h/clip_image006%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image006" border="0" alt="clip_image006" src="http://lh3.ggpht.com/_A4WiZotKHb8/TYFNyjHbVDI/AAAAAAAACRc/ARNYtFsHqMw/clip_image006_thumb.jpg?imgmax=800" width="244" height="131" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;If you are not able to see the Available Keywords pane, then goto menu View-&amp;gt;Available Keywords.&lt;/p&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;&lt;a name="_Toc288024994"&gt;1.3 Data Table&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;To view the Data Table Pane, click View-&amp;gt;Data Table. The Data Table pane allows you to see the data that will get loaded when the test will run. You can also set the Global Data and Local Data from the Data Table Pane. See the below screen shot:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_A4WiZotKHb8/TYFNzVsBoAI/AAAAAAAACRg/vya2kc31eOg/s1600-h/clip_image008%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image008" border="0" alt="clip_image008" src="http://lh3.ggpht.com/_A4WiZotKHb8/TYFN0na30ZI/AAAAAAAACRk/XBbpLv5tN3I/clip_image008_thumb.jpg?imgmax=800" width="244" height="71" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The Global sheet will have the data that will be used globally while the Action Sheet data will be used locally. This pane will get used very frequently when you are doing the scripting.&lt;/p&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;&lt;a name="_Toc288024995"&gt;1.4 Debug Viewer&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;When you want to debug your script, then Debug Viewer Pane will be very useful. You can enable the Debug Viewer pane from View-&amp;gt;Debug Viewer. To make use of Debug Viewer, you need to add watch so that the variable added in Watch will be visible in the Debug Viewer Pane.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_A4WiZotKHb8/TYFN1s3gyPI/AAAAAAAACRs/zMBeX4d2yMA/s1600-h/clip_image010%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image010" border="0" alt="clip_image010" src="http://lh5.ggpht.com/_A4WiZotKHb8/TYFN2hQ16ZI/AAAAAAAACRw/QJVZw7hGgLo/clip_image010_thumb.jpg?imgmax=800" width="244" height="69" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In Debug Viewer, you have three tabs, Watch, Variable, and Command. You can make use of these 3 tabs to debug your script. The command tab will help you in modifying the value of the code and debugging the problems. These tabs were very useful for scripter.&lt;/p&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;&lt;a name="_Toc288024996"&gt;1.5 Information&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;This tab will give you information on VB Syntax Error, when you move from Keyword View to Expert View or vice versa. You can check the syntax by pressing &lt;b&gt;Ctrl+F7 &lt;/b&gt;or goto Tools-&amp;gt;Check Syntax.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_A4WiZotKHb8/TYFN3WXGQxI/AAAAAAAACR0/12TXQSZIytk/s1600-h/clip_image012%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image012" border="0" alt="clip_image012" src="http://lh3.ggpht.com/_A4WiZotKHb8/TYFN4a-sulI/AAAAAAAACR4/Yj6E8GUIEvY/clip_image012_thumb.jpg?imgmax=800" width="244" height="39" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;&lt;a name="_Toc288024997"&gt;1.6 Missing Resources&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;The Missing Resource Pane will provide information if QTP was not able to load any external files references in your Test. The External file can include Library File for Functions, Reusable Actions, External Actions.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_A4WiZotKHb8/TYFN5ak7QLI/AAAAAAAACR8/0xUowaaXFgA/s1600-h/clip_image014%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image014" border="0" alt="clip_image014" src="http://lh6.ggpht.com/_A4WiZotKHb8/TYFN6GGs7vI/AAAAAAAACSA/9IAdw9rD3HQ/clip_image014_thumb.jpg?imgmax=800" width="244" height="90" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;&lt;a name="_Toc288024998"&gt;1.7 Process Guidance&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;This is new to QTP 10.0. This will guide you how you can start your workflow. You will see a descriptive guideline for each of the activities. This is not a wizard but just a guide so that new user can get acquainted with QTP much faster. The screen shot is shown below:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_A4WiZotKHb8/TYFN7HRM31I/AAAAAAAACSE/iFNmM3Mea2w/s1600-h/clip_image002%5B4%5D%5B2%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[4]" border="0" alt="clip_image002[4]" src="http://lh5.ggpht.com/_A4WiZotKHb8/TYFN8NBrP4I/AAAAAAAACSI/GSfVVNdk3rY/clip_image002%5B4%5D_thumb.jpg?imgmax=800" width="94" height="244" /&gt;&lt;/a&gt; &lt;a href="http://lh4.ggpht.com/_A4WiZotKHb8/TYFN9HjWnWI/AAAAAAAACSM/bSw3xFaJFe4/s1600-h/clip_image004%5B4%5D%5B2%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image004[4]" border="0" alt="clip_image004[4]" src="http://lh3.ggpht.com/_A4WiZotKHb8/TYFN-DaBc7I/AAAAAAAACSQ/TPmod9DDTt4/clip_image004%5B4%5D_thumb.jpg?imgmax=800" width="109" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc288024999"&gt;1.8 Resources&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;The Resources Pane is new in QTP 10.0 (not aware about 9.5) and helps one in managing the Test Scripts. You can associate Functional Library, Recovery Scenario, Object Repository. You can also Delete the Action and view the OR. If you are not able to view this pane, then click View-&amp;gt;Resources. See screen shot below:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_A4WiZotKHb8/TYFN_PbmXbI/AAAAAAAACSU/-Js8fDsEP60/s1600-h/clip_image016%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image016" border="0" alt="clip_image016" src="http://lh4.ggpht.com/_A4WiZotKHb8/TYFN_9IDQ9I/AAAAAAAACSY/TIAoyVCYNaQ/clip_image016_thumb.jpg?imgmax=800" width="244" height="110" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;&lt;a name="_Toc288025000"&gt;1.9 Test Flow&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;The Test Flow is also a new feature in QTP 10.0. This will again make your life easier wherein you can easily understand the flow of your Test Cases. You can move the Actions and do a lot with this pane. If you are not able to see (although this pane get loaded as default), click View-&amp;gt;Test Flow. See the below screen shot:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_A4WiZotKHb8/TYFOBP9iJaI/AAAAAAAACSc/iFO-NnPeR8Q/s1600-h/clip_image018%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image018" border="0" alt="clip_image018" src="http://lh5.ggpht.com/_A4WiZotKHb8/TYFOB9w0DlI/AAAAAAAACSg/qa1fL_elMIA/clip_image018_thumb.jpg?imgmax=800" width="244" height="124" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;&lt;a name="_Toc288025001"&gt;1.10 To Do&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;This is new in QTP 10.0. You can add your to do items in the To Do Pane. To access, goto View-&amp;gt;To Do. See the screen shot:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_A4WiZotKHb8/TYFOCyP9PcI/AAAAAAAACSk/EBtzMm_UENQ/s1600-h/clip_image020%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image020" border="0" alt="clip_image020" src="http://lh4.ggpht.com/_A4WiZotKHb8/TYFODiog_vI/AAAAAAAACSo/Gy4YIfoMHbE/clip_image020_thumb.jpg?imgmax=800" width="244" height="62" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;You can see Tasks and Comments tab in the To Do Pane. You can add To do using the upper tool bar which is visible in above screen shot. The comments tab help you in viewing the comments provided in External Actions and Functions provided the comments exist with keyword //To Do, todo, to-do, or TODO (not case-sensitive). You can also export the To Do List in XML or XLS.&lt;/p&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;&lt;a name="_Toc288025002"&gt;1.11 Expand &amp;amp; Collapse All&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;You can expand the entire Item present in the Keyword View from View-Expand All. Similarly to callable the test tree, click View-&amp;gt;Collapse All. Alternatively you can use + to expand and – to collapse all.&lt;/p&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;&lt;a name="_Toc288025003"&gt;1.12 Keyword &amp;amp; Expert View&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;The switching between views can also be done through View Menu. Select Keyword or Expert View from View Menu to switch between the 2 modes. The Keyword View is the tree based structure of your Test Script. Both these views can be used while doing the scripting. Advance QTP user prefers to work mostly in Expert View rather than Keyword View. &lt;/p&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;&lt;a name="_Toc288025004"&gt;1.13 Toolbars&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;The Toolbars section under View-&amp;gt;Toolbars help you show &amp;amp; hide the below mentioned toolbars. These toolbars are very handy when you are doing your scripting. &lt;u&gt;As a best practice always enable the below mentioned Toolbars:&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;# Standard&lt;/p&gt;  &lt;p&gt;# Automation&lt;/p&gt;  &lt;p&gt;# Tools&lt;/p&gt;  &lt;p&gt;# Standard&lt;/p&gt;  &lt;p&gt;# View&lt;/p&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;&lt;a name="_Toc288025005"&gt;1.13.1 Standard&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;The Standard Tool bar is shown below. You can enable or disable it by clicking View-&amp;gt;Toolbars-&amp;gt;Standard (Do check the Tick Mark after you enable)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_A4WiZotKHb8/TYFOEyrbrXI/AAAAAAAACSs/mKPRCWQUFOU/s1600-h/clip_image022%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image022" border="0" alt="clip_image022" src="http://lh6.ggpht.com/_A4WiZotKHb8/TYFOFkfCzkI/AAAAAAAACSw/38Q0bixpQl4/clip_image022_thumb.jpg?imgmax=800" width="205" height="79" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;You can use Standard Toolbar to Open an Existing Test, Create a New Test, Save the Test, Save the Test with All Resource (&lt;u&gt;not recommended&lt;/u&gt;), Settings, Enable Editing, QC Connection. You can further customize the above tool bar by clicking the down arrow in above screen shot. This screen is very self explanatory. &lt;/p&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;&lt;a name="_Toc288025006"&gt;1.13.2 Automation&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;The Automation Toolbar is shown below. View-&amp;gt;Toolbars-&amp;gt;Automation (Do check the Tick Mark after you enable)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_A4WiZotKHb8/TYFOGrrxuDI/AAAAAAAACS0/pEa5tprYzaI/s1600-h/clip_image024%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image024" border="0" alt="clip_image024" src="http://lh5.ggpht.com/_A4WiZotKHb8/TYFOHqxxAZI/AAAAAAAACS4/2M5I8K7vgbI/clip_image024_thumb.jpg?imgmax=800" width="244" height="43" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;You can use above toolbar to record, run, stop, change recording mode (analog and lowlevel), view Test Result, Open Object Repository Window. The Customization of command can also be done by clicking the down arrow which will provide option for customization.&lt;/p&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;&lt;a name="_Toc288025007"&gt;1.13.3 Debug&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;The Debug toolbar is shown below. View-&amp;gt;Toolbars-&amp;gt;Debug (Do check the Tick Mark after you enable)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_A4WiZotKHb8/TYFOIewCjOI/AAAAAAAACS8/ida1S_yw2cU/s1600-h/clip_image026%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image026" border="0" alt="clip_image026" src="http://lh5.ggpht.com/_A4WiZotKHb8/TYFOJI_HcGI/AAAAAAAACTA/Xr0Xpv8Nn6E/clip_image026_thumb.jpg?imgmax=800" width="167" height="52" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;As the name suggest the Debug toolbar is helpful while doing the Test Script debugging. You can Pause the Test, Step Into (Keyboard shortcut is F11), Step Over (very frequently used. Keyboard shortcut is F10), Step Out (Shift+F11), Insert Breakpoint (F9), Clear all Breakpoint, Enable/Disable All Breakpoint. &lt;/p&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;&lt;a name="_Toc288025008"&gt;1.13.4 Edit&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;The Edit toolbar is shown below. View-&amp;gt;Toolbars-&amp;gt;Edit (Do check the Tick Mark after you enable)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_A4WiZotKHb8/TYFOJibyYAI/AAAAAAAACTE/PYk13-jnKyg/s1600-h/clip_image028%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image028" border="0" alt="clip_image028" src="http://lh3.ggpht.com/_A4WiZotKHb8/TYFOKymK2UI/AAAAAAAACTI/xmsHJj0EP0M/clip_image028_thumb.jpg?imgmax=800" width="145" height="52" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;All the Edit commands such as Undo, Redo, Comment Code (Ctrl+M), Uncomment Code (Ctrl+Shift+M), Search and Replace are available in this toolbar. &lt;/p&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;&lt;a name="_Toc288025009"&gt;1.13.5 Insert&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;The Insert toolbar is shown below. View-&amp;gt;Toolbars-&amp;gt;Insert (Do check the Tick Mark after you enable)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_A4WiZotKHb8/TYFOLs_4spI/AAAAAAAACTM/bpqy0ogerE0/s1600-h/clip_image030%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image030" border="0" alt="clip_image030" src="http://lh6.ggpht.com/_A4WiZotKHb8/TYFOMRkH0YI/AAAAAAAACTQ/-QdzsL87juc/clip_image030_thumb.jpg?imgmax=800" width="179" height="52" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The commands available in this Toolbar are Insert Checkpoint or Output Value, Call to an Action, Split Action (will be enabled after test script has been selected), Step Generator, Transaction Start Time and Transaction End Time. The Start Time and End Time transaction is very useful in knowing the time taken by application to complete a flow.&lt;/p&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;&lt;a name="_Toc288025010"&gt;1.13.6 Tools&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;The Tools toolbar is shown below. View-&amp;gt;Toolbars-&amp;gt;Tools (Do check the Tick Mark after you enable)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_A4WiZotKHb8/TYFONFRSGSI/AAAAAAAACTU/0x3YISSGX8M/s1600-h/clip_image032%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image032" border="0" alt="clip_image032" src="http://lh5.ggpht.com/_A4WiZotKHb8/TYFOOFJreoI/AAAAAAAACTY/9HyTS01GXSw/clip_image032_thumb.jpg?imgmax=800" width="79" height="52" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The commands available in this Toolbar are Options, Check Syntax (Ctrl +F7), Object Spy.&lt;/p&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;&lt;a name="_Toc288025011"&gt;1.13.7 View&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;The View toolbar is shown below. View-&amp;gt;Toolbars-&amp;gt;View (Do check the Tick Mark after you enable)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_A4WiZotKHb8/TYFOPGnw7rI/AAAAAAAACTc/-K5KKpFbPhc/s1600-h/clip_image034%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image034" border="0" alt="clip_image034" src="http://lh5.ggpht.com/_A4WiZotKHb8/TYFOQL73FgI/AAAAAAAACTg/XhRHBpwFw6U/clip_image034_thumb.jpg?imgmax=800" width="167" height="52" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Using this tool bar you can show and hide the pane such as Test Flow Pane, Available Keywords Pane, Resource Pane, Datatable, Active Screen, Process Guidance, To Do Panes.&lt;/p&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;&lt;a name="_Toc288025012"&gt;1.13.8 Action&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;The Action is shown below. View-&amp;gt;Toolbars-&amp;gt;Action (Do check the Tick Mark after you enable)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_A4WiZotKHb8/TYFOQ8zllZI/AAAAAAAACTk/mEA4t3ONdtA/s1600-h/clip_image036%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image036" border="0" alt="clip_image036" src="http://lh5.ggpht.com/_A4WiZotKHb8/TYFORnzBD_I/AAAAAAAACTo/N_mk1c6Hb00/clip_image036_thumb.jpg?imgmax=800" width="244" height="26" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The Action toolbar provides an easy way to navigate across Actions. You can easily go to various reusable actions that is getting used in your test script. This is very useful toolbar.&lt;/p&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;&lt;a name="_Toc288025013"&gt;2 References&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;Quick Test Professional Tool.&lt;/p&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;&lt;a name="_Toc288025014"&gt;3 additional information&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;You can email me on &lt;a href="mailto:Sachin.vasudha@gmail.com"&gt;Sachin.vasudha@gmail.com&lt;/a&gt; with any query.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8291059916253528224-8654643242576972870?l=buildtesting.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/buildtesting/~4/GP-f_egadjg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://buildtesting.blogspot.com/feeds/8654643242576972870/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8291059916253528224&amp;postID=8654643242576972870&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/8654643242576972870" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/8654643242576972870" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/buildtesting/~3/GP-f_egadjg/hp-qtp-tutorial-chapter-4.html" title="HP QTP Tutorial Chapter 4" /><author><name>Sachin Kumar</name><uri>http://www.blogger.com/profile/08030029569880551521</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://bp2.blogger.com/_A4WiZotKHb8/SDMMSRhQ2eI/AAAAAAAAAgQ/e8XAvQopCOg/S220/S7300265.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_A4WiZotKHb8/TYFNu5-jmKI/AAAAAAAACRM/1-KuxvY0oFw/s72-c/clip_image002_thumb.jpg?imgmax=800" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://buildtesting.blogspot.com/2011/03/hp-qtp-tutorial-chapter-4.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-8291059916253528224.post-3687806926586952649</id><published>2011-01-14T19:57:00.001-08:00</published><updated>2011-03-16T16:18:18.467-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="QTP Split Action" /><category scheme="http://www.blogger.com/atom/ns#" term="QTP Edit" /><category scheme="http://www.blogger.com/atom/ns#" term="Optional Steps in QTP" /><category scheme="http://www.blogger.com/atom/ns#" term="Delete QTP Action" /><category scheme="http://www.blogger.com/atom/ns#" term="HP QTP" /><category scheme="http://www.blogger.com/atom/ns#" term="QTP Object Property" /><category scheme="http://www.blogger.com/atom/ns#" term="Action Parameter" /><category scheme="http://www.blogger.com/atom/ns#" term="QTP Checkpoint" /><category scheme="http://www.blogger.com/atom/ns#" term="QTP Action" /><category scheme="http://www.blogger.com/atom/ns#" term="QTP Advance Commands" /><title type="text">HP Quick Test Professional Tutorial Chapter 3</title><content type="html">&lt;h3&gt;&lt;a name="_Toc282492932"&gt;1 Edit Menu&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;In Edit Menu, the first 7 commands are very self explanatory, which you can find in any GUI based application. You will find Undo, Redo, Cut, Copy, Paste, Delete, Copy Documentation to Clipboard (used for copying the documentation column value into notepad, ms word etc.).The below command are also very self explanatory and will get active when you are in Expert View mode. The commands are Find, Replace, Goto, Bookmarks.&lt;/p&gt;  &lt;p&gt;In this paper, we will cover Action (Split Action, Rename Action, Delete Action, Action Properties, Action Call Properties), Step Properties (Object Properties, Checkpoint Properties, Output Value Properties), Advanced (Comment, Uncomment, Indent, Outdent, Goto Function Definition, Complete Word, Argument Info, Apply “with” to script, Remove “with” statements) &amp;amp; Optional Step.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_A4WiZotKHb8/TTEaxuiANyI/AAAAAAAACLQ/6-q1o2ooKbE/s1600-h/clip_image0023.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://lh3.ggpht.com/_A4WiZotKHb8/TTEayXKUTBI/AAAAAAAACLU/TNhbq7Xfnvo/clip_image002_thumb.jpg?imgmax=800" width="233" height="136" /&gt;&lt;/a&gt; &lt;a href="http://lh4.ggpht.com/_A4WiZotKHb8/TTEazbx9bWI/AAAAAAAACLY/YPibv9owq_c/s1600-h/clip_image0043.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://lh6.ggpht.com/_A4WiZotKHb8/TTEa0B88r_I/AAAAAAAACLc/yZdpR-R6tUU/clip_image004_thumb.jpg?imgmax=800" width="244" height="78" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_A4WiZotKHb8/TTEa04ksgBI/AAAAAAAACLg/mLw1N0ujbTg/s1600-h/clip_image0063.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image006" border="0" alt="clip_image006" src="http://lh5.ggpht.com/_A4WiZotKHb8/TTEa1jid-rI/AAAAAAAACLk/olLEVLvIsw0/clip_image006_thumb.jpg?imgmax=800" width="244" height="94" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc282492933"&gt;1.1 Action&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;As the name suggests, ACTION command can be used for doing manipulation on the QTP Actions. If you do not know what an ACTION is, then let me define for you. ACTION is building block concept in QTP. Whatever you are scripting is identified with an Action Name. ACTION provides a unique name to your Test Script. There is a reason behind introducing this concept in QTP. The ACTION enable to design a framework which can be made to re-used in your enterprise application. It provides a logical grouping of your Test Cases so that you can easily manage your Test Script. Test can consist either 1 action or multiple ACTION (reusable actions). We will cover these concepts in next series for Intermediate user level. Let now see the commands available under ACTION option.&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc282492934"&gt;1.1.1 &lt;/a&gt;Split Action&lt;/h3&gt;  &lt;p&gt;Select the block of Test Steps in QTP which you want to SPLIT into 2 Action and then either right click or choose EDIT-&amp;gt;ACTION&amp;gt;SPLIT. This will open a window where in you can specify whether you want the Actions as an Independent of each other or Nested. Specify the name of each action on the same window and then click OK. You have successfully SPLIT your Action. Now let me tell you its real time usage, you normally split action for doing a fast scripting. You recorded all the Step in 1 go and then SPLIT into ACTIONS so that you have the logical grouping of your test cases. The SPLIT option might not be enabled if: &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Reusable Action is selected which is external in your Test (External Action) &lt;/li&gt;    &lt;li&gt;The very first step of your Test Script &lt;/li&gt;    &lt;li&gt;The Test open is Read-Only (anyway you cannot do anything except execution) &lt;/li&gt;    &lt;li&gt;Recording a test &lt;/li&gt;    &lt;li&gt;Running a test &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;u&gt;As a best practice, 1 Test Case should ideally consists of 1 independent Action and if required reusable actions. I will not recommend to use SPLIT action if you are using it for having 2 independent action with in the same Test Cases.&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;&lt;a href="http://lh4.ggpht.com/_A4WiZotKHb8/TTEa2oQsr0I/AAAAAAAACLo/jvSaIaDLS6I/s1600-h/clip_image0083.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image008" border="0" alt="clip_image008" src="http://lh5.ggpht.com/_A4WiZotKHb8/TTEa3q9dzBI/AAAAAAAACLs/-uUTwsl4q9Q/clip_image008_thumb.jpg?imgmax=800" width="244" height="191" /&gt;&lt;/a&gt;&lt;/u&gt;&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc282492935"&gt;1.1.2 Rename Action&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;This will be 1 of the very frequent command on your list. You need to rename your Action as per defined standard for your project and organization. To rename your action, press SHIFT+F2 or click EDIT-&amp;gt;SPLIT-&amp;gt;RENAME ACTION. You can also rename your action from the Action Properties Window. The default name given by QTP for Action is Action 1 and so on.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_A4WiZotKHb8/TTEa4UNa6PI/AAAAAAAACLw/VdHcCfs2csc/s1600-h/clip_image0103.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image010" border="0" alt="clip_image010" src="http://lh4.ggpht.com/_A4WiZotKHb8/TTEa4w5fi2I/AAAAAAAACL0/p5j_eFVO9nk/clip_image010_thumb.jpg?imgmax=800" width="235" height="116" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc282492936"&gt;1.1.3 Delete Action&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;You are also going to make use of this command whenever you want to delete other action (normally re-usable) in your Test Script. If you have included wrong re-usable action in your script and want to Delete it, then open the Reusable Action from Action navigation drop-down, click EDIT-&amp;gt;SPLIT-&amp;gt;DELETE ACTION. Please click Yes or No on the confirmation window to perform Deletion of your Action. I still wonder why this option never appears in right click menu. If you know the shortcut key for Delete Action, please share with us as well. I am having hard luck finding the short key for Deleting an Action.&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc282492937"&gt;1.1.4 Action Properties&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;If you want to perform below activities on your Action, then use Action Properties window:&lt;/p&gt;  &lt;p&gt;1. Rename of an action&lt;/p&gt;  &lt;p&gt;2. Making your Action a Reusable action&lt;/p&gt;  &lt;p&gt;3. Specifying Input and Output Parameters specific to your Action&lt;/p&gt;  &lt;p&gt;4. You want to associate or view the Object Repository for your Action.&lt;/p&gt;  &lt;p&gt;5. You want to view the information that which all other Test are making use of your reusable action. &lt;/p&gt;  &lt;p&gt;Let me give you some more insight into point number 3. In real time scenario, we normally use point 3 whenever we are creating reusable action. Parameter are normally not required for Independent Action. Usage of parameter will be covered in next level of my series.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_A4WiZotKHb8/TTEa50A4mJI/AAAAAAAACL4/MlbHPAiuCCo/s1600-h/clip_image0123.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image012" border="0" alt="clip_image012" src="http://lh3.ggpht.com/_A4WiZotKHb8/TTEa6-qKpoI/AAAAAAAACL8/y1nFfwDZ_MA/clip_image012_thumb.jpg?imgmax=800" width="244" height="233" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc282492938"&gt;1.1.5 Action Call Properties&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;You will find this option available only when your Test is using reusable action or nested actions. Using this command you can:&lt;/p&gt;  &lt;p&gt;1. Control the run of the called action&lt;/p&gt;  &lt;p&gt;2. Provide the parameter value for the called action&lt;/p&gt;  &lt;p&gt;Select the Reusable Action in Keyword View mode (remember you won’t see this option in the Expert View mode) and either Right Click and select Action Call Properties or Edit-&amp;gt;Split-&amp;gt;Action Call Properties.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_A4WiZotKHb8/TTEa7uU3gaI/AAAAAAAACMA/7kkS2pzhfA8/s1600-h/clip_image0143.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image014" border="0" alt="clip_image014" src="http://lh5.ggpht.com/_A4WiZotKHb8/TTEa8nQtmpI/AAAAAAAACME/eWldqwXP0mc/clip_image014_thumb.jpg?imgmax=800" width="242" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc282492939"&gt;1.2 Step Properties&lt;/a&gt;&lt;/h3&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;&lt;a name="_Toc282492940"&gt;1.2.1 Object Properties&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;If you know what an object in QTP, then its good but in case of you do not know, then let me define it for you. An object is a control (edit box, radio, check box, button etc), window, browser, page etc which has unique name, properties given by the developer and QTP identifies the object using those unique name or properties. As a scripter you should be able to read and understand the object properties. QTP provide Object Properties option to see the property of an object. Ready only information is displayed in this window but you can find that object in Object Repository from this window as well.&lt;/p&gt;  &lt;p&gt;First highlight the Object and then either press Ctrl+Enter or Alt+Enter or Edit-&amp;gt;Step-&amp;gt;Object Properties or Right Click and then select Object Properties.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_A4WiZotKHb8/TTEa9X7aSHI/AAAAAAAACMI/PNNuK65gegE/s1600-h/clip_image0163.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image016" border="0" alt="clip_image016" src="http://lh5.ggpht.com/_A4WiZotKHb8/TTEa-Bi3ODI/AAAAAAAACMM/ujVp2GheB5M/clip_image016_thumb.jpg?imgmax=800" width="244" height="226" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc282492941"&gt;1.2.2 Checkpoint Properties&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;Let first understand what a checkpoint is actually means in QTP. Checkpoints in QTP enable or pacify the process of test case validation. For e.g. if my test case is saying, validate that the QTP image is appearing on the web page, validate that Age Text Box is disabled by default. If you have to script above test cases, then you might require the Checkpoint in QTP. There are various checkpoints which are available in QTP but the most frequent one is Standard Checkpoint. We will cover QTP checkpoints in detail in next series.&lt;/p&gt;  &lt;p&gt;If your test consists one or more such checkpoint, then you can view the Checkpoint property by either selecting the “Check” keyword in Expert view and then Right Click and choose Checkpoint Property. You can also click the tick sign in Keyword View mode on the Test Step which correspond to “Checkpoint”. Using Checkpoint properties window, you can put validation for other properties as well. You can set the value to be Constant or make it Dynamic by parameterize the specific property.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_A4WiZotKHb8/TTEa_CQLRII/AAAAAAAACMQ/V9_QP3Sp-PI/s1600-h/clip_image0183.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image018" border="0" alt="clip_image018" src="http://lh5.ggpht.com/_A4WiZotKHb8/TTEa_5CM_VI/AAAAAAAACMU/U7ZpcN2n7zA/clip_image018_thumb.jpg?imgmax=800" width="221" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc282492942"&gt;1.2.3 Output Value Properties&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;This is similar to Checkpoint properties except that you are outputting the value from your AUT to make use of it for doing validation at some other steps in your test. We will separately cover this in next series. But you can view the Output properties in the same way as you viewed the Checkpoint properties. Select the Step which consists “Output Check”, select Edit-&amp;gt;Step-&amp;gt;Output Value Properties or Right Click-&amp;gt;Output Value Properties.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_A4WiZotKHb8/TTEbA28hN9I/AAAAAAAACMY/GMcyoBDe14M/s1600-h/clip_image0203.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image020" border="0" alt="clip_image020" src="http://lh5.ggpht.com/_A4WiZotKHb8/TTEbBqXpljI/AAAAAAAACMc/G_QSli39Ip8/clip_image020_thumb.jpg?imgmax=800" width="237" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;You can edit other properties as well so that it can be outputted to a spreadsheet. You can navigate to Object Repository from this window. Click the icon on right side of Name Text Box.&lt;/p&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;&lt;a name="_Toc282492943"&gt;1.3 Advanced&lt;/a&gt;&lt;/h3&gt;  &lt;h5&gt;&amp;#160;&lt;/h5&gt;  &lt;h3&gt;&lt;a name="_Toc282492944"&gt;1.3.1 Comment Block&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;To commend the block of code, select the block of code in Expert View and press Ctrl+M or Edit-&amp;gt;Advance-&amp;gt;Comment Block. This will comment the selected code. Used very frequently while doing scripting.&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc282492945"&gt;1.3.2 Uncomment Block&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;To uncomment the block simply select the block and press Ctrl+Shift+M or Edit-&amp;gt;Advance-&amp;gt;Uncomment Block.&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc282492946"&gt;1.3.3 Indent / Outdent&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;This is very self explanatory. You can indent and outdent your Test Script to increase readability. This make your Test Script look cleaner and make your script easily readable to other scripter. Always follow the defined Organization standard for Indenting and Outdenting.&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc282492947"&gt;1.3.4 Goto Function Definition&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;This is very important command and you need to know this as this will come very handy when you are analyzing the existing script which is making use of function. This command will simply take you’re the function definition. Remember from 2&lt;sup&gt;nd&lt;/sup&gt; series we have included library files in our test. Those library files is a collection of various functions which my Test will make use of. If my test is making use of function whether internally or externally, I can always see the definition. Select the Function Name, Right Click-&amp;gt;Goto Function Definition, or Edit-&amp;gt;Advance-&amp;gt;Goto Function Definition or press Alt+G.&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc282492948"&gt;1.3.5 Complete Word&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;This is again very simple. If you writing a code say Dialog, the instead of typing complete word, you can type initial and then either press Ctrl+Space or select Edit-&amp;gt;Advance-&amp;gt;Complete Word. The former is more frequently used and I do not know why HP has still given this option in the Edit Menu.&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc282492949"&gt;1.3.6 Argument Info&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;To see the Argument of a function whether in-built or external , type the function name and then press Ctrl+Shift+Space or Edit-&amp;gt;Advance-&amp;gt;Argument Info.&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc282492950"&gt;1.3.7 Apply “With” to Script&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;You can make your script look more readable with “With” statements. To apply the script with “With” statement, simply press Ctrl+W. This will convert the script into “With” statement. See the below screen shot for clarification.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_A4WiZotKHb8/TTEbDqYXAVI/AAAAAAAACMg/jefULiDxmbo/s1600-h/clip_image0223.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image022" border="0" alt="clip_image022" src="http://lh5.ggpht.com/_A4WiZotKHb8/TTEbFFTP2AI/AAAAAAAACMo/E2je5ZaAWN8/clip_image022_thumb.jpg?imgmax=800" width="242" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc282492951"&gt;1.3.8 Remove “With” Statements&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;If you want to remove the With Statement and revert to its original format, press Ctrl+Shift+W and your script will be removed with all the “With” statements.&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc282492952"&gt;1.4 Optional Steps&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;The decision to make a step optional entirely depends on your application design. There may be instances where you application perform some action based on saved value in session. For e.g. Remember Login feature. You can make the Test Step for Login as an Optional Step. To make a Step optional, go to Keyword View and then select and right click on step and select Optional Step. You can also go Edit-&amp;gt;Optional Step. This step will show &lt;a href="http://lh6.ggpht.com/_A4WiZotKHb8/TTEbFwaptwI/AAAAAAAACMs/RcWfB10W2GY/s1600-h/clip_image0243.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image024" border="0" alt="clip_image024" src="http://lh5.ggpht.com/_A4WiZotKHb8/TTEbGZxeJ5I/AAAAAAAACMw/sTdbE6ch_2A/clip_image024_thumb.jpg?imgmax=800" width="25" height="21" /&gt;&lt;/a&gt; icon to demarcate it as an Optional Step. In Expert view the corresponding line will be “OptionalStep”. &lt;/p&gt;  &lt;p&gt;An optional step is not necessarily required to successfully complete a run session. If object of optional step does not exist in AUT, then QTP ignores it and continue with the test.&lt;/p&gt;  &lt;p&gt;By default, QTP considers steps that open the following dialog boxes or message boxes as optional steps: AutoComplete, File Download, Internet Explorer, Netscape, Enter Network Password, Error, Security Alert, Security Information, Security Warning, Username and Password Required.&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc282492953"&gt;2 References&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;Quick Test Professional Tool.&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc282492954"&gt;3 additional information&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;You can email me on &lt;a href="mailto:Sachin.vasudha@gmail.com"&gt;Sachin.vasudha@gmail.com&lt;/a&gt; with any query.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8291059916253528224-3687806926586952649?l=buildtesting.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/buildtesting/~4/ZllSCAdiKyM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://buildtesting.blogspot.com/feeds/3687806926586952649/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8291059916253528224&amp;postID=3687806926586952649&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/3687806926586952649" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/3687806926586952649" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/buildtesting/~3/ZllSCAdiKyM/hp-quick-test-professional-basic-series.html" title="HP Quick Test Professional Tutorial Chapter 3" /><author><name>Sachin Kumar</name><uri>http://www.blogger.com/profile/08030029569880551521</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://bp2.blogger.com/_A4WiZotKHb8/SDMMSRhQ2eI/AAAAAAAAAgQ/e8XAvQopCOg/S220/S7300265.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_A4WiZotKHb8/TTEayXKUTBI/AAAAAAAACLU/TNhbq7Xfnvo/s72-c/clip_image002_thumb.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://buildtesting.blogspot.com/2011/01/hp-quick-test-professional-basic-series.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-8291059916253528224.post-6097353037532110535</id><published>2010-11-26T21:17:00.001-08:00</published><updated>2011-03-16T16:17:31.958-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="QTP Addins" /><category scheme="http://www.blogger.com/atom/ns#" term="Automation Framework" /><category scheme="http://www.blogger.com/atom/ns#" term="QTP Settings Best Practices" /><category scheme="http://www.blogger.com/atom/ns#" term="QTP Resources" /><category scheme="http://www.blogger.com/atom/ns#" term="QTP Environment Variables" /><category scheme="http://www.blogger.com/atom/ns#" term="QTP Parameter" /><category scheme="http://www.blogger.com/atom/ns#" term="QTP Settings" /><category scheme="http://www.blogger.com/atom/ns#" term="QTP XML" /><category scheme="http://www.blogger.com/atom/ns#" term="QTP Run Option" /><category scheme="http://www.blogger.com/atom/ns#" term="HP QTP Best Practices" /><title type="text">HP Quick Test Professional Tutorial Chapter 2</title><content type="html">&lt;h3&gt;&lt;a name="_Toc278613694"&gt;1 FILE Menu&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;In the first series of this article you have seen the usage of various commands available in File Menu option. This paper is in continuation of my previous series and in this series we will mainly the &lt;b&gt;File-&amp;gt;Settings&lt;/b&gt; option. I have not included &lt;b&gt;Setting&lt;/b&gt; explanation in the first series because understanding Setting is very important for real time usage. You will visit this option very frequently and you must understand its usage in a better way.&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc278613695"&gt;1.1 Setting&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;To open the &lt;b&gt;Settings &lt;/b&gt;Dialog, Click File-&amp;gt;Settings (as shown below). &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_A4WiZotKHb8/TPCTtkUBzsI/AAAAAAAACJ8/rgeyqFrMm4Q/s1600-h/clip_image0023.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://lh3.ggpht.com/_A4WiZotKHb8/TPCTvUl51BI/AAAAAAAACKA/Cb-6u_DJpPs/clip_image002_thumb.jpg?imgmax=800" width="244" height="196" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;We will see each useful option available in the above dialog which helps you a lot while you are developing your test script. I am going to explain about each option such as Properties, Run, Resources, Parameters, Environment, Web, Recovery, Local System Monitor (new in 10.0).&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc278613696"&gt;1.1.1 Properties&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;In the &lt;b&gt;Properties&lt;/b&gt;, many of the static things are self explanatory. You can use Properties for:&lt;/p&gt;  &lt;p&gt;· Adding or removing the associated add-ins for current test. If you are working on a web based application, &lt;u&gt;it’s always a good practice to de-associate other add-ins to save on memory performance and avoid conflict while opening the Test&lt;/u&gt;. Associating or de-associating will require QTP to be started and then you can see your changes.&lt;/p&gt;  &lt;p&gt;· You can use Properties Window to Generate the Script of your settings and save as .VBS file. The advantage of having this script is that it can be distributed to all the team members so that settings for all the Test Script remain same. A sample script is shown below:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_A4WiZotKHb8/TPCTzsUQb7I/AAAAAAAACKE/nSpmIhFiqrM/s1600-h/clip_image0043.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://lh3.ggpht.com/_A4WiZotKHb8/TPCT1uB8T6I/AAAAAAAACKI/UrjAmsKNkrQ/clip_image004_thumb.jpg?imgmax=800" width="244" height="163" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;When above script will run on the Team Members QTP installed machine, this will ensure same configuration of QTP for developing or running the script. This is a real life example of Generate Script usage which I have shown above. There may be other settings as well depending on organization or project needs.&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc278613697"&gt;1.1.2 Run&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_A4WiZotKHb8/TPCT5-pVuUI/AAAAAAAACKM/K9n_L-p_1NM/s1600-h/clip_image0063.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image006" border="0" alt="clip_image006" src="http://lh4.ggpht.com/_A4WiZotKHb8/TPCT7tix9wI/AAAAAAAACKQ/93Abs8-0SAw/clip_image006_thumb.jpg?imgmax=800" width="244" height="196" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Run option can be used for:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Control your iteration if you are driving your test through excel – Use Data Table Iterations section to control your test execution:      &lt;ol&gt;       &lt;li&gt;Run one iteration only will run the script only one time. This normally picks the data from Global Sheet. &lt;/li&gt;        &lt;li&gt;Run on all rows- Your test run as many times as there are number of rows in the Global Sheet. In real time I hardly use this as this will be an overhead and make your maintenance really costly. &lt;/li&gt;        &lt;li&gt;Run from row - here you can customize your test run by providing the &lt;b&gt;From&lt;/b&gt; &lt;b&gt;Row&lt;/b&gt; number and &lt;b&gt;To Row&lt;/b&gt; number. If you want to run from say row 2 to row 20, then provide your value as 2 and 20. I hardly use this option. &lt;/li&gt;     &lt;/ol&gt;   &lt;/li&gt;    &lt;li&gt;Set the action that will be taken when script is running and encounter any error. The QTP will respond to that error in the defined way. So, if you want to suppress all the error, then you can choose “&lt;u&gt;proceed to next step&lt;/u&gt;”. This way your script will not stop executing. But there are other impacts as well if you set this as an option. So, depending on your requirement you choose this option with care. This is a global setting option. As a &lt;u&gt;best practice&lt;/u&gt; “&lt;u&gt;pop up message box&lt;/u&gt;” is the best action for any script error or object error. &lt;/li&gt;    &lt;li&gt;Object Synchronization Timeout – This is very self explanatory. What time QTP waits for any object before it display you any error. You can define the timeout based on your requirement. Again this is a &lt;u&gt;global setting&lt;/u&gt;. &lt;/li&gt;    &lt;li&gt;&lt;u&gt;Disable Smart Identification during the run session&lt;/u&gt; – I am not diving in much depth (may be in next set of series I will deep dive) what Smart Identification means but as a best practice tick “Disable Smart Identification during the run session”. This will make your script robust when it runs. &lt;/li&gt;    &lt;li&gt;&lt;u&gt;Save image of desktop when error occurs (if test is run by the HP Business Process Monitor) &lt;/u&gt;– New Option available in QTP 10.0 – I have not used this option. You can check the QTP help to know more about this option. But as per my experience we hardly make use of this since usage of this again is an overhead on the resources that will be saved with the test. &lt;/li&gt; &lt;/ol&gt;  &lt;h3&gt;&lt;a name="_Toc278613698"&gt;1.1.3 Resources&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_A4WiZotKHb8/TPCT_8Ok8JI/AAAAAAAACKU/KNZcOHfHWlk/s1600-h/clip_image0083.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image008" border="0" alt="clip_image008" src="http://lh4.ggpht.com/_A4WiZotKHb8/TPCUAvYxlRI/AAAAAAAACKY/WYGfrLbJipQ/clip_image008_thumb.jpg?imgmax=800" width="244" height="196" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;This is one of the important options in Settings Window. This will be very frequently used as you need to associate the relevant library and architecture file using this window. Once associated you can make full use of those library files while developing your script. This is something like include statement which you normally write in your C++ programming.&lt;/p&gt;  &lt;p&gt;I have never used the Datatable option available in this window since my architecture load the required data file on the fly and so I never use this option. But if you want to set the other location for your Data file, then you can select Other Location option to do that. This Excel will be used during your Script development and execution.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;How you will associate the Library file in your Test&lt;/u&gt; – Click the &lt;a href="http://lh3.ggpht.com/_A4WiZotKHb8/TPCUBaa5HqI/AAAAAAAACKc/islVDCwiJ4o/s1600-h/clip_image0104.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image010" border="0" alt="clip_image010" src="http://lh5.ggpht.com/_A4WiZotKHb8/TPCUCSF_BII/AAAAAAAACKg/SwFf-1B86kQ/clip_image010_thumb.jpg?imgmax=800" width="31" height="29" /&gt;&lt;/a&gt; sign and you will see a line item in the grid, navigate to the location and select the library files that you want to associate with your test.&lt;/p&gt;  &lt;p&gt;In real time, you should always associate pre-defined library files with your test. This option will be very frequently used by scripter in real time.&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc278613699"&gt;1.1.4 Parameters&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_A4WiZotKHb8/TPCUGKNnEXI/AAAAAAAACKk/Yi1Ls379JHM/s1600-h/clip_image0123.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image012" border="0" alt="clip_image012" src="http://lh5.ggpht.com/_A4WiZotKHb8/TPCUIS8XLRI/AAAAAAAACKo/_-WzkPq9hwc/clip_image012_thumb.jpg?imgmax=800" width="244" height="196" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The parameter tab will also get used when you want to call your test with parameters. This is same as function arguments. The usage of the Input and Output parameter depend totally on your application requirement and framework development around your application. I can give you an example where I have used the Input Parameter in one of my complex project. I want to develop a mechanism wherein the Execution Team should have the flexibility to control the execution of test iteration. For e.g. If s/he want to run the test say from Row 20 to Row 30, then they can easily do it. They just have to provide the row number in QC from where they are running the Test.&lt;/p&gt;  &lt;p&gt;These parameter are for Test and Not for Action. Remember there is substantial difference between the Test Parameter and Action Parameter usage. Output Parameter is again on global level wherin you can store the output in Quality Center. The usage entirely depends on the complexity and requirement of my solution.&lt;/p&gt;  &lt;p&gt;To define these parameter, cick the &lt;a href="http://lh4.ggpht.com/_A4WiZotKHb8/TPCUI2v4daI/AAAAAAAACKs/y_aEiYfL9jc/s1600-h/clip_image01012.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image010[1]" border="0" alt="clip_image010[1]" src="http://lh6.ggpht.com/_A4WiZotKHb8/TPCUJyaudTI/AAAAAAAACKw/R4UZ6mnsdAw/clip_image0101_thumb.jpg?imgmax=800" width="31" height="29" /&gt;&lt;/a&gt; sign and enter the parameter name, datatype, default value if any and description. After you define these parameter, you can see the parameter in QC Test Run Tab wherein you can provide value to Input Parameter and check the value of the output parameter. &lt;/p&gt;  &lt;p&gt;The real time usage of these parameter is very complex and if you do not have good command, I suggest then do not experiment on real project in QC and instead practice first on demo qc.&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc278613700"&gt;1.1.5 Environment&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_A4WiZotKHb8/TPCUNlPje3I/AAAAAAAACK0/73aVjSaHxyA/s1600-h/clip_image0143.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image014" border="0" alt="clip_image014" src="http://lh3.ggpht.com/_A4WiZotKHb8/TPCUOfXFqeI/AAAAAAAACK4/rDZjTm3zqlE/clip_image014_thumb.jpg?imgmax=800" width="244" height="196" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;There are 2 types of Environment variable:&lt;/p&gt;  &lt;p&gt;· Built In – see the available environment variable. These built in variable are very handy while doing scripting, so please go through each of these built in variables. You can use these variable by writing &lt;b&gt;&lt;i&gt;Environment. Value (&amp;quot;ActionName&amp;quot;)&lt;/i&gt;&lt;/b&gt;. You can change the Value parameter to either user defined variable or built in variable. The statement will return you the value available in the variable. This is very handy while designing the architecture around automation.&lt;/p&gt;  &lt;p&gt;· User Defined – Any variable that is defined by user. As a best practice, define only global type variable for environment. You can export the variable as an XML file and then re-load with your test for usage. If you are not familiar with XML, then you can use this Tab to create all the user defined variable at one go. After creating all the variable, export to XML and then start making use of it across your Team.&lt;/p&gt;  &lt;p&gt;I am not going to cover how to create user defined variable in this paper and will cover in next set of series for intermediate or advance.&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc278613701"&gt;1.1.6 Web&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;I have not used this option in my real time. But for your information, you can make use of Web Tab for doing settings regarding timeout and storing user name and password for the web pages which require authentication on each run.&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc278613702"&gt;1.1.7 Recovery&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_A4WiZotKHb8/TPCURIn5PHI/AAAAAAAACK8/pD-LdR-apb4/s1600-h/clip_image0163.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image016" border="0" alt="clip_image016" src="http://lh4.ggpht.com/_A4WiZotKHb8/TPCUS68APWI/AAAAAAAACLA/QemWDAA4WOs/clip_image016_thumb.jpg?imgmax=800" width="244" height="196" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;From this window, you can associate the relevant recovery file which will be called in case of any error. Select your recovery file and associate and you are done. If you have generic recovery file and you want to make use of that generic file for all your test, then do the association like this.&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc278613703"&gt;1.1.8 Local System Monitor (New in 10.0)&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;I have not used this option much, but if you want to monitor the application or program which your test will run or is running, you can do so by this Tab. The Tab gives you an option to monitor the performance of the local system. You can monitor Memory Usage, GDI Objects, Handle Count, Thread Count, %Processor Time, %User Time etc.&lt;/p&gt;  &lt;p&gt;This completes the File Menu usage series. In next series, we will see the usage of Edit Menu. Keep checking my blog.&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc278613704"&gt;2 References&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;Quick Test Professional Tool&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc278613705"&gt;3 additional information&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;You can email me on &lt;a href="mailto:Sachin.vasudha@gmail.com"&gt;Sachin.vasudha@gmail.com&lt;/a&gt; with any query.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8291059916253528224-6097353037532110535?l=buildtesting.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/buildtesting/~4/ksG72_NpvA4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://buildtesting.blogspot.com/feeds/6097353037532110535/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8291059916253528224&amp;postID=6097353037532110535&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/6097353037532110535" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/6097353037532110535" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/buildtesting/~3/ksG72_NpvA4/hp-quick-test-professional-basic-series_26.html" title="HP Quick Test Professional Tutorial Chapter 2" /><author><name>Sachin Kumar</name><uri>http://www.blogger.com/profile/08030029569880551521</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://bp2.blogger.com/_A4WiZotKHb8/SDMMSRhQ2eI/AAAAAAAAAgQ/e8XAvQopCOg/S220/S7300265.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_A4WiZotKHb8/TPCTvUl51BI/AAAAAAAACKA/Cb-6u_DJpPs/s72-c/clip_image002_thumb.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://buildtesting.blogspot.com/2010/11/hp-quick-test-professional-basic-series_26.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-8291059916253528224.post-6193732530691734192</id><published>2010-11-12T19:15:00.001-08:00</published><updated>2011-03-16T16:16:40.976-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="HP QTP" /><category scheme="http://www.blogger.com/atom/ns#" term="Export QTP Test" /><category scheme="http://www.blogger.com/atom/ns#" term="Business Component" /><category scheme="http://www.blogger.com/atom/ns#" term="QC Connection" /><category scheme="http://www.blogger.com/atom/ns#" term="QTP New Test" /><category scheme="http://www.blogger.com/atom/ns#" term="QTP Function Library" /><category scheme="http://www.blogger.com/atom/ns#" term="HP QTP Best Practices" /><title type="text">HP Quick Test Professional Tutorial Chapter 1</title><content type="html">&lt;p&gt;In this article I will explain how you can make use of &lt;strong&gt;File Menu&lt;/strong&gt; option available in HP QTP. This is a very basic usage and I thought to start the Basic Series so that newbie's can learn QTP by following the complete series on this Blog. I will publish the Series subsequently. Next Series I will explain only about the File-&amp;gt;Settings option which is very useful in real time usage.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h6&gt;&lt;a name="_Toc277397342"&gt;&lt;/a&gt;&lt;/h6&gt;  &lt;h3&gt;&lt;a name="_Toc277397342"&gt;1 FILE Menu&lt;/a&gt;&lt;/h3&gt;  &lt;h3&gt;&lt;a name="_Toc277397343"&gt;1.1 New Menu&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;If you want to either create a new test, business component, or function library you have access the File-&amp;gt;New-&amp;gt;&amp;lt;&amp;lt;Sub Option&amp;gt;&amp;gt;&amp;gt;. Figure is shown below: &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_A4WiZotKHb8/TN4CYoLfvTI/AAAAAAAACIk/opkCz3CLcXw/s1600-h/clip_image001%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image001" border="0" alt="clip_image001" src="http://lh6.ggpht.com/_A4WiZotKHb8/TN4Ca1O4wjI/AAAAAAAACIo/n7ZfbnB5y1g/clip_image001_thumb.jpg?imgmax=800" width="244" height="141" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h5&gt;&lt;/h5&gt;  &lt;h3&gt;&lt;a name="_Toc277397344"&gt;1.1.1 New Test&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;New Test option is used to create a New Test Script. You can create a New Test by pressing &lt;b&gt;Ctr+N, &lt;/b&gt;or click &lt;u&gt;File-&amp;gt;New-&amp;gt;New Test&lt;/u&gt;. Once you do above operation, you will see a blank Test Script Page where you can record or write your VB Script code.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_A4WiZotKHb8/TN4Ccab3qNI/AAAAAAAACIs/lwN3oMFcE1Q/s1600-h/clip_image003%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image003" border="0" alt="clip_image003" src="http://lh3.ggpht.com/_A4WiZotKHb8/TN4Cd2aZKfI/AAAAAAAACIw/mcgeNFaUfc4/clip_image003_thumb.jpg?imgmax=800" width="244" height="106" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc277397345"&gt;1.1.2 Business Component&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Business component is mainly used when you are planning to use Business Component Testing model and you have a Quality Center connection with valid BPT License. This is a separate topic for discussion. Keep checking my blog for updates on BPT as well.&lt;/p&gt;  &lt;p&gt;You can create a business component by pressing &lt;b&gt;Ctr+Shift+N&lt;/b&gt;, or click &lt;u&gt;File-&amp;gt;New-&amp;gt;Business Component&lt;/u&gt;.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc277397346"&gt;1.1.3 Function Library&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Functional Library as it name suggest is the placeholder wherein you can define all your reusable functions which will be used in your Automation Framework. It will consist of all the Function or Sub for your Application, Loading of required OR, loading of required folder path and architecture.&lt;/p&gt;  &lt;p&gt;To create a Function Library, press &lt;b&gt;Shift+Alt+N, &lt;/b&gt;or click &lt;u&gt;File-&amp;gt;New-&amp;gt;Function Library&lt;/u&gt;.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;&lt;/u&gt;&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc277397347"&gt;1.2 Open Menu&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;To perform your daily operation on the Test Script, Functional Library, Business Component you need to access the option available under this Menu.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_A4WiZotKHb8/TN4Ce9ZlLCI/AAAAAAAACI0/YlLtevsRdjY/s1600-h/clip_image004%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://lh3.ggpht.com/_A4WiZotKHb8/TN4CfvMCW3I/AAAAAAAACI4/kzNTXe-jgCY/clip_image004_thumb.jpg?imgmax=800" width="244" height="90" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Note: We will not cover Application Area.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc277397348"&gt;1.2.1 Test&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;To make any modification in your script at later point of time, you need to open the test script. You can open your QTP Test by pressing &lt;b&gt;Ctr+O,&lt;/b&gt; or click &lt;u&gt;File-&amp;gt;Open-&amp;gt;Test.&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;Navigate to the location where you have saved your QTP Test and select the Test to open in Edit Mode. In case you want to Open the Test in Read Only Mode, you need to select the &lt;u&gt;“Open in read-only mode”&lt;/u&gt; checkbox on Open Dialog box.&lt;/p&gt;  &lt;p&gt;Note: If you are connected to Quality Center, you need to navigate to respective QC Test Plan Folder to Open your Test. If any other user has already opened that Test, then you cannot open the Test in Edit Mode and Test will be loaded as Ready Only mode.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc277397349"&gt;1.2.2 Business Component&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;This option is available when you are connected to Quality Center having a valid BPT License. You can open and edit your Business Component Asset by pressing &lt;b&gt;Ctr+Shift+O&lt;/b&gt;, or click File-&amp;gt;Open-&amp;gt;Business/Scripted Component.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc277397350"&gt;1.2.3 Function Library&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;To make any modification in your Function Library at later point of time, you need to open the Function Library. You can open your Function Library by pressing &lt;b&gt;Shift+Alt+O,&lt;/b&gt; or click &lt;u&gt;File-&amp;gt;Open-&amp;gt;Function Library.&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;Navigate to the location where you have saved your Function Library and select the library file to open in Edit Mode. In case you want to Open the Library in Read Only Mode, you need to select the &lt;u&gt;“Open in read-only mode”&lt;/u&gt; checkbox on Open Dialog box.&lt;/p&gt;  &lt;p&gt;Note: If you are connected to Quality Center and you have saved your Library in QC, you need to navigate to respective QC Test Plan Folder to open your Library File. If any other user has already opened that Library file, then you cannot open the Library File in Edit Mode and it will be loaded as Ready Only mode.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc277397351"&gt;1.3 Close all Function Libraries&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;In case you have opened multiple Function Library, then you can close all the Function Libraries file by clicking File-&amp;gt;Close All Function Libraries.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc277397352"&gt;1.4 &lt;/a&gt;&lt;span style="color: #000000"&gt;Quality Center Connection&lt;/span&gt;&lt;/h3&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;In real time scenario, we save all our test cases in QC (in case Organization has valid QC Licenses). To Save or Open any Test from Quality Center, you first need to connect to Quality Center. Click &lt;u&gt;File-&amp;gt;Quality Center Connection.&lt;/u&gt; Enter the QC Server URL and post that enter your login credentials to get connected to QC. Sometime you might need to select the Domain &amp;amp; Project Domain as well.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_A4WiZotKHb8/TN4Ch3fOTbI/AAAAAAAACI8/8vQVfe17-jc/s1600-h/clip_image005%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image005" border="0" alt="clip_image005" src="http://lh5.ggpht.com/_A4WiZotKHb8/TN4CjIbOOwI/AAAAAAAACJA/OV8JFiKrl1E/clip_image005_thumb.jpg?imgmax=800" width="244" height="115" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;One can choose &lt;b&gt;Reconnect to server on startup &lt;/b&gt;to automatically get connected with QC, whenever QTP is opened.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_A4WiZotKHb8/TN4CmYAAtvI/AAAAAAAACJE/DK7DoBmxIjQ/s1600-h/clip_image006%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image006" border="0" alt="clip_image006" src="http://lh6.ggpht.com/_A4WiZotKHb8/TN4CoVmWgAI/AAAAAAAACJI/RIR00obcZDw/clip_image006_thumb.jpg?imgmax=800" width="210" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Choose &lt;b&gt;Authenticate on startup &lt;/b&gt;in case you do not want to enter your login credentials every time.&lt;/p&gt;  &lt;p&gt;You can choose &lt;b&gt;Login to project on startup&lt;/b&gt; option when you always want to login to same domain and project to carry out with your work.&lt;/p&gt;  &lt;p&gt;These Domain and Project are normally defined in QC Administration and User Group.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc277397353"&gt;1.5 Save &amp;amp; Save As&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;To Save the current test you can either press &lt;b&gt;Ctr+S, &lt;/b&gt;or you can click File-&amp;gt;Save. This work in a same fashion as any word processor tool, Save feature works. &lt;/p&gt;  &lt;p&gt;If you are working with Test, then pressing &lt;b&gt;Ctr+S&lt;/b&gt;, will save the Test with latest changes made.&lt;/p&gt;  &lt;p&gt;It’s not a good practice to save the Test with Active Screen files. In case you want to Save the same Test with different name, then use &lt;b&gt;Save As &lt;/b&gt;option.&lt;/p&gt;  &lt;p&gt;The above is true in case of Function Library as well, the only difference is that you can save the Function Library as VBS, TXT and QFL.&lt;/p&gt;  &lt;p&gt;See the below structure to understand how a Test is saved on the drive. &lt;/p&gt;  &lt;p&gt;Do not make any changes in the file available beneath your Test Folder.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_A4WiZotKHb8/TN4Cpcgy7nI/AAAAAAAACJM/-W4fbcOEE-M/s1600-h/clip_image007%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image007" border="0" alt="clip_image007" src="http://lh5.ggpht.com/_A4WiZotKHb8/TN4CrY9NRGI/AAAAAAAACJQ/C5vqfwNZPN8/clip_image007_thumb.jpg?imgmax=800" width="244" height="177" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc277397354"&gt;1.6 Export Test to Zip File&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;You can Export your Test to Zip file to save disk space and for making usage across the network. Your Test should be open, before you start your export to Zip file. You have to individually export each Test File.&lt;/p&gt;  &lt;p&gt;In real time scenario we rarely use this feature as all the Test Script are maintained in QC but where the Test Script get maintained in Shared Drive, there you may use this option to save the Shared Drive Disk Space and it also act as a backup of your Test Script.&lt;/p&gt;  &lt;p&gt;To initiate, click &lt;u&gt;File-&amp;gt;&lt;/u&gt; &lt;u&gt;Export Test to Zip File. &lt;/u&gt;Please ensure that Test is open while using this feature.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_A4WiZotKHb8/TN4CsjpUNfI/AAAAAAAACJU/tk46b0HbXak/s1600-h/clip_image008%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image008" border="0" alt="clip_image008" src="http://lh3.ggpht.com/_A4WiZotKHb8/TN4CuH9cKwI/AAAAAAAACJY/T00DjPsiZs8/clip_image008_thumb.jpg?imgmax=800" width="244" height="112" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h3&gt;&lt;a name="_Toc277397355"&gt;1.7 Import Test from Zip File&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;To import the file, click File-&amp;gt;Import Test from Zip File.&lt;/p&gt;  &lt;p&gt;Select the Zip File location and destination where you want to unzip the file.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_A4WiZotKHb8/TN4Cv20bNsI/AAAAAAAACJc/zfZQrNCeHsA/s1600-h/clip_image009%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image009" border="0" alt="clip_image009" src="http://lh6.ggpht.com/_A4WiZotKHb8/TN4Cw5N8HSI/AAAAAAAACJg/RSLzP0TyRKQ/clip_image009_thumb.jpg?imgmax=800" width="244" height="112" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;&lt;/h3&gt;  &lt;h3&gt;2&lt;a name="_Toc277397356"&gt; References&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Quick Test Professional Tool&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h3&gt;3 Download&lt;/h3&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Click here to &lt;a href="https://sites.google.com/site/sachinvasudha/HPQTPBasicSeriesI.pdf?attredirects=0&amp;amp;d=1"&gt;download&lt;/a&gt; a PDF copy of this article.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8291059916253528224-6193732530691734192?l=buildtesting.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/buildtesting/~4/_IjD4TxMgwM" height="1" width="1"/&gt;</content><link rel="related" href="https://sites.google.com/site/sachinvasudha/HPQTPBasicSeriesI.pdf?attredirects=0&amp;d=1" title="HP Quick Test Professional Tutorial Chapter 1" /><link rel="replies" type="application/atom+xml" href="http://buildtesting.blogspot.com/feeds/6193732530691734192/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8291059916253528224&amp;postID=6193732530691734192&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/6193732530691734192" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/6193732530691734192" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/buildtesting/~3/_IjD4TxMgwM/hp-quick-test-professional-basic-series.html" title="HP Quick Test Professional Tutorial Chapter 1" /><author><name>Sachin Kumar</name><uri>http://www.blogger.com/profile/08030029569880551521</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://bp2.blogger.com/_A4WiZotKHb8/SDMMSRhQ2eI/AAAAAAAAAgQ/e8XAvQopCOg/S220/S7300265.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_A4WiZotKHb8/TN4Ca1O4wjI/AAAAAAAACIo/n7ZfbnB5y1g/s72-c/clip_image001_thumb.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://buildtesting.blogspot.com/2010/11/hp-quick-test-professional-basic-series.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-8291059916253528224.post-8670735425090984887</id><published>2010-05-09T05:13:00.000-07:00</published><updated>2010-05-09T20:20:47.903-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="XML File" /><category scheme="http://www.blogger.com/atom/ns#" term="Environment Variable" /><category scheme="http://www.blogger.com/atom/ns#" term="QTP XML" /><title type="text">QTP-Stroring Environment Variable In XML File</title><content type="html">&lt;strong&gt;Objective:Login Action Parameterization&lt;br /&gt;&lt;/strong&gt;By the Use of External Environment Variables the issue of Login Actions parameterization could be solved.Using this approach we can concurrently run scripts on different environments.&lt;br /&gt;How it Works:&lt;br /&gt;1. &lt;strong&gt;Create&lt;/strong&gt; &lt;em&gt;AutomaticConfiguration.xml&lt;/em&gt; &lt;steps&gt;file with two variables namely &lt;em&gt;AdminLogin,UserLogin&lt;/em&gt; in Local QTP Installation folder.&lt;br /&gt;2. The Admin and User Login Actions Loads the &lt;em&gt;AutomaticConfiguration.xml&lt;/em&gt; file from the above mentioned path.&lt;br /&gt;3. The Login Actions use the Environment variables to Launch the Application.&lt;br /&gt;&lt;strong&gt;Steps To Create an XML File:&lt;br /&gt;&lt;/strong&gt;1. Open Notepad.&lt;br /&gt;2. Type &lt;em&gt;ENVIRONMENT &lt;/em&gt;on the first line (in opening and closing angular brackets)&lt;br /&gt;3. Type each variable name-value pair within &lt;em&gt;variable&lt;/em&gt; elements in the following format:&lt;br /&gt;For example, your environment variables file may look like this:&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_A4WiZotKHb8/S-d7LD97-1I/AAAAAAAACDc/VI73bJDkCqM/s1600/environment.JPG"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 118px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5469475702438624082" border="0" alt="" src="http://1.bp.blogspot.com/_A4WiZotKHb8/S-d7LD97-1I/AAAAAAAACDc/VI73bJDkCqM/s400/environment.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;4. Save the file as AutomaticConfiguration.xml in &lt;em&gt;quicktest install folder&lt;/em&gt;(\program Files\MercuryInteractive\QuickTestProfessional) in your Local Machine.&lt;br /&gt;You are done buddy. If you have any question or comments, please feel free to write at raghavendra.hosur@gmail.com or sachin.vasudha@gmail.com&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8291059916253528224-8670735425090984887?l=buildtesting.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/buildtesting/~4/dcccb1VaPzY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://buildtesting.blogspot.com/feeds/8670735425090984887/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8291059916253528224&amp;postID=8670735425090984887&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/8670735425090984887" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/8670735425090984887" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/buildtesting/~3/dcccb1VaPzY/creating-new-xml-file-to-store.html" title="QTP-Stroring Environment Variable In XML File" /><author><name>Raghav</name><uri>http://www.blogger.com/profile/10378953210795422565</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://3.bp.blogspot.com/_2DCtvpM38sk/S6Y6_5XL6dI/AAAAAAAAAE4/XIExITN1dj4/S220/S7301766.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_A4WiZotKHb8/S-d7LD97-1I/AAAAAAAACDc/VI73bJDkCqM/s72-c/environment.JPG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://buildtesting.blogspot.com/2010/05/creating-new-xml-file-to-store.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-8291059916253528224.post-838801455407032089</id><published>2010-05-09T04:46:00.001-07:00</published><updated>2010-05-09T19:48:47.395-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Reusable Function" /><category scheme="http://www.blogger.com/atom/ns#" term="VBScript" /><category scheme="http://www.blogger.com/atom/ns#" term="QTP Function" /><category scheme="http://www.blogger.com/atom/ns#" term="ChildObject" /><category scheme="http://www.blogger.com/atom/ns#" term="Link" /><title type="text">QTP Functions</title><content type="html">&lt;strong&gt;QTP Functions&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;**********************************************************************************&lt;/strong&gt;&lt;br /&gt;Function TimeStamp()&lt;br /&gt; iArr1=Replace(Now,"/","")&lt;br /&gt; iArr2=Replace(iArr1,":","")&lt;br /&gt; iArr3=Replace( iArr2,"AM","")&lt;br /&gt; iArr3=Replace( iArr2,"PM","")&lt;br /&gt; iArr4=Replace(iArr3," ","")&lt;br /&gt; iArr5=Cdbl(iArr4)&lt;br /&gt; iTimeStamp=iArr5-1000000000&lt;br /&gt; TimeStamp=iTimeStamp&lt;br /&gt;End Function&lt;br /&gt;**********************************************************************************&lt;br /&gt;Function TimeStamp(theDate)&lt;br /&gt;TimeStamp=DateDiff("s","01/01/1970 00:00:00",theDate)&lt;br /&gt;End function&lt;br /&gt;**********************************************************************************&lt;br /&gt;How to use the below function in your Test Script&lt;br /&gt;**********************************************************************************&lt;br /&gt;Set oObj=Browser("oBrowser").Page("oPage").Frame("oFrame").WebTable("oWebTable")&lt;br /&gt;Call app_CLA__ClickLink_ChildObject(oObj,1)&lt;br /&gt;**********************************************************************************&lt;br /&gt;Function ClickLink_ChildObject(oObj,iLinkIndex)&lt;br /&gt;Set oDesc1=Description.Create()&lt;br /&gt;oDesc1("innertext").value=oFrame&lt;br /&gt;Set oDesc2=Description.Create()&lt;br /&gt;oDesc2("micclass").value=oWebTable&lt;br /&gt;Set oDesc3=Description.Create()&lt;br /&gt;oDesc3("micclass").value="Link"&lt;br /&gt;oDesc3("index").value=iLinkIndex&lt;br /&gt;Set iLink=oObj.ChildObjects(oDesc1)&lt;br /&gt;iLink(iLinkIndex).click&lt;br /&gt;End Function&lt;br /&gt;**********************************************************************************&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8291059916253528224-838801455407032089?l=buildtesting.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/buildtesting/~4/B3W9iSgxT0s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://buildtesting.blogspot.com/feeds/838801455407032089/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8291059916253528224&amp;postID=838801455407032089&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/838801455407032089" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/838801455407032089" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/buildtesting/~3/B3W9iSgxT0s/timestamp-function.html" title="QTP Functions" /><author><name>Raghav</name><uri>http://www.blogger.com/profile/10378953210795422565</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://3.bp.blogspot.com/_2DCtvpM38sk/S6Y6_5XL6dI/AAAAAAAAAE4/XIExITN1dj4/S220/S7301766.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://buildtesting.blogspot.com/2010/05/timestamp-function.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-8291059916253528224.post-4065673800779474689</id><published>2010-03-30T20:07:00.000-07:00</published><updated>2010-03-30T20:18:51.885-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Delphi" /><category scheme="http://www.blogger.com/atom/ns#" term="PERT" /><category scheme="http://www.blogger.com/atom/ns#" term="Function Point" /><category scheme="http://www.blogger.com/atom/ns#" term="Estimation Risk" /><category scheme="http://www.blogger.com/atom/ns#" term="Line of Code" /><category scheme="http://www.blogger.com/atom/ns#" term="Wide Band Delphi" /><category scheme="http://www.blogger.com/atom/ns#" term="Feature Point" /><category scheme="http://www.blogger.com/atom/ns#" term="FP" /><category scheme="http://www.blogger.com/atom/ns#" term="Estimation" /><title type="text">ABC Of Estimation</title><content type="html">&lt;strong&gt;1 WHAT IS ESTIMATION&lt;/strong&gt;&lt;br /&gt;What we mean by term Estimation? How do we measure software? Well, we measure software in terms of its SIZE which can be LOC, FP etc.&lt;br /&gt;Sizing is the prediction of product deliverables needed to fulfill the project requirements.&lt;br /&gt;Estimation is nothing but the prediction of effort (resource) needed to produce the deliverables.&lt;br /&gt;Estimation is not 100% accurate at the early stages of the SDLC and as we move ahead our estimation become more accurate. We will see this more into coming sections.&lt;br /&gt;Below is a BIG picture of Software Estimation:&lt;br /&gt;&lt;span style="color:#cc0000;"&gt;Scope Defined -&gt; WBS Created (All dependencies and task identified and created) -&gt;Estimate the Software Size-&gt;Estimate the Effort (Cost) and Duration-&gt; Assign Resources-&gt;Schedule the Work.&lt;br /&gt;&lt;/span&gt;&lt;strong&gt;1.1 ESTIMATION MODELS&lt;/strong&gt;&lt;br /&gt;In below section we will see some widely used Estimation Techniques. In this article we will not go into much detail of each Estimation technique but will give you a high level detail of each technique. My next set of article will follow more detail on each technique, so keep checking on my site.&lt;br /&gt;&lt;strong&gt;1.1.1 LOC – Line of Code&lt;/strong&gt;&lt;br /&gt;Line of Code – LOC is a measure of the SIZE of the Software. Once we calculate the Software Size in LOC unit, we can determine the Effort, Cost and Schedule. We can estimate the LOC using:&lt;br /&gt;• Expert Opinions and Bottom Up Summations&lt;br /&gt;• By Analogy&lt;br /&gt;We will see the detail of above in next article.&lt;br /&gt;In brief consider an example where in we want to estimate the size of software which will be developed in Java technology. The organization has developed similar software in the past. Now based on their past data, they can easily determined the size of the software in terms of LOC. They might use PERT model to get the Pessimistic, Optimistic, and Most Probable estimate (LOC) by experts and then produce the Final Estimate.&lt;br /&gt;Let consider Pessimistic Estimate as 400 LOC, Optimistic as 200 LOC and Most Probable as 250 LOC, then using PERT we can derive final estimate as&lt;br /&gt;PERT = (P+ 4M + O)/6 = (400+4*250+200)/6 = 266 LOC&lt;br /&gt;If you have your productivity figure for Java in terms of LOC like 1 Staff can write 1000 LOC in a month, then you can estimate the Duration. Still productivity in terms of LOC is debatable and may not be the right method for determining productivity.&lt;br /&gt;Note: The number of thousands of source lines of code (KSLOC) delivered is a common metric, carried through the estimation of productivity, which are usually expressed as KSLOC/SM or KLOC/SM (where SM= Staff Month).&lt;br /&gt;LOC is a universal metric because all software products are essentially made of them.&lt;br /&gt;Many organization measure Quality as: No. of Defects / No. of lines of code which is again not the correct way of determining the quality. Quality of the code is important and not the volume.&lt;br /&gt;&lt;strong&gt;1.1.2 Function Point (FP)&lt;/strong&gt;&lt;br /&gt;The Function point method is based on the idea that software size is better measured in terms of the number and complexity of the function that it performs than on the number of lines of code that represent it.&lt;br /&gt;FP measures categories of end-user business functions. It is more methodological way than are LOC counts. A really straightforward analogy is that of a physical house to software. The no. of square feet is to the house as LOC is to software; the number of bedrooms and bathrooms is to the house as function points are to software. The former looks at the size; the latter looks at size and function.&lt;br /&gt;Here is a quick overview of Function Point process:&lt;br /&gt;1. Count the functions in each category ( The categories are: Outputs, Inputs, Inquiries, Data Structures and Interfaces)&lt;br /&gt;2. Establish the complexity of each category as Simple, Medium and Complex.&lt;br /&gt;3. Establish weights for each complexity.&lt;br /&gt;4. Multiply each function by its weight and then sum up to get total function points.&lt;br /&gt;5. Convert FP to LOC using the formula:&lt;br /&gt;LOC = Points X ADJ X Conversion Factor,&lt;br /&gt;where ADJ is an adjustment for the general characteristics of the application.&lt;br /&gt;The Conversion Factor, based on historical data for the application and programming language, represents the average number of lines of code to implement a simple function.&lt;br /&gt;There is more to Function point which will follow soon on my next article dedicated to Function Point only.&lt;br /&gt;&lt;strong&gt;1.1.3 Three Point Estimate or PERT Model&lt;/strong&gt;&lt;br /&gt;Three Point Estimate is considering 3 Estimate, OPTIMISTIC, MOST PROBABLE, PESSIMISTIC. We normally ask relevant developer or Analysts to provide the estimate as 3 Point Estimate. Once they provide these estimates we calculate the Final Estimate using PERT. A formula for the same is:&lt;br /&gt;&lt;br /&gt;PERT = (P+ 4M + O)/6, SD = P-O/6&lt;br /&gt;&lt;br /&gt;Let say we are estimating the Size of Software in terms of LOC and asking expert for their opinion. We got below value:&lt;br /&gt;&lt;br /&gt;O = 200&lt;br /&gt;P = 400&lt;br /&gt;M = 250&lt;br /&gt;&lt;br /&gt;PERT = (P+ 4M + O)/6 = (200+ (4 X 250) + 400)/6 = 266 LOC&lt;br /&gt;SD = (P – O) / 6 = (400 – 200) / 6 = 33&lt;br /&gt;&lt;br /&gt;The Final Size Estimate would be (266±33) LOC = between 233 to 299 LOC with 68% (1σ)Confidence.&lt;br /&gt;With 2 σ (90%), 266±66 = between 200 to 332 LOC&lt;br /&gt;With 3 σ (99%), 266±99 = between 167 to 365 LOC&lt;br /&gt;&lt;strong&gt;1.1.4 Feature Points&lt;/strong&gt;&lt;br /&gt;Feature Points are an extension of the function point method designed to deal with different kinds of application, such as embedded and / or real time systems. Feature points are basically function points that are sensitive to high algorithmic complexity, where an algorithm is a bounded set of rules (executable statements) required to solve a computational problem.&lt;br /&gt;In Feature Point technique apart from counting Outputs, Inputs, Inquiries, Data Structures and Interfaces we also count the number of Algorithms and provide a weightage as per the Algorithm complexity.&lt;br /&gt;&lt;strong&gt;1.1.5 Wideband Delphi&lt;/strong&gt;&lt;br /&gt;This is a disciplined method of using the experience of several people to reach an estimate that incorporates all of their knowledge.&lt;br /&gt;The “pure” approach (Pure Delphi) is to collect the expert opinion in isolation, feed back anonymous summary results, and iterate until consensus is reached. (without Group discussion). As Delphi approach can take a very long time, the concept of Wideband Delphi was introduced to speed up the process. This improved approach uses group discussion.&lt;br /&gt;The steps in conducting Wideband Delphi are:&lt;br /&gt;1. Distribute problem statement and a response form to all the experts.&lt;br /&gt;2. Conduct a Group discussion.&lt;br /&gt;3. Collect expert opinion anonymously.&lt;br /&gt;4. Feed back a summary of results to each expert.&lt;br /&gt;5. Conduct another group discussion.&lt;br /&gt;6. Iterate as necessary until consensus is reached.&lt;br /&gt;Group discussions are the primary difference between pure Delphi and Wideband Delphi.&lt;br /&gt;This process may utilize the PERT calculation for arriving at Final Estimate. It mainly depends on organization how they are setting up the process for Wideband Delphi.&lt;br /&gt;&lt;strong&gt;1.2 ESTIMATION RISK&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;1.2.1 Risk Associated with Estimation&lt;/strong&gt;&lt;br /&gt;1. Customer Dissatisfaction with Inaccurate Estimate.&lt;br /&gt;2. Loss of Money in a Fixed Price Contract, due to too optimistic estimate.&lt;br /&gt;Some of the Problems with Estimating:&lt;br /&gt;1. Missing Facts while doing estimation.&lt;br /&gt;2. No or Little Historical data upon which to base future estimates.&lt;br /&gt;3. No Standard Estimating Process within an Organization.&lt;br /&gt;4. Stakeholder misconception about estimating.&lt;br /&gt;5. The requirement is not clear or there is insufficient visibility into other parts of the system&lt;br /&gt;Inaccurate estimates will require adjustments to the schedule, to squeeze the optimal one into a shorter time frame, which almost always results in the introduction of defects.&lt;br /&gt;&lt;strong&gt;1.2.2 How to Mitigate Estimation Risk&lt;/strong&gt;&lt;br /&gt;1. Decompose the WBS to the lowest level possible; smaller components are easier to estimate.&lt;br /&gt;2. Review assumptions with all the stakeholders, including operations, maintenance and support departments.&lt;br /&gt;3. If historical data is not available, collect Anecdotal evidence.&lt;br /&gt;4. Update estimates at frequent intervals. Estimation accuracy does improve over the time(Life Cycle)&lt;br /&gt;5. Educate developer in estimation methods&lt;br /&gt;6. Use multiple size estimating methods to increase confidence.&lt;br /&gt;&lt;strong&gt;2 REFERENCES&lt;/strong&gt;&lt;br /&gt;• Quality Software Project Management by Robert, Donald &amp;amp; Linda.&lt;br /&gt;• Wikipedia&lt;br /&gt;&lt;strong&gt;3 Download&lt;/strong&gt;&lt;br /&gt;Click here to &lt;a href="http://sites.google.com/site/sachinvasudha/ABCofEstimation.pdf?attredirects=0&amp;amp;d=1"&gt;download &lt;/a&gt;a pdf copy of this article.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8291059916253528224-4065673800779474689?l=buildtesting.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/buildtesting/~4/dJ-ZHInnu-Y" height="1" width="1"/&gt;</content><link rel="related" href="http://sites.google.com/site/sachinvasudha/ABCofEstimation.pdf?attredirects=0&amp;d=1" title="ABC Of Estimation" /><link rel="replies" type="application/atom+xml" href="http://buildtesting.blogspot.com/feeds/4065673800779474689/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8291059916253528224&amp;postID=4065673800779474689&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/4065673800779474689" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/4065673800779474689" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/buildtesting/~3/dJ-ZHInnu-Y/abc-of-estimation.html" title="ABC Of Estimation" /><author><name>Sachin Kumar</name><uri>http://www.blogger.com/profile/08030029569880551521</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://bp2.blogger.com/_A4WiZotKHb8/SDMMSRhQ2eI/AAAAAAAAAgQ/e8XAvQopCOg/S220/S7300265.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://buildtesting.blogspot.com/2010/03/abc-of-estimation.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-8291059916253528224.post-7823547955766482053</id><published>2010-02-23T19:46:00.000-08:00</published><updated>2010-02-23T20:18:55.616-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Nested Query" /><category scheme="http://www.blogger.com/atom/ns#" term="Right Join" /><category scheme="http://www.blogger.com/atom/ns#" term="ANSI Style" /><category scheme="http://www.blogger.com/atom/ns#" term="Inner Join" /><category scheme="http://www.blogger.com/atom/ns#" term="INTERSECT Clause" /><category scheme="http://www.blogger.com/atom/ns#" term="MINUS Clause" /><category scheme="http://www.blogger.com/atom/ns#" term="Equi Join" /><category scheme="http://www.blogger.com/atom/ns#" term="Left Join" /><category scheme="http://www.blogger.com/atom/ns#" term="Self Join" /><category scheme="http://www.blogger.com/atom/ns#" term="Subquery" /><category scheme="http://www.blogger.com/atom/ns#" term="UNION Clause" /><category scheme="http://www.blogger.com/atom/ns#" term="THETA Style" /><category scheme="http://www.blogger.com/atom/ns#" term="Having" /><category scheme="http://www.blogger.com/atom/ns#" term="Correlated Subquery" /><category scheme="http://www.blogger.com/atom/ns#" term="GROUP BY" /><title type="text">Database Knowledge for a Tester Part V</title><content type="html">&lt;span style="font-size:130%;"&gt;&lt;span style="color:#cc0000;"&gt;&lt;u&gt;Hi Readers, this is the last series of DataBase Knowledge for a Tester. I hope you people must enjoyed the reading and gained database knowledge. Soon I will come with some more stuffs on Technology Knowledge for Tester.&lt;/u&gt;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;strong&gt;1. GROUPING DATA FROM TABLES IN SQL &lt;/strong&gt;&lt;br /&gt;Apart from SELECT, WHERE, DISTINCT, ORDER BY etc, there are 2 more clauses which facilitate selective retrieval of row. These are the GROUP BY and HAVING clauses. These are same as ORDER BY and WHERE clauses, except that they act on recordsets, and not on individual records.&lt;br /&gt;&lt;strong&gt;1.1 CONCEPT OF GROUPING &lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;1.1.1 Group By clause&lt;br /&gt;&lt;/strong&gt;The GROUP BY clause creates a data set, containing several sets of records grouped together based on a condition.&lt;br /&gt;Syntax:&lt;br /&gt;SELECT (colname1),(colname2),(colnameN), AGGREGATE_FUNCTION(expression) from TABLE NAME where (condition) GROUP BY (colname1),(colname2),(colnameN);&lt;br /&gt;For e.g.&lt;br /&gt;Consider we want to find out how many employees are there in each department.&lt;br /&gt;Select DEPT_NAME, COUNT(EMP_NO)”No. of Employees” From DEPT_MASTER GROUP BY DEPT_NAME;&lt;br /&gt;Consider another example. In case if we have to find out how many employees are there in each Branch of a Bank.&lt;br /&gt;Select BRANCH_NO, COUNT(EMP_NO)”No. of Employees” From EMP_MASTER GROUP BY BRANCH_NO;&lt;br /&gt;&lt;strong&gt;1.1.2 HAVING Clause&lt;br /&gt;&lt;/strong&gt;HAVING imposes a condition on the GROUP BY clause, which further filters the groups created by the GROUP BY clause.&lt;br /&gt;Each column specification specified in the HAVING clause must occur within a statistical function or must occur in the list of columns named in the GROUP BY clause.&lt;br /&gt;For e.g.&lt;br /&gt;Consider we want to find out all the customers which have more than one account in the Bank.&lt;br /&gt;SELECT CUST_NO, COUNT(ACC_NO) “No. of Accounts” from ACC_DETAIL where ACC_NO like ‘CA%’ or ACC_NO like ‘SA%’ GROUP BY CUST_NO HAVING COUNT(ACC_NO)&gt;1;&lt;br /&gt;&lt;br /&gt;Consider another example, if we want to find the list of those customers having only 1 account.&lt;br /&gt;&lt;br /&gt;SELECT CUST_NO, COUNT(ACC_NO) “No. of Accounts” from ACC_DETAIL GROUP BY CUST_NO HAVING COUNT(ACC_NO)=1;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1.1.3 Rules For GROUP BY and Having Clause&lt;br /&gt;&lt;/strong&gt;• Columns listed in the Select Statement have to be listed in the GROUP BY Clause&lt;br /&gt;• Columns listed in the GROUP BY Clause need not be listed in the SELECT Statement.&lt;br /&gt;• Only GROUP functions can be used in the HAVING clause&lt;br /&gt;• The Group functions listed in the HAVING clause need not be listed in the SELECT statement.&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;1.2 SUBQUERIES&lt;br /&gt;1.2.1 Subqueries &lt;/strong&gt;&lt;br /&gt;Subqueries are also called Nested query. A subquery is a form of an SQL statement that appears inside another SQL statement. The statement containing a subquery is called a parent statement.&lt;br /&gt;The Parent statement uses the rows (i.e. the result set) returned by the subquery.&lt;br /&gt;It can be used for:&lt;br /&gt;• Inserting records in a target table.&lt;br /&gt;• Creating tables and inserting records in the table created.&lt;br /&gt;• Updating records in a target table.&lt;br /&gt;• Creating Views.&lt;br /&gt;• Providing values for conditions in WHERE, HAVING, IN etc and used with SELECT, UPDATE and DELETE statements.&lt;br /&gt;For e.g.&lt;br /&gt;Get the address of the Customer names Sachin Kumar.&lt;br /&gt;SELECT CODE_NO “Cust No”, ADD1 ‘ ‘ ADD 2 ‘ ‘ ‘ ‘ CITY ‘ , ‘ STATE ‘ , ‘ PINCODE “address” FROM ADD_DETAIL WHERE CODE_NO IN&lt;br /&gt;(SELECT CUST_NO FROM CUST_MASTER WHERE FNAME=’SACHIN’ AND LNAME=’KUMAR’);&lt;br /&gt;&lt;strong&gt;1.2.2 Using Subquery in the FROM clause&lt;br /&gt;&lt;/strong&gt;The concept of using a subquery in the FROM clause is called an inline view. A subquery in the FROM clause of the SELECT statement defines a data source from that particular Select statement.&lt;br /&gt;For e.g.&lt;br /&gt;List accounts alongwith the current balance, the branch, and the avg balance of that branch, having a balance more than the avg. balance of the branch, to which the account belongs.&lt;br /&gt;SELECT A.ACC_NO, A.CURBAL, A.BRANCH_NO, A.AVGBAL FROM ACCT_MSTR A, (SELECT BRANCH_NO, AVG(CURBAL) AVGBAL FROM ACCT_MSTR GROUP BY BRANCH_NO) B&lt;br /&gt;WHERE A.BRANCH_NO=B.BRANCH_NO and A.CURBAL&gt;B.AVGBAL;&lt;br /&gt;&lt;strong&gt;1.2.3 Using Correlated Sub-Queries&lt;br /&gt;&lt;/strong&gt;A sub-query becomes correlated when the subquery references a column from a table in the parent query. A correlated subquery is evaluated once for each row processed by the parent statement, which can be any of SELECT, UPDATE or DELETE.&lt;br /&gt;It is used whenever a subquery must return a different result for each candidate row considered by the parent query.&lt;br /&gt;For e.g.&lt;br /&gt;List accounts alongwith the current balance, the branch, having a balance more than the avg. balance of the branch, to which the account belongs&lt;br /&gt;SELECT ACC_NO, CURBAL, BRANC_NO FROM ACCT_MSTR A WHERE CURBAL&gt;(SELECT AVG(CURBAL) FROM ACCT_MSTR WHERE BRANCH_NO=A.BRANCH_NO);&lt;br /&gt;&lt;strong&gt;1.2.4 Using Multi Column Sub-Query&lt;br /&gt;&lt;/strong&gt;Each row of the outer query is compared to the values from the inner query (Multi Row and Multi Column).&lt;br /&gt;For e.g.&lt;br /&gt;Find out all the customers having the same name as the employees.&lt;br /&gt;SELECT FNAME, LNAME FROM CUST_MSTR WHERE (FNAME, LNAME) IN (SELECT FNAME, LNAME FROM EMP_MSTR);&lt;br /&gt;&lt;strong&gt;1.2.5 Using EXISTS/ NOT EXISTS Operator&lt;br /&gt;&lt;/strong&gt;The EXISTS operator is usually used with correlated subqueries. This operator enables to test whether a value retrieved by the outer query exists in the result set of the values retrieved by the inner query. If a match is found TRUE is returned else FALSE.&lt;br /&gt;The EXISTS ensures that the search in the inner query terminates when at least one match is found.&lt;br /&gt;Similarly, the NOT EXISTS enables to test whether a value retrieved by the outer query is not a part of the result set of the values retrieved by the inner query.&lt;br /&gt;For e.g.&lt;br /&gt;List employees who have verified at least one account.&lt;br /&gt;SELECT EMP_NO, FNAME, LNAME FROM EMP_MSTR E WHERE EXISTS(SELECT ‘SCT’ FROM ACCT_MSTR WHERE VERI_EMP_NO = E.EMP_NO);&lt;br /&gt;&lt;br /&gt;List those branches, which don’t have employees yet.&lt;br /&gt;SELECT BRANC_NO, NAME FROM BRANCH_MSTR B WHERE NOT EXISTS(SELECT ‘SCT’ FROM EMP_MSTR WHERE BRANCH_NO=B.BRANCH_NO);&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1.3 JOINS&lt;br /&gt;&lt;/strong&gt;Joins are used to manipulate data from multiple tables using a single SQL sentence. Tables are joined on columns having the same data type, and data width in the tables.&lt;br /&gt;&lt;strong&gt;SYNTAX:&lt;br /&gt;&lt;em&gt;&lt;u&gt;ANSI STYLE &lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;SELECT COL1, COL2, COLN From Table1 INNER JOIN Table 2 on Table1.COL1=Table2.COL2 WHERE (CONDITION) ORDER BY COL1, COL2, COLN&lt;br /&gt;&lt;strong&gt;&lt;u&gt;&lt;em&gt;THETA-STYLE&lt;br /&gt;&lt;/em&gt;&lt;/u&gt;&lt;/strong&gt;SELECT COL1, COL2, COLN From Table1, Table 2 WHERE Table1.COL1=Table2.COL2 AND (CONDITION) ORDER BY COL1, COL2, COLN&lt;br /&gt;In the above syntax:&lt;br /&gt;1. COL1 in Table1 is its Primary Key&lt;br /&gt;2. COL2 in Table2 is its Foreign Key&lt;br /&gt;3. COL1 and COL2 must have the same data type and for certain data types, the same size.&lt;br /&gt;&lt;strong&gt;1.3.6 Inner or Equi Join&lt;br /&gt;&lt;/strong&gt;INNER JOIN returns all rows from both tables where there is a match.&lt;br /&gt;For e.g.&lt;br /&gt;List the employee details alongwith Branch Names to which they belong.&lt;br /&gt;Select E.EMP_NAME, D.BRANCH_NAME FROM EMP_MSTR E, DEPT_MSTR D WHERE D.DEPT_NO = E.DEPT_NO;&lt;br /&gt;&lt;strong&gt;1.3.7 Outer Join&lt;br /&gt;&lt;/strong&gt;This type of Join can be used in situations where it is desired, to select all rows from the table on the left (or right or both) regardless of whether the other table has values in common and (usually) enter NULL where data is missing.&lt;br /&gt;&lt;strong&gt;LEFT OUTER JOIN &lt;/strong&gt;&lt;br /&gt;For e.g.&lt;br /&gt;List the employee details alongwith the contact details (if any) Using Left Outer Join&lt;br /&gt;&lt;u&gt;&lt;strong&gt;&lt;em&gt;ANSI STYLE &lt;/em&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/u&gt;SELECT A.NAME, A.DEPT, B.CONTACT from EMP_MSTR A LEFT JOIN CNTC_DTLS B ON A.EMP_NO=B.CODE_NO;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;&lt;em&gt;THETA STYLE&lt;br /&gt;&lt;/em&gt;&lt;/u&gt;&lt;/strong&gt;SELECT A.NAME, A.DEPT, B.CONTACT from EMP_MSTR A, CNTC_DTLS B WHERE A.EMP_NO=B.CODE_NO (+);&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;USING RIGHT OUTER JOIN- The same query.&lt;br /&gt;&lt;u&gt;&lt;em&gt;ANSI STYLE &lt;/em&gt;&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;SELECT A.NAME, A.DEPT, B.CONTACT from CNTC_DTLS B RIGHT JOIN EMP_MSTR A ON B.CODE_NO=A.EMP_NO;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;&lt;u&gt;THETA STYLE&lt;br /&gt;&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;SELECT A.NAME, A.DEPT, B.CONTACT from CNTC_DTLS B , EMP_MSTR A WHERE B.CODE_NO (+)=A.EMP_NO;&lt;br /&gt;In both the query, all the employee details need to be listed alongwith their contact details if any. &lt;strong&gt;1.3.8 Cross Join&lt;br /&gt;&lt;/strong&gt;A Cross Join returns what’s known as a Cartesian product. The Join combines every row from the left table with every row in the right table.&lt;br /&gt;&lt;strong&gt;1.3.9 Self Join&lt;br /&gt;&lt;/strong&gt;Joining a table to itself is referred to as self-join. In a self join, two rows from the same table combine to form a result row.&lt;br /&gt;For e.g.&lt;br /&gt;Retrieve the name of the employees and the names of their respective managers from the employee table.&lt;br /&gt;SELECT EMP.FNAME “Employee”, MNGR.FNAME “Manager” FROM EMP_MSTR EMP, EMP_MSTR MNGR WHERE EMP.MNGR_NO = MNGR.EMP_NO;&lt;br /&gt;&lt;strong&gt;1.4 Guidelines for Creating Joins&lt;br /&gt;&lt;/strong&gt;• Precede the column name with the table name when writing a select statement that joins tables.(For Clarity)&lt;br /&gt;• If the same column name appears in more than one table, the column name must be prefixed with the table name.&lt;br /&gt;• The WEHERE clause is the most critical clause in a join select statement. Always make sure to include the WHERE clause.&lt;br /&gt;&lt;strong&gt;1.5 Miscellaneous Clause- UNION, INTERSECT AND MINUS&lt;br /&gt;1.5.1 Union Clause &lt;/strong&gt;&lt;br /&gt;The output of multiple queries can be combined using UNION clause.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_A4WiZotKHb8/S4Sk-jt7VrI/AAAAAAAAB9c/KdLmZhJN0jU/s1600-h/Union.JPG"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 139px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5441655644417119922" border="0" alt="" src="http://4.bp.blogspot.com/_A4WiZotKHb8/S4Sk-jt7VrI/AAAAAAAAB9c/KdLmZhJN0jU/s400/Union.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;Output of the UNION Clause&lt;br /&gt;&lt;/u&gt;&lt;/strong&gt;For e.g.&lt;br /&gt;Retrieve the names of all the employee working in India and US&lt;br /&gt;SELECT EMP_NAME FROM EMPLOYEE WHERE LOCATION=’INDIA’&lt;br /&gt;UNION&lt;br /&gt;SELECT EMP_NAME FROM EMPLOYEE WHERE LOCATION=’US’&lt;br /&gt;&lt;br /&gt;The UNION clause picks up the common records as well as the individual records in both queries.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Guideline for using Union Clause &lt;/strong&gt;&lt;br /&gt;• The number of columns and data types of the columns being selected must be identical in all the SELECT statement used in the query. The Column name need not be identical.&lt;br /&gt;• UNION operates over all of the columns being selected.&lt;br /&gt;• NULL values are not ignored during duplicate checking&lt;br /&gt;• The IN operator has a higher precedence than the UNION operator&lt;br /&gt;• By default the output is sorted in ascending order of the first column of the select statement.&lt;br /&gt;• UNION cannot be used in Subqueries&lt;br /&gt;• UNION cannot be used with Aggregate functions.&lt;br /&gt;&lt;strong&gt;1.5.2 Intersect Clause&lt;br /&gt;&lt;/strong&gt;The INTERSECT clause outputs only rows produced by both the queries intersected i.e. the output in an Intersect clause will include only those rows that are retrieved common to both the queries.&lt;br /&gt;&lt;img style="WIDTH: 400px; HEIGHT: 136px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5441656041614483746" border="0" alt="" src="http://3.bp.blogspot.com/_A4WiZotKHb8/S4SlVrZKISI/AAAAAAAAB9k/HhDHpg43ZWY/s400/Intersect.JPG" /&gt;&lt;strong&gt;&lt;u&gt;&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;Output of the INTERSECT Clause&lt;br /&gt;&lt;/u&gt;&lt;/strong&gt;For e.g.&lt;br /&gt;Retrieve the customer holding accounts as well as fixed deposits in a bank.&lt;br /&gt;SELECT DISTINCT CUST_NO FROM ACC_FD_TBL WHERE ACC_FD_NO LIKE ‘CA%’ OR ACC_FD_NO LIKE ‘SB%’&lt;br /&gt;INTERSECT&lt;br /&gt;SELECT DISTINCT CUST_NO FROM ACC_FD_TBL WHERE ACC_FD_NO LIKE ‘FS%’&lt;br /&gt;&lt;br /&gt;The INTERSECT clause picks up the record that are common in both the queries.&lt;br /&gt;&lt;strong&gt;Guideline for using Union Clause&lt;br /&gt;&lt;/strong&gt;• The number of columns and data types of the columns being selected must be identical in all the SELECT statement used in the query. The Column name need not be identical.&lt;br /&gt;• INTERSECT does not ignore NULL values.&lt;br /&gt;• Reversing the order of the intersected tables does not alter the result.&lt;br /&gt;&lt;strong&gt;1.5.3 Minus Clause&lt;br /&gt;&lt;/strong&gt;Multiple queries can be put together and their output combined using the minus clause. The MINUS clause outputs the rows produced by the first query, after filtering the rows retrieved by the second query.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_A4WiZotKHb8/S4SlraipEKI/AAAAAAAAB9s/cLnbIjf91Qg/s1600-h/Minus.JPG"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 132px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5441656415047979170" border="0" alt="" src="http://1.bp.blogspot.com/_A4WiZotKHb8/S4SlraipEKI/AAAAAAAAB9s/cLnbIjf91Qg/s400/Minus.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;For e.g.&lt;br /&gt;Retrieve the customer holding accounts but not holding any fixed deposits in a bank.&lt;br /&gt;SELECT DISTINCT CUST_NO FROM ACC_FD_TBL WHERE ACC_FD_NO LIKE ‘CA%’ OR ACC_FD_NO LIKE ‘SB%’&lt;br /&gt;MINUS&lt;br /&gt;SELECT DISTINCT CUST_NO FROM ACC_FD_TBL WHERE ACC_FD_NO LIKE ‘FS%’&lt;br /&gt;&lt;br /&gt;The MINUS clause picks records in the first query after filtering the records retrieved by the second query.&lt;br /&gt;&lt;strong&gt;Guideline for using Union Clause&lt;br /&gt;&lt;/strong&gt;• The number of columns and data types of the columns being selected must be identical in all the SELECT statement used in the query. The Column name need not be identical.&lt;br /&gt;• All the columns in the where clause must be in the SELECT clause for the MINUS operator to work.&lt;br /&gt;&lt;strong&gt;2 REFERENCES&lt;br /&gt;&lt;/strong&gt;• SQL, PL/SQL Third Edition by Ivan Bayross.&lt;br /&gt;&lt;strong&gt;3. Download&lt;/strong&gt;&lt;br /&gt;Click here to &lt;a href="http://sachin.vasudha.googlepages.com/DatabaseKnowledgeforaTesterPartV.pdf"&gt;download &lt;/a&gt;a pdf copy of this article.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8291059916253528224-7823547955766482053?l=buildtesting.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/buildtesting/~4/_bmz79m5X1o" height="1" width="1"/&gt;</content><link rel="related" href="http://sachin.vasudha.googlepages.com/DatabaseKnowledgeforaTesterPartV.pdf" title="Database Knowledge for a Tester Part V" /><link rel="replies" type="application/atom+xml" href="http://buildtesting.blogspot.com/feeds/7823547955766482053/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8291059916253528224&amp;postID=7823547955766482053&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/7823547955766482053" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/7823547955766482053" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/buildtesting/~3/_bmz79m5X1o/database-knowledge-for-tester-part-v.html" title="Database Knowledge for a Tester Part V" /><author><name>Sachin Kumar</name><uri>http://www.blogger.com/profile/08030029569880551521</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://bp2.blogger.com/_A4WiZotKHb8/SDMMSRhQ2eI/AAAAAAAAAgQ/e8XAvQopCOg/S220/S7300265.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_A4WiZotKHb8/S4Sk-jt7VrI/AAAAAAAAB9c/KdLmZhJN0jU/s72-c/Union.JPG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://buildtesting.blogspot.com/2010/02/database-knowledge-for-tester-part-v.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-8291059916253528224.post-5695823336910736169</id><published>2009-08-06T04:54:00.000-07:00</published><updated>2009-08-06T05:41:57.263-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Between Operator" /><category scheme="http://www.blogger.com/atom/ns#" term="Arithmetic Operator" /><category scheme="http://www.blogger.com/atom/ns#" term="Logical Operator" /><category scheme="http://www.blogger.com/atom/ns#" term="IN Predicate" /><category scheme="http://www.blogger.com/atom/ns#" term="Like Predicate" /><category scheme="http://www.blogger.com/atom/ns#" term="DUAL function" /><category scheme="http://www.blogger.com/atom/ns#" term="Aggregare Function" /><category scheme="http://www.blogger.com/atom/ns#" term="Scalar Function" /><category scheme="http://www.blogger.com/atom/ns#" term="Oracle Operation" /><category scheme="http://www.blogger.com/atom/ns#" term="Date Function" /><title type="text">Database Knowledge for a Tester Part IV</title><content type="html">&lt;span style="font-weight: bold;"&gt;1 COMPUTATIONS ON TABLE DATA&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Computations on table data may include displaying an employee’s name and the employee salary from the EMPLOYEE Master table alongwith the annual salary of the employee (i.e. Salary * 12). This can be achieved by using Arithmetic operator. We will see all these explained in below mentioned sections.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_A4WiZotKHb8/SnrPK1HZBeI/AAAAAAAABY0/CvZ3JDJfhHU/s1600-h/Arithmetic.jpg"&gt;&lt;img style="cursor: pointer; width: 400px; height: 97px;" src="http://1.bp.blogspot.com/_A4WiZotKHb8/SnrPK1HZBeI/AAAAAAAABY0/CvZ3JDJfhHU/s400/Arithmetic.jpg" alt="" id="BLOGGER_PHOTO_ID_5366829690929087970" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1.1 Operators Usage&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1.1.1 Arithmetic Operator&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Oracle allows arithmetic operators to be used while viewing records from the table or while performing Data Manipulation operations such as Insert, Update and Delete.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;For e.g.&lt;br /&gt;&lt;br /&gt;Consider we want to increment the salary of all employees by Rs 500.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 0);"&gt;UPDATE EMPLOYEE SET SALARY = (SALARY + 500)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Similarly you can use the above arithmetic operator for manipulating other data based on the requirement.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1.1.2 Logical Operator&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(102, 0, 0);"&gt;The AND operator&lt;/span&gt;&lt;br /&gt;The AND operator requires that each condition must be met for the record to be included in the result set. It can be used in any valid SQL statement such as Select, Insert, Update or Delete.&lt;br /&gt;&lt;br /&gt;For e.g.&lt;br /&gt;&lt;br /&gt;Consider we want to view the employee whose salary lies between 1000 to 5000.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 0);"&gt;SELECT EMPLOYEE_NAME FROM EMPLOYEE WHERE SALARY&gt;=1000 AND SALARY&lt;=5000.  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The OR operator  &lt;/span&gt;&lt;br /&gt;The OR operator requires that any of the conditions must be met for the record to be included in the result set. It can be used in any valid SQL statement such as Select, Insert, Update or Delete.&lt;br /&gt;&lt;br /&gt;For e.g.&lt;br /&gt;&lt;br /&gt;Consider we want to view the employee which belongs to either ADMIN or IT department.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 0);"&gt;SELECT EMPLOYEE_NAME FROM EMPLOYEE WHERE DEPTT=’ADMIN’ OR DEPTT=’IT’  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Combining the AND and OR operator&lt;/span&gt;&lt;br /&gt;It can be used in any valid SQL statement such as Select, Insert, Update or Delete.  When combining these conditions it is important to use brackets so that the database knows what order to evaluate each condition.&lt;br /&gt;&lt;br /&gt;For e.g.&lt;br /&gt;&lt;br /&gt;Consider we want to view the employee and which belongs to either ADMIN or IT department and their salary is greater than 3000.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 0);"&gt;SELECT EMPLOYEE_NAME, SALARY FROM EMPLOYEE WHERE (DEPTT=’ADMIN’ OR DEPTT=’IT’) AND SALARY&gt;3000.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The NOT operator&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The NOT operator display only those records that do not satisfy the conditions specified.&lt;br /&gt;&lt;br /&gt;For e.g.&lt;br /&gt;&lt;br /&gt;Consider we want to view the employees which are not married.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 0);"&gt;SELECT EMPLOYEE_NAME FROM EMPLOYEE WHERE NOT (MARITAL STATUS=’M’).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1.1.3 Range Searching – BETWEEN operator&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;The BETWEEN operator allows the selection of rows that contain values within a specified lower and upper limit. The range coded after the word BETWEEN is inclusive.&lt;br /&gt;&lt;br /&gt;For e.g.&lt;br /&gt;&lt;br /&gt;We can write the “Consider we want to view the employee whose salary lies between 1000 to 5000” also as:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 0);"&gt;SELECT EMPLOYEE_NAME FROM EMPLOYEE WHERE SALARY BETWEEN1000 AND 5000&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1.1.4 Pattern Matching – LIKE predicate&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The LIKE predicate allows comparison of one string value with another string value, which is not identical. This is achieved by using wildcard characters. Two wildcard characters that are available are:&lt;br /&gt;&lt;br /&gt;• % allows to match any string of any length (including zero length)&lt;br /&gt;• _ allows to match on a single character.&lt;br /&gt;&lt;br /&gt;For e.g.&lt;br /&gt;&lt;br /&gt;Suppose we want to view the Employee Name which starts with Letter “S”.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 0);"&gt;SELECT EMPLOYEE_NAME FROM EMPLOYEE WHERE EMPLOYEE_NAME LIKE ‘S%’&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Similarly if we want to view only those employee name which start with letter S and is of 4 characters only.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 0);"&gt;SELECT EMPLOYEE_NAME FROM EMPLOYEE WHERE EMPLOYEE_NAME LIKE ‘S____’&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1.1.5 IN and NOT IN Predicates&lt;/span&gt;&lt;br /&gt;If a value needs to be compared to a list of values then the IN predicate is used. This predicate helps reduce the need to use multiple OR conditions.&lt;br /&gt;&lt;br /&gt;For e.g.&lt;br /&gt;&lt;br /&gt;Consider we want the list of all employees which belong to either ADMIN, HR, QUALITY, IT or PROJECT department.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 0);"&gt;SELECT EMPLOYEE_NAME FROM EMPLOYEE WHERE EMPLOYEE_NAME IN (‘ADMIN’,’HR’, ‘QUALITY’,’ IT’, ‘PROJECT’)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Note: NOT IN is just the opposite of IN and select all the rows where values do not match the values in the list.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1.2 Oracle Functions&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1.2.1 Oracle Table “DUAL”&lt;/span&gt;&lt;br /&gt;DUAL is a table owned by SYS. When an arithmetic calculation is to be performed such as 2*2 or 4/2 and so on, there is no table being referenced; only numeric literals are being used. To facilitate such calculation via a SELECT statement, Oracle provides a dummy table called DUAL.&lt;br /&gt;&lt;br /&gt;For e.g.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 0);"&gt;SELECT 2*2 from DUAL will return 4.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 0);"&gt;&lt;span style="color: rgb(102, 0, 0);"&gt;SELECT SYSDATE from DUAL will return system date.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1.2.2 GROUP or AGGREGATE Functions&lt;/span&gt;&lt;br /&gt;Functions that act on a set of values are called Group or Aggregate functions. For e.g. SUM is a function which calculated the total set of numbers. A Group function returns a single result row for a group of queried rows.&lt;br /&gt;&lt;br /&gt;Some of the GROUP or AGGREGATE Function is described below:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_A4WiZotKHb8/SnrIhKrFtBI/AAAAAAAABYE/DUD1eNKzoyY/s1600-h/Group_Function.jpg"&gt;&lt;img style="cursor: pointer; width: 400px; height: 183px;" src="http://2.bp.blogspot.com/_A4WiZotKHb8/SnrIhKrFtBI/AAAAAAAABYE/DUD1eNKzoyY/s400/Group_Function.jpg" alt="" id="BLOGGER_PHOTO_ID_5366822378091688978" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1.2.3 Single Row or Scalar Functions&lt;/span&gt;&lt;br /&gt;Functions that act on only one value at a time are called Scalar Functions. Single row function can be classified corresponding to different data types as:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;String Functions - For String data type.&lt;/li&gt;&lt;li&gt;Numeric Functions – For Number data type &lt;/li&gt;&lt;li&gt;Conversion Functions – For Conversion data type&lt;/li&gt;&lt;li&gt;Date Functions -  For Date data type&lt;/li&gt;&lt;/ul&gt;Some of the available scalar functions are described below:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_A4WiZotKHb8/SnrN3pTlPDI/AAAAAAAABYc/V_YgVViXd7k/s1600-h/Scalar_Function1.jpg"&gt;&lt;img style="cursor: pointer; width: 400px; height: 352px;" src="http://4.bp.blogspot.com/_A4WiZotKHb8/SnrN3pTlPDI/AAAAAAAABYc/V_YgVViXd7k/s400/Scalar_Function1.jpg" alt="" id="BLOGGER_PHOTO_ID_5366828261829852210" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_A4WiZotKHb8/SnrOGGpXf1I/AAAAAAAABYk/iy1E8A-OvXc/s1600-h/Scalar_Function2.jpg"&gt;&lt;img style="cursor: pointer; width: 400px; height: 400px;" src="http://4.bp.blogspot.com/_A4WiZotKHb8/SnrOGGpXf1I/AAAAAAAABYk/iy1E8A-OvXc/s400/Scalar_Function2.jpg" alt="" id="BLOGGER_PHOTO_ID_5366828510224023378" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_A4WiZotKHb8/SnrONabQcKI/AAAAAAAABYs/GJAinO-Wq-A/s1600-h/Scalar_Function3.jpg"&gt;&lt;img style="cursor: pointer; width: 400px; height: 292px;" src="http://2.bp.blogspot.com/_A4WiZotKHb8/SnrONabQcKI/AAAAAAAABYs/GJAinO-Wq-A/s400/Scalar_Function3.jpg" alt="" id="BLOGGER_PHOTO_ID_5366828635792634018" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;1.3 Date Functions&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_A4WiZotKHb8/SnrLPjBOvlI/AAAAAAAABYU/u7276qvKWAo/s1600-h/Date_Function.jpg"&gt;&lt;img style="cursor: pointer; width: 400px; height: 348px;" src="http://1.bp.blogspot.com/_A4WiZotKHb8/SnrLPjBOvlI/AAAAAAAABYU/u7276qvKWAo/s400/Date_Function.jpg" alt="" id="BLOGGER_PHOTO_ID_5366825373924245074" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1.4 Miscellaneous Functions &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UID &lt;/span&gt;– This function returns an integer value corresponding to the userid of the user currently logged in.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Syntax:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UID(INTO [variable])&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For e.g.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 0, 0);"&gt;SELECT UID FROM DUAL;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;USER&lt;/span&gt; – This function returns the user name of the user who has logged in. The value returned is in varchar 2 datatype.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Syntax:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;USER&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For e.g.&lt;br /&gt;&lt;span style="color: rgb(102, 0, 0);"&gt;SELECT USER FROM DUAL;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2 REFERENCES&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;SQL, PL/SQL Third Edition by Ivan Bayross.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;3 Download&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Click &lt;a href="http://sachin.vasudha.googlepages.com/DatabaseKnowledgeforaTesterPartIV.pdf"&gt;here&lt;/a&gt;to &lt;a href="http://sachin.vasudha.googlepages.com/DatabaseKnowledgeforaTesterPartIV.pdf"&gt;download&lt;/a&gt; a pdf copy of this article.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8291059916253528224-5695823336910736169?l=buildtesting.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/buildtesting/~4/5ZhQIQl3vPM" height="1" width="1"/&gt;</content><link rel="related" href="http://sachin.vasudha.googlepages.com/DatabaseKnowledgeforaTesterPartIV.pdf" title="Database Knowledge for a Tester Part IV" /><link rel="replies" type="application/atom+xml" href="http://buildtesting.blogspot.com/feeds/5695823336910736169/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8291059916253528224&amp;postID=5695823336910736169&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/5695823336910736169" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/5695823336910736169" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/buildtesting/~3/5ZhQIQl3vPM/database-knowledge-for-tester-part-iv.html" title="Database Knowledge for a Tester Part IV" /><author><name>Sachin Kumar</name><uri>http://www.blogger.com/profile/08030029569880551521</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://bp2.blogger.com/_A4WiZotKHb8/SDMMSRhQ2eI/AAAAAAAAAgQ/e8XAvQopCOg/S220/S7300265.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_A4WiZotKHb8/SnrPK1HZBeI/AAAAAAAABY0/CvZ3JDJfhHU/s72-c/Arithmetic.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://buildtesting.blogspot.com/2009/08/database-knowledge-for-tester-part-iv.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-8291059916253528224.post-5029882702169014638</id><published>2009-07-29T06:06:00.000-07:00</published><updated>2009-07-29T06:45:09.364-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Primary Key" /><category scheme="http://www.blogger.com/atom/ns#" term="Oracle Constraint" /><category scheme="http://www.blogger.com/atom/ns#" term="Foreign Key" /><category scheme="http://www.blogger.com/atom/ns#" term="Data Constraint" /><category scheme="http://www.blogger.com/atom/ns#" term="Unique Key" /><category scheme="http://www.blogger.com/atom/ns#" term="Not Null Constraint" /><category scheme="http://www.blogger.com/atom/ns#" term="Default Value" /><category scheme="http://www.blogger.com/atom/ns#" term="Difference Between Primary Key and Foreign Key" /><category scheme="http://www.blogger.com/atom/ns#" term="Check Constraint" /><title type="text">Database Knowledge for a Tester Part III</title><content type="html">&lt;span style="font-weight: bold;"&gt;1. CONSTRAINT CONCEPTS&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1.1. Data Constraints&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Business Rules, which are enforced on data being stored in a table, are called Constraints. It super control the data being entered into a table for permanent storage.&lt;br /&gt;&lt;br /&gt;If constrains fails during insertion or updation of records, then entire record will be rejected and Insert or Update operation failed.&lt;br /&gt;&lt;br /&gt;There are 2 types of data constraints which can be further classified as described in below sections.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Input/Output Constraints&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;     &lt;span style="font-weight: bold;font-size:100%;" &gt;The Primary Key Constraint&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;     &lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;The Foreign Key Constraint&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;     The Unique Key Constraint&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Business Rule Constraints&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;     &lt;span style="font-weight: bold;font-size:100%;" &gt;CHECK Constraints&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;1.2. Input/Output Data Constraints&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1.2.1. Primary Key Constraint&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Primary Key Constraint defined at Column Level&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Normally used, to define a single primary key in a table.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SYNTAX:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[COLUMN NAME] [DATATYPE] ([SIZE]) PRIMARY KEY&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;E.g.&lt;br /&gt;&lt;br /&gt;CREATE TABLE employee (employee_no varchar2 (10) PRIMARY KEY, employee_name varchar2 (25));&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Primary Key Constraint defined at Table Level&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Normally used, to define a composite primary key in a table.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SYNTAX:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;PRIMARY KEY ([COLUMNNAME], [COLUMNNAME])&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;E.g.&lt;br /&gt;&lt;br /&gt;CREATE TABLE employee (employee_no varchar2 (10), employee_ssn varchar2(20), employee_name varchar2 (25), PRIMARY KEY (employee_no, employee_ssn));&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Features of a Primary Key&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Uniquely identifies a Row&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Does not allow duplicate values and null values&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Helps in establishing relationship among tables&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Cannot be LONG or LONG RAW data type&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Only 1 Primary Key is allowed per table&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Unique Index created automatically&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;1.2.2. Foreign Key Constraint&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This constraint establishes a relationship between records across a Master Table and Details table.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Foreign Key Constraint defined at Column Level&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SYNTAX:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[COLUMNNAME] [DATATYPE]([SIZE]) REFERENCES [TABLENAME] [([COLUMNNAME]) ]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[ON DELETE CASCADE]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;Note: ON DELETE CASCADE delete all the related records from the Master Table &amp;amp; Details table.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;ON DELETE SET NULL option instead of deleting the record set the column value to NULL in the entire related table.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For e.g.&lt;br /&gt;&lt;br /&gt;CREATE TABLE employee (employee_no varchar2 (10), employee_ssn varchar2(20), employee_name varchar2 (25), deptt_code varchar2(10) REFERENCES DEPTT_MASTER);&lt;br /&gt;&lt;br /&gt;Here REFERENCES point to the DEPTT_MASTER table and create deptt_code as foreign key in employee table.&lt;br /&gt;&lt;br /&gt;deptt_code is a primary key of DEPTT_MASTER table.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Foreign Key Constraint defined at Table Level&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SYNTAX:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;FOREIGN KET ([COLUMNNAME], .. [COLUMNNAME]) REFERENCES [TABLENAME] ([COLUMNNAME],…. [COLUMNNAME])&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For e.g.&lt;br /&gt;&lt;br /&gt;CREATE TABLE employee (employee_no varchar2 (10), employee_ssn varchar2 (20), employee_name varchar2 (25), deptt_code varchar2 (10), FOREIGN KEY (deptt_code) REFERENCES DEPTT_MASTER (deptt_code));&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Features of Foreign Keys&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Is a column(s) referencing a column(s) of a table (may be same table)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Parent references should be unique or primary key&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Child may have duplicates or null but unless it is specified.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Foreign Key Constraint can be specified on child but not on parent.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Parent Record can be deleted provided no child record exists.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Records cannot be inserted into a detail table if corresponding records in master table do not exist.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Records cannot be deleted from the Master Table if corresponding records in the detail table actually exist.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;1.2.3. Unique Key Constraint&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Unique Key Constraint defined at Column Level&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Normally used, to define a single unique key in a table.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SYNTAX:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[COLUMNNAME] [DATATYPE]([SIZE]) UNIQUE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For e.g.&lt;br /&gt;&lt;br /&gt;CREATE TABLE employee (employee_no varchar2 (10) UNIQUE, employee_ssn varchar2 (20), employee_name varchar2 (25));&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Unique Key Constraint defined at Table Level&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Normally used, to define a composite unique key in a table.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SYNTAX:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UNIQUE ([COLUMNNAME],…. [COLUMNNAME])&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For e.g.&lt;br /&gt;&lt;br /&gt;CREATE TABLE employee (employee_no varchar2 (10), employee_ssn varchar2 (20), employee_name varchar2 (25), UNIQUE(employee_no));&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;Note: Unique Key Column allow NULL values while Primary Key Column does not allow NULL values&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Features of Unique Key Constraint&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Does not allow duplicate values&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Unique Index created automatically&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;A Table can have more than 1 unique key which is not possible in Primary Key&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Cannot be LONG or LONG RAW data type&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;1.3. Business Rule data constraint&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Business Rule validations can be applied to a table column using CHECK constraint. CHECK constraints must be specified as a logical expression that evaluates either to TRUE or FALSE.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1.3.1. Check Constraint&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Check Key Constraint defined at Column Level&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SYNTAX:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[COLUMN NAME] [DATATYPE] ([SIZE]) CHECK ([LOGICAL EXPRESSION])&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;E.g.&lt;br /&gt;&lt;br /&gt;CREATE TABLE employee (employee_no varchar2 (10) CHECK (employee_no like ‘E%’), employee_name varchar2 (25) CHECK (employee_name=UPPER(employee_name));&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Unique Key Constraint defined at Table Level&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SYNTAX:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;CHECK ([LOGICAL EXPRESSION])&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;E.g.&lt;br /&gt;&lt;br /&gt;CREATE TABLE employee (employee_no varchar2 (10), employee_name varchar2 (25), CHECK (employee_no like ‘E%’), CHECK (employee_name=UPPER(employee_name));&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Restriction on Check Constraints&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The condition must be a Boolean expression&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Check constrains require a condition to be true or unknown for the row to be processed&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The condition cannot contain subqueries or sequences&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The condition cannot include SYSDATE, UID, USER or USERENV SQL functions.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;&lt;br /&gt;Note: CHECK constraint takes substantially longer to execute as compared to NOT NULL, PRIMARY KEY, FOREIGN KEY or UNIQUE.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1.4. NULL Value Concepts&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Principles of NULL values&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Setting NULL value is appropriate when actual value is unknown.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;A NULL is not same as 0 if data type is number and not same as spaces if the data type is character.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;A NULL value will evaluate to NULL in any expression.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;NULL value can be inserted into columns of any data type&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Usual operands such as =,&lt;,&gt; and so on cannot be used on a NULL value. Instead, the IS NULL and IS NOT NULL conditions have to be used.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;1.4.1. NOT NULL Constraint&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SYNTAX:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[COLUMNNAME] [DATATYPE]([SIZE]) NOT NULL&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;E.g.&lt;br /&gt;&lt;br /&gt;CREATE TABLE employee (employee_no varchar2 (10) PRIMARY, employee_name varchar2 (25) NOT NULL);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;Note: The NOT NULL constraint can only be applied at column level.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1.5. Default Value Concepts&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The DEFAULT clause can be used to specify a default value for a column.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SYNTAX:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[COLUMNNAME] [DATATYPE]([SIZE]) DEFAULT [VALUE];&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;E.g.&lt;br /&gt;&lt;br /&gt;CREATE TABLE employee (employee_no varchar2 (10) PRIMARY, employee_name varchar2 (25) NOT NULL, sex varchar2 (2) default ‘M’);&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Rules for Default Value&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The data type of the default value should match the data type of the column&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Character and date values will be specified in single quotes&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;If a column level constraint is defined on the column with a default value, the default value clause must precede the constraint definition&lt;/li&gt;&lt;/ul&gt;In such a case, the Syntax would be:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[COLUMNNAME] [DATATYPE]([SIZE]) DEFAULT [VALUE] [CONSTRAINT DEFINITION]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2. REFERENCES&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;SQL, PL/SQL Third Edition by Ivan Bayross.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;3. Download&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Click &lt;a href="http://sachin.vasudha.googlepages.com/DatabaseKnowledgeforaTesterPartIII.pdf"&gt;here &lt;/a&gt;to &lt;a href="http://sachin.vasudha.googlepages.com/DatabaseKnowledgeforaTesterPartIII.pdf"&gt;download &lt;/a&gt;a PDF copy of this Article.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8291059916253528224-5029882702169014638?l=buildtesting.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/buildtesting/~4/0ZNBCNn1sXY" height="1" width="1"/&gt;</content><link rel="related" href="http://sachin.vasudha.googlepages.com/DatabaseKnowledgeforaTesterPartIII.pdf" title="Database Knowledge for a Tester Part III" /><link rel="replies" type="application/atom+xml" href="http://buildtesting.blogspot.com/feeds/5029882702169014638/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8291059916253528224&amp;postID=5029882702169014638&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/5029882702169014638" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/5029882702169014638" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/buildtesting/~3/0ZNBCNn1sXY/database-knowledge-for-tester-part-iii.html" title="Database Knowledge for a Tester Part III" /><author><name>Sachin Kumar</name><uri>http://www.blogger.com/profile/08030029569880551521</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://bp2.blogger.com/_A4WiZotKHb8/SDMMSRhQ2eI/AAAAAAAAAgQ/e8XAvQopCOg/S220/S7300265.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://buildtesting.blogspot.com/2009/07/database-knowledge-for-tester-part-iii.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-8291059916253528224.post-1538601675277105959</id><published>2009-06-23T03:53:00.000-07:00</published><updated>2009-06-23T04:34:28.290-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="SQL Query" /><category scheme="http://www.blogger.com/atom/ns#" term="Insert Table" /><category scheme="http://www.blogger.com/atom/ns#" term="Update Table" /><category scheme="http://www.blogger.com/atom/ns#" term="Truncate Table" /><category scheme="http://www.blogger.com/atom/ns#" term="Delete Table" /><category scheme="http://www.blogger.com/atom/ns#" term="Drop Table" /><category scheme="http://www.blogger.com/atom/ns#" term="Describe Table" /><category scheme="http://www.blogger.com/atom/ns#" term="Create Table" /><category scheme="http://www.blogger.com/atom/ns#" term="Alter Table" /><title type="text">Database Knowledge for a Tester Part II</title><content type="html">&lt;strong&gt;1 SQL Concepts&lt;br /&gt;&lt;/strong&gt;&lt;strong&gt;&lt;u&gt;1.1 Basic Data Types&lt;/u&gt;&lt;/strong&gt;&lt;strong&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/strong&gt;&lt;a href="http://3.bp.blogspot.com/_A4WiZotKHb8/SkC3mKeM1hI/AAAAAAAABJs/DPV0uq4LtiY/s1600-h/Datatype.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5350478223590086162" style="WIDTH: 352px; CURSOR: hand; HEIGHT: 400px" alt="" src="http://3.bp.blogspot.com/_A4WiZotKHb8/SkC3mKeM1hI/AAAAAAAABJs/DPV0uq4LtiY/s400/Datatype.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;1.2 Basic SQL Commands&lt;/strong&gt;&lt;br /&gt;&lt;a name="_Toc233536604"&gt;&lt;strong&gt;1.1.1 &lt;u&gt;Create Table&lt;/u&gt;&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;SYNTAX:&lt;br /&gt;CREATE TABLE [Table Name] ([ColumnName1] [Datatype] ([size]), [ColumnName..n] [Datatype] ([size]));&lt;br /&gt;Rule for creating table:&lt;br /&gt;· Name can have maximum upto 30 chars.&lt;br /&gt;· Name should begin with an Alphabet (A-Z, a-z) and optionally followed by numbers (0-9)&lt;br /&gt;· Special character “_” underscore is allowed and also recommended.&lt;br /&gt;· SQL reserved words like create, select etc are not allowed.&lt;br /&gt;E.g.&lt;br /&gt;CREATE TABLE employee (employee_no varchar2 (10), employee_name varchar2 (25));&lt;br /&gt;&lt;a name="_Toc233536605"&gt;&lt;strong&gt;1.1.2 &lt;u&gt;Insert Data into Tables&lt;/u&gt;&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;SYNTAX:&lt;br /&gt;INSERT INTO [TABLE NAME] ([COLUMNNAME1], [COLUMNNAME...N]) VALUES ([EXPRESSION1], [EXPRESSION2]);&lt;br /&gt;For e.g.&lt;br /&gt;INSERT INTO employee (employee_no, employee_name) VALUES (‘E001’, ‘Sachin Kumar’);&lt;br /&gt;&lt;span style="color:#cc0000;"&gt;Note: Character &amp;amp; Date expressions placed with in the INSERT INTO statement must be enclosed in single quotes.&lt;/span&gt;&lt;br /&gt;In INSERT INTO if the number of values is same as the number of column then there is no need to provide the column name in the INSERT INTO command provided the expression are provided in the same sequence and data type as defined during CREATE TABLE.&lt;br /&gt;However if there is less values being inserted into the table, then it is mandatory to include both the Column Name and corresponding value in the INSERT INTO SQL command.&lt;br /&gt;&lt;a name="_Toc233536606"&gt;&lt;strong&gt;1.1.3 &lt;u&gt;Viewing Table Data&lt;/u&gt;&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;View All Rows and All Columns&lt;br /&gt;&lt;/strong&gt;SELECT * FROM [TABLE NAME];&lt;br /&gt;&lt;strong&gt;Selected Column and All Rows&lt;br /&gt;&lt;/strong&gt;SELECT [COLUMNNAME1], [COLUMNNAME…N] FROM [TABLE NAME];&lt;br /&gt;&lt;strong&gt;Selected Rows and All Columns&lt;br /&gt;&lt;/strong&gt;SELECT * FROM [TABLE NAME] WHERE [CONDITION];&lt;br /&gt;Here [CONDITION] is always quantified as [ColumnName=Value]&lt;br /&gt;&lt;span style="color:#cc0000;"&gt;Note: All Standard operators such as logical, arithmetic, predicates etc can be used when specifying where clause.&lt;br /&gt;&lt;/span&gt;&lt;strong&gt;Selected Column and Selected Rows&lt;/strong&gt;&lt;br /&gt;SELECT [COLUMNNAME1], [COLUMNNAME…N] FROM [TABLE NAME] WHERE [CONDITION];&lt;br /&gt;Here [CONDITION] is always quantified as [ColumnName=Value]&lt;br /&gt;&lt;span style="color:#cc0000;"&gt;Note: All Standard operators such as logical, arithmetic, predicates etc can be used when specifying where clause.&lt;br /&gt;&lt;/span&gt;&lt;strong&gt;Distinct Data or Eliminate Duplicate Records&lt;br /&gt;&lt;/strong&gt;SELECT DISTINCT [COLUMNNAME1], [COLUMNNAME…N] FROM [TABLE NAME];&lt;br /&gt;&lt;strong&gt;Display unique column values.&lt;br /&gt;&lt;/strong&gt;SELECT DISTINCT * FROM [TABLE NAME];&lt;br /&gt;Display unique rows from all the records.&lt;br /&gt;&lt;a name="_Toc233536607"&gt;&lt;strong&gt;1.1.4 &lt;u&gt;Sorting Table Data&lt;/u&gt;&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;Syntax:&lt;br /&gt;SELECT * FROM [TABLE NAME] ORDER BY [COLUMNNAME1], [COLUMNNAME…N] [[SORT ORDER]];&lt;br /&gt;&lt;span style="color:#cc0000;"&gt;Note: The ORDER BY Clause can only be used in Select Statements.&lt;br /&gt;&lt;/span&gt;The Default sort order is ASC (ascending). To sort the record in descending order use DESC keyword as Sort Order.&lt;br /&gt;&lt;a name="_Toc233536608"&gt;&lt;strong&gt;1.1.5 &lt;u&gt;Updating Table&lt;/u&gt;&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Updating All Rows&lt;br /&gt;&lt;/strong&gt;UPDATE [TABLENAME] SET [COLUMNAME1] = [EXPRESSION1], [COLUMNAME…N] = [EXPRESSION…N];&lt;br /&gt;&lt;strong&gt;Conditional Update of Records&lt;br /&gt;&lt;/strong&gt;UPDATE [TABLENAME] SET [COLUMNAME1] = [EXPRESSION1], [COLUMNAME…N] = [EXPRESSION…N] WHERE [CONDITION];&lt;br /&gt;&lt;a name="_Toc233536609"&gt;&lt;strong&gt;1.1.6 &lt;u&gt;Alter Table&lt;/u&gt;&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;ALTER TABLE allows:&lt;br /&gt;· Add/Delete columns&lt;br /&gt;· Create or Destroy indexes&lt;br /&gt;· Change the data type of existing columns&lt;br /&gt;ALTER TABLE cannot be used for:&lt;br /&gt;· Changing the name of the table &amp;amp; column&lt;br /&gt;· Decrease the size of a column if table data exists.&lt;br /&gt;&lt;br /&gt;SYNTAX:&lt;br /&gt;&lt;strong&gt;Adding New Column&lt;br /&gt;&lt;/strong&gt;ALTER TABLE [TABLE NAME] ADD ([NEWCOLUMNNAME1] [DATATYPE]([SIZE]), [NEWCOLUMNNAME…N] [DATATYPE]([SIZE]));&lt;br /&gt;&lt;strong&gt;Dropping A Column From a Table&lt;br /&gt;&lt;/strong&gt;ALTER TABLE [TABLE NAME] DROP COLUMN [COLUMNNAME];&lt;br /&gt;&lt;strong&gt;Modifying Existing Columns&lt;br /&gt;&lt;/strong&gt;ALTER TABLE [TABLE NAME] MODIFY ([COLUMNNAME] [NEWDATATYPE] ([NEW SIZE]));&lt;br /&gt;Note: To use Alter Table command, the ALTER, INSERT &amp;amp; CREATE privileges for the table are required.&lt;br /&gt;&lt;a name="_Toc233536610"&gt;&lt;strong&gt;1.1.7 &lt;u&gt;Delete Table&lt;/u&gt;&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Removal of All Rows&lt;br /&gt;&lt;/strong&gt;DELETE FROM [TABLE NAME];&lt;br /&gt;&lt;strong&gt;Removal of Specific Rows&lt;br /&gt;&lt;/strong&gt;DELETE FROM [TABLE NAME] WHERE [CONDITION];&lt;br /&gt;&lt;a name="_Toc233536611"&gt;&lt;strong&gt;1.1.8 &lt;u&gt;Truncate Table&lt;/u&gt;&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;Truncate Table like Delete Table deletes all rows from the table but there are some practical differences under some circumstances:&lt;br /&gt;· Truncate is much faster than Delete as Truncate first drop the table and then re-create it.&lt;br /&gt;· Truncate operations are not Transaction safe in case of any error while execution.&lt;br /&gt;· The number of deleted rows are not returned.&lt;br /&gt;Syntax&lt;br /&gt;TRUNCATE TABLE [TABLENAME];&lt;br /&gt;&lt;a name="_Toc233536612"&gt;&lt;strong&gt;1.1.9 &lt;u&gt;Drop Table&lt;/u&gt;&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;Drop table dropped all records from the table and permanently destroy table from the database which cannot be recovered.&lt;br /&gt;Syntax:&lt;br /&gt;DROP TABLE [TABLENAME];&lt;br /&gt;&lt;a name="_Toc233536613"&gt;&lt;strong&gt;1.2 Examining Objects Created by a User&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;a name="_Toc233536614"&gt;&lt;strong&gt;1.2.1 &lt;u&gt;Finding out the table/s Created by a user&lt;/u&gt;&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;SELECT * FROM TAB;&lt;br /&gt;The tables created under the currently selected tablespace are displayed.&lt;br /&gt;&lt;a name="_Toc233536615"&gt;&lt;strong&gt;1.2.2 &lt;u&gt;Displaying the table structure&lt;/u&gt;&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;DESCRIBE [TABLENAME];&lt;br /&gt;The command displays the column names, the data types, and the special attributes connected to the table.&lt;br /&gt;&lt;strong&gt;2. &lt;/strong&gt;&lt;a name="_Toc233536616"&gt;&lt;strong&gt;References&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;SQL, PL/SQL Third Edition by Ivan Bayross.&lt;br /&gt;&lt;strong&gt;3. Download&lt;/strong&gt;&lt;br /&gt;Click &lt;a href="http://sachin.vasudha.googlepages.com/DatabaseKnowledgeforaTesterPartII.pdf"&gt;here &lt;/a&gt;to download a PDF copy of this Article.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8291059916253528224-1538601675277105959?l=buildtesting.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/buildtesting/~4/4nTzH1oYaEA" height="1" width="1"/&gt;</content><link rel="related" href="http://sachin.vasudha.googlepages.com/DatabaseKnowledgeforaTesterPartII.pdf" title="Database Knowledge for a Tester Part II" /><link rel="replies" type="application/atom+xml" href="http://buildtesting.blogspot.com/feeds/1538601675277105959/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8291059916253528224&amp;postID=1538601675277105959&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/1538601675277105959" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/1538601675277105959" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/buildtesting/~3/4nTzH1oYaEA/database-knowledge-for-tester-part-ii.html" title="Database Knowledge for a Tester Part II" /><author><name>Sachin Kumar</name><uri>http://www.blogger.com/profile/08030029569880551521</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://bp2.blogger.com/_A4WiZotKHb8/SDMMSRhQ2eI/AAAAAAAAAgQ/e8XAvQopCOg/S220/S7300265.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_A4WiZotKHb8/SkC3mKeM1hI/AAAAAAAABJs/DPV0uq4LtiY/s72-c/Datatype.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://buildtesting.blogspot.com/2009/06/database-knowledge-for-tester-part-ii.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-8291059916253528224.post-4854016930536969740</id><published>2009-06-18T03:29:00.000-07:00</published><updated>2009-06-18T04:27:39.601-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Truncate" /><category scheme="http://www.blogger.com/atom/ns#" term="2NF" /><category scheme="http://www.blogger.com/atom/ns#" term="Codds Rule" /><category scheme="http://www.blogger.com/atom/ns#" term="Delete" /><category scheme="http://www.blogger.com/atom/ns#" term="3NF" /><category scheme="http://www.blogger.com/atom/ns#" term="DDL" /><category scheme="http://www.blogger.com/atom/ns#" term="RDMS" /><category scheme="http://www.blogger.com/atom/ns#" term="1NF" /><category scheme="http://www.blogger.com/atom/ns#" term="DCL" /><category scheme="http://www.blogger.com/atom/ns#" term="DQL" /><category scheme="http://www.blogger.com/atom/ns#" term="SQL Commands" /><category scheme="http://www.blogger.com/atom/ns#" term="Tester Database Knowledge" /><category scheme="http://www.blogger.com/atom/ns#" term="Normalization" /><category scheme="http://www.blogger.com/atom/ns#" term="Database Concept" /><category scheme="http://www.blogger.com/atom/ns#" term="DBMS" /><category scheme="http://www.blogger.com/atom/ns#" term="DML" /><title type="text">Database Knowledge for a Tester - Part I</title><content type="html">&lt;strong&gt;1.&lt;/strong&gt; &lt;a name="_Toc233103335"&gt;&lt;strong&gt;Database concepts&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;u&gt;&lt;strong&gt;1.1&lt;/strong&gt; &lt;/u&gt;&lt;a name="_Toc233103336"&gt;&lt;em&gt;&lt;strong&gt;&lt;u&gt;Codd’s Rule for RDBMS – 12 Rule&lt;/u&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Rule 1: The Information Rule&lt;br /&gt;&lt;/strong&gt;All data should be presented in a table form&lt;br /&gt;&lt;strong&gt;Rule 2: Guaranteed Access Rule&lt;br /&gt;&lt;/strong&gt;All data should be accessible without ambiguity.&lt;br /&gt;&lt;strong&gt;Rule 3: Systematic Treatment of Null Values&lt;br /&gt;&lt;/strong&gt;Support for Null values which is distinct from an empty string or a number with a value of zero.&lt;br /&gt;&lt;strong&gt;Rule 4: Dynamic Online Catalog based on the Relational model&lt;br /&gt;&lt;/strong&gt;A relational database must provide access to its structure through the same tools that are used to access the data.&lt;br /&gt;&lt;strong&gt;Rule 5: Comprehensive Data Sublanguage Rule&lt;br /&gt;&lt;/strong&gt;The DB must support at least one clearly defined language that includes functionality for Data Definition, Data Manipulation, Data Integrity, and Database Transaction Control.&lt;br /&gt;&lt;strong&gt;Rule 6: View Updating Rule&lt;br /&gt;&lt;/strong&gt;Each view in the database should support the same full range of data manipulation that has direct access to a table available. In reality, providing update and delete access to logical views is difficult and is not fully supported by any current database.&lt;br /&gt;&lt;strong&gt;Rule 7: High-level Insert, Update, and Delete&lt;br /&gt;&lt;/strong&gt;Insert, Update and Delete operations should be supported for any retrievable set rather than just for a single row in a single table.&lt;br /&gt;&lt;strong&gt;Rule 8: Physical Data Independence&lt;br /&gt;&lt;/strong&gt;The user is isolated from the physical method of storing and retrieving information from the database.&lt;br /&gt;&lt;strong&gt;Rule 9: Logical Data Independence&lt;br /&gt;&lt;/strong&gt;How data is viewed should not be changed when the logical structure of the database changes. This rule is particularly difficult to satisfy.&lt;br /&gt;&lt;strong&gt;Rule 10: Integrity Independence&lt;br /&gt;&lt;/strong&gt;The database language should support constraints on user input that maintain database integrity.&lt;br /&gt;&lt;strong&gt;Rule 11: Distribution Independence&lt;br /&gt;&lt;/strong&gt;A user should be totally unaware of whether or not the database is distributed.&lt;br /&gt;&lt;strong&gt;Rule 12: Non Subversion Rule&lt;br /&gt;&lt;/strong&gt;There should be no way to modify the db structure other than through the multiple row database language.&lt;br /&gt;&lt;a name="_Toc233103337"&gt;&lt;strong&gt;&lt;u&gt;&lt;em&gt;1.2 DBMS Vs RDBMS&lt;/em&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;DBMS – Database Management System.&lt;br /&gt;&lt;/strong&gt;The relationship between 2 tables or files is maintained programmatically.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Does not support Client/Server Architecture&lt;/li&gt;&lt;li&gt;Does not support distributed databases&lt;/li&gt;&lt;li&gt;There is no security of data&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;RDBMS – Relational Database Management System&lt;br /&gt;&lt;/strong&gt;The relationship between 2 tables or files can be specified at the time of table creation&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Support Client/Server Architecture&lt;/li&gt;&lt;li&gt;Support distributed databases&lt;/li&gt;&lt;li&gt;There are multiple levels of security&lt;/li&gt;&lt;li&gt;Logging in at O/S level&lt;/li&gt;&lt;li&gt;Command level&lt;/li&gt;&lt;li&gt;Object Level&lt;/li&gt;&lt;/ul&gt;&lt;a name="_Toc233103338"&gt;&lt;strong&gt;1.3 &lt;u&gt;&lt;em&gt;Normalization&lt;/em&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;It is a process that helps in designing the table structure for an application.&lt;br /&gt;Normalization is technique that:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Decomposes data into two dimensional tables.&lt;/li&gt;&lt;li&gt;Eliminates any relationship in which table data does fully depend upon the primary key of a record.&lt;/li&gt;&lt;li&gt;Eliminates any relationship that contains transitive dependencies.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a name="_Toc233103339"&gt;&lt;strong&gt;1.3.1 &lt;u&gt;First &lt;/u&gt;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&lt;u&gt;Normal Form&lt;br /&gt;&lt;/u&gt;&lt;/strong&gt;A table is in 1st Normal Form if:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;There are no repeating group&lt;/li&gt;&lt;li&gt;All the key attributes are defined.&lt;/li&gt;&lt;li&gt;All attributes are dependent on a primary key&lt;/li&gt;&lt;/ul&gt;&lt;a name="_Toc233103340"&gt;&lt;strong&gt;1.3.2 &lt;u&gt;Second &lt;/u&gt;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&lt;u&gt;Normal Form&lt;br /&gt;&lt;/u&gt;&lt;/strong&gt;A Table is in 2nd Normal form if:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Its in 1st Normal Form&lt;/li&gt;&lt;li&gt;It includes no partial dependencies i.e. an attribute is dependent on only a part of a primary key.&lt;/li&gt;&lt;/ul&gt;&lt;a name="_Toc233103341"&gt;&lt;strong&gt;1.3.3 &lt;u&gt;3rd &lt;/u&gt;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&lt;u&gt;Normal Form&lt;/u&gt;&lt;br /&gt;&lt;/strong&gt;A table is in 3rd Normal form if:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Its in 2nd Normal Form&lt;/li&gt;&lt;li&gt;It contains no transitive dependencies.&lt;/li&gt;&lt;/ul&gt;Note: A general case of transitive dependencies is as follows:&lt;br /&gt;X, Y, Z are 3 columns in table.&lt;br /&gt;If Z is related to Y&lt;br /&gt;If Y is related to X&lt;br /&gt;Then Z is indirectly related to X&lt;br /&gt;This is when Transitive dependencies exist.&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;Note: Normalization slow down the database query for fetching records. So sometime to make the query faster denormalization is deliberately done on the table.&lt;/span&gt;&lt;br /&gt;&lt;a name="_Toc233103342"&gt;&lt;span style="color:#000000;"&gt;&lt;strong&gt;&lt;em&gt;1.4 &lt;u&gt;Illustration of Normalization&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_A4WiZotKHb8/Sjofr8N8JQI/AAAAAAAABJM/nt-ajQXZHtc/s1600-h/DenormalizedTable.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5348622347215316226" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 137px" alt="" src="http://4.bp.blogspot.com/_A4WiZotKHb8/Sjofr8N8JQI/AAAAAAAABJM/nt-ajQXZHtc/s400/DenormalizedTable.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_A4WiZotKHb8/SjogNWb3uKI/AAAAAAAABJU/7QGFJBX9dz0/s1600-h/1stNormalForm.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5348622921188751522" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 102px" alt="" src="http://1.bp.blogspot.com/_A4WiZotKHb8/SjogNWb3uKI/AAAAAAAABJU/7QGFJBX9dz0/s400/1stNormalForm.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_A4WiZotKHb8/Sjogiri_amI/AAAAAAAABJc/3ubKdLsLCxs/s1600-h/2ndNormalForm.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5348623287633013346" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 209px" alt="" src="http://2.bp.blogspot.com/_A4WiZotKHb8/Sjogiri_amI/AAAAAAAABJc/3ubKdLsLCxs/s400/2ndNormalForm.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_A4WiZotKHb8/Sjog3sgaR8I/AAAAAAAABJk/v-U11mHLDas/s1600-h/3rdNormalForm.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5348623648667879362" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 249px" alt="" src="http://1.bp.blogspot.com/_A4WiZotKHb8/Sjog3sgaR8I/AAAAAAAABJk/v-U11mHLDas/s400/3rdNormalForm.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;2 &lt;/strong&gt;&lt;a name="_Toc233103343"&gt;&lt;strong&gt;Components of SQL&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;a name="_Toc233103344"&gt;&lt;strong&gt;.1&lt;/strong&gt; &lt;strong&gt;&lt;u&gt;DDL, DML &amp;amp; DCL Commands&lt;/u&gt;&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;DDL – Data Definition Language – No Rollback is possible – Commit is issued implicitly.&lt;br /&gt;&lt;/strong&gt;Examples are:&lt;br /&gt;· CREATE&lt;br /&gt;· ALTER&lt;br /&gt;· DROP&lt;br /&gt;· TRUNCATE – Remove all the records from a table, including all spaces allocated for the records are removed&lt;br /&gt;· GRANT&lt;br /&gt;· REVOKE&lt;br /&gt;&lt;strong&gt;DML – Data Manipulation Language&lt;br /&gt;&lt;/strong&gt;Examples are:&lt;br /&gt;· INSERT&lt;br /&gt;· UPDATE&lt;br /&gt;· DELETE – Deletes all records from a table, the space for the records remain.&lt;br /&gt;· SELECT – more specifically a DQL – data query language.&lt;br /&gt;&lt;strong&gt;DCL – Data Control Language&lt;/strong&gt;&lt;br /&gt;Examples are:&lt;br /&gt;· COMMIT&lt;br /&gt;· ROLLBACK&lt;br /&gt;&lt;strong&gt;&lt;u&gt;References&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;SQL, PL/SQL Third Edition by Ivan Bayross.&lt;br /&gt;&lt;strong&gt;&lt;u&gt;Download&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;Click &lt;a href="http://sachin.vasudha.googlepages.com/Database_Knowledge_for_a_Tester-Part.pdf"&gt;here &lt;/a&gt;to download a PDF copy of this article.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8291059916253528224-4854016930536969740?l=buildtesting.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/buildtesting/~4/chPKwfzRecM" height="1" width="1"/&gt;</content><link rel="related" href="http://sachin.vasudha.googlepages.com/Database_Knowledge_for_a_Tester-Part.pdf" title="Database Knowledge for a Tester - Part I" /><link rel="replies" type="application/atom+xml" href="http://buildtesting.blogspot.com/feeds/4854016930536969740/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8291059916253528224&amp;postID=4854016930536969740&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/4854016930536969740" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/4854016930536969740" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/buildtesting/~3/chPKwfzRecM/database-knowledge-for-tester-part-i.html" title="Database Knowledge for a Tester - Part I" /><author><name>Sachin Kumar</name><uri>http://www.blogger.com/profile/08030029569880551521</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://bp2.blogger.com/_A4WiZotKHb8/SDMMSRhQ2eI/AAAAAAAAAgQ/e8XAvQopCOg/S220/S7300265.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_A4WiZotKHb8/Sjofr8N8JQI/AAAAAAAABJM/nt-ajQXZHtc/s72-c/DenormalizedTable.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://buildtesting.blogspot.com/2009/06/database-knowledge-for-tester-part-i.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-8291059916253528224.post-6263422218047232988</id><published>2009-01-07T06:40:00.000-08:00</published><updated>2009-04-24T03:12:17.425-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Email Configuration" /><category scheme="http://www.blogger.com/atom/ns#" term="Defect Reporting" /><category scheme="http://www.blogger.com/atom/ns#" term="Defect Management Tool" /><category scheme="http://www.blogger.com/atom/ns#" term="Project Creation" /><category scheme="http://www.blogger.com/atom/ns#" term="Defect Life Cycle" /><category scheme="http://www.blogger.com/atom/ns#" term="$g_database_name" /><category scheme="http://www.blogger.com/atom/ns#" term="Mantis Installation" /><category scheme="http://www.blogger.com/atom/ns#" term="Defect Closure" /><category scheme="http://www.blogger.com/atom/ns#" term="Mantis Email Configuration" /><category scheme="http://www.blogger.com/atom/ns#" term="Defect Assignment" /><title type="text">Mantis - Defect Management Tool - User Guide</title><content type="html">&lt;a href="http://3.bp.blogspot.com/_A4WiZotKHb8/SWSICaYv8hI/AAAAAAAABEA/KHdxTVuCNlA/s1600-h/Mantisloggo.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5288501437464048146" style="WIDTH: 242px; CURSOR: hand; HEIGHT: 102px; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_A4WiZotKHb8/SWSICaYv8hI/AAAAAAAABEA/KHdxTVuCNlA/s400/Mantisloggo.jpg" border="0" /&gt;&lt;/a&gt; &lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc80090476"&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;This white paper contains information related to an open source defect management tool called Mantis which is freely available for managing all your defects.&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc214368183"&gt;&lt;strong&gt;&lt;span style="color:#000000;"&gt;Where&lt;/span&gt;&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;to Download&lt;/strong&gt;&lt;br /&gt;One can download the latest version of Mantis from &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=14963"&gt;http://sourceforge.net/project/showfiles.php?group_id=14963&lt;/a&gt;&lt;br /&gt;Download the “mantis-stable” and then “mantis-x.y.z.zip”.1.1&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc214368184"&gt;&lt;strong&gt;PRE-REQUISITE&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;em&gt;Operating System&lt;br /&gt;&lt;/em&gt;Windows 2003 Server, MacOS, OS/2, Linux, Solaris&lt;br /&gt;&lt;em&gt;Database&lt;/em&gt;&lt;br /&gt;&lt;a href="http://www.mysql.com/"&gt;MySQL&lt;/a&gt; database 3.23.2 and higher&lt;br /&gt;&lt;em&gt;Software&lt;br /&gt;&lt;/em&gt;&lt;a href="http://www.php.net/"&gt;PHP&lt;/a&gt; 4.0.6 and higher&lt;br /&gt;&lt;em&gt;Application Server&lt;br /&gt;&lt;/em&gt;Apache 1.3, Apache 2.0.54, IIS 6.0 with Web Services Extension&lt;br /&gt;&lt;em&gt;Browser&lt;/em&gt;&lt;br /&gt;IE6 and above, Mozilla Firefox&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc214368185"&gt;&lt;strong&gt;STEPS FOR INSTALLATION – FOR WINDOWS&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;MySQL Installation&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Install MySQL by downloading it from &lt;a href="http://dev.mysql.com/get/Downloads/MySQLGUITools/mysql-gui-tools-5.0-r6-win32.msi/from/http:/www.mirrorservice.org/sites/ftp.mysql.com/"&gt;http://dev.mysql.com/get/Downloads/MySQLGUITools/mysql-gui-tools-5.0-r6-win32.msi/from/http:/www.mirrorservice.org/sites/ftp.mysql.com/&lt;/a&gt; .&lt;br /&gt;Please follow the below mentioned steps while installing MySQL: (Please remember the password for “root” account)&lt;br /&gt;I. Run Setup.exe. Ignore the warning messages if any.&lt;br /&gt;II. Select Typical Setup and click next until you get to the sign up step. Select Skip and complete the installation.&lt;br /&gt;III. In the Configuration Wizard pick Detailed Configuration from the first option screen. Click next.&lt;br /&gt;IV. Pick Server Machine on the next screen. Next.&lt;br /&gt;V. Select the Non-transactional for database usage. Next.&lt;br /&gt;VI. Pick the first option (Decision Support (DSS)/OLAP). Next.&lt;br /&gt;VII. Make sure both options are checked at the next screen. Next.&lt;br /&gt;VIII. Use the standard character set. Next.&lt;br /&gt;IX. Allow MySQL to install as a Windows Service and launch automatically with Windows.&lt;br /&gt;X. Set the root password to ‘#######’. DO NOT ENABLE ROOT ACCESS FROM REMOTE MACHINES AND CERTAINLY DO NOT CREATE AN ANONYMOUS ACCOUNT.&lt;br /&gt;XI. Execute Settings.&lt;br /&gt;Please check the availability of MySQL in the Start-All Program list. &lt;/p&gt;&lt;p&gt;&lt;a name="_Toc214368187"&gt;&lt;strong&gt;PHP Installation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Install PHP by downloading it from &lt;a href="http://uk2.php.net/get/php-5.2.6-Win32.zip/from/a/mirror"&gt;http://uk2.php.net/get/php-5.2.6-Win32.zip/from/a/mirror&lt;/a&gt;&lt;br /&gt;Follow the Steps and complete the installation. Please check the availability of PHP in the Start-All Program list.To successfully install Mantis the PHP must be able to communicate with MySQL. In case you encounter any error which is related to PHP and MySQL integration then check the Environment variable path.&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc214368188"&gt;&lt;strong&gt;Mantis Installation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Download the mantis from &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=14963"&gt;http://sourceforge.net/project/showfiles.php?group_id=14963&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I. Extract the zip file to your hard drive. C:\Inetpub\wwwroot\mantis&lt;br /&gt;II Access http://[yoursite- normally a localhost]/mantis/admin/install.php. See below&lt;/p&gt;&lt;p&gt;&lt;a href="http://2.bp.blogspot.com/_A4WiZotKHb8/SWSRgQqy6oI/AAAAAAAABEQ/E_MGWir6-9o/s1600-h/MantisSS1.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5288511845856111234" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 259px" alt="" src="http://2.bp.blogspot.com/_A4WiZotKHb8/SWSRgQqy6oI/AAAAAAAABEQ/E_MGWir6-9o/s400/MantisSS1.jpg" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;III.The Green color indicates that everything is OK.&lt;br /&gt;IV.Once your installation is complete, then navigate to C:\Inetpub\wwwroot\mantis&lt;br /&gt;V. Open “config_inc.php” file and set the below mentioned parameter for database details:&lt;br /&gt;# set these values to match your setup&lt;br /&gt;$g_hostname = "your server or localhost";&lt;br /&gt;$g_db_username = "your user name";&lt;br /&gt;$g_db_password = "your password";&lt;br /&gt;$g_database_name = "your database name";&lt;br /&gt;$g_db_type = "mysql";&lt;br /&gt;VI. Save and close the above file.&lt;br /&gt;VII. Open mantis as http://&lt;yoursite-&gt;/mantis/index.php&lt;br /&gt;VIII.Enter Administrator as user Id and root as pwd if login for the first time.&lt;br /&gt;IX. Immediately go to Manage and create at least one administrator level account. Immediately after that DISABLE or DELETE the administrator account. You can recreate it but you should delete the account to prevent the cookie_string from being used to trick the package. It would be even better to rename the account or delete it permanently. REMEMBER: After setting up the package, REMOVE the default administrator account.&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc214368189"&gt;&lt;strong&gt;IMPORTANT CONFIGURATION FOR MANTIS&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc214368190"&gt;&lt;strong&gt;Email Configuration&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;You can configure the email by providing the below mentioned parameter in “config_inc.php” file:&lt;br /&gt;$g_administrator_email = 'xxx@xyz.com';&lt;br /&gt;$g_webmaster_email = ' xxx@xyz.com ';&lt;br /&gt;# the "From: " field in emails&lt;br /&gt;$g_from_email = ' xxx@xyz.com ';&lt;br /&gt;# the return address for bounced mail&lt;br /&gt;$g_return_path_email = ' xxx@xyz.com ';&lt;br /&gt;For configuring the SMTP server, please make below changes in the “config_defaults_inc.php” file:&lt;br /&gt;$g_phpMailer_method = 2;&lt;br /&gt;$g_smtp_host = your SMTP host name';&lt;br /&gt;$g_smtp_username = 'your SMTP user id';&lt;br /&gt;$g_smtp_password = 'Your SMTP password';&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc214368191"&gt;&lt;strong&gt;User Creation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Login into Mantis as an administrator and click the Manage Tab-&gt;Manage Users&lt;/p&gt;&lt;p&gt;&lt;a href="http://3.bp.blogspot.com/_A4WiZotKHb8/SWSTCER0QWI/AAAAAAAABEY/8Xw6T60YL8M/s1600-h/MantisSS2.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5288513526157295970" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 250px" alt="" src="http://3.bp.blogspot.com/_A4WiZotKHb8/SWSTCER0QWI/AAAAAAAABEY/8Xw6T60YL8M/s400/MantisSS2.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The above screen gets displayed. Provide the desired user name and the appropriate access level. The available access levels are:&lt;br /&gt;Viewer, Reporter, Updater, Developer, Manager, Administrator.&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc214368192"&gt;&lt;strong&gt;Project Creation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Login into Mantis as an administrator and click the Manage Tab-&gt;Manage Projects&lt;/p&gt;&lt;p&gt;&lt;a href="http://4.bp.blogspot.com/_A4WiZotKHb8/SWSUYMyVV2I/AAAAAAAABEg/1Ed5L3JFJ4w/s1600-h/Mantis+Project+Creation.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5288515005909915490" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 250px" alt="" src="http://4.bp.blogspot.com/_A4WiZotKHb8/SWSUYMyVV2I/AAAAAAAABEg/1Ed5L3JFJ4w/s400/Mantis+Project+Creation.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The above screen gets displayed. Provide the desired Project name and the required details and then click the Add project button.&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc214368193"&gt;&lt;strong&gt;Email Notification&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;To configure the email notification login into Mantis as an administrator and click Manage Tab-&gt;Manage Configuration-&gt;Email Notifications&lt;/p&gt;&lt;p&gt;&lt;a href="http://4.bp.blogspot.com/_A4WiZotKHb8/SWSVAMcpM0I/AAAAAAAABEo/qLZ0c3-H21k/s1600-h/Mantis+Email+Notification.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5288515693013709634" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 250px" alt="" src="http://4.bp.blogspot.com/_A4WiZotKHb8/SWSVAMcpM0I/AAAAAAAABEo/qLZ0c3-H21k/s400/Mantis+Email+Notification.jpg" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Please tick or un-tick appropriate option as per your requirement and then save the changes by clicking Update Configuration button. The change made here will ensure that who all are going to receive email in case of any changes in the reported defects.Once these configurations are completed, then the Mantis is ready for use for managing defects.&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc214368194"&gt;&lt;strong&gt;Defect Category Creation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;After the Project has been created, then create the various categories for defects which are going to be selected at the time of defect reporting. To create Defect Category, login as an Administrator and Click Manage Tab-&gt;Manage Projects-&gt;Select the Project. On the edit project page scroll down and locate the Add Category button.&lt;/p&gt;&lt;p&gt;&lt;a href="http://4.bp.blogspot.com/_A4WiZotKHb8/SWSVr8e28-I/AAAAAAAABEw/YLbuMkFo-nw/s1600-h/Mantis+Defect+Category+Creation.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5288516444642276322" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 250px" alt="" src="http://4.bp.blogspot.com/_A4WiZotKHb8/SWSVr8e28-I/AAAAAAAABEw/YLbuMkFo-nw/s400/Mantis+Defect+Category+Creation.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Enter Category name and click the Add Category button. Please follow the same step for creating multiple categories.&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc214368195"&gt;&lt;strong&gt;Version Creation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;After the Project has been created, then create the versions to be selected while reporting the defects. To create Version, login as an Administrator and Click Manage Tab-&gt;Manage Projects-&gt;Select the Project. On the edit project page scroll down and locate the Add Version button.&lt;/p&gt;&lt;p&gt;&lt;a href="http://3.bp.blogspot.com/_A4WiZotKHb8/SWSWXAuUjnI/AAAAAAAABE4/oVfuHSvbVBk/s1600-h/Mantis+Add+Version.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5288517184515247730" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 250px" alt="" src="http://3.bp.blogspot.com/_A4WiZotKHb8/SWSWXAuUjnI/AAAAAAAABE4/oVfuHSvbVBk/s400/Mantis+Add+Version.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Enter Version name and click the Add Version button. Please follow the same step for creating multiple Versions.&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc214368196"&gt;&lt;strong&gt;Global Profile Creation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;You can create a global profile to indicate the environment on which you are doing the testing of the application. To create a global profile, login as an administrator and click Manage Tab-&gt;Manage Global Profile.&lt;/p&gt;&lt;p&gt;&lt;a href="http://2.bp.blogspot.com/_A4WiZotKHb8/SWSW2lHhiaI/AAAAAAAABFA/yKmxpIYLm7s/s1600-h/Mantis+Global+Profile.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5288517726860577186" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 250px" alt="" src="http://2.bp.blogspot.com/_A4WiZotKHb8/SWSW2lHhiaI/AAAAAAAABFA/yKmxpIYLm7s/s400/Mantis+Global+Profile.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;On the above page, enter the details of available field like Platform, Operating System, Version, and any additional description and then click the Add Profile button.The newly created profile is available globally to the entire defect reporter.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;DEFECT MANAGEMENT&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc214368198"&gt;&lt;strong&gt;Defect Life Cycle Mantis&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://4.bp.blogspot.com/_A4WiZotKHb8/SWSXySTgysI/AAAAAAAABFI/EBh17dlzEZA/s1600-h/Defect+Life+Cycle.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5288518752602737346" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 220px" alt="" src="http://4.bp.blogspot.com/_A4WiZotKHb8/SWSXySTgysI/AAAAAAAABFI/EBh17dlzEZA/s400/Defect+Life+Cycle.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a name="_Toc214368199"&gt;&lt;strong&gt;Defect Reporting&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The users (Reporter) who have the rights to report the defect can use Mantis to report the defects while doing testing of the application. The steps for reporting defects are as follows:&lt;/p&gt;&lt;p&gt;&lt;a href="http://4.bp.blogspot.com/_A4WiZotKHb8/SWSYSGQNHUI/AAAAAAAABFQ/EDE7q2ICecY/s1600-h/Defect+Reporting.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5288519299123453250" style="WIDTH: 378px; CURSOR: hand; HEIGHT: 400px" alt="" src="http://4.bp.blogspot.com/_A4WiZotKHb8/SWSYSGQNHUI/AAAAAAAABFQ/EDE7q2ICecY/s400/Defect+Reporting.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I. Login using your valid user id and password.&lt;br /&gt;II. Click Report Issue link.&lt;br /&gt;III. The above page gets displayed. In case you are not able to view all the above field shown in the screen shot, then click the Advance Report link available in upper right section of the page.&lt;br /&gt;IV. Select the Defect Category, Reproducibility, Severity, Select Profile, Product Version. (You may select mandatory field only but as a good practice please input as much information as one can)&lt;br /&gt;V. Enter a Summary for the defect – would be one liner.&lt;br /&gt;VI. Enter Defect Description&lt;br /&gt;VII. Enter the Steps to Reproduce the Defects.&lt;br /&gt;VIII. You can also enter any other additional information.&lt;br /&gt;IX. In case you want to upload supporting document for the defects like screen shot, video etc., then Upload the desired file.&lt;br /&gt;X. Set the View Status to either Public or Private. Recommended is Private so that only authorized user can view the detail of defect.&lt;br /&gt;XI. Submit the Report&lt;br /&gt;Once the Defect has been submitted, its Status is Set to New and Resolution is Open. Refer Defect Life Cycle Section&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc214368200"&gt;&lt;strong&gt;Defect Assignment&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The authorized user (Manager) can assign the reported defect to the respective developer. The Steps for assigning defect(s) to developer are as follows:&lt;/p&gt;&lt;p&gt;&lt;a href="http://3.bp.blogspot.com/_A4WiZotKHb8/SWSZhNeEseI/AAAAAAAABFY/-jhDhocBcFQ/s1600-h/Assign+Issues.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5288520658270335458" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 250px" alt="" src="http://3.bp.blogspot.com/_A4WiZotKHb8/SWSZhNeEseI/AAAAAAAABFY/-jhDhocBcFQ/s400/Assign+Issues.jpg" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;a href="http://1.bp.blogspot.com/_A4WiZotKHb8/SWSZ2J6mi2I/AAAAAAAABFg/evOPYhFD-mk/s1600-h/Assign+Issue.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5288521018093505378" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 250px" alt="" src="http://1.bp.blogspot.com/_A4WiZotKHb8/SWSZ2J6mi2I/AAAAAAAABFg/evOPYhFD-mk/s400/Assign+Issue.jpg" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;I. Logged into Mantis&lt;br /&gt;II. Click View Issues link&lt;br /&gt;III.Select the Issue which should be assigned. (as shown above)&lt;br /&gt;IV. Select Assign from the drop down&lt;br /&gt;V.Click OK (see above screen shot)&lt;br /&gt;VI.Select the developer name from the drop-down and click the Assign Issues button.&lt;br /&gt;Once the defect has been assigned, the status is set to Assigned and Resolution remains open. (Refer Defect Life Cycle Section)&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc214368201"&gt;&lt;strong&gt;Defect Resolution&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="left"&gt;After the defect has been assigned, the developer got email notification of all the issue(s) assigned to him/her. The developer can change the Status and provide the correct Resolution based on his/her defect analysis. The below mentioned scenarios can happen at the developer end:&lt;br /&gt;A. &lt;em&gt;In case Defect is valid:&lt;br /&gt;&lt;/em&gt;a. &lt;em&gt;Change the Status to Resolved and Resolution to Fixed&lt;br /&gt;&lt;/em&gt;B. &lt;em&gt;In case Defect is not valid:&lt;br /&gt;&lt;/em&gt;a. &lt;em&gt;Change the Status to Resolved and Resolution to either Duplicate or No Change Required or Unable to Reproduce.&lt;/em&gt;&lt;br /&gt;C. &lt;em&gt;In case Defect is valid but planned to fix in future releases:&lt;br /&gt;&lt;/em&gt;a. &lt;em&gt;Change the Status to Acknowledged and Resolution remain Open.&lt;br /&gt;&lt;/em&gt;The steps for performing above mentioned change in the defect status and resolution are as follows: (Refer below mentioned screen shot)&lt;br /&gt;I. Logged into Mantis&lt;br /&gt;II. Click View Issues link&lt;br /&gt;III. Click the Issue&lt;br /&gt;IV. Click the Update Issue button&lt;br /&gt;V. Change the Status and Resolution and save the changes.&lt;/p&gt;&lt;p&gt;&lt;a href="http://4.bp.blogspot.com/_A4WiZotKHb8/SWSbtXd0AeI/AAAAAAAABFo/M3ZVMWfSbwU/s1600-h/Defect+Resolution.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5288523066135282146" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 318px" alt="" src="http://4.bp.blogspot.com/_A4WiZotKHb8/SWSbtXd0AeI/AAAAAAAABFo/M3ZVMWfSbwU/s400/Defect+Resolution.jpg" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;a name="_Toc214368202"&gt;&lt;strong&gt;Defect Closure&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;After the defect status has been marked as Resolved, then the reporter verifies the defect for its closure. The below mentioned scenarios can happen at Reporter end:&lt;br /&gt;1. &lt;em&gt;In case defect is found to be fixed during verification:&lt;br /&gt;&lt;/em&gt;o Change the Defect Status from Resolved to Closed. Do not make any changes in Resolution.&lt;br /&gt;2. &lt;em&gt;In case defect is found not fixed during verification:&lt;br /&gt;&lt;/em&gt;o Do not change the Status but change the Resolution from Fixed to Reopen&lt;br /&gt;In such cases the defect again moves to Assigned and so on.&lt;br /&gt;3. &lt;em&gt;In case defect is dropped by developer and reporter found that the defect still exists:&lt;br /&gt;&lt;/em&gt;o Do not change the Status but change the Resolution to Reopen.&lt;br /&gt;The Reporter follows the same steps as developer to change the Defect Status. Please see section Defect Resolution&lt;/p&gt;&lt;p&gt;Your views and comments are welcome on above white paper.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8291059916253528224-6263422218047232988?l=buildtesting.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/buildtesting/~4/XWhE5F4RYSs" height="1" width="1"/&gt;</content><link rel="related" href="http://sachin.vasudha.googlepages.com/Mantis_Defect_Management_System_Whit.pdf" title="Mantis - Defect Management Tool - User Guide" /><link rel="replies" type="application/atom+xml" href="http://buildtesting.blogspot.com/feeds/6263422218047232988/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8291059916253528224&amp;postID=6263422218047232988&amp;isPopup=true" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/6263422218047232988" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/6263422218047232988" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/buildtesting/~3/XWhE5F4RYSs/mantis-defect-management-tool-user.html" title="Mantis - Defect Management Tool - User Guide" /><author><name>Sachin Kumar</name><uri>http://www.blogger.com/profile/08030029569880551521</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://bp2.blogger.com/_A4WiZotKHb8/SDMMSRhQ2eI/AAAAAAAAAgQ/e8XAvQopCOg/S220/S7300265.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_A4WiZotKHb8/SWSICaYv8hI/AAAAAAAABEA/KHdxTVuCNlA/s72-c/Mantisloggo.jpg" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://buildtesting.blogspot.com/2008/12/mantis-defect-management-tool-user.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-8291059916253528224.post-4408284077168299855</id><published>2008-08-04T05:10:00.000-07:00</published><updated>2008-08-04T05:22:20.566-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Automation Framework" /><category scheme="http://www.blogger.com/atom/ns#" term="Business Layer" /><category scheme="http://www.blogger.com/atom/ns#" term="Presentation Layer" /><category scheme="http://www.blogger.com/atom/ns#" term="QTP Framework" /><category scheme="http://www.blogger.com/atom/ns#" term="XP Framework" /><category scheme="http://www.blogger.com/atom/ns#" term="Database Layer" /><title type="text">Automation Framework - Beyond Buzzword</title><content type="html">&lt;a name="_Toc205600386"&gt;&lt;strong&gt;1.       What is Automation?&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt; Controlling one application for another application.&lt;br /&gt;&lt;strong&gt; &lt;/strong&gt;&lt;a name="_Toc205600387"&gt;&lt;strong&gt;2.      What is Framework?&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt; A structure which consists of all the building blocks for developing an application.&lt;br /&gt;&lt;strong&gt; &lt;/strong&gt;&lt;a name="_Toc205600388"&gt;&lt;strong&gt;3.      What is Automation Framework?&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt; You are going to use the building block of structure to develop application which is going to control another application.&lt;br /&gt;&lt;strong&gt; &lt;/strong&gt;&lt;a name="_Toc205600389"&gt;&lt;strong&gt;4.      Background – Object Oriented&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt; If you have done development in any OO programming language then you can easily understand the concept of Framework and Automation. Take a simple example of Calculator. Can we call it an automated tool? Yes it is. You know why, because it controls the simple and scientific calculations.&lt;br /&gt;If you are asked to develop a program like calculator in any OO language, then you are going to make use of many pre-existing library, their methods, properties to accomplish your goal. Now these library or readymade utilities can be bundles in a framework and you just make use of that framework to execute your task.&lt;br /&gt;&lt;a name="_Toc205600390"&gt;&lt;strong&gt;5.      Test Automation Framework&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;Come to the point and talk about automation framework in testing. Today a no. of testing tool is available in the market and I am going to discuss about one of the widely used tools for automation which is HP Mercury QTP. How you are going to develop an automation framework in QTP.&lt;br /&gt;Well you have heard of Keyword driven and Data driven methods which is considered as an Automation Framework. But I am not in agreement with this view as they do not fulfill the requirement of an Automation framework as whole. It’s Ok that using above methods you can accomplish specific task as per your requirement and you can reuse it in a same application but you cannot make much of it in another application having different requirement. Then what is the use of such a framework, which cannot be extended to fulfill any task.&lt;br /&gt;In next para, I am going to talk of a Framework which can be extended to fulfill any automation task in QTP. I would like to call this as XP Framework - the framework which is extendible in real terms.&lt;br /&gt;&lt;a name="_Toc205600391"&gt;&lt;strong&gt;6.      Beyond Paradigm – XP Framework&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;I would explain the above framework taking a very simple example. In most of the application you will find a presentation layer, business layer &amp;amp; database layer. XP Framework (as I called) talk of extending existing utilities available with QTP to fulfill the above architecture.&lt;br /&gt;&lt;a name="_Toc205600392"&gt;&lt;strong&gt;6.1.    Presentation Layer (PL) Framework&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;Develop a library which is going to take care of your presentation layer. Now you will say QTP has already taking care of it. I will ask you how many shared repository you are maintaining for 5 different application you are currently working on. You will say 5. Why 5? Why not a single library for maintaining the repository for all your 5 applications? Never ever think of it. No problem.&lt;br /&gt;Develop a list of object in web-based and desktop based application. The list could include text box, label, list box, combo box, radio button, checkbox, command button, image etc.&lt;br /&gt;For e.g. Consider a login page which has 4 controls, 2 Input Box and 2 command buttons.&lt;br /&gt;When you record your script make use of above control in developing a common library which can be fit into any similar login page in different application.&lt;br /&gt;Every control has some properties and it belong to some object class. You goal is to make use of property and develop procedure so that you can set the property of these controls at run time.&lt;br /&gt;When you record an event on a particular control the tool generate script for your actions and then you start working on these generated script by modifying, making it reusable, modular etc. Great Job you are following Data Driven model. What if you are asked to test the same functionality in different applications with same control but different properties, event etc?&lt;br /&gt;You start recording and again start modifying your script. Why not we focus on developing a Presentation framework which should be application independent?&lt;br /&gt;For e.g. “Object (Property, Action/Event)”. Here Property &amp;amp; Action/Event refers to all the Property and Action/Event supported by the underlying object. Give more thought over it as this method is time taking but once developed must give a good ROI.&lt;br /&gt;&lt;a name="_Toc205600393"&gt;&lt;strong&gt;6.2.   Business Layer (BL) Framework&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;You have developed a presentation layer framework, now how PL and BL is associated. PL is used for user activity or input. The user input via PL carries some functionality which is also a part of requirement and thus testing. How you test this business layer where you have to apply logical thinking?&lt;br /&gt;Here comes the old logical blocks of If, Else. Take an example, if I have to test “Age of a person cannot be less than 13 years while creating an email account”. Think about what are the objects, actions and input linked with above functionality while testing.&lt;br /&gt;We already generated the PL, now using PL, provide the input and verify that a proper error message get displayed when user is trying to provide an age which is less than 13 year old.&lt;br /&gt;Creation of a reusable business layer is time taking and evolving. You always have to make note of most common business function across all applications. Business Functionality are not always the same, so you have to make logical business unit and then put all your observation for the business unit on ongoing basis and soon you will find that you have created a library of Business Unit which can easily be reused in matching applications carrying same business functionality.&lt;br /&gt;If one is going to automate the above functionality in QTP, then s/he is going to record the above functionality alongwith the error message. Good, that is the right way but I am going to put that If…else block to make it more reliable. For e.g. first I am going to give the script name “AgeLessThan13YearsOld”. This way I can easily find out all the business related script and can run it at any regression cycle. 2 more things I am going to incorporate to make it more reusable. First the input of age and verification of message.&lt;br /&gt;Make the script with 2 arguments, one is age which can be used as input in your script and other is the expected message which get verified with the actual message and the result get reported. This design will ensure that if in future business changed from age 13 to age 15, I just need to change my arguments in the script and nothing else.&lt;br /&gt;&lt;a name="_Toc205600394"&gt;&lt;strong&gt;6.3.   Database Layer&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;The last layer is the database layer which store the information passed via the presentation layer, filtered through business layer. What you are going to verify in your database. If you are spending time in verifying the entered data in the database using QTP, I will say it useless. You can easily verify it by directly opening the database table.&lt;br /&gt;For e.g. if you are testing a search page, then&lt;br /&gt;You can check the total no. of records returned via a query should match with the results returned on PL.&lt;br /&gt;&lt;a name="_Toc205600395"&gt;&lt;strong&gt;7.      QTP – Itself a framework – Shifting Paradigm&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;QTP is itself an automation framework which help user to fulfill automation task for testing. We are making use of various features of this framework and trying to develop another framework above oneJ.&lt;br /&gt;What we are trying to do? We are trying to fulfill some business tasks of testing. We are developing script, modifying the script, making it reusable and numerous activities. These all are procedure and we are making use of QTP Framework.&lt;br /&gt;The Automation Framework is an industry buzzword and nothing else.&lt;br /&gt;The industry is calling below mentioned as framework and I am not in agreement with it:&lt;br /&gt;         Test Script Modularity&lt;br /&gt;         Test Library Architecture&lt;br /&gt;         Data-Driven Testing&lt;br /&gt;         Keyword-Driven or Table-Driven Testing&lt;br /&gt;         Hybrid Test Automation&lt;br /&gt;Why we call the above model as a Framework. We solve the business problem using above models in QTP or similar automation tool (which I am calling as an Automation Tool Framework.)&lt;br /&gt;What I am talking may sound rubbish but I am talking on basics. Why we do not call MVC, N-tier and other architecture a framework? Why we call dot net as framework because we solve business problem using Dot Net Framework following some architecture which is reliable, maintainable etc.&lt;br /&gt;Even the framework which I mentioned over here is just an extension of QTP Framework.&lt;br /&gt;&lt;br /&gt;The above views are mine and you may or may not agree with it. The views and opinions give may or may not be useful for you in real time scenario.&lt;br /&gt;Your views are most welcome.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8291059916253528224-4408284077168299855?l=buildtesting.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/buildtesting/~4/P2OCQm2XARc" height="1" width="1"/&gt;</content><link rel="related" href="http://sachin.vasudha.googlepages.com/AutomationFramework-Buzzword.pdf" title="Automation Framework - Beyond Buzzword" /><link rel="replies" type="application/atom+xml" href="http://buildtesting.blogspot.com/feeds/4408284077168299855/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8291059916253528224&amp;postID=4408284077168299855&amp;isPopup=true" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/4408284077168299855" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/4408284077168299855" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/buildtesting/~3/P2OCQm2XARc/automation-framework-beyond-buzzword.html" title="Automation Framework - Beyond Buzzword" /><author><name>Sachin Kumar</name><uri>http://www.blogger.com/profile/08030029569880551521</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://bp2.blogger.com/_A4WiZotKHb8/SDMMSRhQ2eI/AAAAAAAAAgQ/e8XAvQopCOg/S220/S7300265.JPG" /></author><thr:total>3</thr:total><feedburner:origLink>http://buildtesting.blogspot.com/2008/08/automation-framework-beyond-buzzword.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-8291059916253528224.post-5561240519464087665</id><published>2008-07-01T02:07:00.000-07:00</published><updated>2008-12-11T15:39:16.233-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Website Testing Tool" /><category scheme="http://www.blogger.com/atom/ns#" term="Pixel Ruler" /><category scheme="http://www.blogger.com/atom/ns#" term="Web Developer" /><category scheme="http://www.blogger.com/atom/ns#" term="TAW-it" /><title type="text">Website Testing - Tools and Best Practices</title><content type="html">&lt;p align="left"&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/p&gt;&lt;p align="left"&gt;This white paper contains information related to tool and fire-fox add-ins that are freely available for usage when doing testing for websites.&lt;/p&gt;&lt;p align="left"&gt;&lt;strong&gt;Website testing tool:&lt;br /&gt;&lt;/strong&gt;Pixel Ruler v3.1 – Measure Vertical and Horizontal distance (in pixels) between various section of a website or your desktop.&lt;br /&gt;&lt;strong&gt;Firefox add-ins:&lt;/strong&gt;&lt;br /&gt;TAW-it – Helpful in doing Accessibility testing&lt;br /&gt;Web Developer&lt;/p&gt;&lt;p align="left"&gt;&lt;strong&gt;Website testing tool and add-ins&lt;/strong&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;strong&gt;Pixel Ruler Functionality&lt;/strong&gt;&lt;br /&gt;Know the exact size and position of any element with this screen ruler. &lt;/p&gt;&lt;p align="left"&gt;Free and easy to use virtual screen ruler.&lt;/p&gt;&lt;p align="left"&gt;Float over your screen.&lt;/p&gt;&lt;p align="left"&gt;Work with all applications.&lt;/p&gt;&lt;p align="left"&gt;Show measurements in Pixels.&lt;/p&gt;&lt;p align="left"&gt;Rotate to horizontal or vertical position.&lt;/p&gt;&lt;p align="left"&gt;Maximum of 1300 pixels.&lt;/p&gt;&lt;p align="left"&gt;Choose between several skins.&lt;/p&gt;&lt;p align="left"&gt;&lt;strong&gt;How to install the application&lt;/strong&gt;&lt;/p&gt;&lt;p align="left"&gt;Download the Setup from &lt;a href="http://www.mioplanet.com/products/pixelruler/index.htm"&gt;http://www.mioplanet.com/products/pixelruler/index.htm&lt;/a&gt;&lt;/p&gt;&lt;p align="left"&gt;Run the Setup&lt;br /&gt;Start using Pixel Ruler&lt;br /&gt;The supported Operating systems are Windows 98, ME, NT4, 2000, XP, Vista.&lt;/p&gt;&lt;p align="left"&gt;&lt;strong&gt;How to use the Pixel Ruler&lt;/strong&gt;&lt;br /&gt;1. Open Pixel Ruler&lt;br /&gt;2. Open the website for which you want to measure the pixel distance between the sections, images or various other objects of your interest.&lt;br /&gt;3. Set the initial point and move your mouse horizontally or vertically to the destination point.&lt;br /&gt;4. Check the value displayed at the destination position of mouse cursor &lt;/p&gt;&lt;p align="left"&gt;&lt;strong&gt;TAW - it&lt;/strong&gt;&lt;br /&gt;TAW-it allows to verify, with just a click, the accessibility of the Web sites that you are visiting, by means of the TAW3 online service (www.tawdis.net) and making use of the W3C Web Content Accessibility Guidelines (WCAG 1.0).&lt;br /&gt;Its goal is to analyze the level of accessibility in the design and development of Web pages to allow access for all, regardless of their specific characteristics&lt;br /&gt;TAW is based on rules developed by the W3C WAI (Web Accessibility Initiative). These rules, known as Web Content Accessibility Guidelines 1.0, include fourteen guidelines that describe the principles of accessible design. Each of these guidelines is divided into one or more checkpoints.&lt;br /&gt;For more information, visit &lt;a href="http://www.tawdis.net/taw3/manual/web_accesible/wcag10/WAI-WEBCONTENT-19990505_es.html"&gt;Web Content Accessibility Guidelines 1.0. &lt;/a&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;strong&gt;H&lt;/strong&gt;&lt;strong&gt;ow to install the TAW-it &lt;/strong&gt;&lt;strong&gt;Add-Ins &lt;/strong&gt;&lt;br /&gt;Pre-requisites:&lt;br /&gt;Firefox: 1.0 – 2.0.0&lt;br /&gt;OS – Supported where Firefox works.&lt;br /&gt;Open Firefox browser&lt;br /&gt;Open link &lt;a href="http://www.tawdis.net/taw3/descargas/ext/tawclic.0.9.6.xpi"&gt;http://www.tawdis.net/taw3/descargas/ext/tawclic.0.9.6.xpi&lt;/a&gt; &lt;/p&gt;&lt;p align="left"&gt;Follow the instructions and restart your browser&lt;br /&gt;Once TAW-it has been successfully installed, its icon &lt;img id="BLOGGER_PHOTO_ID_5217972740391538242" style="WIDTH: 32px; CURSOR: hand; HEIGHT: 30px" height="24" alt="" src="http://4.bp.blogspot.com/_A4WiZotKHb8/SGn2j7a1jkI/AAAAAAAAAh8/gH9Zxsz6GTs/s200/clip_image002.jpg" width="32" border="0" /&gt; will appear in the browser status bar, and you will be able to make an accessibility analysis of the Web page you are visiting simply by clicking on that icon. &lt;/p&gt;&lt;p align="left"&gt;&lt;strong&gt;How to use TAW-it&lt;/strong&gt;&lt;/p&gt;&lt;p align="left"&gt;1.Open the Website under test in Firefox browser&lt;br /&gt;2. Check the TAW-it icon in the status bar&lt;br /&gt;3. Change the settings based on your requirement of WCAG 1.0 Level AAA, AA, A&lt;br /&gt;4. Click the TAW-it icon in the status bar&lt;br /&gt;5. TAW-it generates an accessibility report&lt;br /&gt;6. Analyze the report and share with your web developer for necessary fixation.&lt;br /&gt;Note: The website that is under test must be hosted on a public domain, then only TAW-it will be able to do the analysis. This cannot be used on local hosted website.&lt;br /&gt;&lt;strong&gt;Web Developer&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;Web developer tool help you in doing a complete analysis of web pages with respect to various parameters that are available with this addins.&lt;br /&gt;The Web Developer extension adds a menu and a toolbar to the browser with various web developer tools. It is designed for Firefox, Flock, Mozilla and Seamonkey, and will run on any platform that these browsers support including Windows, Mac OS X and Linux &lt;/p&gt;&lt;p align="left"&gt;&lt;strong&gt;How to install the Web&lt;/strong&gt;&lt;strong&gt; Developer Addins&lt;br /&gt;&lt;/strong&gt;Pre-requisites:&lt;br /&gt;Firefox: 1.0 – 2.0.0&lt;br /&gt;OS – Supported where Firefox works Windows, Mac OS X and Linux&lt;br /&gt;Open Firefox browser&lt;br /&gt;Open link &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/60"&gt;https://addons.mozilla.org/en-US/firefox/addon/60&lt;/a&gt;&lt;br /&gt;Follow the instructions and restart your browser&lt;br /&gt;Once Web Developer has been successfully installed, you will find various menu and toolbar with various web developer tools on the browser standard tool bar. A 'Web Developer' menu under the 'Tools' and context menu of the browser, as well as a new toolbar. &lt;/p&gt;&lt;p align="left"&gt;&lt;strong&gt;How to use &lt;/strong&gt;&lt;strong&gt;Web Developer&lt;br /&gt;&lt;/strong&gt;This tool is very helpful for doing Website Testing. A tester can use this tool for verifying mentioned below functionalities of web pages: &lt;a href="http://sachin.vasudha.googlepages.com/BestPracticesforWebSiteTesting.pdf"&gt;Click here&lt;/a&gt; to download the document.&lt;/p&gt;&lt;p align="left"&gt;Steps to Use&lt;br /&gt;1. Open the web page to test&lt;br /&gt;2. Suppose there is requirement to test “All images must have ALT TAGS”.&lt;br /&gt;3. Choose Images-&gt;Display ALT attributes&lt;br /&gt;4. All the ALT attributes on the page will get highlighted and one can easily verify the ALT tags&lt;br /&gt;5. Similarly you can test other functionality as per your requirement. &lt;/p&gt;&lt;p align="left"&gt;The above article is based on my learning (may or may not apply to your case) and in case you want to share your thoughts, then please do it and assist others.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8291059916253528224-5561240519464087665?l=buildtesting.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/buildtesting/~4/u8NMROxaZv8" height="1" width="1"/&gt;</content><link rel="related" href="http://sachin.vasudha.googlepages.com/BestPracticesforWebSiteTesting.pdf" title="Website Testing - Tools and Best Practices" /><link rel="replies" type="application/atom+xml" href="http://buildtesting.blogspot.com/feeds/5561240519464087665/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8291059916253528224&amp;postID=5561240519464087665&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/5561240519464087665" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/5561240519464087665" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/buildtesting/~3/u8NMROxaZv8/website-testing-tools-and-best.html" title="Website Testing - Tools and Best Practices" /><author><name>Sachin Kumar</name><uri>http://www.blogger.com/profile/08030029569880551521</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://bp2.blogger.com/_A4WiZotKHb8/SDMMSRhQ2eI/AAAAAAAAAgQ/e8XAvQopCOg/S220/S7300265.JPG" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_A4WiZotKHb8/SGn2j7a1jkI/AAAAAAAAAh8/gH9Zxsz6GTs/s72-c/clip_image002.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://buildtesting.blogspot.com/2008/07/website-testing-tools-and-best.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-8291059916253528224.post-3379303112127936423</id><published>2008-06-02T01:56:00.000-07:00</published><updated>2008-06-02T02:04:10.720-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Report" /><category scheme="http://www.blogger.com/atom/ns#" term="Test Plan" /><category scheme="http://www.blogger.com/atom/ns#" term="Test Set" /><category scheme="http://www.blogger.com/atom/ns#" term="Defects" /><category scheme="http://www.blogger.com/atom/ns#" term="Test Lab" /><category scheme="http://www.blogger.com/atom/ns#" term="requirement" /><title type="text">HP Quality Center - Best Practices</title><content type="html">&lt;strong&gt;1.Introduction&lt;br /&gt;&lt;/strong&gt;Quality Center is a test management tool which provides very good features for managing both your manual and automated test cases. This paper highlights the best practices for managing your test cases.&lt;br /&gt;When you open Quality center, depending on your rights it display the below mentioned option in the sidebar:&lt;br /&gt;1. Requirements&lt;br /&gt;2. Test Plan&lt;br /&gt;3. Test Lab&lt;br /&gt;4. Defects&lt;br /&gt;5. Dashboard&lt;br /&gt;&lt;strong&gt;2.Requirements&lt;/strong&gt;&lt;br /&gt;When you have assigned with the responsibility of developing your test cases in the quality center then you must be wondering where to start with. I am going to share my experience to overcome such a situation.&lt;br /&gt;You need to find the solution of some question before you start writing your test cases.&lt;br /&gt;1. Is your requirement developed and available?&lt;br /&gt;2. Is your requirement organized in a logical sequence?&lt;br /&gt;If answer to both of the above question is Yes, then you can start with Requirement option in the side bar. In case your requirement is under development, then you keep your requirement updated in Quality Center alongwith your test cases.&lt;br /&gt;Develop a folder structure based on the logical sequence of the requirement. For e.g. if your requirement document consists broadly below mentioned section, then create the same folder structure in your Quality Center Requirement module.&lt;br /&gt;1. Use Cases&lt;br /&gt;2. User Interface&lt;br /&gt;3. Business Rules&lt;br /&gt;4. Report Specification&lt;br /&gt;The above are your folder name under a root directory which can be the name of your project or product.&lt;br /&gt;You then start creating the requirement under these folders structure and provide logical and relevant name to each of your requirement. For e.g. if my requirement has say use cases for say Login, Landing Page etc. Then the Use Cases and other folder must contain these requirements. An illustration is given below:&lt;br /&gt;1. Use Cases&lt;br /&gt;Login&lt;br /&gt;Landing Page&lt;br /&gt;2. User Interface&lt;br /&gt;Login&lt;br /&gt;Landing Page&lt;br /&gt;and so on…&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;3.Test Plan&lt;/strong&gt;&lt;br /&gt;Once you are through with your requirement, then you start writing test cases. The best way to write test cases is to refer the use cases, user interface, business rules and report specification. These sections help one to develop various scenarios for use cases.&lt;br /&gt;Always think of all possible scenarios and then start documenting those scenarios as per your requirement.&lt;br /&gt;So now you focus your attention on Test Plan module of QC. Here you are going to create the folder structure in logical sequence. The best way to define a logical sequence is to understand the use cases. Your use cases are going to assist in developing the logical sequence and your test scenarios. For e.g. referring my previous example of Login I can think of various test scenarios like&lt;br /&gt;1. Valid Login&lt;br /&gt;2. Invalid Login&lt;br /&gt;3. Authentication and Authorization&lt;br /&gt;4. Server down while login&lt;br /&gt;5. Improper shut down in last successful login&lt;br /&gt;In a similar way you can think of valid scenarios depending on your requirement. These Test Scenarios are going to be your test cases in Quality Center.&lt;br /&gt;An illustration of your folder structure in Test Plan module is given below:&lt;br /&gt;1. Your Project or Product Name&lt;br /&gt;Login&lt;br /&gt;Valid Login&lt;br /&gt;Invalid Login&lt;br /&gt;Authentication and Authorization&lt;br /&gt;Server down while login&lt;br /&gt;Improper shut down in last successful login&lt;br /&gt;Now you must be wondering where we are going to provide the test steps for each scenarios or test cases.&lt;br /&gt;You are going to create your test step for each test scenario. Before that you have to provide the details about the Scenarios in terms of objective, pre-requisite, pre-condition, assumptions and anything important and relevant.&lt;br /&gt;The test scenarios should be completed when you have provided below mentioned detail in Quality Center- Test Plan module.&lt;br /&gt;1. Details&lt;br /&gt;2. Design Steps&lt;br /&gt;Apart from above you can also provide other details like attachments. You can also map your test scenarios with previously developed requirement and defects (once you executed the test scenarios). This you can do using the Req Coverage tab &amp;amp; Linked Defects) available in QC after creating the test scenarios.&lt;br /&gt;&lt;strong&gt;4. Test Lab&lt;br /&gt;&lt;/strong&gt;After completing the test scenarios, the next step is the execution of your test scenarios. The execution sequence can be built in Test Lab module of the Quality Center.&lt;br /&gt;In the test lab module you add your test scenarios that is planned to be executed. Here you are creating a Test Set. A Test Set normally covers a full use case. It is not necessary that you are going to execute all the test scenarios in one go. As I mentioned it is going to depend on your project plan and development lifecycle followed. If you are following Iterative cycle, then only test scenarios relevant to that Iteration is going to be added by you in the Test Lab module.&lt;br /&gt;For example, I have 3 iteration for my project and only Login use case is going to deliver in Iteration 1, then I am going to execute only Login Test Scenarios in Iteration 1. It may be possible that not all the test scenarios of Login is fully functional, then you have to take only those Test Scenarios from Login which have been developed and needs to be tested. An illustration of the same is given below:&lt;br /&gt;Suppose Test Scenarios Server down while login, Improper shut down in last successful login are not yet developed, then one is only going to add below mentioned test scenarios in the Test Lab&lt;br /&gt;1. Your Project or Product Name&lt;br /&gt;Login – (Test Set)&lt;br /&gt;Valid Login&lt;br /&gt;Invalid Login&lt;br /&gt;Authentication and Authorization&lt;br /&gt;I have not added the 2 scenarios in my Login test set as these are not yet developed. The decision for adding the Test Scenarios in the Test Set can be taken mutually with your Project Manager or Test Manager.&lt;br /&gt;&lt;strong&gt;5. Additional Information&lt;br /&gt;&lt;/strong&gt;Last but not the least, Defect module consists all your defects either entered manually or created automatically based on failed test cases or scenarios.&lt;br /&gt;Dashboard shows your Test Progress and help in managing your risk.&lt;br /&gt;At any point of time you can find whether all your requirement have been covered, tested or not just by looking the Requirement module. This module shows the status of each use cases in terms of Covered, Not Covered, Passed or Failed.&lt;br /&gt;&lt;strong&gt;6. Your Opinion&lt;br /&gt;&lt;/strong&gt;Any additional input to this paper is most welcome. Please feel free to write me at &lt;a href="mailto:sachin.vasudha@gmail.com"&gt;sachin.vasudha@gmail.com&lt;/a&gt; in case of any query&lt;br /&gt;You can also download a copy of this article from &lt;a href="http://sachin.vasudha.googlepages.com/HPQualityCenter-BestPractices.pdf"&gt;http://sachin.vasudha.googlepages.com/HPQualityCenter-BestPractices.pdf&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8291059916253528224-3379303112127936423?l=buildtesting.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/buildtesting/~4/4rz2y_TMTq8" height="1" width="1"/&gt;</content><link rel="related" href="http://sachin.vasudha.googlepages.com/HPQualityCenter-BestPractices.pdf" title="HP Quality Center - Best Practices" /><link rel="replies" type="application/atom+xml" href="http://buildtesting.blogspot.com/feeds/3379303112127936423/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8291059916253528224&amp;postID=3379303112127936423&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/3379303112127936423" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/3379303112127936423" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/buildtesting/~3/4rz2y_TMTq8/hp-quality-center-best-practices.html" title="HP Quality Center - Best Practices" /><author><name>Sachin Kumar</name><uri>http://www.blogger.com/profile/08030029569880551521</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://bp2.blogger.com/_A4WiZotKHb8/SDMMSRhQ2eI/AAAAAAAAAgQ/e8XAvQopCOg/S220/S7300265.JPG" /></author><thr:total>1</thr:total><feedburner:origLink>http://buildtesting.blogspot.com/2008/06/hp-quality-center-best-practices.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-8291059916253528224.post-7725073512050605855</id><published>2008-05-05T05:50:00.000-07:00</published><updated>2008-05-20T10:30:36.847-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Test Driven Development" /><category scheme="http://www.blogger.com/atom/ns#" term="Integration Testing" /><category scheme="http://www.blogger.com/atom/ns#" term="Test Strategy" /><category scheme="http://www.blogger.com/atom/ns#" term="design" /><category scheme="http://www.blogger.com/atom/ns#" term="Agile testing" /><category scheme="http://www.blogger.com/atom/ns#" term="Agility" /><category scheme="http://www.blogger.com/atom/ns#" term="UAT" /><category scheme="http://www.blogger.com/atom/ns#" term="requirement" /><title type="text">Testing With Agility</title><content type="html">I am expressing my views and learning on Agility for Testing. This article highlights the challenges and solution when one has to do the testing alongwith the development.&lt;br /&gt;What approach for testing should be taken when “Time to market” is an important factor. The solution of course is to utilize testing time alongwith the development. But is it such an easy task for tester or developer or for management? Of course, not.&lt;br /&gt;To successfully overcome such a situation requires commitment and support from the entire project stakeholder but more support, coordination and commitment are required among test team and development team.&lt;br /&gt;The process that should be followed to overcome such a situation is mentioned below:&lt;br /&gt;1. Define your Test Strategy&lt;br /&gt;2. Define your team and assign responsibility&lt;br /&gt;3. Do not wait for a formal process of release&lt;br /&gt;4. Keep doing the testing as soon as build is ready for testing (Do not wait for formal release)&lt;br /&gt;5. Always keep in mind that tester and developer are working as a team and your objective is to deliver a quality product on schedule.&lt;br /&gt;6. Communicate the defects to developer and help him in understanding the defect.&lt;br /&gt;7. Test each unit once developer finished the work&lt;br /&gt;8. Make your seating arrangement near to developer&lt;br /&gt;9. Communicate verbally as much as you can and do not always communicate formally&lt;br /&gt;10. Always remember that you have a limited time for everything and if you start creating problem, then it is going to waste every one time in meeting and discussion.&lt;br /&gt;11. Do the meeting and discussion only when you are trying to find a technical solution for defect or functionality.&lt;br /&gt;12. If possible release the application to your customer for sneak peak. This is just to save the time and defect when you release the build formally. This also helps in raising the confidence of your customer in the product.&lt;br /&gt;13. If there is dependency on 3rd party, then have a solution ready for doing the testing in case 3rd party is not able to provide the services on time. This can be one of your major risk and should be handled in your test strategy.&lt;br /&gt;14. Keep your motivation high as many a times you feel low on energy due to agile nature of execution.&lt;br /&gt;In my opinion, there is nothing new from execution prospective, it more related to coordination, communication and team work among the development team and test team.&lt;br /&gt;In normal situation also you devote your time in writing test cases, then executing those test cases on formally release build. There is an idle time for tester when development is going on.&lt;br /&gt;If you really want to deliver a quality product, then involve a functional tester while your development is going on and do not wait for the last moment when development get over and you are going to start the testing, this is a very traditional approach and may lead to poor quality for the product. This does not mean that you change the defined process, just make reshuffling in your process and utilize it for your organization maximum benefit.&lt;br /&gt;I would like to share my experiences for a process (you must be known to this process) which is really going to help you in your work. Many of you know this basic process. I am here just adding the activities for a tester in each lifecycle` stage.&lt;br /&gt;&lt;strong&gt;Requirement Gathering –&lt;/strong&gt; Tester should be involved in requirement gathering or requirement analysis. Tester should start developing the test scenarios based on their requirement understanding and should share the same with the functional analyst for the feedback.&lt;br /&gt;&lt;strong&gt;Design Development –&lt;/strong&gt; Tester should participate in the design meeting and he/she should share their thought on the application design. Tester is testing various types of application and design team can make benefit of his/her experiences while designing the system. Tester should update their test scenarios after design review meeting if s/he required a need to do so.&lt;br /&gt;&lt;strong&gt;Development –&lt;/strong&gt; The tester should be assigned the role and responsibility for testing modules. Then it is the responsibility of tester to test the module in coordination with the developer while development is going on. This approach saves a lot of time and also many functional defects to get passed onto the next stage. You should make use of your test scenario document while testing the functionality.&lt;br /&gt;&lt;strong&gt;Integration testing –&lt;/strong&gt; This is one of the important aspects of development life cycle. This may include much complex system with which your product is going to interact. I am here not talking of the integration of the module within application boundary. I am talking of the things which are outside application boundary and which is important for interaction with our system. To successfully do integration testing when complex system interaction are involved, you better start early and make a concrete test strategy in terms of communication involved among the system. It is a good idea to make an Integration testing Plan separately and share it among your stakeholders for feedback and information.&lt;br /&gt;If your system does not interact with complex system then you may or may not require an Integration Test Plan. You better decide for your integration approach.&lt;br /&gt;&lt;strong&gt;Testing -&lt;/strong&gt; Now once you moved into testing phase, you should realize that how less you now need to test. You just need to do the regression testing and you must do a re-verification of the defect you reported during development stage. Re-run your test scenarios and report and verify your defects to closure.&lt;br /&gt;&lt;strong&gt;UAT -&lt;/strong&gt; Your application is now ready for UAT. Go and formally make a release to your customer.&lt;br /&gt;Note: If you development life cycle is Iterative or other model, you must follow the above process of testing particularly during development stage. Development is inevitable stage irrespective of methodology.&lt;br /&gt;Please share your view points on the above topic.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8291059916253528224-7725073512050605855?l=buildtesting.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/buildtesting/~4/XSKXw5heZQQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://buildtesting.blogspot.com/feeds/7725073512050605855/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8291059916253528224&amp;postID=7725073512050605855&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/7725073512050605855" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/7725073512050605855" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/buildtesting/~3/XSKXw5heZQQ/testing-with-agility.html" title="Testing With Agility" /><author><name>Sachin Kumar</name><uri>http://www.blogger.com/profile/08030029569880551521</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://bp2.blogger.com/_A4WiZotKHb8/SDMMSRhQ2eI/AAAAAAAAAgQ/e8XAvQopCOg/S220/S7300265.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://buildtesting.blogspot.com/2008/05/testing-with-agility.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-8291059916253528224.post-4206048482100855386</id><published>2008-03-29T16:59:00.000-07:00</published><updated>2008-05-20T10:30:15.605-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Test Driven Development" /><category scheme="http://www.blogger.com/atom/ns#" term="Unit Testing" /><category scheme="http://www.blogger.com/atom/ns#" term="Agile Nature" /><category scheme="http://www.blogger.com/atom/ns#" term="Test First Then Code" /><title type="text">Test Driven Development</title><content type="html">From programmers to users, everyone involved in software development agrees:&lt;br /&gt;Testing is good. So why so many systems are so badly tested? There are several problems with the traditional approach to testing:&lt;br /&gt;· If testing is not comprehensive enough, errors can make it into production and cause potentially devastating problems.&lt;br /&gt;· Testing is often done after all the code is written, or at least after the programmer who wrote the code has moved on to other things. When you are no longer living and breathing a particular program, it takes some time and effort to back into the code enough to deal with the problems.&lt;br /&gt;· Often tests are written by programmers other than those who wrote the code. Since they may not understand all of the details of the code, it is possible that they may miss important tests.&lt;br /&gt;· If the test writers base their tests on documentation or other artifacts other than the code, any extent to which those artifacts are out of date will cause problems.&lt;br /&gt;· If tests are not automated, they most likely will not be performed frequently, regularly, or in exactly the same way each time.&lt;br /&gt;· Finally, it is quite possible with traditional approaches to fix a problem in a way that creates problems elsewhere. The existing test infrastructure may or may not find these new problems.&lt;br /&gt;&lt;br /&gt;Test-Driven Development solves all of these problems and others.&lt;br /&gt;&lt;br /&gt;· The programmer does the testing, working with tests while the code is freshly in mind. In fact, the code is based on the tests, which guarantees testability, helps ensure exhaustive test coverage, and keeps the code and tests in sync. All tests are automated. They are run quite frequently and identically each time.&lt;br /&gt;· Exhaustive test coverage means that if a bug is introduced during debugging, the test scaffolding finds it immediately and pinpoints its location.&lt;br /&gt;· And the test-debug cycle is kept quite short: there are no lengthy delays between the discovery of a bug and its repair.&lt;br /&gt;· Finally, when the system is delivered, the exhaustive test scaffolding is delivered with it, making future changes and extensions to it easier.&lt;br /&gt;&lt;br /&gt;So from a pure testing standpoint, before we begin to discuss non-testing benefits, TDD is superior to traditional testing approaches. You get more thoroughly tested code, period. But you do indeed get much more than that. You get simpler designs. You get systems that reveal intent (describe themselves) clearly. The tests themselves help describe the system. You get extremely low-defect systems that start out robust, are robust at the end, and stay robust all the time. At the end of every day, the latest build is robust. These are benefits for all project stakeholders. But perhaps the most immediate and most tangible benefit is exclusively the programmer’s: more fun. TDD gives you, the programmer, small, regular, frequent doses of positive feedback while you work. You have tangible evidence that you are making progress, and that your code works. There is a potential problem with all this, of course. It is more addictive than caffeine. Once you’re hooked, you’ll want to program this way, and only this way, from then on. And I for one certainly hope you do.&lt;br /&gt;&lt;br /&gt;This article will give you an overview of Test-Driven Development, including a short example of a programming session.&lt;br /&gt;&lt;br /&gt;WHAT IS TEST-DRIVEN DEVELOPMENT?&lt;br /&gt;&lt;br /&gt;Test-Driven Development (TDD) is a style of development where:&lt;br /&gt;· You maintain an exhaustive suite of Programmer Tests,&lt;br /&gt;· No code goes into production unless it has associated tests,&lt;br /&gt;· You write the tests first,&lt;br /&gt;· The tests determine what code you need to write.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Let’s look at each of these in turn.&lt;br /&gt;&lt;br /&gt;Maintain an exhaustive suite of Programmer Tests&lt;br /&gt;You have Programmer Tests to test that your classes exhibit the proper behavior. Programmer Tests are written by the developer who writes the code being tested. They’re called Programmer Tests because although they are similar to unit tests, they are written for a different reason. Unit tests are written to test that the code you’ve written works. Programmer Tests are written to define what it means for the code to work. Finally, they’re called Programmer Tests to differentiate them from the tests that the Customer writes (called, logically enough, Customer Tests) to test that the system behaves as required form the point of view of a user.&lt;br /&gt;Using Test-Driven Development implies, in theory, that you have an exhaustive test suite. This is because there is no code unless there is a test that requires it in order to pass. You write the test, then (and not until then) write the code that is tested by the test. There should be no code in the system which was not written in response to a test. Hence, the test suite is, by definition, exhaustive.&lt;br /&gt;&lt;br /&gt;No code goes into production unless it has associated tests&lt;br /&gt;One of eXtreme Programming’s tenets is that a feature does not exist until there is a suite of tests to go with it. The reason for this is that everything in the system has to be testable as part of the safety net that gives you confidence and courage. Confidence that all the code tests clean gives you the courage (not to mention the simple ability) to refactor and integrate. How can you possibly make changes to the code without some way to confidently tell whether you have broken the previous behavior? How can you integrate if you don’t have a suite of tests that will immediately (or at least in a short time) tell you if you have inadvertently broken some other part of the code?&lt;br /&gt;&lt;br /&gt;Write the tests first&lt;br /&gt;Now we’re getting eXtreme. What do I mean by write the tests first? I mean that when you have a task to do (i.e., some bit of functionality to implement) you write code that will test that the functionality works as required before you implement the functionality itself. Furthermore, you write a little bit of test, followed by just enough code to make that test pass, then a bit more test, and a bit more code, test, code, test, code, etc.&lt;br /&gt;&lt;br /&gt;Tests determine what code you need to write&lt;br /&gt;By writing only the code required to pass the latest test, you are putting a limit on the code you will write. You write only enough to pass the test, no more. That means that you do the simplest thing that could possibly work. I think an example is in order. Let’s say you are working on a list class. The logical place to start is with the behavior of an empty list (it makes sense to start with the basis, or simplest, case). So you write the test:&lt;br /&gt;&lt;br /&gt;public void testEmptyList()&lt;br /&gt;{&lt;br /&gt;MovieList emptyList = new MovieList();&lt;br /&gt;assertEquals("Empty list should have size of 0", 0, emptyList.size());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;To pass this test we need a MovieList class that has a size() method. When you are working this way, you want to work in small increments some- times increments that seem ridiculously small. When you grasp the significance of this, you will be on your way to mastering TDD. Later we’ll explore the important and sometimes unexpected benefits and side effects of testing and coding in tiny increments.&lt;br /&gt;LET THE COMPUTER TELL YOU&lt;br /&gt;Write your tests (and your code for that matter) without worrying about what classes or methods you will need to add. Don’t even bother keeping a To Do list. Well, at least in terms of what classes, methods, etc., you need to create. You will likely want a To Do list to keep track of tests you want to write and other higher level items. Just write your test and compile. If you need to add a class or method the compiler will tell you. It provides a better To Do list than you could, and faster. In the previous example when I compile after writing the test (with nothing else written) I get the error: MovieList cannot be resolved or is not a type. This immediately tells me that I need to create a new MovieList class, so I do:&lt;br /&gt;&lt;br /&gt;public class MovieList&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;I compile again and get another error:&lt;br /&gt;The method size() is undefined for the type MovieList&lt;br /&gt;In response to this I add a stub size() method:&lt;br /&gt;&lt;br /&gt;public int size()&lt;br /&gt;{&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;Now it will compile. Run the test, and it works. Due to Java requiring a return statement when a return type is defined, we need to combine the steps of creating the method and adding the simplest return statement. I have made a Modern Java programming environments will alert me to these missing items even before I compile. Furthermore, they will offer solutions and do the work of creating the stubs for me.&lt;br /&gt;&lt;br /&gt;A Quick Example&lt;br /&gt;&lt;br /&gt;Habit of always stubbing methods to return the simplest value possible (i.e., 0, false, or null). What!?! Just return 0? That can’t be right. Ah...but it is right. It is the simplest thing that could possibly work to pass the test we just wrote. As we write more tests we will likely need to revisit the size() method, generalizing and refactoring, but for now return 0 is all that is required.&lt;br /&gt;&lt;br /&gt;Let’s take a peek into the development of the project from later in the book. We have a Movie class which now needs to accept multiple ratings (e.g., 3 as in “3 stars out of 5”) and give access to the average. As we go through the example, we will be alluding to a metaphor for the TDD flow originated by William Wake: The TDD Traffic Light. We start by writing a test, and we start the test by making an assertion that we want to be true:&lt;br /&gt;&lt;br /&gt;public void testRating()&lt;br /&gt;{&lt;br /&gt;assertEquals("Bad average rating.", 4, starWars.getAverageRating());&lt;br /&gt;}&lt;br /&gt;Now we need to set the stage for that assertion to be true. To do that we’ll add some rating to the Movie:&lt;br /&gt;public void testRating()&lt;br /&gt;{&lt;br /&gt;starWars.addRating(3);&lt;br /&gt;starWars.addRating(5);&lt;br /&gt;assertEquals("Bad average rating.", 4, starWars.getAverageRating());&lt;br /&gt;}&lt;br /&gt;Finally, we need to create the Movie instance we are working with:&lt;br /&gt;public void testRating()&lt;br /&gt;{&lt;br /&gt;Movie starWars = new Movie("Star Wars");&lt;br /&gt;starWars.addRating(3);&lt;br /&gt;starWars.addRating(5);&lt;br /&gt;assertEquals("Bad average rating.", 4, starWars.getAverageRating());&lt;br /&gt;}&lt;br /&gt;When we compile this, the compiler complains that addRating(int) and getAverageRating() are undefined. This is our yellow light. Now we make it compile by adding the following code to Movie:&lt;br /&gt;&lt;br /&gt;public void addRating(int newRating)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;public int getAverageRating()&lt;br /&gt;{&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;Note that since we are using Java, we must provide a return value for getAverageRating() since we’ve said it returns an int. Now it compiles, but the test fails. This is the red light (aka red bar). This term is derived by the JUnit interfaces that present a progress bar that advances as tests are run. As long as all tests pass, the bar is green. As soon as a test fails, the bar turns red and remains red. The message we get is:&lt;br /&gt;Bad average rating. expected:&lt;4&gt; but was:&lt;0&gt;&lt;br /&gt;Now we have to make the test pass. We add code to getAverageRating() to make the test pass:&lt;br /&gt;public int getAverageRating()&lt;br /&gt;{&lt;br /&gt;return 4;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Recompile and rerun the test. Green light! Now we refactor to remove the duplication and other smells that we introduced when we made the test pass. You’re probably thinking “Duplication.. what duplication?” It’s not always obvious at first. We’ll start by looking for constants that we used in making the test work. Sure enough, look at getAverageRating(). It returns a constant. Remember that we set the test up to get the desired result. How did we do that? In this case we gave the movie two ratings: 3 and 5. The average result is the 4 that we are returning. So, that 4 is duplicated. We provide the information required to compute it, as well as returning it as a constant. Returning a constant when we can compute its value is a form of duplication. Let’s get rid of it. Our first step is to rewrite that constant into something related to the provided information:&lt;br /&gt;&lt;br /&gt;public int getAverageRating()&lt;br /&gt;{&lt;br /&gt;return (3 + 5) / 2;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Compile and run the tests. We’re OK. We have the courage to continue. The 3 and 5 are duplicate with the arguments to addRating() so let’s capture them. Since we add the constants we can simply accumulate the arguments. First we add a variable to accumulate them:&lt;br /&gt;private int totalRating = 0;&lt;br /&gt;Then we add some code to addRating():&lt;br /&gt;&lt;br /&gt;public void addRating(int newRating)&lt;br /&gt;{&lt;br /&gt;totalRating += newRating;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Now we use it in getAverageRating():&lt;br /&gt;&lt;br /&gt;public int getAverageRating()&lt;br /&gt;{&lt;br /&gt;return totalRating / 2;&lt;br /&gt;}&lt;br /&gt;Compile, test, it works! We’re not finished yet, though. While we were refactoring we introduced another constant: the 2 in getAverageRating(). The duplication here is a little subtler. The 2 is the number ratings we added, i.e., the number of times addRating() was called. We need to keep track of that in order to get rid of the 2. Like before, start by defining a place for it:&lt;br /&gt;&lt;br /&gt;private int numberOfRatings = 0;&lt;br /&gt;&lt;br /&gt;Compile, run the tests, green. Now, increment it every time addRating() is called:&lt;br /&gt;&lt;br /&gt;public void addRating(int newRating)&lt;br /&gt;{&lt;br /&gt;totalRating += newRating;&lt;br /&gt;numberOfRatings++;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Compile, run the tests, green. OK, finally we replace the constant 2 with numberOfRatings:&lt;br /&gt;&lt;br /&gt;public int getAverageRating()&lt;br /&gt;{&lt;br /&gt;return totalRating / numberOfRatings;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Compile, run the tests, green. OK, we’re done. If we want to reinforce our confidence in what we did, we can add more calls to addRating() and check against the appropriate expected average. For example:&lt;br /&gt;public void testLotsOfRatings()&lt;br /&gt;{&lt;br /&gt;Movie godzilla = new Movie("Godzilla");&lt;br /&gt;godzilla.addRating(1);&lt;br /&gt;godzilla.addRating(5);&lt;br /&gt;godzilla.addRating(1);&lt;br /&gt;godzilla.addRating(2);&lt;br /&gt;assertEquals("Bad average rating.", 2, godzilla.getAverageRating());&lt;br /&gt;}&lt;br /&gt;I need to underline the fact that I recompiled and ran the tests after each little change above. This cannot be stressed enough. Running tests after each small change gives us confidence and reassurance. The result is that we have courage to continue, one little step at a time. If at any point a test failed we know exactly what change caused the failure: the last one. We back it out and rerun the tests.&lt;br /&gt;The tests should pass again. Now we can try again with courage. The above example shows one school of thought when it comes to cleaning up code. In it we worked to get rid of the duplication that was embodied in the constant. Another school of thought would leave the constant 4 in place and write another test that added different ratings, and a different number of them.&lt;br /&gt;This second test would be designed to require a different returned average. This would force us to refactor and generalize in order to get the test to pass. Which approach should you take? It really depends on how comfortable you are with what you are attempting. Remember that you do have the test to safeguard you. As long as the test runs, you know that you haven’t broken anything. In either case you will want to write that second test: either to drive the generalization, or to verify it.&lt;br /&gt;&lt;br /&gt;SUMMARY&lt;br /&gt;We’ve explored what Test-Driven Development is:&lt;br /&gt;· An exhaustive suite of Programmer Tests&lt;br /&gt;· No code without tests,&lt;br /&gt;· Tests first,&lt;br /&gt;· Tests determine the code.&lt;br /&gt;We’ve seen how to leverage feedback from the computer to keep track of what we should do next: if we need to create a class, method, variable, etc., the system will let us know. We’ve even seen a quick example of TDD in action, step by step, building some code to maintain the average rating of a movie. However, before we can jump in and start practicing it in earnest, we need to make sure we have a few basic techniques and skills that TDD builds on.&lt;br /&gt;&lt;br /&gt;Agile Modeling and TDDA primary benefit of both modeling and TDD is that they promote a think before you act approach to development. Just because they offer the same type of benefit doesn’t mean that they are incompatible with one another. Instead, experience shows that we can and should model on a project taking a TDD approach. Consider XP projects that clearly take a TDD approach. Modeling is definitely an important part of XP. XP practitioners work with user stories, and user stories are clearly agile models. XP practitioners also create CRC cards whenever they need to, also agile models. In eXtreme Programming Explained, Kent Beck even includes sketches of class diagrams. Heresy? No. Just common sense. If creating a model can help our software development efforts then that’s what we do. It’s as simple as that. Creating agile models can help our TDD efforts because they can reveal the need for some tests. As an agile modeler sketches a diagram they will always be thinking, “How can I test this?” in the back of their minds because they will be following the practice consider testability. This will lead to new test cases. Furthermore, we are likely to find that some of our project stakeholders or even other developers simply don’t think in terms of tests; instead, they are visual thinkers. There’s nothing wrong with this as long as we recognize it as an issue and act accordingly—use visual modeling techniques with visual thinkers and test-driven techniques with people that have a testing mindset. TDD can also improve our agile modeling efforts. Following a test-first approach, agile developers quickly discover whether their ideas actually work or not—the tests will either validate their models or not—providing rapid feedback regarding the ideas captured within the models. This fits in perfectly with AM’s practice of Prove it With Code. Agile Modeling (AM) and Test-Driven Development (TDD) go hand in hand. The most effective developers have a wide range of techniques in their intellectual toolboxes, and AM and TDD should be among those techniques.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8291059916253528224-4206048482100855386?l=buildtesting.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/buildtesting/~4/jQrObr05MfE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://buildtesting.blogspot.com/feeds/4206048482100855386/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8291059916253528224&amp;postID=4206048482100855386&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/4206048482100855386" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/4206048482100855386" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/buildtesting/~3/jQrObr05MfE/test-driven-development.html" title="Test Driven Development" /><author><name>Sachin Kumar</name><uri>http://www.blogger.com/profile/08030029569880551521</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://bp2.blogger.com/_A4WiZotKHb8/SDMMSRhQ2eI/AAAAAAAAAgQ/e8XAvQopCOg/S220/S7300265.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://buildtesting.blogspot.com/2021/03/test-driven-development.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-8291059916253528224.post-2919720924855935898</id><published>2008-03-08T15:46:00.000-08:00</published><updated>2008-05-20T10:29:46.269-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Productivity" /><category scheme="http://www.blogger.com/atom/ns#" term="Solution" /><category scheme="http://www.blogger.com/atom/ns#" term="Challenges" /><category scheme="http://www.blogger.com/atom/ns#" term="Customer" /><title type="text">Testing is finding a solution rather than a problem</title><content type="html">&lt;p&gt;What are the major challenges that you come across in your day to day work because of managerial decision and sometime you really feel frustrated because of them and it effect your productivity?&lt;br /&gt;I hope you came across with such a situation quite often when you are asked to focus on things decided by management.&lt;br /&gt;I am taking a typical example, you are doing a testing of a product and you are very much motivated about your work. Suddenly something happen and you are asked to do some other thing. How do you feel at that point? Stressed, Frustrated, de-motivated…&lt;br /&gt;Well let’s discuss about how you can counter such a situation which may have negative impact on your productivity and thus your quality work.&lt;br /&gt;Some of the key points that should always be on mind of a Quality Person to keep him/her motivated all the time is mentioned below. I have learnt all these from my experience.&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Be flexible in your work&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Do not create problems and always come up with some solution&lt;/li&gt;&lt;br /&gt;&lt;li&gt;If you are asked to do some other activity, put your points why the work you are doing is more important. You are best judge to decide.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Support your peers and seniors in making a smooth delivery. There is always pressure on managers. If you create problem, then project delivery will go nowhere.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Quality person should work with “providing solution” mindset when they are reporting any problem.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;“Quality is polishing a dirty mirror and not making it dirtier by reporting problems instead of its solutions.”&lt;br /&gt;&lt;/strong&gt;There are always challenges and fighting and then overcoming with challenges is what a quality person always did. This is my personal opinion.&lt;br /&gt;I always face many challenges in my work life. These challenges are less related to your core product but rather related to the stakeholders, your internal customer, external customer, and your team. Don’t you agree? Just try to think on these aspects for a second and then analyze what I am saying is correct or incorrect.&lt;br /&gt;How many times your manager calls you for a meeting? How much time actually you spent on your work? How much time daily, weekly, monthly and yearly you spent on just doing meeting? If you are going to analyze these statistics, then you will be really amazed.&lt;br /&gt;I would like to invite other people too to share their opinions and of course the challenges that they are facing in their day-to-day work.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8291059916253528224-2919720924855935898?l=buildtesting.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/buildtesting/~4/L8WjGhoviE0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://buildtesting.blogspot.com/feeds/2919720924855935898/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8291059916253528224&amp;postID=2919720924855935898&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/2919720924855935898" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/2919720924855935898" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/buildtesting/~3/L8WjGhoviE0/testing-is-finding-solution-rather-than.html" title="Testing is finding a solution rather than a problem" /><author><name>Sachin Kumar</name><uri>http://www.blogger.com/profile/08030029569880551521</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://bp2.blogger.com/_A4WiZotKHb8/SDMMSRhQ2eI/AAAAAAAAAgQ/e8XAvQopCOg/S220/S7300265.JPG" /></author><thr:total>1</thr:total><feedburner:origLink>http://buildtesting.blogspot.com/2021/03/testing-is-finding-solution-rather-than.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-8291059916253528224.post-2836678325188076602</id><published>2008-02-23T18:47:00.000-08:00</published><updated>2008-12-11T15:39:16.298-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Usability" /><category scheme="http://www.blogger.com/atom/ns#" term="Reliability" /><category scheme="http://www.blogger.com/atom/ns#" term="Priority List" /><category scheme="http://www.blogger.com/atom/ns#" term="prevention" /><category scheme="http://www.blogger.com/atom/ns#" term="Capability" /><category scheme="http://www.blogger.com/atom/ns#" term="Test Factor Matrix" /><title type="text">Risk Based Testing</title><content type="html">&lt;strong&gt;Introduction&lt;/strong&gt;&lt;br /&gt;Risk based testing is a concept which define the roadmap for making test strategy and taking decision on release of product. This concept outlines many of the important aspect of testing when time to market and quality has to be met. How many of times you have tested your product in limited time? I hope you have done it many a times? What approach you normally take when your testing schedule has been reduced and you are asked to test the application in limited schedule? Do you follow any defined approach to overcome such a scenario? I hope many of us “not”. We know all these concepts but making use of it is really difficult as we do not know how to approach with this concept.&lt;br /&gt;&lt;strong&gt;Purpose&lt;br /&gt;&lt;/strong&gt;The purpose of this article is to present a practical approach to Risk based testing based on my experience. It may be applicable or may not be applicable for your day to day activity.&lt;br /&gt;&lt;strong&gt;References&lt;br /&gt;&lt;/strong&gt;• CSTE Group&lt;br /&gt;• Project Experience - myself&lt;br /&gt;&lt;strong&gt;Input&lt;br /&gt;&lt;/strong&gt;Testing schedule and effort has been reduced.&lt;br /&gt;&lt;strong&gt;Process&lt;br /&gt;&lt;/strong&gt;&lt;em&gt;Entry Criteria &lt;/em&gt;&lt;br /&gt;Test Cases &amp;amp; Scenarios are ready&lt;br /&gt;&lt;em&gt;Identification of Important Test Scenario or Cases&lt;br /&gt;&lt;/em&gt;The first step is to identify the important test scenario or cases based on below mentioned parameters:&lt;br /&gt;• Capability&lt;br /&gt;• Reliability&lt;br /&gt;• Usability&lt;br /&gt;• Performance&lt;br /&gt;• Installability&lt;br /&gt;• Compatibility&lt;br /&gt;• Supportability&lt;br /&gt;• Testability&lt;br /&gt;• Maintainability&lt;br /&gt;• Portability&lt;br /&gt;• Localizability&lt;br /&gt;&lt;em&gt;Mechanics for Identification and Prioritization of Test Scenarios&lt;br /&gt;&lt;/em&gt;To identify and prioritize the test scenarios, you need to prepare a &lt;a href="http://2.bp.blogspot.com/_A4WiZotKHb8/R7zsm4YcSZI/AAAAAAAAAR4/hHa8b7kpfGA/s400/riskmatrix.PNG"&gt;Test Factor matrix&lt;/a&gt; and assign test scenarios, weightage based on the importance of above parameters. To carry out this you need to do brainstorming session with your team members.&lt;br /&gt;It is not necessary that you are going to provide score for all the test cases for all the factors. Some of your test cases do not suffice the above factors. In that case you need not to give scoring. This help in focusing only on important cases.&lt;br /&gt;The &lt;a href="http://2.bp.blogspot.com/_A4WiZotKHb8/R7zsm4YcSZI/AAAAAAAAAR4/hHa8b7kpfGA/s400/riskmatrix.PNG"&gt;Test Factor matrix&lt;/a&gt; gives you an analysis based on important quality factors that are required to be fulfilled in the product. It helps in identifying your test scenarios which must be executed before the delivery of the product.&lt;br /&gt;The customer input may be required for prioritizing the test scenario based on your analysis.&lt;br /&gt;From &lt;a href="http://2.bp.blogspot.com/_A4WiZotKHb8/R7zsm4YcSZI/AAAAAAAAAR4/hHa8b7kpfGA/s400/riskmatrix.PNG"&gt;Test Factor matrix&lt;/a&gt; , you can analyze that “Performance is not a major concern area”, the major concern area are “Usability”, “Reliability”, “Capability”.&lt;br /&gt;Now start with Usability Test Scenarios – execute the cases based on maximum weightage to minimum weightage. Follow the same rule for other factors.&lt;br /&gt;&lt;strong&gt;Output&lt;br /&gt;&lt;/strong&gt;• &lt;a href="http://2.bp.blogspot.com/_A4WiZotKHb8/R7zsm4YcSZI/AAAAAAAAAR4/hHa8b7kpfGA/s400/riskmatrix.PNG"&gt;Test Factor matrix&lt;/a&gt;&lt;br /&gt;• Test Priority List&lt;br /&gt;Note: Your feedback is most welcome. Please leave your comments.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8291059916253528224-2836678325188076602?l=buildtesting.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/buildtesting/~4/ihk0LtL3c8Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://buildtesting.blogspot.com/feeds/2836678325188076602/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8291059916253528224&amp;postID=2836678325188076602&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/2836678325188076602" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/2836678325188076602" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/buildtesting/~3/ihk0LtL3c8Y/risk-based-testing.html" title="Risk Based Testing" /><author><name>Sachin Kumar</name><uri>http://www.blogger.com/profile/08030029569880551521</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://bp2.blogger.com/_A4WiZotKHb8/SDMMSRhQ2eI/AAAAAAAAAgQ/e8XAvQopCOg/S220/S7300265.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://buildtesting.blogspot.com/2021/02/risk-based-testing.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-8291059916253528224.post-6031844423303897175</id><published>2008-01-23T07:31:00.000-08:00</published><updated>2008-05-20T10:28:59.284-07:00</updated><title type="text">ABC of Unit Testing</title><content type="html">&lt;strong&gt;What is Unit Testing?&lt;/strong&gt;&lt;br /&gt;After writing any code, every programmer will do some kind of testing to make sure the code works as expected. This testing is called 'unit testing'.&lt;br /&gt;Unit testing is done in different ways. Some programmers write simple test applications to test their own code. Some others simply debug the code and change the values during debugging to make sure the code works fine for different cases.&lt;br /&gt;&lt;strong&gt;Some facts about unit testing:&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Unit testing is done by developers.&lt;/li&gt;&lt;li&gt;Quality department does different tests, they are not unit tests.&lt;/li&gt;&lt;li&gt;Every programmer must do unit testing after finishing development or during development itself.&lt;/li&gt;&lt;li&gt;Unit testing can be done by writing separate test applications to call your classes and methods to make sure the classes work as expected. This is called manual unit testing.&lt;/li&gt;&lt;li&gt;Unit testing can be automated by writing unit test scripts. This is called Automated Unit Testing. &lt;/li&gt;&lt;li&gt;In automated Unit Testing, after writing each class/method, you will write several &lt;strong&gt;Test methods&lt;/strong&gt; to test the actual code. The test method will call your actual class/method with some sample inputs and compare the result with expected result. If the actual result from your code is same as the expected result, the Unit Test will record the result as "Success". Otherwise the test result will be recorded as "Fail". All of the unit test scripts can be executed together and you can get a summary of all results.&lt;/li&gt;&lt;li&gt;Automated Unit test scripts can be saved and easily repeated so that everytime someone make a change in the project, hundreds of automated unit tests can be executed in few seconds to make sure that every piece of code is still working as expected.&lt;/li&gt;&lt;li&gt;NUnit is one of the most popular automated unit testing tool for .NET applications.&lt;/li&gt;&lt;li&gt;Automated unit tests can be done without using any unit testing tool like NUnit. However, unit test frameworks like NUnit make the job very easy. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Manual Unit Testing&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Assume you are writing a class to calculate the Factorial of a number. You may write a class called 'Calculator' with a method called 'Factorial()' taking one input parameter and returning the Factorial of the input.&lt;/p&gt;&lt;p&gt;&lt;em&gt;public class Calculator&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;{ &lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;public int Factorial(int a)&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;{ &lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;int factorial = 1; &lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;while ( a &gt; 0 ) &lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;{ &lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;factorial *= a; --a; &lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;} &lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;return factorial; &lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;}&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;}&lt;/em&gt;&lt;/p&gt;&lt;p&gt;After you write the above class and method, you are done with your job. But before you deliver your code to your team leader, you must test the code to make sure this code works fine as expected for different cases.&lt;/p&gt;&lt;p&gt;Most of the programmers test the code by writing a small test application. You may create a new windows forms project and add some labels, a textbox and buttons etc to the form. In the above case, you need one textbox to input the number to find the Factorial. Also, you need a 'Calculate' button. When user inputs a value to the textbox and press the button, you will call the method and pass the user input value to the method. Then you will display the result as a messagebox. By seeing the result you will manually verify it to make sure that the code worked as expected.The above process is called 'Manual Unit Testing'. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Limitation of Manual Unit Testing&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Some of the issues of manual unit testing are:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;You will write test applications and throw away after doing your testing. After few weeks you may make some modifications to your code and at that time you may not find your old test application. So, you will have to write another test application.&lt;/li&gt;&lt;li&gt;Large projects will have hundreds of classes and several class libraries. It is very difficult to write separate test applications for each of the classes in the project and save all of them for repeated testing in future.&lt;/li&gt;&lt;li&gt;Test applications require a human person to test. You may test several possibilities on the first time, but you may not remember all of the test cases when you repeat the test in future.&lt;/li&gt;&lt;li&gt;When you do manual test, you are manually verifying the result. Even if the result is wrong, you may not realize it and think that the test was success.&lt;/li&gt;&lt;li&gt;It is not practical to repeat all tests manually before you make a product release everytime. It will take several hours or days to complete manual unit testing of every piece of code.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Automated unit testing solves all of the above problems&lt;/p&gt;&lt;p&gt;&lt;strong&gt;What is Automated Unit Testing?&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Automated unit testing is the process of testing software using test scripts. A unit test is a piece of code that executes another piece of code and compare the actual result with expected result. In above example, you saw how to write a small class to calculate the Factorial of a number. Now let us try to write a small test script to test the Factorial() method. A simple test script will look like this:&lt;/p&gt;&lt;p&gt;public void TestFactorialMethod()&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;// Instantiate the calculator class. &lt;/p&gt;&lt;p&gt;Calculator calc = new Calculator(); &lt;/p&gt;&lt;p&gt;// Call the Factorial method to calculate the factorial of 5. &lt;/p&gt;&lt;p&gt;int result = calc.Factorial(5);&lt;/p&gt;&lt;p&gt;// We know that the factorial of 5 is 120. The job of the test method is to compare the result from the factorial method with the expected value and make sure it is same as the expected value&lt;/p&gt;&lt;p&gt;if ( result != 120 ) &lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;MessageBox.Show("Expected value is 120, but actual value is '" + result + "'."); &lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;The above method calls the Factorial method and compares the result. If the result is same as the expected result, then you know that the test is success. This indicates your Factorial method is working as expected.In the above case, the test script calls the Factorial method with one input (5). In real development environment, you have to write several test scripts to test each method, with various input values and make sure the result is correct.The above test script is not perfect. It displays a messagebox when the test fails. This requires someone has to manually look for the messageboxes.&lt;/p&gt;&lt;p&gt;Automated Unit Test Frameworks like NUnit solves this problem. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;What is Nunit?&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;NUnit is an automated unit testing framework for .Net applications.&lt;/li&gt;&lt;li&gt;NETNUnit is free to use with your .NET projects.&lt;/li&gt;&lt;li&gt;NUnit is ported from another product called JUnit, which is a unit testing framework for Java applications.&lt;/li&gt;&lt;li&gt;NUnit provides a class library which includes some classes and methods to help you write test scripts.&lt;/li&gt;&lt;li&gt;NUnit provides graphical user interface application to execute all the test scripts and show the result as a success/failure report (instead of message boxes from the test script).&lt;/li&gt;&lt;li&gt;NUnit is the most popular unit testing framework for .net applications.&lt;/li&gt;&lt;li&gt;NUnit does not create any test scripts by itself. You have to write test scripts by yourself, but NUnit allows you to use it's tools and classes to make the unit testing easier.&lt;/li&gt;&lt;li&gt;NUnit is an open source product. You can get this tool along with source code and modify the source code if required for your specific needs. However, 99% of the programmers do not mess with the source code. Instead, you can download only the executable and class library and implement unit test scripts for your application.&lt;/li&gt;&lt;li&gt;Now Microsoft offers a team collaboration system called 'Visual Studio Team System' (VSTS). This tool includes a unit testing framework also. So, eventually most of the developers may switch to VSTS instead of NUnit. However, NUnit will continue to exist because it is free and easy to use.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8291059916253528224-6031844423303897175?l=buildtesting.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/buildtesting/~4/oeMN5WL048k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://buildtesting.blogspot.com/feeds/6031844423303897175/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8291059916253528224&amp;postID=6031844423303897175&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/6031844423303897175" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/6031844423303897175" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/buildtesting/~3/oeMN5WL048k/abc-of-unit-testing.html" title="ABC of Unit Testing" /><author><name>Sachin Kumar</name><uri>http://www.blogger.com/profile/08030029569880551521</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://bp2.blogger.com/_A4WiZotKHb8/SDMMSRhQ2eI/AAAAAAAAAgQ/e8XAvQopCOg/S220/S7300265.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://buildtesting.blogspot.com/2021/01/abc-of-unit-testing.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-8291059916253528224.post-4719497272100643044</id><published>2008-01-22T19:59:00.000-08:00</published><updated>2008-05-20T10:28:27.689-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="testing history" /><category scheme="http://www.blogger.com/atom/ns#" term="debugging" /><category scheme="http://www.blogger.com/atom/ns#" term="prevention" /><title type="text">History - Software Testing</title><content type="html">Do you know who distinguish testing from debugging? The separation of debugging from testing was initially introduced by Glenford J. Myers in 1979. Although his attention was on breakage testing ,it illustrated the desire of the software engineering community to separate fundamental development activities, such as debugging, from that of verification. Dr. Dave Gelperin and Dr. William C. Hetzel classified in 1988 the phases and goals in software testing in the following stages:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Until 1956 - Debugging oriented&lt;/li&gt;&lt;li&gt;1957-1978 - Demonstration oriented&lt;/li&gt;&lt;li&gt;1983-1987 - Destruction oriented&lt;/li&gt;&lt;li&gt;1983-1987 - Evaluation oriented&lt;/li&gt;&lt;li&gt;1988-onward- Prevention oriented&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;References:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Myers, Glenford J. (1979). The Art of Software Testing. John Wiley and Sons. &lt;a class="internal" href="http://en.wikipedia.org/w/index.php?title=Special:Booksources&amp;amp;isbn=0471043281"&gt;ISBN 0-471-04328-1&lt;/a&gt;. &lt;/li&gt;&lt;li&gt;Gelperin, D.; B. Hetzel (1988). "The Growth of Software Testing". CACM 31 (6). ISSN 0001-0782. &lt;/li&gt;&lt;li&gt;until 1956 it was the debugging oriented period, when testing was often associated to debugging: there was no clear difference between testing and debugging. Gelperin, D.; B. Hetzel (1988). "The Growth of Software Testing". CACM 31 (6). ISSN 0001-0782. &lt;/li&gt;&lt;li&gt;From 1957-1978 there was the demonstration oriented period where debugging and testing was distinguished now - in this period it was shown, that software satisfies the requirements. Gelperin, D.; B. Hetzel (1988). "The Growth of Software Testing". CACM 31 (6). ISSN 0001-0782. &lt;/li&gt;&lt;li&gt;The time between 1979-1982 is announced as the destruction oriented period, where the goal was to find errors. Gelperin, D.; B. Hetzel (1988). "The Growth of Software Testing". CACM 31 (6). ISSN 0001-0782. &lt;/li&gt;&lt;li&gt;1983-1987 is classified as the evaluation oriented period: intention here is that during the software lifecycle a product evaluation is provided and measuring quality. Gelperin, D.; B. Hetzel (1988). "The Growth of Software Testing". CACM 31 (6). ISSN 0001-0782. &lt;/li&gt;&lt;li&gt;From 1988 on it was seen as prevention oriented period where tests were to demonstrate that software satisfies its specification, to detect faults and to prevent faults. Gelperin, D.; B. Hetzel (1988). "The Growth of Software Testing". CACM 31 (6). ISSN 0001-0782. &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8291059916253528224-4719497272100643044?l=buildtesting.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/buildtesting/~4/Q3FGw2nRqok" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://buildtesting.blogspot.com/feeds/4719497272100643044/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8291059916253528224&amp;postID=4719497272100643044&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/4719497272100643044" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/4719497272100643044" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/buildtesting/~3/Q3FGw2nRqok/history-software-testing.html" title="History - Software Testing" /><author><name>Sachin Kumar</name><uri>http://www.blogger.com/profile/08030029569880551521</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://bp2.blogger.com/_A4WiZotKHb8/SDMMSRhQ2eI/AAAAAAAAAgQ/e8XAvQopCOg/S220/S7300265.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://buildtesting.blogspot.com/2008/01/history-software-testing.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-8291059916253528224.post-2966096044251735700</id><published>2008-01-21T20:32:00.000-08:00</published><updated>2008-05-20T10:27:45.380-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Software Testing" /><category scheme="http://www.blogger.com/atom/ns#" term="Complexity and Testing" /><title type="text">What is Software Testing?</title><content type="html">Software testing is any activity aimed at evaluating an attribute or capability of a program or system and determining that it meets its required results. &lt;a href="http://www.ece.cmu.edu/~koopman/des_s99/sw_testing/#reference"&gt;[Hetzel88]&lt;/a&gt; Although crucial to software quality and widely deployed by programmers and testers, software testing still remains an art, due to limited understanding of the principles of software. The difficulty in software testing stems from the complexity of software: we can not completely test a program with moderate complexity. Testing is more than just debugging. The purpose of testing can be quality assurance, verification and validation, or reliability estimation. Testing can be used as a generic metric as well. Correctness testing and reliability testing are two major areas of testing. Software testing is a trade-off between budget, time and quality.&lt;br /&gt;&lt;br /&gt;Software Testing is the process of executing a program or system with the intent of finding errors. &lt;a href="http://www.ece.cmu.edu/~koopman/des_s99/sw_testing/#reference"&gt;[Myers79]&lt;/a&gt; Or, it involves any activity aimed at evaluating an attribute or capability of a program or system and determining that it meets its required results. &lt;a href="http://www.ece.cmu.edu/~koopman/des_s99/sw_testing/#reference"&gt;[Hetzel88]&lt;/a&gt; Software is not unlike other physical processes where inputs are received and outputs are produced. Where software differs is in the manner in which it fails. Most physical systems fail in a fixed (and reasonably small) set of ways. By contrast, software can fail in many bizarre ways. Detecting all of the different failure modes for software is generally infeasible. &lt;a href="http://www.ece.cmu.edu/~koopman/des_s99/sw_testing/#reference"&gt;[Rstcorp]&lt;/a&gt;&lt;br /&gt;Unlike most physical systems, most of the defects in software are design errors, not manufacturing defects. Software does not suffer from corrosion, wear-and-tear -- generally it will not change until upgrades, or until obsolescence. So once the software is shipped, the design defects -- or bugs -- will be buried in and remain latent until activation.&lt;br /&gt;Software bugs will almost always exist in any software module with moderate size: not because programmers are careless or irresponsible, but because the complexity of software is generally intractable -- and humans have only limited ability to manage complexity. It is also true that for any complex systems, design defects can never be completely ruled out.&lt;br /&gt;Discovering the design defects in software, is equally difficult, for the same reason of complexity. Because software and any digital systems are not continuous, testing boundary values are not sufficient to guarantee correctness. All the possible values need to be tested and verified, but complete testing is infeasible. Exhaustively testing a simple program to add only two integer inputs of 32-bits (yielding 2^64 distinct test cases) would take hundreds of years, even if tests were performed at a rate of thousands per second. Obviously, for a realistic software module, the complexity can be far beyond the example mentioned here. If inputs from the real world are involved, the problem will get worse, because timing and unpredictable environmental effects and human interactions are all possible input parameters under consideration.&lt;br /&gt;A further complication has to do with the dynamic nature of programs. If a failure occurs during preliminary testing and the code is changed, the software may now work for a test case that it didn't work for previously. But its behavior on pre-error test cases that it passed before can no longer be guaranteed. To account for this possibility, testing should be restarted. The expense of doing this is often prohibitive. &lt;a href="http://www.ece.cmu.edu/~koopman/des_s99/sw_testing/#reference"&gt;[Rstcorp]&lt;/a&gt;&lt;br /&gt;An interesting analogy parallels the difficulty in software testing with the pesticide, known as the Pesticide Paradox &lt;a href="http://www.ece.cmu.edu/~koopman/des_s99/sw_testing/#reference"&gt;[Beizer90]&lt;/a&gt;: Every method you use to prevent or find bugs leaves a residue of subtler bugs against which those methods are ineffectual. But this alone will not guarantee to make the software better, because the Complexity Barrier &lt;a href="http://www.ece.cmu.edu/~koopman/des_s99/sw_testing/#reference"&gt;[Beizer90]&lt;/a&gt; principle states: Software complexity(and therefore that of bugs) grows to the limits of our ability to manage that complexity. By eliminating the (previous) easy bugs you allowed another escalation of features and complexity, but his time you have subtler bugs to face, just to retain the reliability you had before. Society seems to be unwilling to limit complexity because we all want that extra bell, whistle, and feature interaction. Thus, our users always push us to the complexity barrier and how close we can approach that barrier is largely determined by the strength of the techniques we can wield against ever more complex and subtle bugs. &lt;a href="http://www.ece.cmu.edu/~koopman/des_s99/sw_testing/#reference"&gt;[Beizer90]&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8291059916253528224-2966096044251735700?l=buildtesting.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/buildtesting/~4/6EPRvjfYA3w" height="1" width="1"/&gt;</content><link rel="related" href="http://www.buildtesting.blogspot.com/swtesting.html" title="What is Software Testing?" /><link rel="replies" type="application/atom+xml" href="http://buildtesting.blogspot.com/feeds/2966096044251735700/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8291059916253528224&amp;postID=2966096044251735700&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/2966096044251735700" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/2966096044251735700" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/buildtesting/~3/6EPRvjfYA3w/what-is-software-testing.html" title="What is Software Testing?" /><author><name>Sachin Kumar</name><uri>http://www.blogger.com/profile/08030029569880551521</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://bp2.blogger.com/_A4WiZotKHb8/SDMMSRhQ2eI/AAAAAAAAAgQ/e8XAvQopCOg/S220/S7300265.JPG" /></author><thr:total>0</thr:total><feedburner:origLink>http://buildtesting.blogspot.com/2008/01/what-is-software-testing.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-8291059916253528224.post-5334369924655167400</id><published>2008-01-20T08:38:00.000-08:00</published><updated>2008-05-20T10:27:21.986-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Reliability" /><category scheme="http://www.blogger.com/atom/ns#" term="Validation" /><category scheme="http://www.blogger.com/atom/ns#" term="Verification" /><category scheme="http://www.blogger.com/atom/ns#" term="Quality" /><category scheme="http://www.blogger.com/atom/ns#" term="Estimation" /><title type="text">Why to do Software Testing?</title><content type="html">&lt;p&gt;Regardless of the limitations, testing is an integral part in software development. It is broadly deployed in every phase in the software development cycle. Typically, more than 50% percent of the development time is spent in testing. Testing is usually performed for the following purposes: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;To improve quality. &lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;As computers and software are used in critical applications, the outcome of a bug can be severe. Bugs can cause huge losses. Bugs in critical systems have caused airplane crashes, allowed space shuttle missions to go awry, halted trading on the stock market, and worse. Bugs can kill. Bugs can cause disasters. The so-called year 2000 (Y2K) bug has given birth to a cottage industry of consultants and programming tools dedicated to making sure the modern world doesn't come to a screeching halt on the first day of the next century. &lt;a href="http://www.ece.cmu.edu/~koopman/des_s99/sw_testing/#reference"&gt;[Bugs]&lt;/a&gt; In a computerized embedded world, the quality and reliability of software is a matter of life and death.&lt;br /&gt;Quality means the conformance to the specified design requirement. Being correct, the minimum requirement of quality, means performing as required under specified circumstances. Debugging, a narrow view of software testing, is performed heavily to find out design defects by the programmer. The imperfection of human nature makes it almost impossible to make a moderately complex program correct the first time. Finding the problems and get them fixed &lt;a href="http://www.ece.cmu.edu/~koopman/des_s99/sw_testing/#reference"&gt;[Kaner93]&lt;/a&gt;, is the purpose of debugging in programming phase.&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;For Verification &amp;amp; Validation (V&amp;amp;V)&lt;br /&gt;&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Just as topic &lt;a href="http://www.ece.cmu.edu/~koopman/des_s99/verification/index.html"&gt;Verification and Validation&lt;/a&gt; indicated, another important purpose of testing is verification and validation (V&amp;amp;V). Testing can serve as metrics. It is heavily used as a tool in the V&amp;amp;V process. Testers can make claims based on interpretations of the testing results, which either the product works under certain situations, or it does not work. We can also compare the quality among different products under the same specification, based on results from the same test.&lt;br /&gt;We can not test quality directly, but we can test related factors to make quality visible. Quality has three sets of factors -- functionality, engineering, and adaptability. These three sets of factors can be thought of as dimensions in the software quality space. Each dimension may be broken down into its component factors and considerations at successively lower levels of detail. Some of the most frequently cited quality considerations are:(Typical Software Quality Factors &lt;a href="http://www.ece.cmu.edu/~koopman/des_s99/sw_testing/#reference"&gt;[Hetzel88]&lt;/a&gt; )&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Functionality (exterior quality) -&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Correctness&lt;/li&gt;&lt;li&gt;Reliability&lt;/li&gt;&lt;li&gt;Usability&lt;/li&gt;&lt;li&gt;Integrity&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Engineering (interior quality)&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Efficiency&lt;/li&gt;&lt;li&gt;Testability&lt;/li&gt;&lt;li&gt;Documentation&lt;/li&gt;&lt;li&gt;Structure&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Adaptability (future quality)&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Flexibility&lt;/li&gt;&lt;li&gt;Reusability&lt;/li&gt;&lt;li&gt;Maintainability&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Good testing provides measures for all relevant factors. The importance of any particular factor varies from application to application. Any system where human lives are at stake must place extreme emphasis on reliability and integrity. In the typical business system usability and maintainability are the key factors, while for a one-time scientific program neither may be significant. Our testing, to be fully effective, must be geared to measuring each relevant factor and thus forcing quality to become tangible and visible. &lt;a href="http://www.ece.cmu.edu/~koopman/des_s99/sw_testing/#reference"&gt;[Hetzel88]&lt;/a&gt;&lt;br /&gt;Tests with the purpose of validating the product works are named clean tests, or positive tests. The drawbacks are that it can only validate that the software works for the specified test cases. A finite number of tests can not validate that the software works for all situations. On the contrary, only one failed test is sufficient enough to show that the software does not work. Dirty tests, or negative tests, refers to the tests aiming at breaking the software, or showing that it does not work. A piece of software must have sufficient exception handling capabilities to survive a significant level of dirty tests.&lt;br /&gt;A testable design is a design that can be easily validated, falsified and maintained. Because testing is a rigorous effort and requires significant time and cost, design for testability is also an important design rule for software development.&lt;br /&gt;For reliability estimation &lt;a href="http://www.ece.cmu.edu/~koopman/des_s99/sw_testing/#reference"&gt;[Kaner93] [Lyu95]&lt;/a&gt;&lt;br /&gt;Software reliability has important relations with many aspects of software, including the structure, and the amount of testing it has been subjected to. Based on an operational profile (an estimate of the relative frequency of use of various inputs to the program &lt;a href="http://www.ece.cmu.edu/~koopman/des_s99/sw_testing/#reference"&gt;[Lyu95]&lt;/a&gt;), testing can serve as a statistical sampling method to gain failure data for reliability estimation.&lt;br /&gt;Software testing is not mature. It still remains an art, because we still cannot make it a science. We are still using the same testing techniques invented 20-30 years ago, some of which are crafted methods or heuristics rather than good engineering methods. Software testing can be costly, but not testing software is even more expensive, especially in places that human lives are at stake. Solving the software-testing problem is no easier than solving the Turing halting problem. We can never be sure that a piece of software is correct. We can never be sure that the specifications are correct. No verification system can verify every correct program. We can never be certain that a verification system is correct either. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8291059916253528224-5334369924655167400?l=buildtesting.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/buildtesting/~4/G9ifES8KJl8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://buildtesting.blogspot.com/feeds/5334369924655167400/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8291059916253528224&amp;postID=5334369924655167400&amp;isPopup=true" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/5334369924655167400" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8291059916253528224/posts/default/5334369924655167400" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/buildtesting/~3/G9ifES8KJl8/why-to-do-software-testing.html" title="Why to do Software Testing?" /><author><name>Sachin Kumar</name><uri>http://www.blogger.com/profile/08030029569880551521</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://bp2.blogger.com/_A4WiZotKHb8/SDMMSRhQ2eI/AAAAAAAAAgQ/e8XAvQopCOg/S220/S7300265.JPG" /></author><thr:total>2</thr:total><feedburner:origLink>http://buildtesting.blogspot.com/2008/01/why-to-do-software-testing.html</feedburner:origLink></entry></feed>

