Средства тестирования приложений для разработчиков

       

Quantfy


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

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

Rational Quantify - позволяет решить описанные выше проблемы, как говорится, одним махом. Это простое, но в то же время мощное и гибкое средство учета производительности приложений - незаменимый инструмент для сбора и анализа информации о производительности созданного программного продукта.

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

Quantify предоставляет полную статистическую выкладку, невзирая на размеры тестируемого приложения и время тестирования. Сбор данных осуществляется посредством технологии OCI (Object Code Insertion). Суть способа состоит в подсчете всех машинных циклов путем вставки счетчиков в код для каждого функционального блока тестируемой программы (все циклы приложения просчитываются реально, а не при помощи произвольных выборок, как в большинстве пакетов тестирования). Уникальность данного подхода заключается в том, что, во-первых, тестируется не только сам исходный код, но и все используемые компоненты, (например: библиотеки DLL, системные вызовы), а во-вторых, для подобного анализа совсем необязательно иметь исходные тексты тестируемого приложения.
Последнюю функцию я хотел бы выделить особо, поскольку, пользуясь Quantify, любой разработчик может подвергнуть тестированию произвольное приложение, написанное в любой среде, с использованием любого известного компилятора!

Рисунок 1 Гибкая система фильтров Quantify позволяет, не загромождая экран лишними выводами (например, системными вызовами), получать необходимую информацию только о внутренних, программных вызовах. Вооружившись полученной статистикой, разработчик без труда выявит узкие места в производительности тестируемого приложения и устранит их в кратчайшие сроки.
Рисунок 2 Попробуем рассмотреть работу Quantify на конкретном примере - например, используя стандартную программу "Clock" из состава Windows NT 4.0 выяснить, сколько и чего она вызывает. После загрузки необходимо под контролем Quantify исполнить "Clock", как в обыкновенном отладчике, с той лишь разницей, что здесь нельзя наблюдать дизассемблированный код программы. На рисунке 1 показан диалог запуска "подопытного" приложения. Как видно, в данном диалоге нет никакой сложности. Quantify для работы необходимо знать только месторасположение программы и рабочий каталог. Рисунок 2 выводит на экран сведения о собираемой статистике. В зависимости от количества подключаемых библиотек, количество строк также изменяется. Подобная информация собирается для всех подключаемых модулей.
Рисунок 3 К сожалению, "Clock" не имеет большого числа явно загружаемых модулей (точнее - ни одного), в отличие от программы "Paint", изображенной на рисунке 3. Подобным образом Quantify собирает начальную, предварительную статистику о работе приложения.


Рисунок 4 После такой преамбулы запускается само тестируемое приложение, без каких бы то ни было видимых ограничений: все идет как обычно. Однако, работа Quantify на этом не заканчивается: программа продолжает контролировать тестируемое приложение, отслеживая и подсчитывая число обращений ко всем функциям, вызываемых "подопытной" программой.


В любой момент времени можно получить слепок состояния (snapshot), показывающий общий список вызовов на данный момент работы, который впоследствии можно проанализировать. Вся статистика во время работы приложения отображается в специальном окне (рис. 4), где в наглядной форме демонстрируется временная диаграмма исполнения приложения. Здесь отображается временная характеристика (сколько приложение работало), демонстрируется (разноцветными квадратами), чем оно было занято в определенный момент времени и, самое важное, как завершилось. В закладках можно найти более детализованное описание как тестируемой программы, так и компьютера в целом. Еще один любопытный момент: во время сбора разработчик может работать со своим продуктом как обычно: нажимать на кнопки, заходить в меню и пр. Естественно, при этом вызываются явным образом определенные функции в тестируемой программе, которые тут же попадают в статистику Quantify.
Рисунок 5 Прервать процесс возможно в любой момент, закрыв тестируемое приложение (обратите внимание на рисунок 4. В конце диаграммы отображается черный квадрат, говорящий о том, что приложение завершилось). Здесь завершается механический этап сбора статистики и начинается творческий анализ. Способов, предоставляемых Quantify для анализа, более чем достаточно: можно посмотреть и дерево вызовов (Call Graph), и список функций с точными замерами (Function List), а если Вы разрабатываете свои приложения в среде Visual Studio, то Quantify позволит вызывать исходные тексты тестируемых функций (в этом случае эффективность разработки повышается за счет интеграции Quantify с Visual Studio).
Рисунок 6 Начнем описание по порядку. На рисунке 5 показано дерево вызовов для приложения "Clock". Двойное нажатие на любой функции вызовет либо поддерево (если функция разворачиваемая), либо статистическую выкладку по числу вызовов данной функции. Следующий рисунок (№ 6) демонстрирует окно списка, где отображаются в табличном виде наименования всех функций со всеми характеристиками.


Здесь можно, отсортировав список по определенному признаку, выяснить какие функции сколько раз вызывались и сколько времени заняли. Табличное представление позволяет сравнивать временные интервалы и вызовы нескольких функций (вызовов) для более глубокого сравнительного анализа. Возвращаясь к рисунку 6, хочется обратить ваше внимание на то, какую детальную информацию представляет Quantify. Приглядевшись, можно заметить, что самая часто вызываемая функция это - "GetLocalTime", число вызовов составляет 5831. Соответственно, получив такую информацию, разработчик сам решит, стоит или нет заниматься ее оптимизацией.
Рисунок 7 Рисунок 7 демонстрирует следующий уровень детализации статистики вызовов. Здесь выводится та же информация, что и на предыдущем шаге, но уже только для конкретной функции и с использованием более понятных в визуальном отношении гистограмм. К сожалению, объем статьи не позволяет более детально объяснить все аспекты применения Rational Quantify. Но это и не обязательно, так как хочется вызвать интерес как можно большего числа людей к программным продуктам компании Rational, которые пока еще недостаточно хорошо знакомы большинству российских разработчиков. В заключение коротко рассмотрим возможности программы Quantify:
  • Выдает точную и детальную информацию о производительности приложения
  • Указывает на все узкие места в приложении (как в пользовательском коде, так и в системных вызовах)
  • Представляет комплексный дополнительный обзор данных по производительности (Call Graph, Function Lists, Function Detail)
  • Гибкая настройка по желаниям и потребностям пользователя
  • Позволяет многократно тестировать приложение (по ходу разработки), позволяя отслеживать изменения в количестве вызываемых функций
  • Интеграция с Visual C++ с возможностью вызова исходных текстов функций тестируемого приложения
  • Интегрируется с Rational Robot, ClearQuest и Visual Test
  • Поддерживает Visual C++, Visual Basic и Visual Java приложения
|  

Содержание раздела