Introduction

One of the most sought after skills for software professionals today is not only the ability to write good quality code but also the ability to test and validate your code. This is where this tool comes into play. ScriptRunner is different from other unit testing Frameworks. In fact, ScriptRunner is a complement of a traditional unit testing Framework like CPP Unit. A Unit Testing Framework lets you test modules in your application. A module can be a library, a class (or an object) or can be a simple function. ScriptRunner complements unit testing by emulating a user interaction with your software and can display any error in the execution of your program.

Description

Initially, ScriptRunner was created with the intent to simulate a user interaction with an application. But in the end, this tool has evolved. Now, it provides a simple TRACE library to capture the application state and of course, to report any error in your program.Typically with CPP Unit (or other Framework), you write the code to test your function passing both correct and error values to verify whether it behaves correctly. These tools are great and if you choose to test enough important functions, you can get very good coverage and find bugs (or broken code) easily in your program.

But one aspect that is lacking, is how do you test the User Interface to achieve the same result? ScriptRunner can help you do that! You can write a simple script to interact with your application and use the ScriptRunner TRACE library to display any success or failure.

How Does it Work?

ScriptRunner is a Scripting Host application. It provides a set of interfaces to execute an application, manipulate a window and submit input to your user interface as a user would normally do. Several commands are available to configure and run a test script. I am assuming everyone will recognize the standard icons and know what they are used for. Now, let me describe the other icons to get you started.

Command

Description

Trace

You can use the Trace button to capture the trace statement (OutputDebugString) directly to this window. Your code can send output strings directly to this window by using the ScriptRunner TRACE library. A script can also send an output by using ScriptHost.DebugOutput function.

Stop

Stop Trace will stop the capture of the debugger output.

Compare

Compare mode can be used to verify the outputs being sent when your program executes.

Run

Run command will execute a User Interface JavaScript Testing Unit

Several additional features are available to filter your program output. Context menu options are also available to load and save your program output settings.

ScriptRunner ScriptHost API

Function

Description

Display(text)

Display a message box

DebugOutput(text)

Send output text to script runner output Window

FindWindow(class,title)

Search for a specific Window class and title (optional).

SendKey(keyCode,ctrlKey,altKey)

Send a virtual Keycode to an active Window (control with focus). Optionally, simulate CTRL and ALT keys being pressed.

SendKeys(text)

Send keystrokes (User emulation).

Sleep(delay)

Wait for specified milliseconds

bool LaunchApp(appPath)

Run an application

string GetEnvString(sName)

Get an environment variable string

ScriptRunner WindowDispatch API

Function

Description

Window

Property to get Window handle. This should be used as read-only since ScriptRunner is responsible for creating and initializing this object.

string GetWindowText()

Get current caption text or edit text for edit control

int GetWindowTextLength()

Get current caption text (or edit text) length

bool SetWindowText(text)

Change Window text

SetFocus()

Change focus to Window

ShowWindow(cmdShow)

Show/Hides a Window

Window GetDlgItem(dlgItem)

Get a child Window handle

ChildWindowFromPoint(x,y)

Get a child Window handle from client coordinates

MoveWindow(x,y,w,h)

Resize and reposition a Window

SetWindowPos(x,y,cx,cy,flg)

Resize and reposition a window

Window FindWindowEx(class,title,prev)

Find a child Window based on class or title

bool SetForegroundWindow()

Set Window to foreground

Window GetParent()

Get current Window parent

MouseHover()

Move and Center mouse over Window object

MouseLClick(x,y,clickNow)

Move mouse to Window client position, optionally simulate left click at the end of movement.

MouseRClick(x,y,clickNow)

Move mouse to Window client position, optionally simulate right click at the end of movement.

ScriptRunner Example

ScriptRunner exposes only one event handler OnStarted. It is the recommended main entry point to run your script. In JavaScript, use this prototype function ScriptHost::OnStarted().

You need to include a set of files in your solution.
CTracer.h : This is used to hook OutputDebugString calls from your program.
SocketHandle.h, cpp : Socket API used to communicate with ScriptRunner.
HookImportFunction.h, cpp : PJ Naughter's Hook Import function

Thanks for that great utility.
We are thinking about writing something like this, but you outdistanced us
But I have a problem with sending something like Alt+F4. Is there any solution to send such keystrokes?