Тестирование приложений J2EE с помощью Rational PurifyPlus

Горан Бегик (Goran Begic), Rational Software

Ранее, значительное количество пользователей спрашивали меня, как использовать Rational PurifyPlus для приложений на Java, выполняемых на стороне сервера. Некоторые советы общего характера можно получить из оперативной справки, поставляемой вместе с PurifyPlus, или же поискать ответ в базе данных Rational Technical Support. Однако этих советов может оказаться явно недостаточно при работе со всеми возможными средами развертывания - например, такими, как сервер приложений Java, хостирующий и выполняющий серверные компоненты Java.И, кроме того, появление на рынке большого числа серверов приложений Java еще больше усложняет эту задачу.В этой статье я представлю проверенный и надежный способ использования PurifyPlus для тестирования сервлетов и серверных страниц Java (JSP), выполняющихся на сервере Apache Jakarta Tomcat, версия 4. Это же решение можно применить для коммерческих серверов приложений Java; я успешно «вычистил» самые разные приложения J2EE, выполняемые на сервере WebLogic компании BEA, версии 5.1, 6.0 и 6.1, а также на сервере WebSphere компании IBM, версии 3.5 и 4.

О сервере Tomcat проекта Jakarta

Jakarta представляет собой проект разработки ПО с открытым исходным кодом, поддерживаемый компанией Sun. Главной целью этого проекта является создание свободно распространяемого серверного решения J2EE, с качеством, не уступающим коммерческим разработкам. Приложение Tomcat составляет главную часть этого проекта, и многие люди зачастую воспринимают это название как синоним всего проекта Jakarta. Tomcat не является полномасштабным сервером приложений Java, а всего лишь машиной обработки сервлетов и серверных страниц JSP, чего, впрочем, более чем достаточно для развертывания и тестирования JSP и приложений сервлетов Java. Tomcat может выполняться как самостоятельное приложение, так и интегрироваться в web-сервер Apache. Лично я решил использовать Tomcat потому, что он очень устойчив, надежен и, что немаловажно, бесплатно доступен. Дополнительную информацию о Tomcat и проекте Jakarta можно найти в списке ссылок в конце этой статьи. Web-страница, указанная в разделе ссылок, также содержит ссылку, по которой можно загрузить исполняемые файлы Tomcat и исходный код.

СОВЕТ: Я рекомендую установить Tomcat в каталог, имя которого не содержит пробелов. Потом будет проще включить каталоги Tomcat в переменную classpath, например, при компиляции сервлетов.
О Rational PurifyPlus

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

  • Rational Purify - средство профилирования памяти (сбор данных профилирования памяти по объектам и методам, а также выполнение «мгновенных снимков» картины использования памяти приложением).
Полная оценочная версия Rational PurifyPlus может быть загружена с web-сайта Rational. Оценочная лицензия рассчитана на 14 дней. Rational Purify, Quantify, и PureCoverage также доступны на следующих сайтах отдельных инструментов Rational: Rational Suite DevelopmentStudio, Rational Suite TestStudio, и Rational Suite Enterprise.
  • Rational Quantify - средство профилирования времени выполнения приложения (сбор данных профилирования методов и выполнения строк программы, а также определение узких мест производительности приложения).
  • Rational PureCoverage - инструмент для работы с кодом (сбор информации о еще нетестированных учасках кода приложения, путем высвечивания пока не выполненных методов и строк кода).

Эти три инструментальные средства обеспечивают не только полную поддержку для Java, но также поддерживают и Visual C/C++, Visual Basic, и приложения .NET. В этой статье, при упоминании PurifyPlus, я имею в виду версию 2001А Rational PurifyPlus. Конечно же, для тестирования Java-приложений на стороне сервера с помощью Rational PurifyPlus, вы должны инсталлировать эти приложения на серверной машине.

СОВЕТ: При установке Rational PurifyPlus, выберите опцию пользовательской настройки и затем отметьте опцию: "Добавить Purify (а также Quantify и PureCoverage) в системный path." Это не является установкой по умолчанию, и весьма пригодится при запуске инструментов PurifyPlus из командной строки.

О сервлетах и серверных страницах Java

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

Серверные страницы Java (JSP) представляют собой в основном HTML-страницы, содержащие специальные теги, позволяющие либо встраивать код Java в страницу, либо предоставлять доступ к JavaBean и сервлетам, запущенным на стороне сервера. Rational PurifyPlus не может проверять синтаксис HTML, но способна тестировать код Java из серверных страниц, следя за событиями, поступающими от виртуальной машины Java (JVM).

За дальнейшей информацией о создании сервлетов и серверных страниц Java, см. статью Khawar Ahme, LoïcJulien "Enterprise Java and Rational Rose" в февральском выпуске (2001 г.) The Rational Edge.

Подготовка сервлетов и серверных страниц Java к тестированию с помощью Rational PurifyPlus

PurifyPlus имеет два основных уровня сбора данных: уровень методов и уровень строк. Для тестирования приложений Java на уровне методов, вам не нужно проводить перекомпиляцию тестируемого Java-приложения для сбора всей информации, относящейся к методам. Если вам нужно собрать информацию по строкам, то тогда придется перекомпилировать код Java для включения в него символьной отладочной информации. Для включения символьной информации в файлы классов Java, их следует перекомпилировать с параметром - g (компилятор компании Sun).

>javac -g MyServlet.java

Вся информация о Java-приложениях, выполняемых на Sun Java 2-совместимых виртуальных машинах, будет собираться с помощью JVMPI (Java Virtual Machine Profiling Interface - интерфейс профилирования виртуальной машины Java). Обязательным условием является использования виртуальной машины Java, полностью совместимой со спецификациями Sun Java 2. Кроме того, Rational PurifyPlus также поддерживает JVM компании Microsoft.

При компиляции сервлетов вам следует включить библиотеку сервлетов servlet.jar в переменную среды classpath. Эта библиотека инсталлируется вместе с Tomcat и находится в каталоге <Tomcat home>\common\lib. В качестве примера ниже представлена командная строка для компиляции MyServlet.java для создания файла с символьной отладочной информацией:

Javac -g -classpath <<Tomcat home>\common\lib\servlet.jar>MyServlet.java

Подготовка среды Windows для тестирования серверных страниц и сервлетов Java с помощью Rational PurifyPlus

Переменная среды

JAVA_HOME

указывает домашний каталог для виртуальной машины Java, принятой по умолчанию. Таким образом, также указывается виртуальная машина Java, с которой будет работать Rational PurifyPlus. Для правильной настройки выполнения программы на Java и возможности использования PurifyPlus, вам следует выполнить следующую команду, перед тем как вы в первый раз начнете профилирование нового сеанса Java:

pstart <or qstart, or cstart> -setup

Этой командой будет обновлен файл политик Java для выбора среды выполнения Java (JRE - Java Run-time Environment).

Ну а теперь давайте посмотрим на еще одну переменную среды:

JAVA_OPTIONS (или IBM_JAVA_OPTIONS для IBM JVM)

Как уже говорилось ранее, Rational PurifyPlus собирает всю информацию о приложении Java, используя интерфейс профилирования виртуальной машины Java (JVMPI). Так как PurifyPlus и JVM выполняются в качестве двух различных процессов, Java-процесс требует загрузки совместно используемой библиотеки PurifyPlus, называемой PureJVMPI. Эта библиотека прослушивает события JVM, собирает информацию о выполнении программы, выдаваемую JVMPI, и отсылает эту информацию PurifyPlus. Эта динамически связываемая библиотека загружается при помощи указания дополнительной опции при запуске выполнимого файла Java: -Xrun. Ниже приведен пример того, как PurifyPlus может быть запущена из командной строки:

> java -XrunPureJVMPI:Purify Java_App (или
>java -XrunPureJVMPI:Quantify Java_App или

>java -XrunPureJVMPI:Coverage Java_App)

Для профилирования Java-приложений, выполняемых на стороне сервера, вам потребуется создать вручную специальную системную переменную среды, с использованием опции -Xrun, которая будет запускать PurifyPlus каждый раз при активизации JVM. Для Sun JVM имя переменной будет _JAVA_OPTIONS и значение этой переменной должно быть:

-XrunPureJVMPI:Purify (или
-XrunPureJVMPI:Quantify  или
-XrunPureJVMPI:Coverage)

Если вы используете JVM компании IBM (что необходимо при работе на сервере приложений Java WebSphere), то в этом случае имя переменной среды должно быть IBM_JAVA_OPTIONS.

Вышеупомянутая опция, указанная в переменной среды _JAVA_OPTIONS , будет запускать Rational Purify (или Quantify, или PureCoverage) каждый раз при запуске Tomcat, и Purify (или Quantify, или PureCoverage) будет автоматически начинать сбор данных для процесса Java. Вы можете не включать в отчет данные, собранные от тех частей Java-процесса, которые не относятся к тестированию сервлетов и JSP, с использованием как предопределенных фильтров, так и PurifyPlus Filter Manager.

Подготовка среды сервера приложений Java к работе с Rational PurifyPlus

Для работы Rational PurifyPlus с сервером приложений Java, крайне важно указать одну и ту же переменную среды JAVA_HOME как для сервера, так и инструмента PurifyPlus. Для Apache Tomcat, вы можете непосредственно установить эту переменную, выполнив команду:

SET JAVA_HOME=<путь к установочному каталогу JRE>

Для серверов BEA WebLogic и IBM WebSphere, вы можете модифицировать командные файлы, используемые для установки переменных среды выполнения сервера, изменив значение переменной JAVA_HOME так, как показано ниже.

Подготовка PurifyPlus к сбору данных по приложению Java, выполнямом на сервере Apache Tomcat

Для того, чтобы запустить сбор информации Rational PurifyPlus о вашем сервлете или серверной странице Java, выполняющихся на Apache Tomcat, перед тестированием вы должны создать собственный набор предопределенных фильтров.

Фильтры PurifyPlus

В PurifyPlus предусмотрены две возможности фильтрации неотносящихся к тестированию данных. Первая возможность заключается в установке предопределенных фильтров для того инструмента, который вы планируете использовать (Rational PurifyPlus, Quantify или PureCoverage). Фильтр представляет собой список пакетов Java, для которых не нужно собирать данные. Этот список приводится в разделе [Prefilter] файла Profile.ini, который находится в родительском каталоге каждого из приложений PurifyPlus.

Каждый пакет Java, указанный в списке, должен быть с новой строки. Давайте изучим пример, показывающий, как предварительная фильтрация работает с функциями PurifyPlus.

Рис. 1. Файл Profile.ini для Rational Purify

Допустим, что мы хотим отключить филирование пакета Java com.sun. Если мы указали com.sun. (обратите внимание на точку в конце строки) в качестве строки в разделе фильтрации Profile.ini, тогда этот файл и все входящие пакеты будут исключены при выполнении сбора данных PurifyPlus во время тестирования (см. рис. 1). Для предварительной фильтрации индивидуальных классов вы можете указать их полные имена (сначала, как обычно, идет имя пакета) без заключительной точки. Например, com.rational.MyClass будет фильтровать класс MyClass пакета com.rational . Если вы укажете только имя класса (например, MyClass ), тогда этот класс будет фильтроваться во всех пакетах. PurifyPlus не поддерживает фильтрацию по индивидуальным методам класса.

PurifyPlus Filter Manager

Второй способ фильтрации данных заключается в использовании Filter Manager, доступ к которому можно получить с помощью графического интерфейса пользователя каждого из инструментов (см. рис. 2A и 2B). Filter Manager создает специальный двоичный файл фильтрации для тестирования приложения Java. Он может быть использован только после проведения профилирования или сбора данных.

Рис. 2A. Основное окно PurifyPlus Filter Manager в Rational Quantify

Файлы классов, проверяемые в списке, будут исключены из отчетов, но данные, собранные для них, будут сохранены в итоговых результатах (т.е., в ячейке "Time", находящейся в нижнем правом углу окна Filter Manager, показанного на рис. 2A).

СОВЕТ: За один раз вы можете проверить большое количество классов (например, все классы Java.*), с помощью мыши маркировав их в списке классов, удерживая при этом нажатой клавишу CTRL или SHIFT. Нажатие правой клавишей мыши на маркированном наборе классов приведет к появлению всплывающего окна, а затем вы можете выбрать "Enable" для того, чтобы создать фильтры сразу для всех маркированных Java-классов.

Рис. 2B. Использование PurifyPlus Filter Manager в Rational PureCoverage

При запуске Tomcat в PurifyPlus, я рекомендую следующий список фильтров, находящийся в файле Profile.ini для каждого из средств PurifyPlus (Purify, Quantify, PureCoverage):

org.omg. javax.servlet. com.sun. org.apache. org.xml.
org.w3c. sun.

Для других серверных приложений Java, вам понадобится создать другие фильтры. См. мои СОВЕТЫ по поводу того, как применять Rational PurifyPlus с серверами Java-приложений BEA WebLogic и IBM WebSphere.

Демо-приложение

Демо-приложение, используемое в этой статье, представляет собой электронный книжный магазин, называющийся "Duke's Bookstore." Это web-приложение может быть загружено с web-сайта компании Sun. Первоначально оно было создано как часть учебного пособия по созданию и выполнению сервлетов Java. Приложение состоит из ряда web-страниц и сервлетов, создающих контент для этих страниц. PurifyPlus может применяться для тестирования либо всего Web-приложения, либо любой его части (например, индивидуальных сервлетов).

Тестирование сервлетов и серверных страниц Java во время их выполнения с помощью Rational PurifyPlus

После компиляции Java-компонента с помещением в результирующий файл отладочной информации, и установки необходимых фильтров для инструментов PurifyPlus, можно начинать сбор информации по профилированию строк кода и покрытию кода, поступающую от сервлетов и серверных страниц Java.

В качестве первого шага, я советую запустить Rational Quantify и собрать информацию по анализу времени выполнения.

Профилирование времени выполнения приложения с помощью Rational Quantify

Присвоение значения -XrunPureJVMPI:Quantify переменной среды _JAVA_OPTIONS приведет к запуску Quantify при старте сервера Tomcat. По мере того, как вы работаете с демо-приложением, Quantify будет фиксировать время, затрачиваемое на выполнение каждого метода и строки кода, которые будут вызываться на web-странице. После того, как Tomcat инициализирован и запущен, доступ к тестовому приложению можно получить, указав в браузере следующий URL:

http://localhost:8080/bookstore/bookstore.html

После того, как вы завершили тестовое приложение, закройте браузер и остановите сервер Tomcat. В Quantify результаты профилирования будут отображены в виде нескольких различных представлений. Первым является представление CallGraph, показанное на рис. 3.


Рис. 3. Диаграмма вызовов Rational Quantify для web-приложения

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

Информация по выполнению строк для выбранных методов включается в представление Annotated Source, как показано на рис. 4:

Рис. 4. Представление Annotated Source для One Method в web-приложении

Дальнейшая информация может быть получена из других представлений, создаваемых Quantify, включая представления Function Detail, показанные на рис. 5:

Рис. 5. Представление Function Detail для One Method в web-приложении

Преимуществом использования Quantify по сравнению с другими решениями является способ представления данных профилирования. Quantify позволяет вам заглянуть непосредственно в саму основу критических мест производительности тестируемого приложения.

Покрытие кода с помощью Rational PureCoverage

Если теперь мы изменим значение переменной среды _JAVA_OPTIONS на XrunPureJVMPI:Coverage и снова запустим на выполнение наше тестовое web-приложение, PureCoverage запишет протестированные методы и строки кода, и высветит нетестированные части приложения.

Как показано на рис. 6A и 6B, PureCoverage выдает как информацию по методам, так и по строкам кода, показывая покрытие тестируемого сервлета Java:

Рис. 6A. Представление Method Coverage в Rational PureCoverage для тестирования web-приложения

Для покрытия на уровне методов, PureCoverage выдает статистику для методов тестированного приложения, отсортированную по модулям, в которых находятся эти методы, или же отсортированную по файлам исходного кода, в которых определены эти методы.

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

Рис. 6B. Покрытие кода по строкам Rational PureCoverage для One Servlet Method из тестируемого web-приложения

Этот вид информации особенно полезен при определении шагов тестирования во время выполнения, или создания скриптов для автоматизации процесса тестирования. Кроме того, PureCoverage позволяет объединять данные покрытия для нескольких различных тестов одного и того же приложения, давая тем самым явное представление о качестве тестирования разработанного приложения.

Профилирование использования памяти с помощью Rational Purify

Использование Rational Purify для получения профиля использования памяти тестируемого web-приложения сходно с использованием PureCoverage и Quantify. Снятие "мгновенных снимков" памяти обеспечивает возможность сравнения картины использования памяти на различных этапах выполнения приложения. Подобная процедура служит весьма эффективным методом определения утечек памяти.

Утечки памяти в серверном приложении (которое зачастую предназначено для круглосуточной работы) может привести к отказу, как самого приложения, так и всей системы, вследствие постоянно увеливающегося количества захваченной памяти по мере работы приложения. Влияние утечек памяти на производительность приложения также является очень важным моментом. Карта использования памяти, которую вы можете записать для Java-приложения с помощью Rational Purify, позволяет проводить подробный анализ ее использования.

При анализе сервлетов и серверных страниц Java, Purify генерирует тот же набор отчетов, что и в случае анализа Java-приложений и Java-апплетов. На рис. 7 показано то, что записывает Purify при анализе серверных страниц Java с вызываемыми методами JavaBean.

Рис. 7. Диаграмма вызовов Rational Purify для серверной страницы Demo

Список методов предоставляет больше информации об использовании памяти для этой сессии JSP, как показано на рис. 8.

Рис. 8. Список функций Rational Purify для JSP

Точно так же, как Rational Quantify предоставляет пользователям информацию об участках приложения с наибольшим временем выполнения, Purify выдает данные об узких местах использования памяти. Отсортировав методы в представлении Function List, легко определить те, которые захватывают слишком много памяти; Purify также обеспечивает ряд других представлений для проведения подобного анализа.

Максимальный результат при минимальных усилиях

При необходимости можно легко развернуть Rational PurifyPlus на серверном компьютере для получения развернутой информации о профилировании и покрытии кода для Java-приложений, выполняемых на стороне сервера. Естественно, вы можете использовать Rational PurifyPlus не только с коммерческими серверами приложений Java, но также и с более легкими - и бесплатными - обработчиками Java-сервлетов и JSP, такими как Apache Tomcat.

Ссылки

  1. Спецификации серверных страниц Java
  2. Khawar Ahmed and Loïc Julien, "Enterprise Java and Rational Rose - Part II." The Rational Edge , February 2001.
  3. Goran Begic, "Memory Profiling in Java." The Rational Edge , Январь 2001 г.
  4. Goran Begic, "Monitoring Object Creation in Java Application Profiling with Rational PurifyPlus." The Rational Edge , Июнь 2001 г.
  5. Руководство программиста по работе с сервлетами в Netscape Enterprise Server 4.0
  6. Пример сервлета Bookstore

Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=4724