Locust - Performance Testing Tool (Phần 1)

Performance Testing là gì?

Performance Testing là một loại kiểm thử nhằm xác định khả năng đáp ứng tối đa, các điểm tắc nghẽn của một hệ thống, từ đó đưa ra những điều chỉnh hợp lí để cải thiện hiệu suất của hệ thống. Trong bài viết này chúng tôi sẽ giới thiệu về Locust - một công cụ hỗ trợ cho load testing được viết bằng Python.

Mặc dù không được phổ biến như một số tool khác (như Jmeter, Gatling, ...) nhưng Locust cũng có nhiều tính năng khác thú vị rất phù hợp cho một số trường hợp.

Locust là gì?

Locust là một user load testing tool được viết bằng python, rất dễ sử dụng. Nó thường được dùng để load testing cho website, các hệ thống api, ... và để tìm ra số lượng người dùng đồng thời mà hệ thống có thể xử lí.

Ý tưởng của nó là dùng một nhóm các Locust để giả lập các requests tới website. Các hành vi của người dùng do chúng ta định nghĩa bằng python. Quá trình load testing được theo dõi real-time bằng UI.

Locust là event-based, do đó nó có thể hỗ trợ tạo ra hàng ngàn người dùng đồng thời trên một máy duy nhất. Trái ngược với nhiều ứng dụng event-base khác, nó không sứ dụng call-backs thay vào nó sử dụng light-weight processes, thông qua gevent.

Ưu điểm:

  • Kịch bản test được viết bằng Python phù hợp cho các pro python (nhưng là nhược điểm cho người không thành thạo python), hơn nữa giúp dễ dàng quản lí kịch bản test với git
  • Dễ dàng setup môi trường phân tán, khả năng mở rộng tốt - hỗ trợ giả lập hàng trăm nghìn user
  • Có giao diện web, một số biểu đồ đơn giản để xem kết quả testing
  • Nhờ cơ chế event-based nên Locust dùng ít tài nguyên hơn một số tool khác (như Jmeter, Gatling). Có thể dễ dàng giả lập hàng nghìn user trên một laptop.
  • Và đặc biệt vì kịch bản được viết Python thay vì dùng giao diện như các tool khác nên chúng ta có thể Hackable nếu pro Python.

Nhược điểm:

  • Cần biết python.
  • Không có cơ chế recording như một số tool (Jmeter,Gatling...).
  • Phần thống kê báo cáo kết quả testing còn đơn giản.
  • Mặc định chỉ hỗ trợ giao thức http/https tuy nhiên chúng ta cũng có thể mở rộng ra các giao thức khác nhưng đòi hỏi cần nhiều kinh nghiệp lập trình Python

Thao khảo thêm bài so sánh Locust với Jmeter:

Jmeter vs locust what to use when

Cài đặt

pip install locustio
locust --help

Chú ý:

Mỗi kết nối HTTP trên một máy sẽ mở một file mới (technically a file descriptor). Hệ điều hành có thể giới hạn số lượng file có thể mở. Nếu số lượng giới hạn này thấp hơn số lượng người dùng giả lập trong lúc test sẽ xảy ra lỗi. Vì thế chúng ta nên cấu hình lại số lượng giới hạn này (tùy thuộc vào từng hệ điều hành sẽ có các cách điều chỉnh khác nhau).

Sử dụng đơn giản

Tạo một file locustfile.py đơn giản (các tham số chúng tôi sẽ giải thích sau)

from locust import HttpLocust, TaskSet

def login(l):
    l.client.post("/login", {"username":"ellen_key", "password":"education"})

def index(l):
    l.client.get("/")

def profile(l):
    l.client.get("/profile")

class UserBehavior(TaskSet):
    tasks = {index: 2, profile: 1}

    def on_start(self):
        login(self)

class WebsiteUser(HttpLocust):
    task_set = UserBehavior
    min_wait = 5000
    max_wait = 9000```

hoặc sử dụng cách sau tương đương:

from locust import HttpLocust, TaskSet, task

class UserBehavior(TaskSet):
    def on_start(self):
    """ on_start is called when a Locust start before any task is scheduled """
        self.login()

    def login(self):
        self.client.post("/login", {"username":"ellen_key", "password":"education"})

    @task(2)
    def index(self):
         self.client.get("/")
    @task(1)
    def profile(self):
        self.client.get("/profile")

class WebsiteUser(HttpLocust):
    task_set = UserBehavior
    min_wait = 5000
    max_wait = 9000

Start Locust

locust --host=http://example.com

Nếu sử dụng tên file khác locustfile.py ta có thể sử dụng tham số -f

locust -f locust_files/my_locust_file.py --host=http://example.com

Ngay sau khi chạy script ta truy cập: http://127.0.0.1:8089

Tại đây chúng ta sẽ xác định số lượng user giả lập, tiến hành chạy load testing và xem kết quả monitoring

Hình minh họa:

Còn tiếp ...

Phần sau chúng tôi sẽ hướng dẫn cách viết kịch bản testing, mong các bạn tiếp tục theo dõi.

Tham khảo:

https://docs.locust.io/en/latest/quickstart.html
https://www.blazemeter.com/blog/jmeter-vs-locust-which-one-should-you-choose
https://www.blazemeter.com/blog/locust-assertions-a-complete-user-manual