|
|
1.1 ! root 1: HINTS FOR CREATING SCRIPTS FOR 32-BIT MICROSOFT TEST ! 2: ! 3: This file describes differences between using Microsoft Test on 16-bit Windows ! 4: vs. 32-bit Windows (NT). There are some areas where special code must be ! 5: placed into the scripts in order for script to successfully run under NT. In ! 6: almost all cases it is possible to create the scripts such that they will run ! 7: properly under both platforms without modification. ! 8: ------------------------------------------------------------------------------ ! 9: ! 10: Due to differences between Windows 3.1 and Windows NT, MS Test scripts ! 11: written for 16-bit (Win 3.1) may not run under 32-bit without modification. ! 12: This file will explain some of the most common reasons for this and provide ! 13: ways to workaround the problems with simple modifications to scripts. ! 14: ! 15: The primary difference is preemption vs. non-preemption. Under 16-bit ! 16: windows, MS Test scripts could perform actions on an application with a ! 17: single statement, and be assured that by the time the next statement begins ! 18: to execute, the application has already completed what it was asked to do ! 19: with the first statement. For example, under Win 3.1 the code below: ! 20: ! 21: WMenu "File" ! 22: WMenu "Open..." ! 23: WButtonClick "Cancel" ! 24: ! 25: ...would bring up the File.Open dialog and cancel it without any problem. ! 26: ! 27: (Note that this is *most often* the case -- there are cases in Win 3.1 ! 28: where the application "yields" while performing a task, in which case the ! 29: script writer must take special steps to ensure that task has completed ! 30: before continuing with the script.) ! 31: ! 32: However, the same code run on 32-bit windows will bring up the File.Open ! 33: dialog, but the WButtonClick function may fail because the File.Open ! 34: dialog may not be there yet. Since NT is a preemptive system, both ! 35: the application and the script run concurrently -- and if the application ! 36: takes longer to bring up the file.open dialog than it takes MS Test to ! 37: execute the WButtonClick call (which it often does), WButtonClick will ! 38: fail to find a "Cancel" button, the script will continue on, and we will ! 39: have effectively "lost" an important event. ! 40: ! 41: USING THE WFndWndWait FUNCTION: ! 42: ------------------------------- ! 43: To combat this, 32-bit scripts need to WAIT for things to happen. By far, ! 44: the best way to do this is to use one of the new TestCtrl API: ! 45: ! 46: h = WFndWndWait ("Open", FW_PART, 5) ! 47: ! 48: This call will wait for a window with "Open" (or "open" or "OPEN") in its ! 49: caption to appear, or for 5 seconds, whichever happens first. The handle ! 50: to the window will be returned, or NULL if it timed out before the window ! 51: was found. When using this api, it is safe to use rather long timeout ! 52: values (20 or 30 seconds) because the function returns as soon as the ! 53: window is there, and if the window is expected to come up but doesn't, ! 54: something has gone wrong, anyway. ! 55: ! 56: Calls like this could be placed in between things that might take some ! 57: time to happen, like between "WMenu "File"" and "WButtonClick": ! 58: ! 59: WMenu "File" ! 60: WMenu "Open..." ! 61: h = WFndWndWait ("Open", FW_PART, 5) ! 62: WButtonClick "Cancel" ! 63: ! 64: AND, to make this even easier, you could create a wrapper function like ! 65: the following: ! 66: ! 67: DECLARE SUB WndWait (Title$) ! 68: STATIC SUB WndWait (Title) ! 69: IF WFndWndWait (Title$, FW_PART, giTimeOut) = 0 THEN ! 70: PAUSE "Window " + Title$ + " could not be found!" ! 71: END ! 72: END IF ! 73: END SUB ! 74: ! 75: ...and place it in a header file. Then all you need to add are statements ! 76: like the following: ! 77: ! 78: WMenu "File" ! 79: WMenu "Open..." ! 80: WndWait "Open" ! 81: WButtonClick "Cancel" ! 82: ! 83: ...and if the window you're looking for never comes up, the script will ! 84: END, after telling you which window it couldn't find. ! 85: ! 86: USING THE QueSetSpeed AND QuePause FUNCTIONS: ! 87: --------------------------------------------- ! 88: In some cases, slowing down playback of journalled events can be helpful, not ! 89: only in allowing things to complete (which isn't too much of a concern, since ! 90: NT synchronizes all input threads while journalling), but also in allowing ! 91: you to see what is actually happening during the execution of a script. ! 92: ! 93: You can do this in two ways: ! 94: - The QueSetSpeed statement allows you to set a time (in milliseconds) ! 95: delay between each message is played ! 96: - The QuePause stateent lets you set a one-time pause in the event ! 97: stream just before the next queued event. ! 98: ! 99: USING THE NEW SPEED STATEMENT: ! 100: ------------------------------ ! 101: 32-bit MS Test has a new statement called SPEED which allows you to control ! 102: the general execution speed of the script. It is dynamic, meaning you can ! 103: run parts of the script at full speed, and slow other parts down drastically. ! 104: For example: ! 105: ! 106: SPEED 100 ! 107: ! 108: ...will cause TestDrvr to sleep for 100 milliseconds before executing each ! 109: line of code in the script. Likewise, ! 110: ! 111: SPEED 0 ! 112: ! 113: ...will allow TestDrvr to run the script at full speed. ! 114: ! 115: This can also be an easy way to keep the application under test from "falling ! 116: behind" the MS Test script. However, care should be taken when controlling ! 117: the speed of execution OR playback -- as it might work okay on one system, but ! 118: still be too fast for another. ! 119: ! 120: OTHER CONSIDERATIONS: ! 121: --------------------- ! 122: Some special things to watch out for include: ! 123: ! 124: - Using Program Manager to launch apps under test. Progman does NOT wait ! 125: for the application to come to the foreground before continuing. Thus ! 126: if you use "File.Run" from progman to start your app, you MUST use some ! 127: way of waiting for the application to appear before continuing with ! 128: the script, such as the WFndWndWait method. The best solution, though, ! 129: is to use MS Test's RUN statement. Internally, RUN uses WinExec, which ! 130: will wait until the application appears before returning, which causes ! 131: the script to wait as well. So, unless you are specifically testing ! 132: Program Manager's ability to launch applications, using RUN is a much ! 133: "safer" way of starting the app. ! 134: ! 135: - Switching between apps within the script (such as setting focus to ! 136: another application, etc). You should wait for a brief moment (perhaps ! 137: SLEEP 1 to sleep for a second) before starting to perform actions to ! 138: the new app. ! 139: ! 140: ! 141: WS1.DLL - WaitUntilIdle() FUNCTION: ! 142: ----------------------------------- ! 143: The following function is provided in the WS1.DLL: ! 144: ! 145: DECLARE FUNCTION WaitUntilIdle LIB "ws1.dll" (nMSecToWait&) as Integer ! 146: ! 147: The WaitUntilIdle function waits until the forground application has reached an ! 148: idle state. ! 149: ! 150: Parameters: nMSecToWait& - ! 151: Specifies the number of milliseconds the function will wait for ! 152: the foreground application to go idle. ! 153: 0 : Function tests the idle state and returns immediately. ! 154: -1 : Function will not return until the idle state is reached. ! 155: ! 156: Return Value: TRUE : The foreground application reached the idle state. ! 157: ! 158: FALSE : The wait was terminated because the timeout time was ! 159: reached or an error occurred. ! 160: ! 161:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.