| Назад: 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 Создание собственных надстроек |