In TestComplete tests, to extract data from external data sources, you can use DDT driver objects:
-
DDT.ADODriver
- Creates a driver for a recordset, which can be accessed via Microsoft ADO DB. -
DDT.CSVDriver
- Creates a driver for a file holding values separated by commas. -
DDT.ExcelDriver
- Creates a driver for a sheet in an Excel document.
Requirements
The DDT
object is available only if the Data-Driven Testing plugin is enabled in TestComplete.
This plugin is installed and enabled by default during the TestComplete installation. You can check the plugin status in the File > Install Extensions dialog in TestComplete. You can find the plugin in the Common group.
Working with drivers
To work with a driver in your tests, you can use the DDT.CurrentDriver
property. This property holds a reference to the last created DDT
driver. It is convenient to use because it frees you from using a global variable to hold the reference to the driver object.
Once you get a driver object, you can work with data, to which it provides access, in the same unified approach. The driver objects represent all data regardless of their storage format as a table of rows and columns:
-
For ADO DDT driver, the names and the order of columns coincide with the name and order of columns of the underlying database table.
-
For the CSV driver, each row corresponds to a line in the underlying CSV file and the column names are specified by the first line of this file.
-
For the Excel driver, the names and number of columns and rows are determined by the populated cells in the underlying Excel sheet. Depending on certain Windows Registry settings, the driver may recognize the first row of an Excel worksheet as column names or data.
Iterating through records
The driver objects have methods and properties that let you iterate through records of this table, obtain the numbers and names of columns, retrieve data stored in record fields:
-
To walk through the records, you can create a loop using the
Next
andEOF
methods.JavaScript, JScript
var Driver = DDT.ExcelDriver("C:\\work\\UserData.xls", "Sheet1");
while (!Driver.EOF())
{
…
Driver.Next();
}
DDT.CloseDriver(Driver.Name);Python
Driver = DDT.ExcelDriver("C:\\work\\UserData.xls", "Sheet1")
while not Driver.EOF():
…
Driver.Next()
DDT.CloseDriver(Driver.Name)VBScript
Set Driver = DDT.ExcelDriver("C:\work\UserData.xls", "Sheet1")
While Not Driver.EOF()
…
Driver.Next()
WEnd
DDT.CloseDriver(Driver.Name)DelphiScript
var Driver;
…
Driver := DDT.ExcelDriver('C:\work\UserData.xls', 'Sheet1');
while not Driver.EOF() do
begin
…
Driver.Next();
end;
DDT.CloseDriver(Driver.Name);C++Script, C#Script
var Driver = DDT["ExcelDriver"]("C:\\work\\UserData.xls", "Sheet1");
while (!Driver["EOF"]())
{
…
Driver["Next"]();
}
DDT["CloseDriver"](Driver["Name"]);Right after its creation the driver is on the first row of the driver’s table. To proceed to the next row, call
Next
. To determine the end of the table, callEOF
. To return to the beginning of the data source, use theFirst
method. Row-by-row backward navigation is not supported. -
To obtain values stored in the current record of the driver’s table, use the
Value
property of the driver object. This property returns a column value by column index or column name.JavaScript, JScript
var value = DDT.CurrentDriver.Value("My Column");Python
value = DDT.CurrentDriver.Value["My Column"]VBScript
value = DDT.CurrentDriver.Value("My Column")DelphiScript
var value;
…
value : = DDT.CurrentDriver.Value('My Column');C++Script, C#Script
var value = DDT["CurrentDriver"]["Value"]("My Column"); -
To get the number and names of driver’s table, use the
ColumnCount
andColumnName
properties.JavaScript, JScript
var count = DDT.CurrentDriver.ColumnCount;
for (var i = 0; i < count; i++)
{
var column = DDT.CurrentDriver.ColumnName(i);
…
}Python
count = DDT.CurrentDriver.ColumnCount
for i in range (0, count):
column = DDT.CurrentDriver.ColumnName[i]
…VBScript
count = DDT.CurrentDriver.ColumnCount
For i = 0 To count - 1
column = DDT.CurrentDriver.ColumnName(i)
…
NextDelphiScript
count := DDT.CurrentDriver.ColumnCount;
for i := 0 to count - 1 do
begin
column := DDT.CurrentDriver.ColumnName[i];
…
end;C++Script, C#Script
var count = DDT["CurrentDriver"]["ColumnCount"];
for (var i = 0; i < count; i++)
{
var column = DDT["CurrentDriver"]["ColumnName"](i);
…
} - To evaluate the function whose name is specified in a cell of the driver’s table, you can either use the
Eval
function (in VBScript, JScript and Python) or theEvaluate
function (in DelphiScript).Note: If you use the Evaluate
function to evaluate the routine that does not have a return value, it is necessary to specify the name of the unit that contains it before specifying the name of the evaluated procedure.DelphiScript
// Both procedures are declared in the same unit, for example, Unit1
procedure PostMessage;
begin
Log.Message('Success');
end;
procedure TestEval;
begin
Evaluate('Unit1.PostMessage');
end;
Examples
The following code creates a DDT driver for an Excel sheet, runs through records of the driver’s table and posts values stored in record fields to the test log.
JavaScript, JScript
var RecNo;
// Posts data to the log (helper routine)
function ProcessData()
{
var Fldr, i;
Fldr = Log.CreateFolder("Record: " + aqConvert.VarToStr(RecNo));
Log.PushLogFolder(Fldr);
for(i = 0; i < DDT.CurrentDriver.ColumnCount; i++)
Log.Message(DDT.CurrentDriver.ColumnName(i) + ": " + aqConvert.VarToStr(DDT.CurrentDriver.Value(i)));
Log.PopLogFolder();
RecNo = RecNo + 1;
}
// Creates the driver (main routine)
function TestDriver()
{
var Driver;
// Creates the driver
// If you connect to an Excel 2007 sheet, use the following method call:
// Driver = DDT.ExcelDriver("C:\\MyFile.xlsx", "Sheet1", true);
Driver = DDT.ExcelDriver("C:\\MyFile.xls", "Sheet1");
// Iterates through records
RecNo = 0;
while (! Driver.EOF() )
{
ProcessData(); // Processes data
Driver.Next(); // Goes to the next record
}
// Closes the driver
DDT.CloseDriver(Driver.Name);
}
Python
RecNo = 0
# Posts data to the log (helper routine)
def ProcessData():
global RecNo
Fldr = Log.CreateFolder("Record: " + aqConvert.VarToStr(RecNo))
Log.PushLogFolder(Fldr)
for i in range(DDT.CurrentDriver.ColumnCount):
Log.Message(DDT.CurrentDriver.ColumnName[i] + ": " + aqConvert.VarToStr(DDT.CurrentDriver.Value[i]))
Log.PopLogFolder()
RecNo = RecNo + 1
# Creates the driver (main routine)
def TestDriver():
# Creates the driver
# If you connect to an Excel 2007 sheet, use the following method call:
# Driver = DDT.ExcelDriver("C:\\MyFile.xlsx", "Sheet1", True)
Driver = DDT.ExcelDriver("C:\\MyFile.xls", "Sheet1")
# Iterates through records
while not Driver.EOF():
ProcessData(); # Processes data
Driver.Next(); # Goes to the next record
# Closes the driver
DDT.CloseDriver(Driver.Name);
VBScript
Dim RecNo
' Posts data to the log (helper routine)
Sub ProcessData
Dim Fldr, i
Fldr = Log.CreateFolder("Record: " + aqConvert.VarToStr(RecNo))
Log.PushLogFolder Fldr
For i = 0 To DDT.CurrentDriver.ColumnCount - 1
Log.Message DDT.CurrentDriver.ColumnName(i) + ": " + aqConvert.VarToStr(DDT.CurrentDriver.Value(i))
Next
Log.PopLogFolder
RecNo = RecNo + 1
End Sub
' Creates the driver (main routine)
Sub TestDriver
Dim Driver
' Creates the driver
' If you connect to an Excel 2007 sheet, use the following method call:
' Set Driver = DDT.ExcelDriver("C:\MyFile.xlsx", "Sheet1", True)
Set Driver = DDT.ExcelDriver("C:\MyFile.xls", "Sheet1")
' Iterates through records
RecNo = 0
While Not Driver.EOF()
Call ProcessData() ' Processes data
Call Driver.Next() ' Goes to the next record
WEnd
' Closes the driver
Call DDT.CloseDriver(Driver.Name)
End Sub
DelphiScript
var RecNo;
// Posts data to the log (helper routine)
procedure ProcessData;
var
Fldr, i : OleVariant;
begin
Fldr := Log.CreateFolder('Record: ' + aqConvert.VarToStr(RecNo));
Log.PushLogFolder(Fldr);
for i := 0 to DDT.CurrentDriver.ColumnCount - 1 do
Log.Message(DDT.CurrentDriver.ColumnName[i] + ': ' + aqConvert.VarToStr(DDT.CurrentDriver.Value[i]));
Log.PopLogFolder;
RecNo := RecNo + 1;
end;
// Creates the driver (main routine)
procedure TestDriver;
var
Driver : OleVariant;
begin
// Creates the driver
// If you connect to an Excel 2007 sheet, use the following method call:
// Driver := DDT.ExcelDriver('C:\MyFile.xlsx', 'Sheet1', true);
Driver := DDT.ExcelDriver('C:\MyFile.xls', 'Sheet1');
// Iterates through records
RecNo := 0;
while not Driver.EOF() do
begin
ProcessData; // Processes data
Driver.Next; // Goes to the next record
end;
// Closes the driver
DDT.CloseDriver(Driver.Name);
end;
C++Script, C#Script
var RecNo;
// Posts data to the log (helper routine)
function ProcessData()
{
var Fldr, i;
Fldr = Log["CreateFolder"]("Record: " + aqConvert.VarToStr(RecNo));
Log["PushLogFolder"](Fldr);
for(i = 0; i < DDT["CurrentDriver"]["ColumnCount"]; i++)
Log.Message(DDT["CurrentDriver"]["ColumnName"](i) + ": " + aqConvert.VarToStr(DDT["CurrentDriver"]["Value"](i)));
Log["PopLogFolder"]();
RecNo = RecNo + 1;
}
// Creates the driver (main routine)
function TestDriver()
{
var Driver;
// Creates the driver
// If you connect to an Excel 2007 sheet, use the following method call:
// Driver = DDT["ExcelDriver"]("C:\\MyFile.xlsx", "Sheet1", true);
Driver = DDT["ExcelDriver"]("C:\\MyFile.xls", "Sheet1");
// Iterates through records
RecNo = 0;
while (! Driver["EOF"]() )
{
ProcessData(); // Processes data
Driver["Next"](); // Goes to the next record
}
// Closes the driver
DDT["CloseDriver"](Driver["Name"]);
}
As you can see, to address the driver within the ProcessData
routine, we used the DDT.CurrentDriver
property.
In the example above we iterate through the records of the driver’s table using the Next
and EOF
methods. The driver object contains the DriveMethod("UnitName.RoutineName")
function that let you automate the iteration. DriveMethod
runs through all the records of the driver’s table and execute the routine passed to it as a parameter.
JavaScript, JScript
var RecNo;
// Posts data to the log (helper routine)
function ProcessData()
{
var Fldr, i;
Fldr = Log.CreateFolder("Record: " + aqConvert.VarToStr(RecNo));
Log.PushLogFolder(Fldr);
for(i = 0; i < DDT.CurrentDriver.ColumnCount; i++)
Log.Message(DDT.CurrentDriver.ColumnName(i) + ": " + aqConvert.VarToStr(DDT.CurrentDriver.Value(i)));
Log.PopLogFolder();
RecNo = RecNo + 1;
}
// Creates the driver (main routine)
function TestDriver()
{
var Driver;
// Creates the driver
// If you connect to an Excel 2007 sheet, use the following method call:
// Driver = DDT.ExcelDriver("C:\\MyFile.xlsx", "Sheet1", true);
Driver = DDT.ExcelDriver("C:\\MyFile.xls", "Sheet1");
// Iterates through records
RecNo = 0;
Driver.DriveMethod("Unit1.ProcessData")
// Closes the driver
DDT.CloseDriver(Driver.Name);
}
Python
RecNo = 0
#Posts data to the log (helper routine)
def ProcessData():
global RecNo
Fldr = Log.CreateFolder("Record: " + aqConvert.VarToStr(RecNo))
Log.PushLogFolder(Fldr)
for i in range(DDT.CurrentDriver.ColumnCount):
Log.Message(DDT.CurrentDriver.ColumnName[i] + ": " + aqConvert.VarToStr(DDT.CurrentDriver.Value[i]))
Log.PopLogFolder()
RecNo = RecNo + 1
# Creates the driver (main routine)
def TestDriver():
# Creates the driver
# If you connect to an Excel 2007 sheet, use the following method call:
# Driver = DDT.ExcelDriver("C:\\MyFile.xlsx", "Sheet1", True);
Driver = DDT.ExcelDriver("C:\\Users\\Public\\Documents\\TestComplete 11 Samples\\Common\\Data-Driven Testing\\TestBook.xlsx", "TestSheet", True)
# Iterates through records
RecNo = 0
Driver.DriveMethod("Unit1.ProcessData")
# Closes the driver
DDT.CloseDriver(Driver.Name)
VBScript
Dim RecNo
' Posts data to the log (helper routine)
Sub ProcessData
Dim Fldr, i
Fldr = Log.CreateFolder("Record: " + aqConvert.VarToStr(RecNo))
Log.PushLogFolder Fldr
For i = 0 To DDT.CurrentDriver.ColumnCount - 1
Log.Message DDT.CurrentDriver.ColumnName(i) + ": " + aqConvert.VarToStr(DDT.CurrentDriver.Value(i))
Next
Log.PopLogFolder
RecNo = RecNo + 1
End Sub
' Creates the driver (main routine)
Sub TestDriver
Dim Driver
' Creates the driver
' If you connect to an Excel 2007 sheet, use the following method call:
' Set Driver = DDT.ExcelDriver("C:\MyFile.xlsx", "Sheet1", True)
Set Driver = DDT.ExcelDriver("C:\MyFile.xls", "Sheet1")
' Iterates through records
RecNo = 0
Driver.DriveMethod "Unit1.ProcessData"
' Closes the driver
Call DDT.CloseDriver(Driver.Name)
End Sub
DelphiScript
var RecNo;
// Posts data to the log (helper routine)
procedure ProcessData;
var
Fldr, i : OleVariant;
begin
Fldr := Log.CreateFolder('Record: ' + aqConvert.VarToStr(RecNo));
Log.PushLogFolder(Fldr);
for i := 0 to DDT.CurrentDriver.ColumnCount - 1 do
Log.Message(DDT.CurrentDriver.ColumnName[i] + ': ' + aqConvert.VarToStr(DDT.CurrentDriver.Value[i]));
Log.PopLogFolder;
RecNo := RecNo + 1;
end;
// Creates the driver (main routine)
procedure TestDriver;
var
Driver : OleVariant;
begin
// Creates the driver
// If you connect to an Excel 2007 sheet, use the following method call:
// Driver := DDT.ExcelDriver('C:\MyFile.xlsx', 'Sheet1', True);
Driver := DDT.ExcelDriver('C:\MyFile.xls', 'Sheet1');
// Iterates through records
RecNo := 0;
Driver.DriveMethod('Unit1.ProcessData');
// Closes the driver
DDT.CloseDriver(Driver.Name);
end;
C++Script, C#Script
var RecNo;
// Posts data to the log (helper routine)
function ProcessData()
{
var Fldr, i;
Fldr = Log["CreateFolder"]("Record: " + aqConvert.VarToStr(RecNo));
Log["PushLogFolder"](Fldr);
for(i = 0; i < DDT["CurrentDriver"]["ColumnCount"]; i++)
Log.Message(DDT["CurrentDriver"]["ColumnName"](i) + ": " + aqConvert.VarToStr(DDT["CurrentDriver"]["Value"](i)));
Log["PopLogFolder"]();
RecNo = RecNo + 1;
}
// Creates the driver (main routine)
function TestDriver()
{
var Driver;
// Creates the driver
// If you connect to an Excel 2007 sheet, use the following method call:
// Driver = DDT["ExcelDriver"]("C:\\MyFile.xlsx", "Sheet1", true);
Driver = DDT["ExcelDriver"]("C:\\MyFile.xls", "Sheet1");
// Iterates through records
RecNo = 0;
Driver["DriveMethod"]("Unit1.ProcessData");
// Closes the driver
DDT["CloseDriver"](Driver["Name"]);
}
DriveMethod
simplifies the processing, but Next
and EOF
give you more “freedom”: you can exclude certain data from processing either within TestDriver
, or within ProcessData
routine. With DriveMethod
you can exclude data from processing only within the ProcessData
function.
If you need to use several drivers simultaneously, you can assign a name to each driver and then use the DDT.DriverByName
property to obtain the desired driver by its name. This property allows you to avoid using a global variable to store references to the desired driver object. This is especially useful, if you create and use drivers in several units:
JavaScript, JScript
[Unit1.sj]
var drv = DDT.ExcelDriver("C:\\MyFiles\\MyFile.xls", "Sheet1");
drv.Name = "My Driver";
...
[Unit2.sj]
var drv2 = DDT.DriverByName("My Driver");
...
Python
[Unit1.py]
drv = DDT.ExcelDriver("C:\\MyFiles\\MyFile.xls", "Sheet1");
drv.Name = "My Driver";
...
[Unit2.py]
drv2 = DDT.DriverByName("My Driver");
...
VBScript
[Unit1.svb]
Set drv = DDT.ExcelDriver("C:\MyFiles\MyFile.xls", "Sheet1")
drv.Name = "My Driver"
...
[Unit2.svb]
Set drv2 = DDT.DriverByName("My Driver")
...
DelphiScript
[Unit1.sd]
var
drv : OleVariant;
begin
drv := DDT.ExcelDriver('C:\MyFiles\MyFile.xls', 'Sheet1');
drv.Name := 'My Driver';
...
end;
...
[Unit2.sd]
var
drv2 : OleVariant;
begin
drv2 := DDT.DriverByName('My Driver');
...
end;
...
C++Script, C#Script
[Unit1.scs]
var drv = DDT["ExcelDriver"]("C:\\MyFiles\\MyFile.xls", "Sheet1");
drv["Name"] = "My Driver";
...
[Unit2.scs]
var drv2 = DDT["DriverByName"]("My Driver");
...
To address the driver that was created last, you can also use the DDT.CurrentDriver
property.
See Also
Data-Driven Testing
Data-Driven Testing - Basic Concepts
Preparing Data for Data-Driven Testing
DDT Object
DDTDriver Object
Using Excel Files as Data Storages
Using CSV Files as Data Storages
Using Scripts for Data-Driven Testing