В одном из предыдущих постов мы рассматривали преимущества и недостатки использования QTP для обработки “крэша” приложения.
На этот раз мы поделимся своим опытом применения QTP для поиска необработанного исключения.
Функция обработки исключения должна вызываться с параметром, например с названием текущего окна или текстом сообщения. Сообщение появляется в том случае, если исключение обнаружено.
Функция вызывается при каждой попытке получения или записи данных и находит дочернее окно с кнопками «Detail» и «Quit».
Когда окно найдено, нужно нажать кнопку «Detail» и скопировать текст из появившейся текстовой области. После этого нажать «Quit» и подтвердить выход из приложения в случае необходимости.
Следующий шаг – записать значение скопированного текста в параметр теста и сформировать ручную запись ошибки выполнения шага теста со статусом Fail.
И наконец, принять значение для функции, определяющее, что исключение найдено.
Пример окна исключения:
Также следует обратить внимание, что функция должна передавать значение текущего окна приложения. После выполнения функции необходимо остановить проведение теста.
Код скрипта для QTP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<span style="color: #008000;">' Открыто стартовое окно приложения с заголовком окна "Кредитний портфель" </span><span style="color: #008000;">' На данном этапе обращений к сервису еще нет </span><span style="color: #008000;">' Сохраняем значение параметра окна regexpwndtitle (название окна) в параметр теста: </span>TestArgs(<span style="color: #800000;">"CurrentWindowName"</span>) = SwfWindow(<span style="color: #800000;">"Кредитний портфель"</span>).GetROProperty(<span style="color: #800000;">"regexpwndtitle"</span>) <span style="color: #008000;">' Определяем обьект окна (это вариант использования через descriptive programming) </span><span style="color: #000080;">Set</span> CurrentWindow = Description.Create CurrentWindow(<span style="color: #800000;">"swfname"</span>).Value = <span style="color: #800000;">"ShellForm"</span> CurrentWindow(<span style="color: #800000;">"regexpwndtitle"</span>).Value = TestArgs(<span style="color: #800000;">"CurrentWindowName"</span>) CurrentWindow(<span style="color: #800000;">"is owned window"</span>).Value = <span style="color: #800000;">"False"</span> CurrentWindow(<span style="color: #800000;">"regexpwndtitle"</span>).RegularExpression = <span style="color: #000080;">False</span> <span style="color: #008000;">' Начинаем работу с программой, открываем форму с данными - т.е. обращение к сервису </span>SwfWindow(<span style="color: #800000;">"Кредитний портфель"</span>).SwfToolbar(<span style="color: #800000;">"menuStrip1"</span>).ShowDropdown <span style="color: #800000;">"Договори"</span> SwfWindow(<span style="color: #800000;">"Кредитний портфель"</span>).SwfObject(<span style="color: #800000;">"_mainDeck"</span>).<span style="color: #000080;">Type</span> micDwn SwfWindow(<span style="color: #800000;">"Кредитний портфель"</span>).SwfObject(<span style="color: #800000;">"_mainDeck"</span>).<span style="color: #000080;">Type</span> micRight SwfWindow(<span style="color: #800000;">"Кредитний портфель"</span>).SwfObject(<span style="color: #800000;">"_mainDeck"</span>).<span style="color: #000080;">Type</span> micDwn SwfWindow(<span style="color: #800000;">"Кредитний портфель"</span>).SwfObject(<span style="color: #800000;">"_mainDeck"</span>).<span style="color: #000080;">Type</span> micReturn wait 5 <span style="color: #008000;">'Ищем исключение </span>TestArgs(<span style="color: #800000;">"ExceptionFound"</span>) = Application_CrashCheck(CurrentWindow, TestArgs (<span style="color: #800000;">"CurrentWindowName"</span>)) <span style="color: #008000;">'Если исключение найдено - останавливаем выполнениеIf TestArgs("ExceptionFound") = "yes" Then </span> ExitTest <span style="color: #000080;">End</span> <span style="color: #000080;">If</span> <span style="color: #008000;">' Определяем функцию, обрабатывающую крэш приложения (в нашем случае функция хранится во внешнем файле, который подключается к тесту.) </span><span style="color: #000080;">Function</span> Application_CrashCheck(CurrentWindow, WindowName) <span style="color: #000080;">If</span> SwfWindow(CurrentWindow).SwfWindow(<span style="color: #800000;">"micclass:=SwfWindow"</span>,<span style="color: #800000;"> "regexpwndtitle:=.*"</span>,<span style="color: #800000;">"is owned window:=True"</span>).Exist(5) <span style="color: #000080;">Then</span> <span style="color: #000080;">If</span> SwfWindow(CurrentWindow).SwfWindow(<span style="color: #800000;">"micclass:=SwfWindow"</span>,<span style="color: #800000;"> "regexpwndtitle:=.*"</span>,<span style="color: #800000;">"is owned window:=True"</span>).SwfButton(<span style="color: #800000;">"micclass:=SwfButton"</span>,<span style="color: #800000;"> "regexpwndtitle:=&Detail.*"</span>).Exist(1) <span style="color: #000080;">and</span> _ SwfWindow(CurrentWindow).SwfWindow(<span style="color: #800000;">"micclass:=SwfWindow"</span>,<span style="color: #800000;"> "regexpwndtitle:=.*"</span>,<span style="color: #800000;">"is owned window:=True"</span>).SwfButton(<span style="color: #800000;">"micclass:=SwfButton"</span>,<span style="color: #800000;"> "regexpwndtitle:=&Quit.*"</span>).Exist(1) <span style="color: #000080;">Then</span> <span style="color: #000080;">On</span> <span style="color: #000080;">Error</span> <span style="color: #000080;">Resume</span> <span style="color: #000080;">Next</span> SwfWindow(CurrentWindow).SwfWindow(<span style="color: #800000;">"micclass:=SwfWindow"</span>,<span style="color: #800000;"> "regexpwndtitle:=.*"</span>,<span style="color: #800000;">"is owned window:=True"</span>).SwfButton(<span style="color: #800000;">"micclass:=SwfButton"</span>,<span style="color: #800000;"> "regexpwndtitle:=&Detail.*"</span>).Click SwfWindow(CurrentWindow).SwfWindow(<span style="color: #800000;">"micclass:=SwfWindow"</span>,<span style="color: #800000;"> "regexpwndtitle:=.*"</span>,<span style="color: #800000;">"is owned window:=True"</span>).SwfEditor(<span style="color: #800000;">"Class Name:=SwfEditor"</span>,<span style="color: #800000;">"swftypename:=System.Windows.Forms.TextBox"</span>).<span style="color: #000080;">Output</span> CheckPoint(<span style="color: #800000;">"Exception"</span>) Reporter.ReportEvent micFail, <span style="color: #800000;">"Исключение в окне "</span>&SwfWindow(CurrentWindow).<span style="color: #000080;">Object</span>.Text, DataTable(<span style="color: #800000;">"ExceptionValue"</span>, dtGlobalSheet) SwfWindow(CurrentWindow).SwfWindow(<span style="color: #800000;">"micclass:=SwfWindow"</span>,<span style="color: #800000;"> "regexpwndtitle:=.*"</span>,<span style="color: #800000;">"is owned window:=True"</span>).SwfButton(<span style="color: #800000;">"micclass:=SwfButton"</span>,<span style="color: #800000;"> "regexpwndtitle:=&Quit.*"</span>).Click SwfWindow(CurrentWindow).Dialog(<span style="color: #800000;">"nativeclass:=#32770"</span>,<span style="color: #800000;">"text:=Увага"</span>). WinButton(<span style="color: #800000;">"nativeclass:=Button"</span>,<span style="color: #800000;">"text:=&Да"</span>).Click Application_CrashCheck = <span style="color: #800000;">"yes"</span> <span style="color: #000080;">else</span> Reporter.ReportEvent micInfo, <span style="color: #800000;">"Исключение не найдено. Окно: "</span>&WindowName, <span style="color: #800000;">"Исключение не обнаружено. Выполнение теста продолжено."</span> Application_CrashCheck = <span style="color: #800000;">"no"</span> <span style="color: #000080;">End</span> <span style="color: #000080;">If</span> <span style="color: #000080;">else</span> Reporter.ReportEvent micInfo, <span style="color: #800000;">"Исключение не найдено. Окно: "</span>&WindowName, <span style="color: #800000;">"Исключение не обнаружено. Выполнение теста продолжено."</span> Application_CrashCheck = <span style="color: #800000;">"no"</span> <span style="color: #000080;">End If</span> <span style="color: #000080;">End Function</span> |
Иногда данная функция выдает ошибку:
1 |
Объект не поддерживает это свойство или метод: 'SwfWindow(...).SwfObject(...)' |
Эта ошибка указывает на то, что описание обьекта CurrentWindow не позволило распознать обьект основного окна. К сожалению, такая ошибка может возникать не только с описаниями обьектов через Descriptive Programming, но и с обьектами из репозитария. Однако работа с обьектом репозитария несколько надежнее.
Описание обьекта из репозитария:
1 |
<span style="color: #000080;">Set</span> CurrentWindow = SwfWindow(<span style="color: #800000;">"Кредитний портфель"</span>) |
В функции также необходимо внесети незначительные изменения: во всех строках выражение SwfWindow(CurrentWindow) следует заменить на CurrentWindow.
Пример строки из функции:
1 |
<span style="color: #000080;">If</span> CurrentWindow.SwfWindow(<span style="color: #800000;">"micclass:=SwfWindow"</span>,<span style="color: #800000;"> "regexpwndtitle:=.*"</span>,<span style="color: #800000;">"is owned window:=True"</span>).Exist(5) <span style="color: #000080;">Then</span> |
Рекомендации по оптимальному использованию
Поиск окна исключения занимает некоторое время. Если делать это слишком часто, то автоматизированные тесты будут выполняться дольше, чем эти же тесты, выполненные вручную. Так что, лучше лишний раз эту проверку не применять.
Впрочем, вызов функции обработки исключения можно оптимизировать, используя следующие способы :
- Дубликаты – в рамках набора выполняемых тестов открываются одни и те же формы. Проверку следует выполнить только при первом использовании формы.
- Перекрестные валидации, требующие обращения к БД – такую проверку также можно выполнить только один раз на каждой форме (если для этой формы такая валидация предусмотрена).
- Иногда можно исключить проверку путем поиска корректной реакции приложения на выполненное в тесте действие. Данным правилом не следует злоупотреблять из-за ошибки ‘SwfWindow(…).SwfObject(…)
- В крайнем случае – проверять только при смене окна или формы. Этот подход может быть использован в тестах, где смена форм и окон выполняется редко (к примеру, тесты для проверки правил валидации приложения). Если исключение найдено в процессе работы с формой, оно все равно будет обработан, только позже. Отследить, когда оно появилось, возможно, поскольку в результатах теста отобразится цепочка шагов, которые не были выполнены.
Надеемся, что эта информация пригодится в работе читателям нашего блога.