Gatling vs JMeter vs The Grinder: Membandingkan Alat Uji Beban

1. Pengenalan

Memilih alat yang tepat untuk pekerjaan itu boleh menakutkan. Dalam tutorial ini, kami akan mempermudahnya dengan membandingkan tiga alat pengujian beban aplikasi web - Apache JMeter, Gatling, dan The Grinder - dengan REST API yang mudah.

2. Alat Uji Beban

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

2.1. Gatling

Gatling adalah alat pengujian beban yang membuat skrip ujian di Scala. Perekam Gatling menghasilkan skrip ujian Scala, ciri utama untuk Gatling. Lihat tutorial Pengenalan Gatling kami untuk maklumat lebih lanjut.

2.2. JMeter

JMeter adalah alat pengujian beban oleh Apache. Ini menyediakan GUI yang bagus yang kami gunakan untuk konfigurasi. Ciri unik yang disebut pengawal logik memberikan fleksibiliti yang besar untuk menyiapkan ujian di GUI.

Lawati tutorial Pengenalan JMeter kami untuk tangkapan skrin dan penjelasan lebih lanjut.

2.3. Pengisar

Dan alat terakhir kami, The Grinder, menyediakan mesin skrip berasaskan pengaturcaraan daripada dua yang lain dan menggunakan Jython. Namun, The Grinder 3 memang mempunyai fungsi untuk merakam skrip.

Grinder juga berbeza dari dua alat lain dengan membenarkan proses konsol dan ejen. Fungsi ini memberikan kemampuan untuk proses ejen sehingga ujian beban dapat meningkat di beberapa pelayan. Ia diiklankan secara khusus sebagai alat ujian beban yang dibina untuk pembangun untuk menemui jalan buntu dan kelambatan.

3. Persediaan Kes Ujian

Seterusnya, untuk ujian kami, kami memerlukan API. Fungsi API kami merangkumi:

  • tambah / kemas kini rekod ganjaran
  • lihat satu / semua rekod ganjaran
  • pautkan transaksi ke rekod ganjaran pelanggan
  • melihat urus niaga untuk rekod ganjaran pelanggan

Senario kami:

Sebuah kedai mempunyai penjualan di seluruh negara dengan pelanggan baru dan pemulangan yang memerlukan akaun ganjaran pelanggan untuk mendapatkan simpanan. API ganjaran menyemak akaun ganjaran pelanggan oleh id pelanggan . Sekiranya tidak ada akaun ganjaran, tambahkan, kemudian pautkan ke transaksi.

Selepas ini, kami membuat pertanyaan mengenai urus niaga.

3.1. API REST kami

Mari dapatkan sorotan ringkas API dengan melihat beberapa rintisan kaedah:

@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 membuat pertanyaan untuk transaksi dengan id ganjaran dan mendapatkan akaun ganjaran oleh id pelanggan . Hubungan ini memaksa logik dan tindak balas menghuraikan penciptaan senario ujian kami.

Aplikasi yang diuji juga menggunakan pangkalan data dalam memori H2 untuk kegigihan.

Nasib baik, alat kami semuanya mengatasinya dengan baik, ada yang lebih baik daripada yang lain.

3.2. Rancangan Pengujian Kami

Seterusnya, kita memerlukan skrip ujian.

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

  1. Hasilkan id akaun pelanggan secara rawak
  2. Kirim urus niaga
  3. Huraikan jawapan untuk id pelanggan rawak dan id transaksi
  4. Pertanyaan untuk id ganjaran pelanggan dengan id pelanggan
  5. Huraikan jawapan untuk id akaun ganjaran
  6. Sekiranya tidak ada id akaun ganjaran, tambahkan satu dengan siaran
  7. Kirimkan transaksi awal yang sama dengan id ganjaran yang dikemas kini menggunakan id transaksi
  8. Pertanyaan untuk semua transaksi dengan id akaun ganjaran

Mari kita perhatikan lebih dekat Langkah 4 untuk setiap alat. Dan, pastikan untuk melihat sampel untuk ketiga-tiga skrip yang lengkap.

3.3. Gatling

Untuk Gatling, keakraban dengan Scala menambahkan kelebihan bagi pembangun kerana Gatling API kuat dan mengandungi banyak ciri.

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

Yang perlu diperhatikan ialah sokongan Gatling untuk JSON Path ketika kita perlu membaca dan mengesahkan respons HTTP. Di sini, kami akan mengambil id ganjaran dan menyimpannya ke keadaan dalaman Gatling.

Juga, bahasa ekspresi Gatling menjadikan String badan permintaan dinamik lebih mudah :

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

Terakhir konfigurasi kami untuk perbandingan ini. 1000 larian ditetapkan sebagai pengulangan keseluruhan senario, kaedah atOnceUsers menetapkan 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 fail XML setelah konfigurasi GUI. Fail mengandungi objek khusus JMeter dengan sifat set dan nilainya, misalnya:

Lihat atribut nama ujian , mereka boleh dilabelkan kerana kita mengenalinya sesuai dengan langkah logik di atas. Keupayaan untuk menambahkan anak-anak, pemboleh ubah dan langkah-langkah kebergantungan memberikan fleksibiliti JMeter seperti yang disediakan oleh skrip. Lebih jauh lagi, kami bahkan menetapkan ruang untuk pemboleh ubah kami!

Konfigurasi kami untuk jalan 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
  • Sokongan Apache Foundation dan integrasi hebat dengan Maven

Pengisar:

  • Alat ujian beban prestasi pantas untuk pembangun yang menggunakan Jython
  • Skalabiliti merentas pelayan memberikan lebih banyak potensi untuk ujian besar

Ringkasnya, jika kelajuan dan skalabilitas adalah keperluan, maka gunakan The Grinder.

Sekiranya grafik interaktif yang kelihatan hebat menunjukkan peningkatan prestasi untuk memperjuangkan perubahan, maka gunakan Gatling.

JMeter adalah alat untuk logik perniagaan yang rumit atau lapisan integrasi dengan banyak jenis mesej. Sebagai sebahagian daripada Yayasan Perisian Apache, JMeter menyediakan produk yang matang dan komuniti yang besar.

6. Kesimpulannya

Sebagai kesimpulan, kita melihat bahawa alat mempunyai fungsi yang sebanding di beberapa kawasan sambil bersinar di kawasan lain. Alat yang tepat untuk pekerjaan yang tepat adalah kebijaksanaan sehari-hari yang berfungsi dalam pembangunan perisian.

Akhirnya, API dan skrip boleh didapati di Github.