Start your automation work only when AUT (Application Under Test) is stable. i-e You should have completed initial round of manual testing before starting QTP automation task.
Use reusable actions wherever possible. And, Functional libraries should be used to include the vbscript functions so that maintenance of vbscript functions is easy.
Don’t copy and paste checkpoints when you wish to check same thing in more than one places. Instead, create separate checkpoints. Because manipulating checkpoints in QTP is not feasible or it will be difficult.
Open browser/application after opening QTP.
Your vbscript functions should not have any hard coded object names, the name of the objects should be passed as function argument.
Use Shared Object Repository. My suggestion is, don’t use DP (Descriptive Programming) which will increase your maintenance work.
Before adding any object to Object Repository, set up appropriate object identification properties (in Tools->ObjectIdentification) if you feel that default identification properties are not suitable for you application. If you do it after adding some objects to the Object Repository then you may face issues related to having multiple Test objects in Object Repository for a single actual Object.
Open QTP using Automation object model. You can do it just by writing (even you are having ‘generate script’ option in the QTP IDE itself) simple .vbs file, and then open QTP just by double clicking this .vbs file. It is very essential if you are developing your scripts in one machine/environment and planning to run/execute it in another environment. By using Automation Object model we are making sure that all the IDE settings (e.g Object identification properties) that are changed in development environment are propagated to the execution environment also
Always use Reference/Relative path when calling any external reusable action instead of using absolute/full path, Otherwise the script will fail when placing it in different path.
Remember to take backup of Object Repositories before merging object repositories.
Put proper inline comments and also put summary comments (description, input & output parameters, dependency, and author) at beginning of the Test. In the comments remember to mention about execution/data flow.
Rename the Objects in Object Repository to have proper meaning for them. Because the default name given by adding the objects by recording or manually may not be good/meaningful.
Give attention to synchronization (i-e use of sync,waitproperty, exist). And also use regular expression wherever required. Otherwise consistency of script execution will be affected.
Use recovery scenario to handle any unexpected behaviour (e.g showing pop-up windows sometimes) of the application.