Load test cho ứng dụng ASP.NET Core với Apache JMeter

Bạn đã tạo một Web API hoàn toàn mới được phát triển bằng ASP.NET Core dựa trên các nguyên tắc REST. Bây giờ bạn muốn tạo và chạy một số load test cho API của mình để hiểu tốc độ của nó và mức độ tải mà nó hỗ trợ.

Nhóm .NET đã ngừng dịch vụ load test dựa trên đám mây của họ một thời gian trước trong Visual Studio 2019 do thiếu sự chấp nhận của cộng đồng. Người dùng trong cộng đồng bây giờ phải suy nghĩ về câu hỏi lớn: Công cụ load test tốt nhất cho các dự án .NET của tôi là gì?

Trong bài viết này, bạn sẽ tìm hiểu sâu về Apache JMeter, một trong những công cụ kiểm tra tải được sử dụng nhiều nhất trong cộng đồng phát triển phần mềm bằng cách thử nghiệm nó với một ứng dụng REST được viết bằng ASP.NET Core.

Thiết lập JMeter

JMeter được tạo bằng Java 8+, vì vậy nó yêu cầu JDK (Bộ công cụ dành cho nhà phát triển Java) trên máy tính của bạn trước khi sử dụng. Hãy chắc chắn bạn đã tải xuống và cài đặt nó. Cài đặt cho JMeter hơi khác một chút so với cách tiếp cận trình cài đặt thông thường. Thay vào đó, bạn phải truy cập trang Tải xuống JMeter và tải xuống tệp nén nhị phân.

Giải nén nó và điều hướng đến thư mục bin, trong đó bạn sẽ tìm thấy một tệp có tên jmeter.bat. Nhấp đúp vào nó và cửa sổ trong Hình 1 sẽ xuất hiện.

Hình 1. Khởi động công cụ Apache JMeter
Hình 1. Khởi động công cụ Apache JMeter

Công cụ GUI sẽ tải ở chế độ nền cho đến khi nó bật lên như trong Hình 2.

Hình 2. Màn hình ban đầu của Apache JMeter
Hình 2. Màn hình ban đầu của Apache JMeter

Hãy dành chút thời gian để xem các tùy chọn và menu hiển thị trên màn hình này.

Ứng dụng ASP.NET Core Web API

Để đơn giản, ví dụ này sẽ không tạo một ứng dụng API từ đầu vì nó không phải là trọng tâm của bài viết. Bạn có thể kiểm tra bất kỳ ứng dụng web hoặc API trực tiếp nào trên web mà bạn có sẵn. Tuy nhiên, để có được cảm giác của các thử nghiệm cục bộ, hãy sử dụng một API CRUD có sẵn trên GitHub.

Bạn có thể tìm thấy mã nguồn ở đây. Vui lòng clone nó về máy của bạn, di chuyển vào thư mục \ReactASPNET\ReactASPCrud\ReactASPCrud\ và chạy lệnh sau:

dotnet run

Lệnh này sẽ khởi động ứng dụng tại https://localhost:5000. Để nó ở đó và quay lại các bài kiểm tra.

Các kế hoạch thử nghiệm của JMeter

Trong JMeter, mọi thứ đều bắt đầu từ Test Plan. Đó chính là định nghĩa về cách JMeter nhóm mọi thứ lại với nhau như một thành phần của các bài kiểm tra có thể chạy được. Bạn có thể có bao nhiêu kế hoạch thử nghiệm tùy thích cho một dự án.

JMeter thích chia nhóm. Thông thường, bạn sẽ sử dụng các vòng lặp để thực hiện load test. Các vòng lặp được sử dụng để kiểm tra xem tài nguyên đã cho có thể xử lý tất cả tải đồng thời mà cuối cùng bạn sẽ có trong một kịch bản thế giới thực hay không. Đó là lý do tại sao bạn luôn bắt đầu bằng cách thêm Thread Group mới vào Test Plan của mình. Hình 3 minh họa các menu bạn có thể truy cập để thêm Thread Group.

Hình 3. Thêm một Thread Group mới vào Test Plan của bạn
Hình 3. Thêm một Thread Group mới vào Test Plan của bạn

Bạn có thể thấy một loạt các trường trong phần Thread Properties. Trong số tất cả các trường này, có ba trường quan trọng hơn:

  • Number of threads (users): như tên cho thấy, trường này đại diện cho số lượng người dùng mà bạn hình dung sẽ sử dụng cùng một enpoint một lúc. Thông thường, bạn sẽ thêm một giá trị theo cách cao hơn mức trung bình của những người dùng đồng thời mà bạn có để làm quá tải hệ thống của mình.
  • Ramp-up period (seconds): trường này xem xét chiến lược tăng lên theo thời gian cho JMeter biết phải đợi bao lâu cho đến khi tải người dùng tiếp theo (yêu cầu).
  • Loop count: số lần lặp thử nghiệm của thread group.
Hình 4. Cấu hình Thread Properties của Thread Group của bạn
Hình 4. Cấu hình Thread Properties của Thread Group của bạn

Tuyệt quá! Bây giờ bạn đã thiết lập Thread Group của mình, bạn cần xác định nhóm này sẽ lặp lại những gì. Bạn có thể lặp qua nhiều loại yêu cầu khác nhau, chẳng hạn như JDBC, JMS, FTP, v.v. Tuy nhiên, vì bạn đang xử lý REST API nên các yêu cầu HTTP là yếu tố tiếp theo để cấu hình.

Nhưng trước tiên, hãy sử dụng một phím tắt thông qua một cấu hình tuyệt vời có tên là HTTP Request Defaults. Hình 5 cho thấy cách truy cập tùy chọn này.

Hình 5. Thêm HTTP Request Defaults mới
Hình 5. Thêm HTTP Request Defaults mới

Tùy chọn này giúp bạn cấu hình toàn cục các thuộc tính HTTP thường được sử dụng nhất như URL của API của bạn, cài đặt Xác thực HTTP, IP, cổng, v.v. Đây là một tùy chọn tuyệt vời khi bạn phải kiểm tra nhiều API endpoint trong cùng một Thread Group mà không cần phải sao chép thông tin một cách rõ ràng.

Tiếp tục và điền vào các tùy chọn như trong Hình 6.

Hình 6. Thiết lập các tùy chọn HTTP Request Defaults
Hình 6. Thiết lập các tùy chọn HTTP Request Defaults

Bạn cũng có thể nhận thấy rằng các cấu hình này đang được xếp chồng lên nhau trên bảng điều khiển bên trái của công cụ JMeter GUI. Nó sắp xếp mọi thứ theo cách lồng nhau để giữ thứ bậc trong cài đặt của bạn, vì vậy hãy chú ý đến điều đó.

Bây giờ bạn đã có cấu hình mặc định cho các yêu cầu HTTP của mình, hãy chuyển sang thêm API endpoint đầu tiên để kiểm tra. Bắt đầu với cái đơn giản nhất: danh sách người dùng tại https://localhost:5000/api/users.

Hình 7 cho thấy cách thêm một phần tử HTTP Request Sampler mới .

Hình 7. Thêm một yêu cầu HTTP mới vào Thread Group
Hình 7. Thêm một yêu cầu HTTP mới vào Thread Group

Hình 8 trình bày cách bạn có thể điền vào các trường. Hãy nhớ rằng Server Name/IPPort đã được cung cấp trong cài đặt mặc định trước đó, vì vậy không cần đặt lại.

Hình 8. Thiết lập chi tiết điểm cuối yêu cầu HTTP
Hình 8. Thiết lập chi tiết điểm cuối yêu cầu HTTP

Về cơ bản, đây là mọi thứ bạn cần như một thiết lập tối thiểu cho một bộ yêu cầu HTTP. Tuy nhiên, để bạn có thể kiểm tra kết quả của bài kiểm tra tải, bạn cần yêu cầu JMeter đo các chỉ số phù hợp. JMeter có thể xử lý một loạt các trình lắng nghe kết quả hữu ích và khác nhau. Hãy xem hai cái được sử dụng nhiều nhất.

Hình 9 và 10 cho thấy cách thêm một Summary Report mới và một trình lắng nghe Graph Results mới, tương ứng. Hãy tiếp tục và thực hiện điều đó đối với Kế hoạch kiểm tra của bạn.

Hình 9. Thêm một Summary Report mới vào Test Plan
Hình 9. Thêm một Summary Report mới vào Test Plan
Hình 10. Thêm Graph Results mới vào Test Plan
Hình 10. Thêm Graph Results mới vào Test Plan

Không có cách nào tốt hơn để xem hai trình lắng nghe này có thể làm gì hơn là chạy Test Plan. Trước đó, hãy nhớ lưu cài đặt kiểm thử hiện tại của bạn bằng cách nhấn Ctrl + S trên bàn phím. Nó sẽ kích hoạt một cửa sổ mới (Hình 11) để bạn chọn thư mục lưu các bài kiểm thử dưới dạng tệp có đuôi .jmx.

Hình 11. Lưu bộ thử nghiệm hiện tại
Hình 11. Lưu bộ thử nghiệm hiện tại

Sau đó, bạn có thể thêm tệp này vào kho lưu trữ dự án của mình và các thành viên khác trong nhóm của bạn cũng có thể nạp tệp đó trên các công cụ JMeter của riêng họ.

Bây giờ, hãy nhấp vào nút Start trên thanh trên cùng hoặc nhấn phím tắt Ctrl + R để thực thi Test Plan. Khi nhật ký bắt đầu hiển thị trên cửa sổ đầu cuối nơi bạn bắt đầu ứng dụng API cục bộ, bạn sẽ thấy tóm tắt về quá trình thực thi khi nhấp vào mục Summary Report trên bảng điều khiển bên trái. Điều đó sẽ hiển thị màn hình như trong Hình 12.

Hình 12. Hiển thị Summary Report trong khi chạy thử nghiệm
Hình 12. Hiển thị Summary Report trong khi chạy thử nghiệm

Đó là thông tin hữu ích vì bạn không chỉ có thể xem số lượng mẫu đang chạy tại thời điểm mà còn có thể xem trung bình của người dùng, số lượng mẫu tối đa bất kỳ lúc nào trong quá trình thực hiện, tỷ lệ lỗi, v.v.

Nếu bạn mở mục Graph Results, mục đó có thể hiển thị các kết quả tương tự như trong Hình 13.

Hình 13. Kết quả hoạt hình từ Graph Results trong khi chạy thử nghiệm
Hình 13. Kết quả hoạt hình từ Graph Results trong khi chạy thử nghiệm

Biểu đồ này không chỉ mang lại thông tin quan trọng về số lượng mẫu được thực thi mà còn hiển thị bằng đồ thị thông lượng so với độ lệch của các bài kiểm tra. Thông lượng càng cao, ứng dụng càng có thể xử lý nhiều yêu cầu. Điều ngược lại là đúng với độ lệch. Trong ví dụ này, mức trung bình là khoảng 650 yêu cầu/phút.

Trình lắng nghe mở rộng

Có một số trình lắng nghe tốt hơn cần xem xét khi phát triển các bài kiểm tra JMeter của bạn. Hãy dành một chút thời gian để khám phá chúng. Cái đầu tiên là View Results Tree. Bạn có thể thêm nó giống như cách bạn đã thêm những cái trước đó, thông qua Add > Listener > View Results Tree.

Trước khi bạn chạy lại các bài kiểm tra, hãy đảm bảo xóa quá trình thực thi trước đó. Bạn có thể làm điều đó bằng cách nhấp vào biểu tượng “bánh răng và hai cây chổi” trên thanh trên cùng. Sau đó, chạy lại các bài kiểm tra. Bạn có thể thấy một kết quả tương tự như trong Hình 14.

Hình 14. Hiển thị kết quả View Results Tree
Hình 14. Hiển thị kết quả View Results Tree

Ở đây, JMeter sẽ rất chi tiết bằng cách hiển thị từng thông tin của yêu cầu cũng như tiêu đề HTTP, kích thước nội dung, mã phản hồi và thông báo, v.v. Điều này rất tốt khi bạn cần tìm kiếm một lỗi rất rõ ràng trong các tình huống cụ thể.

Một thước đo quan trọng khác có thể được hiển thị bằng Response Time Graph như trong Hình 15. Nó hoạt động bằng cách vẽ biểu đồ với hai trục: thời gian so với số lượng yêu cầu. Biểu đồ này cho thấy thông lượng yêu cầu / phản hồi thông qua thời gian thực thi.

Hình 15. Hiển thị kết quả Response Time Graph
Hình 15. Hiển thị kết quả Response Time Graph

Một lần nữa, bạn có thể thêm các trình lắng nghe khác thông qua các bước tương tự như trước đây.

Xác nhận phản hồi

Trong quá trình thử nghiệm, thường có các tình huống mà bạn muốn kiểm tra trạng thái phản hồi HTTP cụ thể hoặc thậm chí nếu nội dung phản hồi tuân theo một điều kiện cụ thể. Đối với những tình huống như vậy, JMeter cung cấp cho bạn Assertions. Bắt đầu với cấu hình xác nhận trạng thái phản hồi HTTP.

Hình 16 cho thấy cách thêm một cái mới vào Thread Group của bạn .

Hình 16. Thêm một trình kiểm tra Xác nhận Phản hồi mới
Hình 16. Thêm một trình kiểm tra Xác nhận Phản hồi mới

Đảm bảo kiểm tra tùy chọn Response Code trong cấu hình Field to Test. Pattern Matching Results phải được thiết lập là Equals như thể hiện trong hình 17.

Để thêm một mẫu mới, hãy nhấp vào nút Add ở phía dưới cùng của màn hình và thêm 200 làm giá trị cho tùy chọn Patterns to Test.

Hình 17. Thiết lập Xác nhận Phản hồi
Hình 17. Thiết lập Xác nhận Phản hồi

Đó là nó! Bất cứ khi nào bạn nhận được mã trạng thái HTTP khác 200, trình lắng nghe của View Results Tree sẽ hiển thị lỗi.

Một xác nhận thú vị khác có sẵn cho các API sử dụng rộng rãi JSON là JSON Assertion. Để thêm nó, vào cùng menu Add > Assertion> JSON Assertion và cấu hình nó như trong Hình 18.

Hình 18. Thiết lập JSON Assertion
Hình 18. Thiết lập JSON Assertion

Trường Assert JSON Path exists nhận một biểu thức để bắt một giá trị cụ thể từ phản hồi JSON.

Liệt kê 1 cho thấy một ví dụ về danh sách người dùng hiện được API trả về. Vì dữ liệu luôn được tạo ngẫu nhiên khi khởi động, nên thử nghiệm của bạn sẽ không thành công. Sử dụng điều này để kiểm tra khẳng định không thành công. JSON Assertion nói rằng JMeter phải kiểm tra xem thuộc tính name của mục danh sách đầu tiên có bằng “Susan MacDonald” hay không. Đừng quên đánh dấu vào hộp kiểm Additionally assert value.

Phản hồi JSON từ API users

[
   {
      "id":1,
      "name":"Mary Gay",
      "email":"mary@yahoo.com",
      "document":"0562264851",
      "phone":"+1 888-452-1232"
   },
   {
      "id":2,
      "name":"Neil Strip",
      "email":"neil@outlook.com",
      "document":"-654353851",
      "phone":"+1 888-452-1232"
   },
   {
      "id":3,
      "name":"Jonathan O'Neil",
      "email":"jonathan@outlook.com",
      "document":"0424625040",
      "phone":"+1 888-452-1232"
   },
   {
      "id":4,
      "name":"Joe Spenser",
      "email":"joe@outlook.com",
      "document":"1415116364",
      "phone":"+1 888-452-1232"
   },
   {
      "id":5,
      "name":"Jonathan O'Neil",
      "email":"jonathan@hotmail.com",
      "document":"-367589335",
      "phone":"+1 888-452-1232"
   }
]

Hình 19 cho thấy kết quả thực thi của View Results Tree.

Hình 19. Hiển thị kết quả xác nhận JSON sai
Hình 19. Hiển thị kết quả xác nhận JSON sai

Như bạn có thể thấy, xác nhận không thành công vì giá trị mong đợi không khớp với giá trị đã nhận, đó là "Mary Gay".

Nếu bạn cập nhật JSON Assertion cho phù hợp, thì các bài kiểm tra của bạn sẽ vượt qua.

Kết luận

Như bạn đã thấy, JMeter là một công cụ mạnh mẽ đi kèm với nhiều chức năng tích hợp cho các tình huống khác nhau. Ngoài ra, cộng đồng của JMeter còn cung cấp cho bạn một lượng lớn các plugin mã nguồn mở mà bạn có thể thêm vào để mang lại sự linh hoạt và sức mạnh hơn nữa cho các bài kiểm tra tải của bạn. Một trong số chúng rất hữu ích là JSONFormatter giúp làm đẹp các phản hồi HTTP JSON của bạn.

Cuối cùng nhưng không kém phần quan trọng, hãy đảm bảo tham khảo các tài liệu chính thức của Apache JMeter để biết thêm về những gì nó có thể làm.

ASP.NET Core Web APIASP.NET CoreLoad TestApache JMeter
Bài Viết Liên Quan:
Distributed Tracing trong ASP.NET Core với Jaeger và Tye
Trung Nguyen 01/05/2021
Distributed Tracing trong ASP.NET Core với Jaeger và Tye

Trong bài viết này, chúng ta sẽ tìm hiểu về tiêu chuẩn kỹ thuật open tracing và sử dụng Jaeger để theo dõi phân tán cho các microservices viết bằng ASP.NET Core.

Cách xây dựng REST API sử dụng ASP.NET Core, Entity Framework Core và JWT
Trung Nguyen 08/04/2021
Cách xây dựng REST API sử dụng ASP.NET Core, Entity Framework Core và JWT

Trong hướng dẫn này, chúng ta sẽ học cách tạo CRUD REST API bằng ASP.NET Core, Entity Framework Core và bảo mật API bằng JWT.

Triển khai microservices với gRPC và ASP.NET Core 3.1
Trung Nguyen 16/03/2021
Triển khai microservices với gRPC và ASP.NET Core 3.1

Tìm hiểu cách xây dựng các dịch vụ hiệu suất cao trong microservices với .NET Core 3.1 và gRPC.

Hướng dẫn tuyệt vời về cách xây dựng API RESTful với ASP.NET Core
Trung Nguyen 04/10/2020
Hướng dẫn tuyệt vời về cách xây dựng API RESTful với ASP.NET Core

Hướng dẫn từng bước về cách triển khai các API RESTful sạch, có thể bảo trì sử dụng ASP.NET Core.