Статьи

Если плохие вещи случаются с хорошими автоматизированными тестами — как Red Deer помогает вам отлаживать неудачные тесты

Это четвертая из серии публикаций о новой автоматизированной среде тестирования JBoss Red Deer. В этом посте описываются функции Red Deer, облегчающие отладку тестовых сбоев.

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

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

Отладка Maven и Eclipse по-прежнему доступна

Прежде чем обсуждать функции отладки Red Deer, важно помнить, что Red Deer никоим образом не препятствует выполнению типов отладки, которые вы можете использовать с Maven или Eclipse. Вы можете использовать отладчик Eclipse для установки точек останова в тестовых программах Red Deer таким же образом, как и в любых других программах. Аналогично, для отладки тестовой программы Red Deer с помощью maven все, что вам нужно сделать, это запустить maven с -DdebugPort = <debug_port>, а в Eclipse выбрать тестовый класс, который вы хотите выполнить, выбрать «Debug As» и создать новую конфигурацию отладки. В конфигурации отладки укажите, что вы хотите запустить тестовый класс как Удаленное Java-приложение, и номер порта. Запуск отладчика запускает выполнение ожидающего теста, а затем останавливается на первой точке останова:

Функции отладки, добавленные Red Deer

Функции отладки Red Deer, которые мы обсудим в этом посте:

  • Red Deer Debug Logging

  • Автоматические скриншоты для неудачных тестов

  • Приостановка неудачных тестов

  • Запись скринкастов

Давайте начнем с рассмотрения самых простых инструментов отладки Red Deer; протоколирование.

Red Deer Debug Logging

По умолчанию Red Deer создает журнал уровня DEBUG при каждом запуске теста. Журнал записывается в стандартный вывод при запуске тестов из оболочки и в представление консоли при запуске тестов в Eclipse.

Пример вывода журнала Red Deer выглядит следующим образом:

INFO [thread][class] Log message-N
INFO [thread][class] Log message-N+1
ERROR [thread][class] Hey! Something failed here
DEBUG [thread][class] And, here’s some additional debug information
INFO [thread][class] Log message-N+2

Чтобы отключить ведение журнала отладки, установите для аргумента JVM «logDebug» значение false. Например:

-DlogDebug = ложь

Кроме того, вы также можете фильтровать содержимое журнала с помощью аргумента JVM «logMessageFilter».

Поддерживаемые значения фильтра:

  • отлаживать

  • ошибка

  • предупреждать

  • Информация

  • след

  • никто

  • все

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

-DlogMessageFilter = ошибка | предупредить

Обратите внимание, что значения фильтра не чувствительны к регистру.

Автоматические скриншоты для неудачных тестов

Как и в случае с журналом отладки, сохранение скриншотов для неудачных тестов по умолчанию включено Red Deer. Случается так, что при сбое теста «Красный олень» в момент сбоя для вас создается и сохраняется скриншот. На снимке экрана показано состояние интерфейса пользователя, когда произошел сбой теста. По умолчанию Red Deer сохраняет файлы скриншотов в каталоге «target / screenshot». Вы можете выбрать каталог, в который Red Deer будет сохранять файлы скриншотов, установив этот аргумент JVM :lativeScreenshotDirectory

Например: -DrelativeScreenshotDirectory = / home / jsmith / screenshots

Давайте посмотрим на это в действии. Следующий скриншот был создан при сбое теста. Указанный адрес сервера действителен. Ошибка произошла из-за временной проблемы с сетевым подключением.

screenshot.png

В данном случае происходит то, что при сбое теста процесс наблюдения Red Deer вступает во владение и вызывает расширение класса org.eclipse.swt.graphics.ImageLoader для создания снимка экрана, прежде чем завершить тест.

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

Приостановка неудачных тестов

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

Аналогичным образом, было бы полезно, если бы Red Deer вместо немедленного завершения теста мог позволить вам нажать кнопку «пауза» и заморозить тест, чтобы вы могли изучить состояние аварии, чтобы вы могли понять ее причины.

К счастью, Red Deer — это встроенная функция, позволяющая приостановить неудачные тесты. В отличие от функции скриншота, при отключении теста Red Deer по умолчанию не включается. Чтобы включить эту функцию, все, что вам нужно сделать, это установить для аргумента JVM «pauseFailedTest» значение «true».

Например: -DpauseFailedTest = true

Если для этого аргумента установлено значение «истина», то при сбое теста он подключается к сторожевому процессу Red Deer, и выполнение теста приостанавливается. Вы можете продолжить выполнение теста, нажав клавишу Enter.

Обратите внимание, что в текущей версии Red Deer pauseFailedTest работает только тогда, когда ваш тест расширяет класс RedDeerTest. В будущем выпуске Red Deer он будет работать на всех типах тестов.

Запись скринкастов

До сих пор обсуждаемые нами возможности отладки Red Deer имели одну общую черту; все они требуют, чтобы вы запустили тест и вручную наблюдали за результатами. Это означает, что для ошибки, которая является тонкой и трудной для отслеживания, вам, возможно, придется повторить тест несколько раз, чтобы увидеть ошибку. Было бы более полезно, если бы у вас был простой способ приостановить выполнение теста в точке, в которой он завершился неудачей, и «перемотать» выполнение до точки, предшествующей ошибке, без необходимости тратить время и занимать системные ресурсы, чтобы перезапустите тест с самого начала.

Red Deer решает эту проблему, позволяя сохранить скринкаст всех неудачных тестов. Red Deer выполняет снимки экрана через расширение класса org.monte.screenrecorder.ScreenRecorder ( http://www.randelshofer.ch/monte/ ).

Как и в случае с паузой в тестах, функция скринкаста Red Deer по умолчанию отключена. Чтобы включить запись скриншотов, установите для аргумента recordScreenCast JVM значение «true». Например:

-DrecordScreenCast=true

Файлы скринкастов хранятся в подкаталоге, названном, соответственно, «скринкаст».

Рекомендации

Благодарности

Большое спасибо Йирке Петерке и Владо Пакану за их вклад в этот пост!