|
|
|||||||||||||||||||||||||||||
|
Создание инфраструктуры автоматизации тестирования с использованием Rational Functional TesterИсточник: IBM
В данной статье Шиной Захариас (архитектор ПО, IBM Rational Functional Tester, IBM) описывает создание инфраструктуры автоматизации тестирования с использованием Rational Functional Tester. Он продемонстрирует весь процесс создания инфраструктуры автоматизации, начиная с введения в Rational Functional Tester и программного интерфейса (API) find. В статье рассматриваются примеры и сценарии. Введение в IBM Rational Functional TesterIBM® Rational® Functional Tester является инструментом автоматизированного функционального и регрессионного тестирования. Этот продукт предоставляет тестировщикам средства автоматизированного тестирования, позволяющие выполнять функциональное тестирование, регрессионное тестирование, тестирование пользовательского интерфейса и тестирование, управляемое данными. Rational Functional Tester включает встроенную поддержку Web-, .Net-, Java-, Siebel-, SAP-приложений и приложений эмуляции терминалов. Можно тестировать приложения PowerBuilder, AJAX, Adobe Flex, Dojo Toolkit, GEF, документы Adobe PDF, а также приложения для zSeries, iSeries и pSeries. Преимущества использования Rational Functional TesterПреимущества Rational Functional Tester:
Предварительные условияДля выполнения примеров данной статьи необходимо иметь базовые знания IBM Rational Functional Tester и установить Rational Functional Tester версии 8.2. Необходимость инфраструктуры автоматизацииБольшинство инструментов автоматизации просто позволяет тестировщикам записывать взаимодействия с интерфейсом пользователя и воспроизводить их при тестировании приложения. Подход "запись-воспроизведение" упрощает создание сценариев тестирования, но усложняет их обслуживание. Группы тестирования записывают и перезаписывают сценарии после каждого изменения приложения. Хотя этот подход можно использовать для быстрого создания пакетов контрольных тестов, он имеет ограничения, поскольку для записи работоспособного сценария необходимо практически готовое правильно функционирующее приложение. Группы тестирования часто отказываются от модели "запись-воспроизведение" и пишут контрольные тесты вручную. Зачастую тестировщики не могут использовать автоматизацию пользовательского интерфейса для регрессионного тестирования. Алгоритмы распознавания объектов, сложные и труднодоступные, делают изменения в сценариях громоздкими и в некоторых случаях невозможными. Хотя инструмент, предлагающий алгоритмы распознавания, делает изменения гораздо более управляемыми, он также имеет неприятный побочный эффект - не очень надежное распознавание объектов. Rational Functional Tester и инфраструктура автоматизацииИнфраструктура автоматизации дает много преимуществ, таких как:
Создание инфраструктуры автоматизации в Rational Functional Tester с использованием find APIИспользование API (программного интерфейса поиска) find при создании инфраструктуры автоматизации дает следующие преимущества:
В Rational Functional Tester есть два вида API find:
Подэлементы API find Подэлементами могут быть
sind() с подэлементом atChild Если find() используется в Есть три вида find() с подэлементом atChild:
В листинге 1 показано использование различных вариантов find() с atChild. Листинг 1. Различные варианты find() с atChildpublicvoid testMain(Object[] args) { TestObject[] tobs1 = find(atChild(".class", "JButton")); TestObject[] tobs2 = find(atChild(".class", "JButton", "text", "OK")); Property prop1 = new Property(".class", "JButton"); Property prop2 = new Property(".name", "ok"); Property prop3 = new Property("text", "OK"); Property[] props = {prop1, prop1, prop3}; TestObject[] tobs3 = find(atChild(props)); } find() с подэлементом atDescendant Если find() используется в TestObject с Есть три вида find() с подэлементом atDescendant:
В листинге 2 показано использование различных вариантов find() с atDescendant. Листинг 2. Варианты find() с atDescendantpublicvoid testMain(Object[] args) { TestObject[] tobs1 = find(atDescendant(".class", "JButton")); TestObject[] tobs2 = find(atDescendant(".class","JButton","text", "OK")); Property prop1 = new Property(".class", "JButton"); Property prop2 = new Property(".name", "ok"); Property prop3 = new Property("text", "OK"); Property[] props = {prop1, prop1, prop3}; TestObject[] tobs3 = find(atDescendant(props)); } find() с подэлементом atList find() с atList предоставляет последовательный список свойств для сравнения. Подэлементами Есть пять типов find() с подэлементом atList:
В листинге 3 показано использование find() с atList. Листинг 3. find() с atListpublicvoid testMain(Object[] args) { TestObject[] tobs = find(atList(atDescendant (".class", "JFrame"), atChild(".class", "JButton", ".value", "OK"))) ; } find() с RootTestObject
Существуют специальные свойства, применимые к find() с RootTestObject. К ним относятся:
В листинге 4 Листинг 4. Пример использования RootTestObject в сценарииpublicvoid testMain(Object[] args) { ProcessTestObject pto = startApp("notepad") ; Integer pid = new Integer((int)pto.getProcessId()); RootTestObject rto = RootTestObject.getRootTestObject(); TestObject[] textObjects = rto.find (atList( atProperty(".processId", pid), atDescendant(".class", "Edit"))) ; ((TextGuiTestObject)textObjects[0]).setText("Hello RFT"); } Создание инфраструктуры автоматизации с использованием API find в Rational Functional TesterТеперь, познакомившись с API Например, не имеющий технической подготовки тестировщик может написать тест с помощью простых функциональных вызовов, таких как:
Тестировщикам нужно лишь ввести имя элемента управления или текст. Поиск конкретного элемента управления с помощью API В листинге 5 приведен пример реализации одной из этих функций с помощью API Листинг 5. Пример функции, использующей API findpublicstaticvoid ClickButton(String name) { GuiTestObject buttonObj = findButton(name); if (buttonObj != null) { buttonObj.click(); } elsethrownew ObjectNotFoundException(); } privatestatic GuiTestObject findButton(String value) { TestObject[] tobs = find(atDescendant (".class", "Html.INPUT.submit", ".value", value), true); if(tobs.length == 0) returnnull; return (GuiTestObject)tobs[0]; } Метод В листинге 5 метод Рисунок 1. Инструмент Test Object InspectorКроме того, инженеры по автоматизации могут писать модули для других функций, таких как Листинг 6. Примеры библиотечных функций, основанных на API findpublicstaticvoid ClickText(String name) { TextGuiTestObject textObj = findTextObject(name); if (textObj != null) { textObj.click(); } else { throw new ObjectNotFoundException(); } } public static void EnterText(String controlName, String value) { TextGuiTestObject textObj = findTextObject(controlName); if (textObj != null) { textObj.setText(value); } else { thrownew ObjectNotFoundException(); } } public static void ClickPassword(String name) { TextGuiTestObject textObj = findPasswordObject(name); if (textObj != null) { textObj.click(); } else { thrownew ObjectNotFoundException(); } } private static TextGuiTestObject findTextObject(String name) { TestObject[] tobs = find(atDescendant(".class", "Html.INPUT.text", ".name", name), true); if(tobs.length == 0) returnnull; return (TextGuiTestObject)tobs[0]; } private static TextGuiTestObject findPasswordObject(String name) { TestObject[] tobs = find(atDescendant(".class", "Html.INPUT.password", ".name", name), true); if(tobs.length == 0) returnnull; return (TextGuiTestObject)tobs[0]; } Если в различных экземплярах или сборках приложения меняются некоторые свойства, используемые в методе RegularExpression buttonRE = new RegularExpression("*button", false) ; TestObject[] tobs = find(atDescendant(".class", buttonRE, "name", "OK")); Теперь инженеры по автоматизации могут создать библиотеку классов инфраструктуры, а инженеры-тестировщики могут использовать эти классы для создания сценариев. В приведенном ниже примере инженеры-тестировщики используют функции инфраструктуры для загрузки amazon.com, поиска iPhone и входа в систему для покупки телефона. public void testMain(Object[] args) { startApp("www.amazon.com"); sleep(5); //задержка на 5 секунд для загрузки страницы amazon EnterText("field-keywords", "iphone"); ClickButton("Go"); sleep(3); //задержка на 3 секунды для загрузки следующей страницы ClickLink("Hello. Sign in Your Account"); sleep(3); //задержка на 3 секунды для загрузки следующей страницы EnterText("email", "name@gmail"); ClickPassword("password"); EnterPassword("password", "password"); ClickImage("Continue"); } ЗаключениеВ статье описано использование программного интерфейса find API в Rational Functional Tester при создании инфраструктуры автоматизации тестирования HTML-приложения. Такой же подход можно использовать при написании инфраструктур для других приложений, поддерживаемых Rational Functional Tester. Ссылки по теме
|
|