Содержание этой статьи было первоначально написано Марком Баккером в блоге 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 для тестирования производительности. Я напишу блог, чтобы описать этот метод позже.