| Назад: 6 Keyword Driven Testing | Содержание | Дальше: 8 Работа с базами данных |
Data Driven Testing (Тесты, управляемые данными) – это такой подход к тестированию, при котором тестовые данные хранятся отдельно от скриптов, обычно в документе Excel, файле CSV или в базе данных.
Допустим, нам необходимо создать 10 разных записей с помощью тестируемого приложения, т.е. 10 раз выполнить одни и те же действия с разными данными. Мы можем просто объявить массив, в который поместить все данные, а можем поместить данные в отдельный файл. Преимущество этого подхода в том, что все данные будут храниться в одном месте и когда нам надо будет их просмотреть или отредактировать, мы сможем быстро переключаться между разными данными, а не искать их по всему проекту.
Для работы с подобными данными в TestComplete существует объект DDT, с помощью которого можно создать подключение к файлу Excel, CSV или таблице из базы данных.
Мы подробно рассмотрим лишь один из них (Excel), так как работа с остальными двумя отличается несущественно. В конце этой главы мы вкратце рассмотрим особенности работы с CSV и базами данных при помощи DDT.
Для демонстрации работы с ДДТ мы протестируем несколько базовых операций Калькулятора. Для этого мы создали файл calc.xls и поместили его в папку проекта TestComplete (Stores\Files). В этом файле один лист с такими данными:

Первая колонка (id) – это уникальный идентификатор строки ( в принципе она необязательна). В колонках digit1 и digit2 находятся числа, с которыми мы будем производить операции. Операции указаны в столбце operation. В колонке result находится заранее вычисленный результат, с которым мы будем сравнивать результат в Калькуляторе.
Теперь рассмотрим процесс вычитки данных из файла с помощью ДДТ. Сначала необходимо создать подключение к файлу:
var ddtExcel = DDT.ExcelDriver(Project.Path + “\\Stores\\Files\\calc.xls”, “Table1”, true);
В параметрах мы передаем полное имя файла, имя листа в файле и третий параметр UseACEDriver. Если параметр UseACEDriver=true, это дает возможность работать с файлами, созданными как в MS Office 2007, так и в более ранних версиях Office. Если же этот параметр равен false, то для доступа к данным будет использован драйвер ODBC, который не поддерживает работу с файлами Office 2007.
Теперь переменная ddtExcel содержит всю информацию из листа Table1, а указатель стоит на первой строке. Нам остается лишь считать данные из этого объекта.
Работа с данными происходит так: указатель находится на первой строке и мы имеем возможность с помощью свойств и методов объекта DDTDriver считать данные из любой колонки первой строки.
Затем мы перемещаем указатель на следующую строку и так же считываем данные из нее. Таким образом мы двигаемся по строкам, пока не достигнем конца файла. Первая строка файла содержит имена колонок, поэтому первая строка DDTDriver-a соответствует второй строке в файле.
Для доступа к данным в строке используется свойство Value. Это свойство принимает один параметр – имя колонки, из которой необходимо считать значение. Следующий пример считывает значение из первой строки данных, колонка digit1.
function TestDDT()
{
var ddtExcel = DDT.ExcelDriver(Project.Path + “\\Stores\\Files\\calc.xls”, “Table1”, true);
Log.Message(ddtExcel.Value(“digit1”));
DDT.CloseDriver(ddtExcel.Name);
}
Обратите внимание на последнюю строку кода – она закрывает ранее открытый драйвер. Это необходимо делать всегда, так как количество открытых драйверов ДДТ ограничено.
Этот пример выведет нам в лог число 12 – именно такое число у нас находится в ячейке B2. Таким же образом можно узнать количество колонок и имя любой колонки по ее номеру. Например:
function TestDDT()
{
var ddtExcel = DDT.ExcelDriver(Project.Path + “\\Stores\\Files\\calc.xls”, “Table1”, true);
Log.Message(ddtExcel.ColumnCount);
Log.Message(ddtExcel.ColumnName(0));
DDT.CloseDriver(ddtExcel.Name);
}
Этот скрипт выведет в лог цифру 5 (количество колонок) и слово id – имя первой колонки. Обратите внимание, что нумерация колонок начинается с нуля.
Метод Next позволяет переместиться на следующую строку, а метод EOF позволяет определить, достигнут ли конец файла. В качестве примера считаем все значения из столбца result.
function TestDDT()
{
var ddtExcel = DDT.ExcelDriver(Project.Path + “\\Stores\\Files\\calc.xls”, “Table1”, true);
while(!ddtExcel.EOF())
{
Log.Message(“Row #” + ddtExcel.Value(“id”) + “: ” + ddtExcel.Value(“result”));
ddtExcel.Next();
}
}
Результат работы скрипта:

Теперь напишем скрипт, который будет считывать данные, выполнять необходимые действия и затем выполнять проверку полученного значения. Если результат в Калькуляторе отличается от ожидаемого результата, будет выведено сообщение об ошибке. Специально для того, чтобы продемонстрировать выведение ошибки, мы ввели один неправильный ответ (в 6ой строке результат должен быть 125, а не 1255).
function TestDDT()
{
var ddtExcel = DDT.ExcelDriver(Project.Path + “\\Stores\\Files\\calc.xls”, “Table1”, true);
var sKey, sRes, sExpRes;
var wnd = Sys.Process(“calc”).Window(“SciCalc”, “Calculator Plus”);
// очищаем предыдущие вычисления
wnd.Activate();
wnd.Keys(“[Esc]”);
while(!ddtExcel.EOF())
{
sKey = ddtExcel.Value(“digit1”);
wnd.Keys(sKey);
sKey = ddtExcel.Value(“operation”);
wnd.Window(“Button”, sKey).Click();
sKey = ddtExcel.Value(“digit2”);
// если второе число не указано, то вводить его не надо
// и кнопку = наживать тоже не надо, иначе действие выполнится дважды
if(sKey != null)
{
wnd.Keys(sKey);
wnd.Window(“Button”, “=”).Click();
}
// сравнение ожидаемого и полученного результатов
sExpRes = ddtExcel.Value(“result”);
sRes = wnd.Window(“Edit”, “”, 1).wText.split(“.”)[0];
if(sExpRes != sRes)
{
Log.Error(“Wrong result, see remarks”, “Expected: ” + sExpRes + “\nActual: ” + sRes);
}
ddtExcel.Next();
}
DDT.CloseDriver(ddtExcel.Name);
}
Здесь мы показали, как можно пройтись по всем записям в DDT таблице с помощью цикла while и метода EOF. Однако в TestComplete есть более удобное средство для этого: метод DriveMethod. С его помощью можно избавиться от цикла и проверки конца файла. Для этого необходимо в метод DriveMethod в качестве параметра передать имя функции, которую необходимо выполнить для каждой строки. Тогда функция считывания данных и выполнения операций в Калькуляторе будет выглядеть так:
function TestDDT2()
{
var sKey, sRes, sExpRes;
var wnd = Sys.Process(“calc”).Window(“SciCalc”, “Calculator Plus”);
// очищаем предыдущие вычисления
wnd.Activate();
wnd.Keys(“[Esc]”);
sKey = DDT.CurrentDriver.Value(“digit1”);
wnd.Keys(sKey);
sKey = DDT.CurrentDriver.Value(“operation”);
wnd.Window(“Button”, sKey).Click();
sKey = DDT.CurrentDriver.Value(“digit2”);
// если второе число не указано, то вводить его не надо
// и кнопку = наживать тоже не надо, иначе действие выполнится дважды
if(sKey != null)
{
wnd.Keys(sKey);
wnd.Window(“Button”, “=”).Click();
}
// сравнение ожидаемого и полученного результатов
sExpRes = DDT.CurrentDriver.Value(“result”);
sRes = wnd.Window(“Edit”, “”, 1).wText.split(“.”)[0];
if(sExpRes != sRes)
{
Log.Error(“Wrong result, see remarks”, “Expected: ” + sExpRes + “\nActual: ” + sRes);
}
}
А сам вызов этой функции будет выглядеть таким образом:
function TestDriveMethod()
{
var ddtExcel = DDT.ExcelDriver(Project.Path + “\\Stores\\Files\\calc.xls”, “Table1”, true);
ddtExcel.DriveMethod(“Unit1.TestDDT2”);
DDT.CloseDriver(ddtExcel.Name);
}
Обратите внимание, что имя функции, которое передается в метод DriveMethod должно иметь полный вид (имя_модуля.имя_функции), а для доступа к текущему драйверу DDT в функции TestDDT2 используется свойство CurrentDriver.
Работа с CSV файлами ничем не отличается от работы с файлами Excel, с той лишь разницей, что при создании подключения не нужно передавать имя таблицы (так как файл один и таблиц там нет в принципе: CSV имеет обычный текстовый формат, данные в нем отделены запятыми).
При работе с ADO драйвером вместо имени файла передается строка подключения (connection string) и имя таблицы. Если вы хотите подключиться через ADO драйвер к локальному файлу, то имя файла будет задано в строке подключения вместе с другими параметрами.
Например, в следующем примере мы подключимся к файлу Excel с помощью ADO. Для этого мы внесем изменения в использованную выше функцию TestDriveMethod, при этом никаких изменений в функции TestDDT2 делать не нужно!
function TestDriveMethod()
{
var sConnStr = “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\calc.xls;Extended Properties=’Excel 8.0;HDR=Yes;IMEX=1′;”;
var ddtExcel = DDT.ADODriver(sConnStr, “[Table1$]”);
ddtExcel.DriveMethod(“Unit1.TestDDT2”);
DDT.CloseDriver(ddtExcel.Name);
}
Примеры строк подключения к разным базам данных можно найти на сайте http://connectionstrings.com/ , откуда мы и взяли пример строки подключения к Excel файлу. Обратите внимание на символ $ в конце имени таблицы: без него при попытке подключения произойдет ошибка!
Еще раз напоминаем, что каждый открытый драйвер необходимо закрывать с помощью метода CloseDriver, так как одновременно не может быть открыто более 64 драйверов. При попытке открыть 65й драйвер TestComplete выдаст ошибку.
И еще один момент, связанный с файлами Excel. Для того, чтобы работать с файлами Excel через ДДТ драйвер, необходимо чтобы структура листа Excel была такой же, как у базы данных (т.е. данные должны располагаться строго по строкам и столбцам). Если в файле из нашего примера ввести какой-то текст в ячейку G20, то считать значение из нее с помощью ДДТ будет невозможно!
Для того чтобы узнать, как работать с excel-файлами с произвольно расположенными данными, обратитесь к главе 14.3 Работа с MS Excel через COM.
При использовании драйвера ДДТ вы можете только считывать данные из файлов, но не записывать их туда.
| Назад: 6 Keyword Driven Testing | Содержание | Дальше: 8 Работа с базами данных |