C++Script is a specific dialect of the C++ programming language supported by TestComplete. It is based on JScript. It was specially designed to let C++ developers easily port script routines to their C++ Self-Testing and Connected Applications.
Connected and self-testing applications are deprecated. We do not recommend using them. |
TestComplete can both record and play back C++Script routines. That is, you can record a script in TestComplete, debug it there, then import this script to your C++ application and make it work by adding just a few lines. For instance:
// This code was recorded by TestComplete: function Test() |
// This code was imported to a C++ Connected Application: #include "c:\TestComplete\Connected Apps\C++\script.h" |
The language of the code recorded by TestComplete for your C++ projects is JScript. So, you can simply write anything that is allowed in JScript and this script will be operational. For instance, in JScript and C++Script all variables and constants are VARIANT
. You must declare them and you should do this using the following format:
var p, w;
Syntax of C++ scripts is the same as the syntax of C# scripts (since C#Script is also based on JScript). They are the same as long as the scripts reside in TestComplete. If you export scripts to a Connected Application, they will be different. That is, the syntax of C++Script and C#Script routines exported to C++ and C# Connected and Self-Testing Applications will differ.
Once again, the idea of having C++Scripts as a separate script language for TestComplete projects is to let developers, who are used to C++, write script code that requires minimal changes when being imported into C++ applications. When writing such code in C++Script, please keep in mind the following rules, which distinguish C++Script from JScript:
-
When calling methods, use only the following notation: method names are quoted and placed in brackets, and their parameters are placed in parentheses:
C++Script
Log["Message"]("My Message", "My Message Description", 0, 1);
TestComplete uses this notation when recording C++Script routines. JScript uses another notation for method calls:
JScript
Log.Message("My Message", "My Message Description", 0, 1);
You should avoid this notation, since it is not supported in C++. Otherwise, you will have to rewrite code when importing it into C++.
-
To address properties in C++Script, you should also use square brackets. For instance:
C++Script
p = w["Parent"];// Saving property value to a variable
Sys["MouseX"] = 100; // Assigning property valueTo access an indexed property, use the following syntax:
object["property_name"](index)
. For example:C++Script
var p = TestedApps["Items"](0); // Getting property value
TestedApps["Items"](0) = "notepad.exe"; // Setting property value -
Do not use JScript statements
with
andfor...in
and JScript operators===
,!==
,>>>
or>>>=
. They are not supported in C++. If you use them, you will have to update your code when importing it into a C++ application. -
Also, these JScript objects are not currently supported in C++ applications:
Array
,Boolean
,Date
,Function
,Global
,Math
,Number
,Object
,RegExp
,Error
andString
. -
Use the semicolon at the end of each statement.
When you have inserted your C++Script routines into C++ code, try to compile the code. This will tell you whether it contains errors and where you can find them. Below are the most common changes that you may need to make:
-
C++Script uses only the
VARIANT
data type, so there is no need to specify the type of exceptions in thetry... catch
blocks. In C++ you must always specify the exception types. -
You should initialize COM libraries before running imported scripts and uninitialize them when the scripts stop running. The easiest way to do this in your application is to use the
IMPLEMENT_TESTCOMPLETE_GLOBAL_OBJECTS_MTA
orIMPLEMENT_TESTCOMPLETE_GLOBAL_OBJECTS
macros declared in the <TestComplete>\Connected Apps\C++\scripts.h file. For more information on these macros, see Creating Self-Testing Applications in C++ or Creating Connected Applications in C++. Even if COM has already been initialized somehow, these macros will not cause harm to anything, so we recommend that you always use them. -
Change instructions that assign values to indexed properties. To set an indexed property, use the following syntax:
object[Put("property_name")](index)
orobject[(Put)"property_name"](index)
. For example:C++Script
TestedApps[Put("Items")](0) = "notepad.exe";or
TestedApps[(Put)"Items"](0) = "notepad.exe"; - If your C++Script function returns a value, you should modify its syntax after it has been imported into your C++ application:
C++Script
// The function returns a value
function Func1()
{
return m;
}C++
// The function returns a value
int Func1()
{
return m;
}If your script function does not return values, you cannot modify its syntax, because the script.h file, which is included in the C++ application, holds the following declaration:
typedef void functionSo, the function keyword is identical to void. For instance:
C++Script
// The function does not return a value
function Func1()
{
}C++
// The function does not return a value
void Func1()
{
}
// or
function Func1()
{
}
Note that besides TestComplete, Script.h allows you to work with other COM servers, e.g. with Microsoft Word, in the same way. Script.h simplifies syntax used in C++ applications to work with COM servers via late binding. Once you have obtained the IDispatch
interface of the desired server, you can address its methods and properties using the C++Script syntax rather than calling the GetIDsOfName
, Invoke
and other methods:
C++Script
#include "c:\TestComplete\Connected Apps\C++\script.h"
...
using namespace TestComplete;
void Test()
{
/*
We used the COleInit variable rather than
the
CoInitializeEx and CoUninitialize API functions. */
COleInit g;
var wrd;
/*
The GetObject method returns a reference to the desired COM server.
It
performs the actions, similar to those below:
IDispatch
* wrdVar;
GUID WrdClass;
CLSIDFromProgID(L"Word.Application",
&WrdClass);
CoCreateInstance(WrdClass,
NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&wrdVar);
wrd
= wrdVar; */
wrd.GetObject(L"Word.Application");
/*
The following code performs some operations with the COM Server */
wrd["Visible"]
= true;
wrd["Documents"]["Add"]();
wrd["Selection"]["InsertAfter"]("Hello,
world!");
}
See Also
Script Tests
JScript, C#Script and C++Script - Specifics of Usage
Handling Exceptions in Scripts
Creating Connected Applications in C++
Creating Self-Testing Applications in C++