Gatling vs JMeter vs The Grinder: Membandingkan Alat Uji Beban

1. Perkenalan

Memilih alat yang tepat untuk pekerjaan itu bisa jadi menakutkan. Dalam tutorial ini, kita akan menyederhanakannya dengan membandingkan tiga alat pengujian beban aplikasi web - Apache JMeter, Gatling, dan The Grinder – dengan REST API sederhana.

2. Alat Pengujian Beban

Pertama, mari kita dengan cepat meninjau beberapa latar belakang masing-masing.

2.1. Gatling

Gatling adalah alat pengujian beban yang membuat skrip pengujian di Scala. Perekam Gatling menghasilkan skrip uji Scala, fitur utama untuk Gatling. Lihat tutorial Pengenalan Gatling kami untuk informasi lebih lanjut.

2.2. JMeter

JMeter adalah alat pengujian beban oleh Apache. Ini menyediakan GUI yang bagus yang kami gunakan untuk konfigurasi. Sebuah fitur unik yang disebut pengontrol logika memberikan fleksibilitas yang tinggi untuk menyiapkan pengujian di GUI.

Kunjungi tutorial Intro to JMeter kami untuk screenshot dan penjelasan lebih lanjut.

2.3. Penggiling

Dan alat terakhir kami, The Grinder, menyediakan lebih banyak mesin skrip berbasis pemrograman daripada dua lainnya dan menggunakan Jython. Namun, The Grinder 3 memang memiliki fungsionalitas untuk merekam skrip.

Grinder juga berbeda dari dua alat lainnya dengan memungkinkan proses konsol dan agen. Fungsionalitas ini menyediakan kemampuan untuk proses agen sehingga uji beban dapat ditingkatkan di beberapa server. Ini secara khusus diiklankan sebagai alat uji beban yang dibuat untuk pengembang untuk menemukan kebuntuan dan perlambatan.

3. Pengaturan Kasus Uji

Selanjutnya, untuk pengujian kami, kami membutuhkan API. Fungsionalitas API kami meliputi:

  • tambahkan / perbarui catatan hadiah
  • lihat satu / semua catatan hadiah
  • tautkan transaksi ke catatan hadiah pelanggan
  • lihat transaksi untuk catatan penghargaan pelanggan

Skenario Kami:

Sebuah toko mengadakan penjualan nasional dengan pelanggan baru dan lama yang membutuhkan akun hadiah pelanggan untuk mendapatkan tabungan. Penghargaan API memeriksa akun hadiah pelanggan dengan id pelanggan . Jika tidak ada akun hadiah, tambahkan, lalu tautkan ke transaksi.

Setelah ini, kami menanyakan transaksi.

3.1. API REST kami

Mari kita soroti singkat dari API dengan melihat beberapa metode bertopik:

@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) 

Perhatikan beberapa hubungan seperti meminta transaksi dengan id reward dan mendapatkan akun reward dengan id pelanggan . Hubungan ini memaksa beberapa logika dan beberapa penguraian respons untuk pembuatan skenario pengujian kami.

Aplikasi yang diuji juga menggunakan database dalam memori H2 untuk persistensi.

Untungnya, semua alat kami menanganinya dengan cukup baik, beberapa lebih baik daripada yang lain.

3.2. Rencana Pengujian kami

Selanjutnya, kami membutuhkan skrip uji.

Untuk mendapatkan perbandingan yang adil, kami akan melakukan langkah-langkah otomatisasi yang sama untuk setiap alat:

  1. Hasilkan id akun pelanggan acak
  2. Posting transaksi
  3. Parse respons untuk id pelanggan acak dan id transaksi
  4. Kueri untuk id akun hadiah pelanggan dengan id pelanggan
  5. Parse respons untuk id akun hadiah
  6. Jika tidak ada id akun hadiah, tambahkan satu dengan postingan
  7. Posting transaksi awal yang sama dengan id hadiah yang diperbarui menggunakan id transaksi
  8. Kueri untuk semua transaksi dengan id akun hadiah

Mari kita lihat lebih dekat Langkah 4 untuk setiap alat. Dan, pastikan untuk memeriksa sampel untuk ketiga skrip yang telah diselesaikan.

3.3. Gatling

Bagi Gatling, keakraban dengan Scala menambah keuntungan bagi pengembang karena API Gatling kuat dan berisi banyak fitur.

API Gatling menggunakan pendekatan DSL pembangun, seperti yang dapat kita lihat pada langkah 4:

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

Catatan khusus adalah dukungan Gatling untuk JSON Path ketika kita perlu membaca dan memverifikasi respons HTTP. Di sini, kami akan mengambil id hadiah dan menyimpannya ke status internal Gatling.

Selain itu, bahasa ekspresi Gatling membuat String tubuh permintaan dinamis lebih mudah :

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

Terakhir konfigurasi kami untuk perbandingan ini. 1000 proses berjalan sebagai pengulangan dari seluruh skenario, metode atOnceUsers mengatur utas / pengguna:

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

Seluruh skrip Scala dapat dilihat di repo Github kami.

3.4. JMeter

JMeter menghasilkan file XML setelah konfigurasi GUI. File tersebut berisi objek khusus JMeter dengan properti set dan nilainya, misalnya:

Periksa atribut testname , mereka dapat diberi label seperti yang kita kenali cocok dengan langkah-langkah logis di atas. Kemampuan untuk menambahkan turunan, variabel, dan langkah-langkah ketergantungan memberi JMeter fleksibilitas seperti yang disediakan skrip. Selanjutnya, kami bahkan mengatur ruang lingkup untuk variabel kami!

Konfigurasi kami untuk berjalan dan pengguna di JMeter menggunakan 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
  • Dukungan Apache Foundation dan integrasi yang hebat dengan Maven

Penggiling:

  • Alat pengujian beban kinerja cepat untuk pengembang yang menggunakan Jython
  • Skalabilitas lintas server memberikan potensi yang lebih besar untuk pengujian besar

Sederhananya, jika kecepatan dan skalabilitas diperlukan, gunakan The Grinder.

Jika grafik interaktif yang tampak bagus membantu menunjukkan peningkatan kinerja untuk memperdebatkan perubahan, gunakan Gatling.

JMeter adalah alat untuk logika bisnis yang rumit atau lapisan integrasi dengan banyak jenis pesan. Sebagai bagian dari Apache Software Foundation, JMeter menyediakan produk yang matang dan komunitas yang besar.

6. Kesimpulan

Sebagai kesimpulan, kami melihat bahwa alat memiliki fungsi yang sebanding di beberapa area sementara di area lain bersinar. Alat yang tepat untuk pekerjaan yang tepat adalah kebijaksanaan sehari-hari yang bekerja dalam pengembangan perangkat lunak.

Terakhir, API dan skrip dapat ditemukan di Github.