Đặt 6 công cụ kiểm thử chịu tải mã nguồn mở tốt nhất hiện nay lên bàn cân

Kiểm thử chịu tải - Load testing đã từ lâu được xem là một quy trình kiểm thử phần mềm quan trọng, giúp xác định cách ứng dụng phần mềm phản hồi khi có nhiều người dùng truy cập đồng thời.

Quy trình Load testing giúp chúng ta cải thiện tắc nghẽn hiệu suất, lường trước được các tình huống xảy ra, và nhanh chóng khắc phục các lỗi gặp phải trước khi ứng dụng chính thức được ra mắt. 

Hiện nay có rất nhiều công cụ chuyên dụng được phát triển để giúp chúng ta thực hiện được quy trình kiểm thử chịu tải một cách hiệu quả. Tùy thuộc vào độ phức tạp của các bài kiểm thử tải, chúng ta có thể lựa chọn các công cụ từ miễn phí cho đến trả phí phù hợp với nhu cầu. 

Trong bài viết này, hãy cùng thảo luận về một số công cụ kiểm thử chịu tải mã nguồn mở đang được sử dụng rộng rãi nhất hiện nay nhé!

06 công cụ được "đưa lên bàn cân" hôm nay

Tên công cụ: ApacheBench

Sáng tạo bởi: Apache foundation

Ngôn ngữ sử dụng: C

Đa luồng (Multithreaded): Không

Tạo tải phân tán (Distributed load generation): Không

Hỗ trợ giao thức tích hợp (In-built Protocols Support): HTTP

Phân tích kết quả test:

Website: https://httpd.apache.org/

Mã nguồn: https://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/support/

Ưu điểm:

  • Apachebench xuất hiện từ khá sớm. Hiện nay, công cụ này là 1 phần của Apache httpd và vẫn đang được phát triển.
  • Do có sẵn khi cài đặt bộ công cụ Apache httpd nên đây vẫn là công cụ được nhiều người sử dụng để test nhanh (quick-and-dirty performance tests).

Nhược điểm:

  • Apachebench không hỗ trợ HTTP/2 và không có khả năng viết script test.
  • Tuy vẫn đang được phát triển nhưng những lần cập nhật không mang lại quá nhiều thay đổi.

Kết luận: 

Apachebench sẽ là một lựa chọn tốt và dễ dàng cho việc chỉ cần xử lý một URL đơn giản.

Tên công cụ: Artillery

Sáng tạo bởi: Shoreditch Ops LTD

Ngôn ngữ sử dụng: NodeJS

Đa luồng (Multithreaded): Không

Tạo tải phân tán (Distributed load generation): Không (phiên bản free) & Có (phiên bản trả phí)

Hỗ trợ giao thức tích hợp (In-built Protocols Support): HTTP, Socket.io, WebSocket

Phân tích kết quả test:

Website: https://www.artillery.io/

Mã nguồn: https://github.com/artilleryio/artillery

Ưu điểm:

  • Có phiên bản free
  • Có giao diện dòng lệnh dễ sử dụng, có định dạng cấu hình dựa trên YAML đơn giản và ngắn gọn nên dễ dàng tích hợp với CI/CD.
  • Có thể sử dụng các thư viện NodeJS thông thường và cung cấp một lượng lớn chức năng.

Nhược điểm:

  • Phiên bản free không được chú trọng và tích cực phát triển.
  • Phiên bản free cũng không hỗ trợ tải phân tán.
  • Chỉ chạy trên một luồng và sử dụng một lõi CPU duy nhất.
  • Hiệu suất ở phiên bản free rất chậm, ngốn nhiều tài nguyên. Mức sử dụng CPU quá cao sẽ dẫn đến các sai số đo lường khá lớn.

Kết luận:

Từ những nhược điểm của phiên bản free, đặc biệt là về hiệu suất thì có lẽ bạn chỉ nên lựa chọn Artillery khi bắt buộc phải sử dụng thư viện NodeJS để thực hiện một số chức năng đặc thù.

Tên công cụ: Locust

Sáng tạo bởi: Jonathan Heyman

Ngôn ngữ sử dụng: Python

Đa luồng (Multithreaded): Không

Tạo tải phân tán (Distributed load generation): Có

Hỗ trợ giao thức tích hợp (In-built Protocols Support): HTTP

Phân tích kết quả test:

Website: https://locust.io/

Mã nguồn: https://github.com/locustio/locust

Ưu điểm:

  • Nếu bạn muốn viết script với Python, Locust gần như là lựa chọn duy nhất hiện nay, tuy nhiên script API cũng được đánh giá khá tốt.
  • Có giao diện web UI điều khiển và chạy kịch bản test đẹp mắt.
  • Tích hợp tạo tải phân tán dễ sử dụng.

Nhược điểm:

  • Locust cũng là một luồng, vì vậy nếu không chạy nhiều process, Locust chỉ có thể sử dụng một lõi CPU và không thể tạo ra nhiều lưu lượng truy cập nếu không được chạy ở chế độ tạo tải phân tán.
  • Được viết bằng Python nên khá chậm, ảnh hưởng đến khả năng tạo lưu lượng truy cập và cung cấp các phép đo đáng tin cậy.
  • Hiệu suất tổng thể được đánh giá là thấp đối với các thử nghiệm có quy mô lớn.

Kết luận:

Tuy là công cụ một luồng và tốn nhiều tài nguyên, nhưng Locust lại được tích hợp sẵn khả năng tạo tải phân tán nên sẽ đem lại sai số đo lường thấp hơn nhiều so với Artillery. Tuy nhiên, lý do lớn nhấn khiến mọi người lựa chọn Locust chủ yếu đến từ việc công cụ này được viết bằng Python. 

Tên công cụ: Apache JMeter

Sáng tạo bởi: Apache foundation

Ngôn ngữ sử dụng: Java

Đa luồng (Multithreaded): Có

Tạo tải phân tán (Distributed load generation): Có

Hỗ trợ giao thức tích hợp (In-built Protocols Support): HTTP, FTP, JDBC, SOAP, LDAP, TCP, JMS, SMTP, POP3, IMAP

Phân tích kết quả test:

Website: https://jmeter.apache.org/

Mã nguồn: https://github.com/apache/jmeter

Ưu điểm:

  • Apache JMeter là một ứng dụng Java lớn, phổ biến và lâu đời. Hiện nó vẫn đang được tích cực phát triển.
  • Có rất nhiều chức năng, hỗ trợ nhiều giao thức (có thể xem là nhiều nhất hiện nay).
  • Có rất nhiều tích hợp, tiện ích bổ sung cùng toàn bộ các dịch vụ SaaS được xây dựng trên nó (như Blazemeter).
  • Là một công cụ cho những Tester chuyên nghiệp.

Nhược điểm:

  • Các bài kiểm tra yêu cầu nhiều thao tác thủ công và kiến thức về load testing vô cùng cụ thể.
  • JMeter không được xây dựng để thử nghiệm tự động và sử dụng cho developer.
  • Đây không phải là lựa chọn tốt cho kiểm thử tự động vì sử dụng dòng lệnh rất khó, các tùy chọn đầu ra kết quả mặc định bị hạn chế, sử dụng nhiều tài nguyên và không thật sự có khả năng viết kịch bản test, mà chỉ hỗ trợ một số thao tác (như chèn logic bên trong cấu hình XML).
  • Dùng GUI là chủ yếu.

Kết luận:

Chúng ta nên lựa chọn JMeter nếu cần chạy các bài kiểm tra chịu tải tích hợp quy mô lớn, phức tạp, mất nhiều thời gian để lập kế hoạch, thực hiện và phân tích kết quả. JMeter cũng phù hợp với những ai có nhu cầu kiểm tra nhiều giao thức hoặc kiểm tra các giao thức mà chỉ jmeter hỗ trợ. Ngoài ra, JMeter còn phù hợp với những người tìm kiếm một công cụ kiểm tra chịu tải dựa trên Java, hoặc có nhu cầu  dùng công cụ có sử dụng GUI.

Tên công cụ: Gatling

Sáng tạo bởi: Gatling Corp

Ngôn ngữ sử dụng: Scala

Đa luồng (Multithreaded): Có

Tạo tải phân tán (Distributed load generation): Không (phiên bản free) & Có (phiên bản trả phí)

Hỗ trợ giao thức tích hợp (In-built Protocols Support): HTTP, WebSockets, JMS

Phân tích kết quả test:

Website: https://gatling.io/

Mã nguồn: https://github.com/gatling/gatling

Ưu điểm:

  • Gatling được viết bằng Scala, chạy trên nền máy ảo Java và tương thích hoàn toàn với Java, do đó có thể sử dụng các thư viện của Java.
  • Là một dự án được duy trì và phát triển khá tích cực.
  • Các script test được viết dựa trên Scala hoạt động khá tốt. Hiệu suất công cụ này đem lại tuy không lớn, nhưng phù hợp với hầu hết mọi yêu cầu.
  • Một điểm hay nữa ở Gatling là công cụ này hỗ trợ tuỳ chọn đầu ra với Graphite/InfluxDB và hiển thị trực quan trên Grafana.

Nhược điểm:

  • Hiệu suất không lớn

Nhận xét:

Không có quá nhiều điều để nói về Gatling, đây đơn giản là một ứng dụng Java, hoạt động khá tốt và bớt "đồ sộ" hơn so với Jmeter. Nếu bạn thích các ứng dụng Java, và đang sử dụng Jmeter thì đừng ngần ngại thử cả Gatling. Rất có thể bạn sẽ thích công cụ này, nhất là ở khả năng tạo các kịch bản test với Scala (khi Jmeter không thực sự có khả năng viết kịch bản test).

Tên công cụ: K6

Sáng tạo bởi: Load Impact

Ngôn ngữ sử dụng: Go

Đa luồng (Multithreaded): Có

Tạo tải phân tán (Distributed load generation): Không (phiên bản free) & Có (phiên bản trả phí)

Hỗ trợ giao thức tích hợp (In-built Protocols Support): HTTP 1.1, HTTP 2, WebSockets

Phân tích kết quả test:

Website: https://k6.io/

Mã nguồn: https://github.com/grafana/k6

Ưu điểm:

  • Đây là một công cụ khá mới, được phát hành vào năm 2017
  • Đang được tích cực phát triển.
  • Giao diện dòng lệnh k6 đơn giản, trực quan và nhất quán.
  • Hỗ trợ tất cả các giao thức cơ bản (HTTP 1/2 / Websocket)
  • Hiểu suất ổn.
  • Có nhiều tùy chọn đầu ra (text, JSON, InfluxDB, StatsD, Datadog, Kafka), InfluxDB có thể kết hợp với grafana để hiển thị kết quả trực quan.
  • Dễ dàng viết kịch bản test với Javascript thuần.

Nhược điểm:

  • Không có web UI, không chạy trong NodeJS.
  • Thư viện NodeJS không thể sử dụng trong các tập lệnh k6.
  • Chưa hỗ trợ kiểm tra tải phân tán.

Kết luận:

Tuy là công cụ có tuổi đời non trẻ nhất trong số các công cụ kể trên, nhưng hiện tại K6 nhận được rất nhiều phản hồi tích cực từ người dùng. Tuy nhiên, nếu bạn bắt buộc phải sử dụng thư viện NodeJS, thì Artillery có thể là lựa chọn thay thế.

Bài viết gốc của tác giả Thanh Thư đăng tải trên Viblo: https://sal.vn/SN_LoadTestingViblo

Viblo là dịch vụ chia sẻ và học tập kiến thức IT dành cho lập trình viên Việt Nam, được phát triển và vận hành bởi Sun*. Viblo ra đời với mục tiêu trở thành nền tảng tối ưu dành cho các lập trình viên, nơi mọi người có thể tự do học hỏi, chia sẻ và thể hiện các kỹ năng CNTT của riêng mình.

Website: www.viblo.asia

#kiến thức

#Viblo

#Kiểm thử

#Chia sẻ kiến thức