9. Object Driven Testing (Тесты, управляемые объектами)

Назад: 8 Работа с базами данных Содержание Дальше: 10 Создание собственных надстроек

Object Driven Testing (тесты, управляемые объектами) – это такой подход к автоматизации тестирования, при котором тестовые скрипты проектируются в виде классов, в которых реализуется логика работы с приложением. Такие скрипты легче создавать и поддерживать, так как в тесткейсах используются лишь методы «высокого уровня», позволяя скрыть подробности реализации тех или иных действий.

В TestComplete есть специальный элемент проекта ODT, который и позволяет представить скрипты в виде классов со свойствами и методами.

Сразу заметим, что в языках JScript/C++Script/C#Script и VBScript вы можете создавать классы, пользуясь только встроенными средствами этих языков. Эти возможности кратко рассмотрены в конце этой главы. А здесь мы рассмотрим возможности объекта ODT.

Использование ODT

Прежде, чем начать использовать ODT, его необходимо добавить в проект. Правый щелчок на имени проекта, Add – New Item, ODT.

После чего в проекте появится новый элемент ODT с двумя дочерними элементами:  Classes и Data.

Структура данных в ODT разделена на классы и данные. Классы содержат свойства (которые могут быть как обычными переменными, так и массивами) и методы (имена методов привязываются к существующим функциям). Данные могу содержать обычные переменные, массивы и объекты классов. В отличие от большинства объектно-ориентированных языков, в ODT есть интересная особенность: объекты класса могут содержать дополнительные (собственные) методы, которые будут доступны только в этом объекте, но не в других объектах этого же класса.

В качестве примера создадим простой класс и объект для Калькулятора.

Дважды щелкнем на элементе Classes в Project Explorer, затем в редакторе справа щелкнем правой кнопкой мыши по элементу Classes и выберем пункт меню New Item. Добавится новый класс NewClass. Нажмем клавишу F2 и переименуем класс в Calculator. Обратите внимание, что теперь у нас стала доступной вкладка Methods. Эта вкладка доступна только тогда, когда в редакторе выделен класс или объект класса.

Если теперь щелкнуть правой кнопкой мыши на имени класса и выбрать пункт меню New Item, то добавится новое свойство:

В колонку Value можно ввести какое-то значение напрямую (строку, число, true/false) или выбрать значение (Array), чтобы создать переменную типа массив. Мы назовем это свойство Result и не будем сейчас присваивать ему никакого значения. Это свойство будет в дальнейшем использовано для хранения результата вычислений.

Теперь выделим в редакторе класс Calculator и перейдем на вкладку Methods. Здесь мы определим 3 метода (правый щелчок мышью, New Item), как показано на скриншоте ниже.

Как уже было сказано, имена методов связываются с существующими функциями в проекте, для чего на вкладке Methods есть колонка Test Procedure. Мы создадим необходимые процедуры позже, а сейчас перейдем к созданию данных (объектов).

Для этого в Project Explorer выберем элемент Data, затем в редакторе данных щелкнем правой кнопкой мыши и выберем пункт меню New item. При этом создастся новая группа NewGroup. Данные (или объекты) в ODT сгруппированы по группам, в каждой группе может хранится сколько угодно объектов. Мы назовем нашу группу CalcGroup, после чего добавим в нее новый элемент (Calc) и свяжем его с классом Calculator, как показано на скриншоте ниже.

Обратите внимание, что как только мы связали объект Calc с классом Calculator, мы сразу видим его свойство Result, которое мы определили для класса. Дополнительно определим еще одно свойство Wnd. С помощью этого свойства мы будем обращаться к главному окну Калькулятора.

Также на вкладке Methods мы можем определить дополнительные методы, которые будут доступны для этого объекта, но не для класса и не для других объектов этого класса.

Выше мы определили 3 метода для класса Calculator и сейчас самое время создать для них тестовые процедуры. Для этого в любом модуле проекта вставим следующий код:

function _CalcStartODT()

{

  TestedApps.calc.Run();

  var wCalc = Sys.Process(“CalcPlus”).Window(“SciCalc”, “Calculator Plus”, 1);

  ODT.Data.CalcGroup.Calc.Wnd = wCalc;

  ODT.Data.CalcGroup.Calc.Result = wCalc.Window(“Edit”, “”, 1).wText;

}

 

function _CalcStopODT()

{

  Sys.Process(“CalcPlus”).Terminate();

}

 

function _CalcCalculateODT(expression)

{

  var i;

  var wCalc = Sys.Process(“CalcPlus”).Window(“SciCalc”, “Calculator Plus”, 1);

  for(i = 0; i < expression.length; i++)

  {

    wCalc.Keys(expression.substr(i, 1));

  }

  wCalc.Keys(“=”);

  This.Result = wCalc.Window(“Edit”, “”, 1).wText;

  return This.Result;

}

Функция _CalcStartODT запускает Калькулятор и присваивает переменной Wnd объекта Calc объект Window(“SciCalc”), который является главным окном Калькулятора, а также присваивает свойству Result значение текстового поля Калькулятора; функция _CalcStopODT закрывает Калькулятор, попросту убивая его процесс; функция _CalcCalculateODT позволяет рассчитать значение переданного выражения с помощью калькулятора. Кроме того, функция _CalcCalculateODT демонстрирует, как можно с помощью ключевого слова This (или Self в случае DelphiScript) из метода обратиться к собственному объекту. Обратите внимание, что в данном случае ключевые слова This и Self необходимо писать с большой буквы, так как аналогичные слова в нижнем регистре (this и self) являются зарезервированными словами в языках программирования.

Функции могут называться как угодно, мы же использовали суффик ODT в их именах просто для наглядности.

Теперь самое время связать методы класса с созданными функциями. Для этого вернемся в список методов созданного ранее класса Calculator и выберем для каждого метода соответствующую функцию, как показано ниже.

Теперь мы готовы написать простой тест, который в Калькуляторе вычисляет значение переданного выражения и результат выводит в лог.

function TestODT()

{

  var calc = ODT.Data.CalcGroup.Calc;

  calc.Start();

  Log.Message(calc.Calculate(“(5+3)*2″));

  Log.Message(ODT.Classes.Calculator.Result);

  calc.Close();

}

Результат работы программы:

Как видите, хотя нам и пришлось потрудится, создавая структуру данных в ODT, соответствующие функции и связывая все эти данные вместе, в результате мы получили очень простой и удобочитаемый скрипт, который легко понять и отредактировать в случае надобности.

Object Driven Testing – это очень мощный инструмент, который позволяет создавать тестовые скрипты высокого класса.

Кроме рассмотренных выше возможностей, TestComplete позволяет создавать классы и объекты ODT динамически (т.е. во время работы скрипта). Если вас интересует эта возможность, обратитесь к справочной системе TestComplete, раздел «Creating Custom Objects Programmatically».

В случае использования JScript/C++Script/C#Script и VBScript подобного эффекта можно добиться и с помощью встроенных возможностей языков. Ниже кратко рассматриваются эти возможности.

ODT и JScript

Язык JScript изначально является объектно-ориентированным, что означает, что в нем также можно создавать объекты и классы. Пример объявления класса со свойствами и объектами в JScript:

function MyClass(arg1)

{

  // создаем свойство 

  this.myProperty = arg1;

 

  // объявляем метод 

  this.method = function(arg2)

  {

    Log.Message(“Method #1. Text: ” + arg2);

  }

}

 

Сама функция MyClass, как видно из примера, выступает в роли конструктора класса, в котором мы присваиваем свойству myProperty переданное значение arg1. И пример использования созданного класса:

function TestJscriptClass()

{

  // создаем объект класса MyClass 

  var myVar = new MyClass(“some value”);

  myVar.method(“val1″); // вызов метода 

  Log.Message(myVar.myProperty);// обращение к свойству 

}

Таким образом можно написать свои классы со свойствами и методами для работы с тестируемым приложением. Подробнее об ООП в JavaScript-e можно узнать здесь.

У TestComplete есть один недостаток, связанный с подобным объявлением классов и методов. Если мы объявляем обычную функцию, а затем используем ее где-то, то мы можем затем легко перейти к её исходному коду из любого места, где используется эта функция, зажав клавишу Ctrl и щелкнув мышью по имени функции. В случае с классами и методами, однако, такой переход невозможен. Кроме того, с непривычки может оказаться тяжело находить в коде место, где произошла ошибка, когда мы дважды щелкаем по ошибке в логе.

ODT и VBScript

VBScript изначально был процедурно-ориентированным языком, но начиная с версии 5.0 в него была добавлена возможность создания классов. Например:

Class MyClass

  Private m_prop

 

  Private Sub Class_Initialize   конструктор 

    Log.Message “Конструктор класса MyClass”

    m_prop = “init value”

  End Sub 

 

  Private Sub Class_Terminate   деструктор 

    Log.Message “Деструктор класса MyClass”

  End Sub 

 

  Public Function Method1

    Method1 = “return value”

  End Function 

 

  Public Property Get MyVar

    MyVar = m_prop

  End Property 

 

  Public Property Let MyVar(value)

    m_prop = value

  End Property 

End Class 

 

И пример использования класса:

Sub TestClass

  Set myvar = New MyClass

  Log.Message myvar.Method1

  Log.Message myvar.MyVar

  myvar.MyVar = 123

  Log.Message myvar.MyVar

  Set myvar = Nothing 

End Sub

Как видите, возможности VBScript в ООП тоже весьма неплохие.

Итог

Из приведенных выше примеров видно, что ни возможности TestComplete, ни встроенные возможности языков, не дают достаточно широких возможностей ООП. Если вы хотите создавать в TestComplete более сложные скрипты, используя более современные языки и среды разработки, обратитесь к главе 5 Присоединяемые и Самотестируемые приложения.

Назад: 8 Работа с базами данных Содержание Дальше: 10 Создание собственных надстроек