Первое впечатление: Rational RobotJ 1.0

Томас Р. Арнолд II (Tom Arnold), Xtend Development

Оглавление

Введение

Компания Rational Software попросила меня поделиться впечатлениями об их новом продукте - Rational RobotJ. Они сделали это по двум причинам. Наиболее очевидная из них состоит в том, что я длительное время принимаю участие в проектах автоматизации систем тестирования, и часто наблюдал за методами, использовавшимися в подобных прикладных программах, в том числе и неправильными. Вторая причина в том, что я никогда не использовал Rational Robot или его модели Test Manager. Обладая опытом в области автоматизации, я смогу свежим взглядом оценить решения, применяемые Rational для автоматизации тестирования программного обеспечения.

Получив бета-копию Rational RobotJ, я горел желанием поскорее приступить к выяснению, что нового этот продукт Rational привнес в методы тестирования программного обеспечения. Как автор сценариев автоматизации Rational Visual Test с многолетним опытом, я хотел видеть, как поведет себя этот программный пакет при тестировании приложений, основанных на веб-технологиях.

После нескольких минут, потребовавшихся на установку пакета, предварительного знакомства с интерфейсом и обычных в таких случаях попыток выяснить "что есть что", я решил начать серьезное изучение и нажал кнопку Record new RobotJ script (Записать новый сценарий RobotJ) на панели инструментов. "А что, - подумал я про себя. - Давай посмотрим, насколько обширный сценарий создает эта программа, если она пытается не только точно записывать мои действия, но и синхронизировать их между собой для обеспечения корректной работы при воспроизведении". Я был немного циничен, когда приступал к изучению инструментария записи и воспроизведения.

Мною двигало желание узнать больше о возможностях этого программного пакета, даже несмотря на то, что сам я был приверженцем старого доброго метода кодирования "на скорую руку". Тем не менее, применение регистратора - один из лучших способов изучать системы автоматизации и оптимальные методы их использования. Оказалось, как вы скоро увидите, что использование регистратора было (и остается) не просто великолепным способом получения дополнительной информации о RobotJ. Это инструмент, которым по предположениям Rational Software большинство разработчиков будут создавать свои сценарии тестирования. И с этой задачей он также справляется превосходно.

Предпосылки

До меня дошли слухи, циркулировавшие среди коллег, занимающихся автоматизированным тестированием, что Rational Software готовилась к выпуску нового продукта, ориентированного на тестирование веб-приложений на основе HTML и Java. К тому же Java использовался там в качестве языка программирования, позволяя использовать обычные преимущества объектно-ориентированного программирования. Мне хотелось увидеть результаты работы этой программы как можно скорее. Поэтому я не мог дождаться того момента, когда эта новая программно-ориентированная "игрушка" попадет ко мне в руки.

Долгое время в работе по автоматизации тестирования программного обеспечения и описанию этого процесса моей любимой программой был пакет Rational Visual Test. Похожий на Visual Basic язык программирования этой программы делал сам процесс программирования простым, а расширенные возможности работы с указателями для сложных структур данных создавали дополнительные удобства в работе. К тому же, начиная с версии 6, в Visual Test была добавлена функция тестирования веб-страниц. Эта возможность работала великолепно и сейчас работает, но она добавлена к инструменту тестирования, который изначально спроектирован только для тестирования программ Microsoft Windows. Visual Test создавался как полное, комплексное средство автоматизации тестирования программного обеспечения, и будьте уверены, он останется таким на долгие годы.

Я до сих пор использую VT, даже для решения нетестовых задач. Но когда в тот момент готовилось к выпуску новое программное решение, ориентированное исключительно на тестирование веб-приложений, мне действительно захотелось ознакомиться с его возможностями, и возник подлинный интерес к тому, как язык Java используется для написания сценариев

Я всегда старался обучать своих студентов и клиентов передовым методам программирования, а также принципам создания объектно-ориентированных сценариев, ограничения доступа к данным, инкапсуляции и простых форм наследования, реализуемых даже не в таком объектно-ориентированном языке. Эти методы хороши, но использование объектно-ориентированного языка не просто дает возможность их применения, а вынуждает их использовать. Вот почему я доволен тем, что в RobotJ в качестве языка программирования используется Java.

Тестирование

Я предполагал, что начну с чего-нибудь несложного: щелкну несколько ссылок, проверю работоспособность линейки прокрутки окна браузера, доступность ссылок, находящихся вне экрана и время задержки между загрузками страниц. Но затем мои мысли пошли по другому пути: если проводится тест-драйв нового автомобиля, для которого обещан мощный двигатель и спортивная подвеска, то буду ли я, сев в машину, проверять работу указателей поворота и настраивать на приемнике национальный радиоканал? Ну, положим, так оно и есть. Но, кроме того, я определенно должен захотеть проехать на этой машине и найти множество способов испытать ее возможности, даже слушая при этом программу " О чем говорит страна " на национальном государственном канале.

Вероятно, я не стал получать слишком много сведений при первом запуске, поскольку мне не хотелось, чтобы "машина врезалась в стену". Я только хотел, чтобы записанный мною сценарий действительно заработал, и был настроен немного скептически относительно работоспособности записанного сценария без дополнительной корректировки. Итак, я нажал кнопку "запись" и проделал следующие операции.

  1. Запустил браузер, установленный по умолчанию (Microsoft Internet Explorer 6.0).
  2. Назвал тест " First_one" (вы увидите упоминание о нем в коде).
  3. Запустил приложение, указав URL (www.xtenddev.com).
  4. Нажал ссылку перехода на страницу поисковой машины Xtend Development.
  5. Указал в строке поиска, какую информацию необходимо найти ("Rational").
  6. Перешел по ссылкам к требуемому товару ("VT6 InDepth Videos" - видеокурс "VT6 InDepth").
  7. Добавил товар в корзину (картинка "buy.gif").
  8. Нажал кнопку "Check Out" ("Оформить сделку") для осуществления сделки.
  9. Заполнил форму, требуемую для выписки счета.
  10. Подтвердил заказ товара на собственном сервере транзакций.
  11. Вышел из браузера.

Ожидаемые результаты

Я, как программист автоматизированных систем тестирования, имел предвзятое мнение о том, что можно ожидать от работы с регистратором RobotJ. Эта точка зрения сформировалась в процессе работы с Visual Test и другими автоматизированными системами тестирования. Я ожидал возникновения некоторых проблем, а именно.

  • Совместимость: Прежде всего, я беспокоился о совместимости тестируемого пакета с Microsoft Internet Explorer 6.0. Microsoft часто выпускает обновления своего браузера, и мне было интересно, способен ли RobotJ поддерживать наиболее свежие версии. Rational должна была использовать внутренние объектные модели, представленные интерфейсом программирования приложений IE, но так поступала команда разработки Visual Test, и внутренние функции Microsoft не всегда работали как ожидалось, в результате группе разработки требовалось применение обходных маневров. Мне представлялось, что те же сложности должны были возникнуть у разработчиков RobotJ.
  • Размер сценария: Я беспокоился за размер сценария, который мог быть сгенерирован с многочисленными задержками, возникшими из-за попыток эмулирования пауз, допущенных мною при вводе данных и нажимании ссылок. Также ожидалось появления многочисленных команд проверки размера и расположения окна браузера, разрешения экрана и других параметров, которые были бы явно избыточными и чрезмерно удлиняющими сценарий.
  • Проблемы, связанные с задержкой ответа сервера: Я ожидал, что сценарий будет работать только при идеальных условиях, когда ответ сервера совпадал по времени или опережал следующую сгенерированную команду. Я не сомневался, что при запаздывании ответа сервера потребуется тонкая настройка сценария с применением дополнительного кодирования для добавления пауз в определенных точках, например, после нажатия ссылки, для осуществления перехода с текущей страницы.

Фактические результаты

Полученные результаты, против ожидания, были приятным сюрпризом.

  • Совместимость: При нажатии ссылок, вводе данных в многочисленные <input type=text> окна управления, использовании <textarea> элементов управления, <select><option> выпадающих меню, <input type=submit> кнопок, отправляющих формы методами post и get, а также прочих возможностей - все внешне работало безошибочно. Я еще не экспериментировал с другими браузерами, но был обрадован корректным распознаванием и, что более важно, успешным обнаружением при воспроизведении тестируемой веб-страницы большого числа разнообразных органов управления.
  • Компактность кода: Созданный код был компактным и читабельным. Благодаря преимуществам базового класса "Helper", все внешние коды были скрыты, для просмотра остался доступен только основной код, который меня и интересовал. Как и ожидалось, для оказания помощи программисту, занимающемуся автоматизацией, в каждую строку кода были добавлены комментарии. Кроме того, в качестве комментариев там также была включена дополнительная информация, которую я не ожидал увидеть, особенно данные, записанные в файл при нажатии кнопки Place Order Now. (Замечательная функция!)
  • Синхронность: Поскольку паузы и задержки не были явно добавлены в код, а распознавание всех управляющих элементов выполнял базовый класс "Helper", действия с управляющим элементом обрабатывались только после их обнаружения. Если произошло какое-то действие, сценарий проверяет, были ли заполнены какие-либо формы или нажаты соответствующие элементы управления. Сценарий постоянно находится в режиме ожидания, пока полностью не загрузится страница или пока пользователь не ознакомится с органами управления и ссылками, имеющимися на странице, и не совершит какое-либо действие.

Чтобы получить образец кода, я попытался создать пример сценария, упомянутого на первых страницах этого документа. Сгенерированный код представлен на следующей странице в Распечатке 1. (Примечание: для повышения удобочитаемости документ пришлось подвергнуть незначительному форматированию, заключавшемуся в удалении некоторых автоматически добавленных комментариев). Я потрачу несколько следующих страниц, чтобы сравнить использование RobotJ для генерации этого сценария с известными программами, а также обсудить некоторые ключевые аспекты созданного сценария и затем проанализировать результаты его выполнения.

Распечатка 1
import resources.First_oneHelper;
import com.rational.test.ft.*;
import com.rational.test.ft.object.interfaces.*;
import com.rational.test.ft.script.*;
import com.rational.test.ft.value.*;
import com.rational.test.ft.vp.*;
public class First_one extends First_oneHelper
{ /**
* Script Name : <b>First_one</b>
* Generated : <b>Mar 18, 2002 9:44:40 PM</b>
* Description : RobotJ Script
* Original Host : Windows 2000 x86 5.0
* Original Host : WinNT Version 5.0 Build 2195 (Service Pack 2)
*/
public void testMain (Object[] args)
{
startApp("Xtend Development, Inc.");
consultingsmjpg_textVP().performTest();
// Document: Xtend Development, Inc.: http://www.xtenddev.com/
Link_SiteMap().click();
Link_SearchEngine().click();
Text_query().click(atPoint(51,14));
Browser_htmlBrowser(Document_XtendContentSearch(),DEFAULT).inputKeys("rational");
Button_Submit().click();
Link_XtendOnDemandVideoLibrary().click();
Document_XtendOnDemandVideoLib().drag(atPoint(754,247),atPoint(753,450));
Link_VisualTest6Indepth().click();
Document_VT6InDepthVideos().drag(atPoint(755,137),atPoint(754,203));
Image_buygif().click();
Button_CheckOutsubmit().click();
Text_name().click(atPoint(29,13));
name_textVP().performTest();
Text_name().click(atPoint(35,10));
Browser_htmlBrowser(Document_OrderConfirmationForm(),DEFAULT).inputKeys(
"Thomas Arnold");
Browser_htmlBrowser(Document_OrderConfirmationForm(),DEFAULT).inputKeys(
"{Tab}Xtend Development, Inc.{Tab}206-938-2370{Tab}206-932-8797");
Browser_htmlBrowser(Document_OrderConfirmationForm(),DEFAULT).inputKeys(
"{Tab}206-938-1191{Tab}tom@xtenddev.com{Tab}tom@xtenddev.com{Tab}");
Browser_htmlBrowser(Document_OrderConfirmationForm(),DEFAULT).inputKeys(
"4742 42nd Avenue SW{Tab}#621{Tab}Seayt{BKSP}{BKSP}ttle{Tab}WA");
Browser_htmlBrowser(Document_OrderConfirmationForm(),DEFAULT).inputKeys(
"{Tab}98116{Tab}{Tab}{Tab}{Tab}{Tab}");
Document_OrderConfirmationForm().drag(atPoint(754,178),atPoint(731,301));
Text_CCNum().click(atPoint(14,9));
Browser_htmlBrowser(Document_OrderConfirmationForm(),DEFAULT).inputKeys(
"{Num4}{Num3}{Num8}{Num8}{Num5}{Num4}{Num3}{Num0}{Num2}{Num3}");
Browser_htmlBrowser(Document_OrderConfirmationForm(),DEFAULT).inputKeys(
"{Num7}{Num2}{Num0}{Num3}{Num5}{Num7}");
List_Expiremonth().click();
List_Expiremonth().click(atText("05"));
Document_OrderConfirmationForm().drag(atPoint(752,364),atPoint(752,444));
List_shippingid().click();
List_shippingid().click(atText("United States (lower 48 states) (Overnight) $36.00"));
Text_Comments().click(atPoint(154,58));
Browser_htmlBrowser(Document_OrderConfirmationForm(),DEFAULT).inputKeys(
"This is a test order. Delete it!{Enter}");
Document_OrderConfirmationForm().drag(atPoint(752,356),atPoint(753,478));
Button__PLACEORDERNOWsubmit().click();
CloseWindow_textVP().performTest();
// Document: Xtend / Purchase Completed:
//http://www.xtenddev.com/purchase_completed.asp?name=Thomas+Arnold
//&company=Xtend+Development%2C+Inc%2E&email1=tom%40xtenddev%2Ecom
//&address1=4742+42nd+Avenue+SW&address2=%23621&city=Seattle&state=WA […some deleted…]
Link_CloseWindow2().click();
Dialog_HtmlDialogButtonYes().click();
}
}

Порядок создания сценария

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

Добро пожаловать в Rational RobotJ

Как уже упоминалось, RobotJ - это новейшая разработка Rational Software, предназначенная для тестирования Java- или веб-приложений, работающих на платформах Microsoft Windows и Unix. 4 RobotJ встраивается в открытую интегрированную среду разработки (Integrated Development Environment, IDE) фирмы IBM, известную как Eclipse. Используя IDE-среду IBM, как показано на рис.1, RobotJ оказывается в одном ряду с другими программными решениями, разрабатываемыми Rational Software и прочими производителями, которые обеспечивают простую интеграцию инструментария в общий интерфейс.

Рисунок 1: RobotJ использует открытую интегрированную среду разработки (IDE) фирмы IBM, известную как Eclipse.

Перед запуском процедуры создания тестового сценария RobotJ необходимо подготовить контейнер, где может быть сохранен этот сценарий. Этот контейнер называется Data Store (Хранилище данных). Такой файл проекта должен создаваться в первую очередь, перед совершением любых последующих операций. На рисунке 1 видно, что я создал хранилище данных, назвав его tomsrobotjdatastore (оригинально, не правда ли?). В этом хранилище данных находится первый записанный сценарий, First_one, показанный на распечатке 1. Я опустил описание шагов по созданию хранилища данных, поскольку хотел сконцентрировать внимание на сути программы RobotJ.

Подготовка к записи

Первым шагом, сделанным мной при подготовке к записи автоматизированного сценария, был запуск Configuration Editor (Редактора конфигураций), показанного на рис. 2 на следующей странице. Это диалоговое окно открывается после того, как в RobotJ в меню Configure (Конфигурирование) выбран пункт Configure Applications for Testing (Конфигурирование приложений для тестирования). Оказавшись в диалоговом окне, я нажал кнопку Add (Добавить), при этом было предложено выбрать, что именно будет тестироваться: приложение Java, приложение HTML или программа Windows.

В этом примере я создал запись для моего веб-сайта, расположенного по адресу. Это даст мне возможность выбрать свое приложение из списка приложений, поддерживаемых редактором конфигураций, как только появится интерфейс записи.

Рисунок 2: Необходимо ввести начальную информацию о приложении, которое будет тестироваться с помощью RobotJ. Эта информация используется регистратором и позволяет указывать приложения, подлежащие тестированию.

Запись нового сценария RobotJ

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

Я запустил процесс, щелкнув кнопку Record New RobotJ (Новая запись RobotJ), расположенную на панели инструментов прямо под меню Script (Сценарий), как показано на рис.3. Это привело к появлению диалогового окна, приглашающего ввести имя сценария. Свой пример я озаглавил "First_one" (недопустимы пробелы и любые символы, кроме букв и цифр) и нажал кнопку Finish, чтобы начать сеанс записи.

Появились постоянно активное окно, озаглавленное Recording (Запись) и панель инструментов с обилием забавно оформленных кнопок, их внешний вид показан на рис.4. Это окно позволило мне контролировать ключевые аспекты записи сценария.

Рисунок 3: Красная кнопка, расположенная на панели инструментов прямо под меню Script запускает регистратор.

Рисунок 4: Окно "Recording" отображается все время, пока работает регистратор RobotJ.

Я нажал четвертую слева кнопку в окне Recording, показанном на рис.4. Это была кнопка Start Application (Запустить приложение), которая не принесла никаких сюрпризов и вызвала появление диалогового окна Start Application. Данное диалоговое окно, содержащее список приложений, было сконфигурировано ранее с помощью Configuration Editor. Как показано на рис.5, я выбрал приложение, которое требовалось протестировать, и нажал кнопку Ok.

Если бы я остановил регистратор в этот момент, то сгенерированный сценарий выглядел бы так, как показано в распечатке 2.

Рисунок 5: Диалоговое окно Start Application может быть вызвано нажатием кнопки Start Application на панели инструментов в окне Recording.

Распечатка 2
import resources.First_oneHelper;
import com.rational.test.ft.*;
import com.rational.test.ft.object.interfaces.*;
import com.rational.test.ft.script.*;
import com.rational.test.ft.value.*;
import com.rational.test.ft.vp.*;
public class First_one extends First_oneHelper
{
public void testMain (Object[] args)
{
startApp("Xtend Development, Inc.");

Первые шесть строк созданы секретным модулем RobotJ, доступным для пользователей в форме Java-пакетов, представляющих собой сгруппированные программные интерфейсы приложений. Все пакеты и выполняемые ими функции перечислены в таблице 1.

Пакет Rational RobotJ Описание
Resources.First_oneHelper Класс, создаваемый автоматически на основе пользовательского интерфейса тестируемых приложений
Com.rational.test.ft Базовые классы исключений, используемые RobotJ
Com.rational.test.ft.object.interfaces Классы, взаимодействующие с тестируемым программным обеспечением
Com.rational.test.ft.script Классы, управляющие сценарием тестирования
Com.rational.test.ft.value Интерфейсы доступа и управления значениями
Com.rational.test.ft.vp Интерфейсы, представляющие контрольные точки

Таблица 1: Основные пакеты, включаемые в сценарии, созданные с помощью функций регистратора.

Самым первым элементом является класс Resources.First_oneHelper. Этот класс создается, когда регистратор анализирует подлежащее тестированию приложение. Для каждого элемента управления в интерфейсе пользователя создается отдельный метод, при этом используется имя соответствующего элемента управления. Этот метод в дальнейшем может быть использован для взаимодействия с этим элементом управления. Поскольку объектно-ориентированное программирование используется в RobotJ тем способом, которым оно и должно использоваться, каждый элемент управления становится черным ящиком, и любые изменения в классе не оказывают или почти не оказывают влияние на используемый метод. Описание остальных пакетов имеется в расширенной интерактивной справочной системе, поставляемой с RobotJ.

Вновь обратимся к распечатке 2. После операторов "import" идут следующие строки:

public class First_one extends First_oneHelper
{
public void testMain (Object[] args)
{
startApp("Xtend Development, Inc.");

Первая строка определяет новый класс (First_one) на основе автоматически созданного класса First_oneHelper. Класс First_oneHelper был создан, когда RobotJ анализировал подлежащее тестированию приложение и создал ряд методов, обеспечивающих упрощенный доступ к прикладным элементам управления. (Класс First_oneHelper сам определяется на основе базового класса RobotJ Helper). В рамках этого нового класса First_one создается метод testMain(). Первая команда в функции testMain() обращается к startApp() с параметром, соответствующим записи, созданной мною в редакторе конфигураций ("Xtend Development, Inc."). Если теперь изменить местоположение приложения (например, ввести другой URL), то будет необходимо всего лишь поправить значения, введенные в редактор конфигураций, и сценарий продолжит работу.
Следующая строка сценария определяет окно браузера, которое было создано при вызове команды startApp(). (Я перешел в это окно, чтобы проверить смену фокуса.)

Browser_htmlBrowser(Document_XtendDevelopmentInc(),DEFAULT).click(
atPoint(382,11));

Приложение запущено и выполняется; теперь необходимо проверить, что я нахожусь именно там, куда собирался попасть.

Добавление контрольных точек

Для контроля синхронизации сценария в него могут быть добавлены контрольные точки (VP). Эту операцию можно выполнить в окне Recording, показанном на рис.4 (пятая кнопка слева). Нажатие кнопки VP вызывает диалоговое окно, показанное на рис.6.

В этом диалоговом окне имеется три закладки. Первая вкладка позволяет щелкать и перетаскивать идентификатор на объект, используемый в процессе контроля.

Рисунок 6: Контрольные точки помогают удостовериться, что вы находитесь там, где думаете.

Вторая вкладка из показанных на рис.6, отображает каждый объект иерархически, так, как RobotJ отображает их в браузере. Чтобы проверить, что я нахожусь на домашней странице Xtend Development, я выбрал рисунок consultingsm.jpg, единственный на этой странице. Если RobotJ найдет указанный рисунок в данной точке сценария, то можно быть уверенным, что все идет по плану.

На третьей вкладке изображен указательный палец с секундомером, с ее помощью можно добавлять задержки в сценарий. Такая задержка может быть настроена на ожидание появления определенного управляющего элемента. Если указанный элемент управления не появляется, а заданный период времени истек, возникает исключение "пропущен", в результате которого RobotJ регистрирует ошибку в журнале.

Нажав кнопку диалогового окна Next, показанного на рис.6, можно перейти к заключительному диалогу, допускающему тонкую настройку контрольной точки, как показано на рис.7.

Рисунок 7: Заключительный шаг при добавлении контрольной точки (VP) в записываемый сценарий.

Выполняется настройка значений, после чего нажатие кнопку Finish позволяет добавить контрольную точку в сценарий и возобновить запись:

consultingsmjpg_textVP().performTest();

(Обратите внимание, что имя объекта, используемого в контрольной точке, применяется для создания объекта consultingsmjpg_textVP() с наследуемым методом performTest()). Не существует каких-либо правильных или неправильных мест для расположения контрольных точек. Обычно контрольные точки добавляются тогда, когда происходят основные переходы, так, чтобы выполнение могло быть остановлено в ту же минуту, как только стало понятно, что не все идет по плану.

Схемы тестируемых объектов

Регистратор RobotJ хранит рабочие копии всех объектов, задействованных во время сеанса записи. Большинство этих объектов помещается в группу с названием Test Object Map (Схема тестируемого объекта).

Другие элементы, например, те, что созданы в процессе определения контрольной точки, добавляются в раздел Verification Points (Контрольные точки).

В схеме тестируемого объекта отслеживаются все характеристики объекта, включая его имя, тип, родительские элементы, одноранговые элементы и прочие свойства. Имя элемента также используется для создания функций или методов, используемых сценарием для взаимодействия с объектом.

Поскольку RobotJ не учитывает каких бы то бы ни было атрибутов объекта, то даже если его свойства изменяются в процессе разработки, велика вероятность, что сценарий продолжит работать без возникновения ошибки. Тем не менее, предупреждения будут регистрироваться в журнале, позволяя инженеру по автоматизации преобразовать объект и установить 100% для значения соответствия в RobotJ.

На рис.8 приведена схема объекта, созданная в результате выполнения созданного мною сценария. Обратите внимание, что, несмотря на то, что на страницах, которые я посетил в процессе создания сценария, присутствовали сотни объектов, в схему включены только те из них, которые я использовал.

Здесь не показана возможность управления весовыми коэффициентами, применяемыми к различным свойствам управляющего элемента в процессе поиска совпадений программой RobotJ. Эти весовые коэффициенты позволяют разработчику сценария указать, на что RobotJ должен обратить внимание, а что менее важно, когда в процессе выполнения сценария осуществляется поиск соответствующего элемента управления. Это просто великолепно: прерывания сценариев происходят значительно реже.

Рисунок 8: Все объекты в тестируемом приложении преобразованы в функцию или метод, вызываемые из сценария автоматизации.

Заключительная часть кода

Остальная часть исходного кода, сгенерированного регистратором, довольно проста, особенно теперь, когда вам понятно, откуда берутся имена функций. Записанный сценарий, по сути дела, самодокументирован, хотя RobotJ всюду любезно добавляет вспомогательные комментарии. Заключительные строки кода представлены в распечатке 3 (некоторые комментарии удалены для экономии места).

Распечатка 3
Link_SiteMap().click();
Link_SearchEngine().click();
Text_query().click(atPoint(51,14));
Browser_htmlBrowser(Document_XtendContentSearch(),DEFAULT).inputKeys("rational");
Button_Submit().click();
Link_XtendOnDemandVideoLibrary().click();
Document_XtendOnDemandVideoLib().drag(atPoint(754,247), atPoint(753,450));
Link_VisualTest6Indepth().click();
Document_VT6InDepthVideos().drag(atPoint(755,137),atPoint(754,203));
Image_buygif().click();
Button_CheckOutsubmit().click();
Text_name().click(atPoint(29,13));
name_textVP().performTest();
Text_name().click(atPoint(35,10));
Browser_htmlBrowser(Document_OrderConfirmationForm(),DEFAULT).inputKeys("Thomas
Arnold");
Browser_htmlBrowser(Document_OrderConfirmationForm(),DEFAULT).inputKeys("{Tab}Xtend
Development, Inc.{Tab}206-938-2370{Tab}206-932-8797");
Browser_htmlBrowser(Document_OrderConfirmationForm(),DEFAULT).inputKeys("{Tab}206-938-1191{Tab}tom@xtenddev.com{Tab}tom@xtenddev.com{Tab}");
Browser_htmlBrowser(Document_OrderConfirmationForm(),DEFAULT).inputKeys("4742 42nd
Avenue SW{Tab}#621{Tab}Seayt{BKSP}{BKSP}ttle{Tab}WA");
Browser_htmlBrowser(Document_OrderConfirmationForm(),DEFAULT).inputKeys("{Tab}98116{Ta
b}{Tab}{Tab}{Tab}{Tab}");
Document_OrderConfirmationForm().drag(atPoint(754,178),atPoint(731,301));
Text_CCNum().click(atPoint(14,9));
Browser_htmlBrowser(Document_OrderConfirmationForm(),DEFAULT).inputKeys("{Num4}{Num3}{
Num8}{Num8}{Num5}{Num4}{Num3}{Num0}{Num2}{Num3}");
Browser_htmlBrowser(Document_OrderConfirmationForm(),DEFAULT).inputKeys("{Num7}{Num7}{
Num0}{Num3}{Num5}{Num7}");
List_Expiremonth().click();
List_Expiremonth().click(atText("05"));
Document_OrderConfirmationForm().drag(atPoint(752,364),atPoint(752,444));
List_shippingid().click();
List_shippingid().click(atText("United States (lower 48 states) (Overnight) $36.00"));
Text_Comments().click(atPoint(154,58));
Browser_htmlBrowser(Document_OrderConfirmationForm(),DEFAULT).inputKeys("This is a
test order. Delete it!{Enter}");
Document_OrderConfirmationForm().drag(atPoint(752,356),atPoint(753,478));
Button__PLACEORDERNOWsubmit().click();
CloseWindow_textVP().performTest();
// Document: Xtend / Purchase Completed:
http://www.xtenddev.com/purchase_completed.asp?name=Thomas+Arnold&company=Xtend+Develo
pment%2C+Inc%2E&email1=tom%40xtenddev%2Ecom&address1=4742+42nd+Avenue+SW&address2=%236
21&city=Seattle&state=WA&zip=98116&country=United+States&fax=206%2D938%2D1191&homePhon
e=206%2D932%2D8797&workPhone=206%2D938%2D2370&orderID=615514&cardType=&shipname=Thomas
+Arnold&shipaddress1=4742+42nd+Avenue+SW&shipaddress2=%23621&shipcity=Seattle&shipstat
e=WA&shipzip=98116&shipcountry=United+States&sku1=BDL%2DVT6%2DSET&product1=Videos+%2D+
Bundle+%2D+VT6+Videos+%2B+Book+%26+CD&quantity1=1&option1=&optionA1=&optionB1=&price1=
749%2E00&total=749%2E00&tax=65%2E91&shippingMethod=United+States+%28lower+48+states%29
+%28Overnight%29&shippingAmount=36%2E00&gst=0%2E00&grandTotal=850%2E91
Link_CloseWindow2().click();
Dialog_HtmlDialogButtonYes().click();

Я не стал удалять из распечатки 3 одну строку комментариев, чтобы показать, что регистратор RobotJ отслеживает заголовки HTML, возвращаемые после отправки формы. Большой блок комментария содержит информацию, возвращаемую на обрабатываемую сценарием страницу (в данном случае на ASP-страницу, но это будет работать и в случае JSP-страниц). Такой тип комментариев будет очень полезен при тестировании, позволяя понять возвращаемые значения, не появляющиеся в строке URL (а также скрытые в заголовках HTTP). (Примечание. Блок комментариев в конце распечатки 3 представляет собой одну длинную строку, которая была поделена на части моим текстовым редактором. По этой причине в качестве меток комментариев вместо "/*" и "*/" используются символы "//").

Выполнение и результаты

Теперь, когда сценарий сгенерирован, осталось только запустить его и взглянуть на результаты. Сценарий начинает выполняться при нажатии значка с изображением бегущего человечка (кнопка в панели инструментов приложения). При этом окно интегрированной среды разработки RobotJ автоматически сворачивается и открывается отдельное окно, показывающее статус выполняемого сценария.

После завершения выполнение сценария запускается специальное приложение, отображающее протокол выдачи результатов и все встреченные ошибки. На рис.10 показан стандартный файл с результатами, полученный после успешного выполнения тестового сценария.

Рисунок 9: Для начала выполнения тестового сценария RobotJ необходимо нажать значок с изображением бегущего человечка, расположенный на панели инструментов.

Рисунок 10: Rational Test Manager отображает результаты выполнения теста RobotJ.

Итоги

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

Хотя данное описание последней выпущенной Rational Software системы автоматизации нельзя назвать исчерпывающим, я надеюсь, что документ дал вам хорошее представление о ее возможностях. Надежность регистратора значительно упрощает задачу генерации сценариев, обеспечивая превосходные примеры для тех, кто предпочитает быстрый стиль программирования, и не любит фиксировать свои действия, а также использует модель, которой обладает гибкостью, свойственной тестовому приложению.

Дополнительная информация


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=1153