Testcomplete - робота над помилками
Під час роботи скриптів час від часу неминуче виникають помилки і новачкові спочатку буває важко розібратися, чому виникла помилка і як її виправити. У цій статті я розповім про загальний підхід до вирішення таких проблем в TestComplete і розповім про найбільш часто зустрічаються помилки, які можуть викликати питання.
Почнемо з більш загального питання.
Як вирішувати проблему?
Припустимо, після запуску тесту ви отримали лог з декількома помилками:
Тут ми бачимо три проблеми, які можуть бути пов'язані, а можуть і не бути. Тому починати потрібно завжди з рішення першої проблеми. так як її виправлення може автоматично виправити і всі інші. З іншого боку, спроба виправити пізніші помилки швидше за все ні до чого не приведе, так що ми даремно витратимо час.
Тепер приступимо власне до вирішення проблеми:
- Якщо повідомлення про помилку ні про що вам не говорить, клацніть на ньому один раз мишею і подивіться на панель Remarks (в TestComplete 8 і пізніших вона називається Additional Info). Зазвичай там знаходиться більш детальна інформація про проблему.
- Якщо при створенні помилки був згенерований скріншот - подивіться на нього теж (панель Picture).
- Якщо до цих пір причина неясна - двічі клацніть на помилку в балці, в результаті ви перейдете до рядка коду, в якій виникла проблема. Подивіться уважно на код і спробуйте зрозуміти, що саме в цьому коді могло привести до подібної помилку (звернення до неіснуючого вікна, спроба використання неоголошеної змінної, вихід за кордон масиву і т.п.).
- Якщо причина досі незрозуміла - пора налагоджувати. Ставте брекпоінт на рядку, де виникла помилка (для цього потрібно натиснути F9. Попередньо поставивши в цей рядок курсор) і запускайте тест. Виконання тесту буде зупинено і ми отримаємо можливість уважно вивчити стан всіх об'єктів в даний момент:
- перевірте, що всі змінні ініціалізовані і містять правильні значення (особливу увагу приділяйте значенням типу null і undefined. так як часто з ними пов'язані проблеми роботи зі змінними)
- перевірте, що всі вікна і елементи управління, які використовуються в цьому рядку, існують і видно на екрані - властивості Enabled. Exists. Focused. Visible. VisibleOnScreen (прочитайте в довідковій системі про різницю між властивостями Visible і VisibleOnScreen. Якщо ще цього не знаєте)
- перевірте, що викликається метод підтримується об'єктом (aqObject.IsSupported)
- Якщо на цьому етапі вам неясно, чому змінні мають такі значення, а не очікувані, зупиняйте відтворення і ставте брекпоінт раніше, після чого виконуйте скрипт крок за кроком (виконати один рядок коду можна за допомогою клавіші F10. А зайти всередину функції - за допомогою клавіші F11).
Які бувають помилки?
Тепер розглянемо приклади помилок і способи їх вирішення.
The test run has stopped because the Stop on Error (Warning) setting is enabled
Ця помилка з'являється в тому випадку, якщо перед цим виникла інша помилка і в настройках проекту зазначено зупиняти виконання тестів в разі виникнення помилки. Вирішити її досить просто:
- Відкрийте властивості проекту (правий клацання на імені проекту, Edit - Properties).
- Відкрийте групу опцій Playback.
- Вимкніть прапорці Stop on error / Stop on warning
Incomplete Keyboard Input
- Ця помилка зазвичай з'являється в тому випадку, якщо в метод Keys була передана неправильна послідовність символів. Для методу Keys символи!. ^.
Ця помилка з'являється в тому випадку, якщо під час роботи з тестовим додатком на екрані з'явилося модальне вікно, що заважає TestComplete'у. Є 2 способи вирішити цю проблему:
- автоматично: в настройках проекту в групі опцій Playback вказати TestComplete'у, як чинити з такими вікнами (закривати, натискати на фокусований елемент управління і т.п.)
- вручну: створити обробник події OnUnexpectedWindow. де явно прописати необхідні дії.
Другий спосіб зазвичай використовується в специфічних випадках з нестандартними вікнами.
Є схожа проблема з Overlapping Windows (перекривають вікнами). Різниця між ними в тому, що Overlapping Window не заважає роботі TestComplete. Їх можна ігнорувати (все в тих же налаштуваннях проекту) або обробляти за допомогою події OnUnexpectedWindow.
Об'єкт, з яким скрипт намагається працювати, не існує. Ось список найбільш частих причин цієї помилки:
- неправильна ідентифікація об'єкта (заданий набір властивостей і їх значень не збігається з реальним об'єктом)
- змінилося становище об'єкта в ієрархії об'єктів (частіше буває при використанні моделі об'єктів Tree)
- не найден один з батьківських об'єктів (або ж під опис батьківського об'єкта потрапляє відразу кілька об'єктів)
Рішення проблеми: за допомогою Object Spy (в TestComplete 7 - Object Properties) з'ясувати повне ім'я та нові значення властивостей і оновити скрипти або NameMapping.
Unable to Find the Object
Перш ніж виконувати якісь дії з будь-яким об'єктом (вікно, процес, елемент управління), TestComplete спочатку перевіряє його існування. Якщо об'єкт не існує, в балці з'являється помилка «Unable to Find the Object». Найчастіше це відбувається в тому випадку, якщо об'єкт був привласнений змінної, після чого сам об'єкт перестав існувати, а скрипт намагається працювати зі змінною (яка відповідає вже неіснуючого об'єкту).
Рішення проблеми: заново форматувати змінну тим же об'єктом.
Can not Obtain the Window.
Спроба звернення до вікна або елементу управління, якого не існує. Найбільш часта причина: неправильне написання заголовка, класу або невірний індекс елемента.
Рішення проблеми: виправити неправильне властивість. Це може бути наслідком змін в тестованому додатку.
Ambiguous Recognition of the Tested Object
Неоднозначне визначення вікна: опису вікна або елемента управління відповідає кілька об'єктів. Основних причин може бути дві:
- невірно обраний набір властивостей, які використовуються для ідентифікації об'єкта (наприклад, їх дуже мало)
- невірне використання символів групової заміни (wildcards, * і?).
Рішення проблеми: визначити новий набір властивостей для унікальної ідентифікації об'єктів або використовувати менш універсальні заміни за допомогою символів * і.
The alias refers to a mapped object that is not in the NameMapping project item
Alias посилається на неіснуючий елемент NameMapping. Це може відбуватися в тому випадку, якщо елемент був видалений з NameMapping. але відповідний йому Alias залишився.
Рішення проблеми: видалити Alias і переписати скрипти відповідно до змін.
висновок
Звичайно, кожну проблему необхідно вирішувати окремо, так як причини в кожному випадку можуть бути абсолютно різні. Однак зіткнувшись кілька разів з тією чи іншою проблемою і вирішивши її, ви з кожним разом будете робити це все швидше, а в подальшому будете писати код, менш схильний до подібних помилок.
Також слід згадати, що в деяких випадках рішення проблеми може виявитися складнішим, ніж в описаних тут випадках. Наприклад, якщо для створення тестів ви використовуєте об'єктно-орієнтований підхід з використанням мовних можливостей JScript або VBScript. знайти причину може виявитися набагато складніше, тому що TestComplete не підтримує переходи всередину методів при натисканні в балці.
Ще більш проблематичним може виявитися робота з такими об'єктами, які неможливо «зловити» за допомогою Object Spy (наприклад, меню). В цьому випадку доведеться писати додатково невеликі функції, які будуть в лог виводити список доступних властивостей і методів (за допомогою методів aqObject.GetProperties і aqObject.GetMethods).
Більш докладно познайомитися з TestComplete можна на найближчому тренінгу. де ми в тому числі будемо розглядати обробку подій і різні параметри TestComplete.
Детальніше почитати про всі розглянутих помилках можна в офіційному керівництві по TestComplete (англійською мовою).