Gatling срещу JMeter срещу The Grinder: Сравняване на инструментите за тестване на натоварването

1. Въведение

Изборът на подходящия инструмент за работата може да бъде плашещ. В този урок ще опростим това, като сравним три инструмента за тестване на натоварвания на уеб приложения - Apache JMeter, Gatling и The Grinder - срещу прост REST API.

2. Заредете инструменти за тестване

Първо, нека да прегледаме бързо някои предистории за всеки.

2.1. Гатлинг

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

2.2. JMeter

JMeter е инструмент за тестване на натоварване от Apache. Той осигурява приятен GUI, който използваме за конфигуриране. Уникална функция, наречена логически контролери, дава голяма гъвкавост за настройване на тестове в GUI.

Посетете нашия урок за въвеждане в JMeter за екранни снимки и повече обяснения.

2.3. Мелницата

И нашият последен инструмент, The Grinder, предоставя по-базиран на програмиране скриптов механизъм от другите два и използва Jython. Въпреки това, The Grinder 3 има функционалност за запис на скриптове.

Мелницата също се различава от другите два инструмента, като позволява конзолни и агентни процеси. Тази функционалност предоставя възможността за процес на агент, така че тестовете за натоварване да могат да се увеличат на множество сървъри. Той е специално рекламиран като инструмент за тестване на натоварването, създаден за разработчици за намиране на блокировки и забавяния.

3. Настройка на тестовия калъф

След това за нашия тест се нуждаем от API. Нашата функционалност на API включва:

  • добавяне / актуализиране на запис за награди
  • вижте запис на една / всички награди
  • свържете транзакция със запис на награди на клиента
  • преглед на транзакции за клиентски награден запис

Нашият сценарий:

Магазин има национална продажба с нови и завръщащи се клиенти, които се нуждаят от акаунти за награди на клиенти, за да спестят. API за награди проверява акаунта за награди на клиента по идентификатор на клиента . Ако не съществува акаунт за награди, добавете го, след което свържете към транзакцията.

След това правим запитване към транзакциите.

3.1. Нашият REST API

Нека да получим бърз акцент върху API, като разгледаме някои от методите:

@PostMapping(path="/rewards/add") public @ResponseBody RewardsAccount addRewardsAcount(@RequestBody RewardsAccount body) @GetMapping(path="/rewards/find/{customerId}") public @ResponseBody Optional findCustomer(@PathVariable Integer customerId) @PostMapping(path="/transactions/add") public @ResponseBody Transaction addTransaction(@RequestBody Transaction transaction) @GetMapping(path="/transactions/findAll/{rewardId}") public @ResponseBody Iterable findTransactions(@PathVariable Integer rewardId) 

Обърнете внимание на някои от връзките, като например заявка за транзакции по идентификатор на наградата и получаване на акаунта за награди по идентификатор на клиента . Тези взаимоотношения налагат някаква логика и анализ на отговора за създаването на нашия тестов сценарий.

Тестваното приложение също използва H2 база данни в паметта за постоянство.

За щастие всички наши инструменти се справят доста добре, някои по-добре от други.

3.2. Нашият план за тестване

След това се нуждаем от тестови скриптове.

За да получим справедливо сравнение, ще извършим същите стъпки за автоматизация за всеки инструмент:

  1. Генерирайте произволни идентификатори на клиентски акаунти
  2. Публикувайте транзакция
  3. Анализирайте отговора за произволен идентификатор на клиента и идентификатор на транзакция
  4. Заявка за клиент възнаграждава идентификатора на акаунта с идентификатора на клиента
  5. Анализирайте отговора за идентификационния номер на наградата
  6. Ако не съществува идентификатор на акаунт за награди, добавете такъв с публикация
  7. Публикувайте същата първоначална транзакция с актуализиран идентификатор за награди, като използвате идентификатора на транзакцията
  8. Заявка за всички транзакции по идентификатор на акаунт за награди

Нека разгледаме по-отблизо стъпка 4 за всеки инструмент. И не забравяйте да проверите пробата за всичките три завършени скрипта.

3.3. Гатлинг

За Gatling запознаването със Scala добавя благодат за разработчиците, тъй като API на Gatling е стабилен и съдържа много функции.

Приложният програмен интерфейс (API) на Gatling използва DSL подход, както виждаме в стъпка 4:

.exec(http("get_reward") .get("/rewards/find/${custId}") .check(jsonPath("$.id").saveAs("rwdId"))) 

Особено внимание заслужава поддръжката на Gatling за JSON Path, когато трябва да прочетем и проверим HTTP отговор. Тук ще вземем идентификационния номер на наградата и ще го запазим във вътрешното състояние на Gatling.

Също така, езикът на израза на Gatling улеснява динамичните низове на тялото на заявката :

.body(StringBody( """{ "customerRewardsId":"${rwdId}", "customerId":"${custId}", "transactionDate":"${txtDate}" }""")).asJson) 

И накрая нашата конфигурация за това сравнение. 1000 изпълнения, зададени като повторение на целия сценарий, методът AtOnceUsers задава нишките / потребителите:

val scn = scenario("RewardsScenario") .repeat(1000) { ... } setUp( scn.inject(atOnceUsers(100)) ).protocols(httpProtocol)

Целият скрипт Scala може да се види в нашия репозитор на Github.

3.4. JMeter

JMeter генерира XML файл след конфигурацията на GUI. Файлът съдържа специфични за JMeter обекти със зададени свойства и техните стойности, например:

Вижте атрибутите на testname , те могат да бъдат етикетирани, тъй като ги разпознаваме, че съвпадат с логическите стъпки по-горе. Възможността за добавяне на деца, променливи и стъпки на зависимост дава на JMeter гъвкавост, както предоставя скриптове. Освен това дори задаваме обхвата на нашите променливи!

Нашата конфигурация за изпълнения и потребители в JMeter използва ThreadGroups :

100

View the entire jmx file as a reference. While possible, writing tests in XML as .jmx files do not make sense with a full-featured GUI.

3.5. The Grinder

Without the functional programming of Scala and GUI, our Jython script for The Grinder looks pretty basic. Add some system Java classes, and we have a lot fewer lines of code.

customerId = str(random.nextInt()); result = request1.POST("//localhost:8080/transactions/add", "{"'"customerRewardsId"'":null,"'"customerId"'":"+ customerId + ","'"transactionDate"'":null}") txnId = parseJsonString(result.getText(), "id")

However, fewer lines of test setup code are balanced by the need for more string maintenance code such as parsing JSON strings. Also, the HTTPRequest API is slim on functionality.

With The Grinder, we define threads, processes, and runs values in an external properties file:

grinder.threads = 100 grinder.processes = 1 grinder.runs = 1000

Our full Jython script for The Grinder will look like this.

4. Test Runs

4.1. Test Execution

All three tools recommend using the command line for large load tests.

To run the tests, we'll use Gatling open-source version 3.4.0 as a standalone tool, JMeter 5.3 and The Grinder version 3.

Gatling requires only that we have JAVA_HOME and GATLING_HOME set. To execute Gatling we use:

./gatling.sh

in the GATLING_HOME/bin directory.

JMeter needs a parameter to disable the GUI for the test as prompted when starting the GUI for configuration:

./jmeter.sh -n -t TestPlan.jmx -l log.jtl

Like Gatling, The Grinder requires that we set JAVA_HOME and GRINDERPATH. However, it needs a couple more properties, too:

export CLASSPATH=/home/lore/Documents/grinder-3/lib/grinder.jar:$CLASSPATH export GRINDERPROPERTIES=/home/lore/Documents/grinder-3/examples/grinder.properties

As mentioned above, we provide a grinder.properties file for additional configuration such as threads, runs, processes, and console hosts.

Finally, we bootstrap the console and agents with:

java -classpath $CLASSPATH net.grinder.Console
java -classpath $CLASSPATH net.grinder.Grinder $GRINDERPROPERTIES

4.2. Test Results

Each of the tests ran 1000 runs with 100 users/threads. Let's unpack some of the highlights:

Successful Requests Errors Total Test Time (s) Average Response Time (ms) Mean Throughput
Gatling 500000 Requests 0 218s 42 2283 req/s
JMeter 499997 Requests 0 237s 46 2101 req/s
The Grinder 499997 Requests 0 221s 43 2280 req/s

The results show the 3 tools have similar speed, with Gatling slightly edging out the other 2, based on the mean throughput.

Each tool also provides additional information in a friendlier user interface.

Gatling will generate an HTML report at the end of the run, which contains multiple graphs and statistics, for the total run as well as for each request. Here's a snippet of the test result report:

When using JMeter, we can open the GUI after the test run and generate an HTML report based on the log file where we saved the results:

The JMeter HTML report also contains a breakdown of the statistics per request.

Finally, The Grinder Console records statistics for each agent and run:

While The Grinder is high-speed, it comes at the cost of additional development time and less diversity of output data.

5. Summary

Now it's time to take an overall look at each of the load testing tools.

Gatling JMeter The Grinder
Project and Community 9 9 6
Performance 9 8 9
Scriptability/API 7 9 8
UI 9 8 6
Reports 9 7 6
Integration 7 9 7
Summary 8.3 8.3 7

Gatling:

  • Solid, polished load testing tool that outputs beautiful reports with Scala scripting
  • Open Source and Enterprise support levels for the product

JMeter:

  • Robust API (through GUI) for test script development with no coding required
  • Поддръжка на фондация Apache и чудесна интеграция с Maven

Мелницата:

  • Инструмент за бързо тестване на натоварване за разработчици, използващи Jython
  • Мащабируемостта на различни сървъри осигурява още по-голям потенциал за големи тестове

Просто казано, ако скоростта и мащабируемостта са необходимост, използвайте The Grinder.

Ако страхотно изглеждащите интерактивни графики помагат да се покачи производителността, за да се аргументирате за промяна, тогава използвайте Gatling.

JMeter е инструментът за сложна бизнес логика или интеграционен слой с много видове съобщения. Като част от Apache Software Foundation, JMeter предоставя зрял продукт и голяма общност.

6. Заключение

В заключение виждаме, че инструментите имат сравними функционалности в някои области, докато блестят в други. Правилният инструмент за правилната работа е разговорната мъдрост, която работи при разработването на софтуер.

И накрая, API и скриптовете могат да бъдат намерени в Github.