Статьи

О тестировании приложений GWT на производительность и производительность

Содержание этой статьи было первоначально написано Марком Баккером в блоге Xebia .

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

Одной из таких платформ является Google Web Toolkit. Подобные фреймворки полезны для разработки … но для тестирования производительности они могут быть проблемой.

Для тестирования производительности лучше всего использовать прокси-сервер, регистрирующий весь трафик между браузером и приложением. В большинстве случаев это просто http с протоколом html или xml. Таким образом, легко воспроизвести записанный тест и параметризовать его различными значениями.

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

Сначала вы устанавливаете в браузере прокси, который вы определяете в JMeter. JMeter запишет запросы, которые вы делаете.

образ

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

При записи моих первых приложений GWT я обнаружил, что GWT использует собственный проприетарный протокол, заключенный в своего рода JSON. Это дает как минимум 3 проблемы, если вы используете JMeter для записи и воспроизведения.

В следующих 4 параграфах я дам обзор GWT и расскажу вам о трех приемах, которые я использовал для записи и воспроизведения скриптов для приложений GWT. В моем следующем блоге я также объясню альтернативный подход к тестовым фреймворкам, таким как GWT.

Обзор GWT

GWT — это среда, в которой вы можете кодировать приложение, которое будет предварительно скомпилировано в javascript и служебную часть (java). Часть javascript будет использоваться для просмотра одной страницы в браузере.
Таким образом, у вас приложение с высокой скоростью отклика, потому что вам не нужно перезагружать страницы снова и снова. GWT также имеет множество элементов управления, которые вы можете использовать, не заботясь о связи между вашим элементом управления и вашим сервисом. Весь код JavaScript и коммуникационный код будут сгенерированы на этапе предварительной компиляции.

3 хитрости, чтобы использовать JMeter для нагрузочного тестирования GWT

Контекст сеанса GWT

GWT использует сеанс для каждого уникального пользователя.

Здесь вы видите пример запроса, поступившего от сгенерированного GWT внешнего интерфейса javascript:

7|0|4|http://myserver:9080/myurl/|ABE2C0B156012B8657E5E26645105F43|
org.class.MyClass|FieldName|1|2|3|4|0|

Первое, что вы можете увидеть, это своего рода хеш-код ( ABE2C0B156012B8657E5E26645105F43), этот код можно найти на одной из первых html-страниц с расширением файла .nocache, которое было извлечено ранее. Это своего рода контекст сеанса. Вам это нужно для каждой уникальной сессии.

Обфускация / сжатие идентификатора объекта

Если вы запрашиваете объект по идентификатору через GWT во внешнем интерфейсе, GWT запутывает / сжимает его. Чтобы получить предопределенные записи, вы должны деобфусцировать / распаковать их. В приведенном ниже примере я запрашиваю запись с идентификатором 318 (E $). В сообщении вы видите E $.

//OK[7,1,["java.lang.Integer/3438268394"],0,7,E$]

Мне потребовалось некоторое время, чтобы выяснить, как сопоставить обфусцированные / сжатые идентификаторы GWT с идентификаторами, которые используются в приложении.

Наконец я смог создать функцию для сжатия / шифрования идентификатора, как это делает GWT.

String chars = “ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789$_”;
long id = 318;
String out = “”;
while(id > 0){
    long charpos = id % 64;
id /= 64;
out = chars.charAt((int)charpos) + out;
}
System.out.println(“GWT id: ” + out);
GWT конкретный JSON

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

Здесь вы видите пример ответа JSON от GWT.

//OK[35,8,34,27,5,’CvA’,
4,26,3,8,33,27,5,’CvB’,
4,0,3,8,7,6,5,’Cvh’,
4,0,3,30,2,2559,1,[“com.search.searchResult/3409195600″,”java.util.ArrayList/4159755760″,
“com.data.client.message.MyMessageSummary/3311733355″,”java.lang.Long/4227064769″,
“type.type1“,”My Object type 1.”,”08-10-2012 10:06″,”55863485″,
“04-10-2012 11:27″,
” type.type2“,”My Object type 54″,”04-10-2012 11:28″,
“05-10-2012 11:27″,

Этот ответ представляет собой список из 4 записей. Первые 4 строки дают некоторую информацию об идентификаторе объекта и количестве данных для этой записи, которые будут отличаться от предыдущих записей.

запись Дата Тип
345 08-10-2012 10:06 type.type1
346 04-10-2012 11:27 type.type2
347 04-10-2012 11:28 type.type1
348 05-10-2012 11:27 type.type2

Как вы можете видеть, данные type.type1 и type.type2 будут видны только два раза в данных JSON.
Это пока он используется 4 раза. GWT использует некоторый тип указателей между записями, чтобы указывать на данные, которые использовались ранее.

Другой способ тестирования

Именно в этот момент я решил, что нам нужен другой способ тестирования приложений GWT.

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

Тестеры функций часто используют Selenium для функционального тестирования. Через некоторое время я нашел способ использовать Selenium в сочетании с JMeter для тестирования производительности. Я напишу блог, чтобы описать этот метод позже.