Разделы портала

Онлайн-тренинги

.
TestComplete – работа над ошибками
05.09.2013 10:20

Автор: Геннадий Алпаев (автор единственного русскоязычного учебника по TestComplete и ведущий тренинга Автоматизация тестов с использованием TestComplete)

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

Начнем с более общего вопроса.

Как решать проблему?

Предположим, после запуска теста вы получили лог с несколькими ошибками:

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

Теперь приступим собственно к решению проблемы:

  1. Если сообщение об ошибке ни о чем вам не говорит, щелкните на нем один раз мышью и посмотрите на панель Remarks (в TestComplete 8 и более поздних она называется Additional Info). Обычно там находится более подробная информация о проблеме.
  2. Если при создании ошибки был сгенерирован скриншот — посмотрите на него тоже (панель Picture).
  3. Если до сих пор причина неясна — дважды щелкните на ошибке в логе, в результате вы перейдете к строке кода, в которой возникла проблема. Посмотрите внимательно на код и попытайтесь понять, что именно в этом коде могло привести к подобной ошибке (обращение к несуществующему окну, попытка использования необъявленной переменной, выход за границу массива и т.п.).
  4. Если причина до сих пор непонятна — пора отлаживать. Ставьте брекпоинт на строке, где возникла ошибка (для этого нужно нажать F9, предварительно поставив в эту строку курсор) и запускайте тест. Выполнение теста будет остановлено и мы получим возможность внимательно изучить состояние всех объектов в данный момент:
  • проверьте, что все переменные инициализированы и содержат правильные значения (особое внимание уделяйте значениям типа null и undefined, так как зачастую с ними связаны проблемы работы с переменными)
  • проверьте, что все окна и элементы управления, используемые в этой строке, существуют и видны на экране – свойства Enabled, Exists, Focused, Visible, VisibleOnScreen (прочитайте в справочной системе о разнице между свойствами Visible и VisibleOnScreen, если еще этого не знаете)
  • проверьте, что вызываемый метод поддерживается объектом (aqObject.IsSupported)

Для просмотра значений переменных у нас есть сразу несколько способов: панели Watch List и Locals, а также окошко Evaluate (вызывается нажатием на кнопку с изображением калькулятора на панели инструментов), в котором можно присвоить переменным новые значения в случае надобности.

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

Какие бывают ошибки?

Теперь рассмотрим примеры ошибок и способы их решения.

The test run has stopped because the Stop on Error (Warning) setting is enabled

Эта ошибка появляется в том случае, если перед этим возникла другая ошибка и в настройках проекта указано останавливать выполнение тестов в случае возникновения ошибки. Решить ее довольно просто:

  1. Откройте свойства проекта (правый щелчок на имени проекта, Edit – Properties).
  2. Откройте группу опций Playback.
  3. Отключите флажки Stop on error/Stop on warning


Incomplete Keyboard Input

  1. Эта ошибка обычно появляется в том случае, если в метод Keys была передана неправильная последовательность символов. Для метода Keys символы !, ^, ~ и [ имеют специальные значения (эмуляция нажатия клавиш-модификаторов типа Ctrl и Shift), поэтому чтобы ввести такой символ, его нужно просто продублировать. Самый простой способ создать правильную последовательность вводимого текста — записать его с помощью Record Script.
  2. Еще одна возможная причина ошибки — отсутствие нужной раскладки клавиатуры (если используется не английский текст) или нужных компонентов ОС (в случае с азиатским текстом).
  3. Кроме того, в Windows XP и Server 2003 может быть выключена опция Extend support of advanced text services to all programs.

Unexpected window

Эта ошибка появляется в том случае, если во время работы с тестовым приложением на экране появилось модальное окно, мешающее TestComplete'у. Есть 2 способа решить эту проблему:

  • автоматически: в настройках проекта в группе опций Playback указать TestComplete'у, как поступать с такими окнами (закрывать, нажимать на фокусированный элемент управления и т.п.)
  • вручную: создать обработчик события OnUnexpectedWindow, где явно прописать необходимые действия.

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

Есть похожая проблема с Overlapping Windows (перекрывающими окнами). Разница между ними в том, что Overlapping Window не мешает работе TestComplete. Их можно игнорировать (все в тех же настройках проекта) или обрабатывать с помощью события OnUnexpectedWindow.

Object Does Not Exist

Объект, с которым скрипт пытается работать, не существует. Вот список наиболее частых причин этой ошибки:

  • неправильная идентификация объекта (заданный набор свойств и их значений не совпадает с реальным объектом)
  • изменилось положение объекта в иерархии объектов (чаще бывает при использовании модели объектов Tree)
  • не найден один из родительских объектов (или же под описание родительского объекта попадает сразу несколько объектов)

Решение проблемы: с помощью Object Spy (в TestComplete 7 – Object Properties) выяснить полное имя и новые значения свойств и обновить скрипты или NameMapping.

Unable to Find the Object

Прежде чем выполнять какие-то действия с любым объектом (окно, процесс, элемент управления), TestComplete сначала проверяет его существование. Если объект не существует, в логе появляется ошибка «Unable to Find the Object». Чаще всего это происходит в том случае, если объект был присвоен переменной, после чего сам объект перестал существовать, а скрипт пытается работать с переменной (которая соответствует уже несуществующему объекту).

Решение проблемы: заново инициализировать переменную тем же объектом.

Cannot 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 (на английском языке).

Обсудить в форуме

Utbetalningsprocent är inte svårt att förstå. De är helt enkelt ett mått på hur mycket spelare kan förvänta sig att vinna i genomsnitt. För att uttrycka det på ett annat sätt så anger utbetalningsprocenten hur stor andel av de pengar som spelarna satsar som casinot betalar ut i vinster.

Utbetalningsprocent kallas ofta för återbetalningsprocent eller RTP %. Om ett spel har en utbetalningsprocent eller RTP på 97% kommer casinot att betala ut 97 kr för varje 100 kr som satsas i genomsnitt. Hur som helst bör du inte förvänta dig att RTP ska vara vägledande för dina individuella casino online i Sverige eller kollektiva spelsessioner. Det är viktigt att du förstår att utbetalningsprocenten mäts över tid och inte bara din tid. Beroende på titeln kan det ta 10 000 till 10 0000 spel och ibland mer för att RTP ska vara som annonserat. När man jämför RTP och utbetalningsprocent kan siffran vara lite missvisande eftersom den inte återspeglar hur ofta man vinner. Spel som europeisk roulette har samma husfördel för varje satsning, men det är lättare att vinna satsningar på jämna pengar än satsningar på enstaka nummer, som betalar 35 till 1.

När det gäller spelautomater hittar du spel som ger många små vinster och andra spel som erbjuder stora jackpottar men betalar ut sällan, men de kan ändå lätt ha samma RTP % eftersom det bara är ett genomsnitt.