7. Data Driven Testing (Тесты, управляемые данными)

Назад: 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 Работа с базами данных