Blog
Python
อธิบายการใช้งาน Loadtest ฉบับเข้าใจง่าย ๆ ด้วย Locust Python

อธิบายการใช้งาน Loadtest ฉบับเข้าใจง่าย ๆ ด้วย Locust Python

python_ep_2

Loadtest คือ ?

การทดสอบโหลดโดยจำลองการใช้งานโปรแกรมซอฟต์แวร์ที่คาดไว้จะจำลองผู้ใช้หลายคนที่เข้าถึงโปรแกรมพร้อมกัน การทดสอบนี้จึงมีความเกี่ยวข้องมากที่สุดสำหรับระบบที่มีผู้ใช้จำนวนหลากหลาย มักจะสร้างโดยใช้โมเดลไคลเอ็นต์หรือเซิฟเวอร์ โดยการทดสอบในส่วนของทฤษฏีหรือเชิงวิเคราะห์มักจะไม่แม่นยำ และด้วยข้อกฏหมายและข้อบังคับจะต้องมีการตรวจสอบความแม่นยำที่สุด การทดสอบโหลดโดยจำลองผู้ใช้งานจึงเป็นทางเลือกที่ช่วยในการตรวจสอบความแม่นยำ

Locust Framework คือ ?

เครื่องมือในการจำลองพฤติกรรมของผู้ใช้งานหลากหลายคนพร้อมกัน โดยสามารถกระจายและปรับขนาดการเข้าใช้งานได้ พิสูจน์การจำลองว่ามีการใช้งาน และรองรับการใช้งานผ่าน UI บนเว็บไซต์ได้ด้วยเช่นกัน

สิ่งที่น่าสนใจ

  1. ใช้ภาษาในการพัฒนาและทดสอบ Python
  2. รองรับและปรับขนาดปริมาณการส่งข้อมูลพร้อมกันได้หลายแสนคน
  3. มี UI บนเว็บไซต์ให้ใช้งาน
  4. สามารถทดสอบได้เกือบทุก Procotol
  5. สามารถแฮกหรือ DDOS ได้ (อย่าหาทำ โดยไม่ได้รับอนุญาตจากเจ้าของเว็บไซต์นะเด็ก ๆ)

ขั้นตอนการเตรียมตัว

อย่างแรกสิ่งที่จำเป็นจะต้องเตรียมความพร้อมและต้องมีได้แก่

  1. Python เวอร์ชั่นใดก็ได้ แนะนำ (3.8+)
  2. Vscode (ส่วนตัวหากเพื่อน ๆ คนไหนมีโปรแกรมที่ชื่นชอบ IDE ก็เลือกตัวนั้นได้เลย)
  3. สร้างโฟลเดอร์ Project ขึ้นมาและสร้างไฟล์ locustfile.py
pip3 install locust
locust --version # ตรวจสอบเวอร์ชั่น
mkdir <project_name> # สร้างโฟลเดอร์
cd <project_name> # เข้าโฟลเดอร์
touch locustfile.py # สร้างไฟล์

ขั้นตอนการใช้งาน

อย่างแรกจะต้องทำการเรียกใช้งาน library เข้ามาก่อน

locustfile.py
import time
from locust import HttpUser, task, between

เมื่อเราทำการเรียกมาใช้งานแล้ว หลักการใช้งาน locust จะเป็นรูปแบบตายตัว โดยจะต้องทำการสร้างในรูปแบบ Class เพื่อใช้งาน และทำการสร้างฟังก์ชั่นขึ้นมา

locustfile.py
import time
from locust import HttpUser, task, between
 
class QuickstartUser(HttpUser):
    wait_time = between(1, 5)
 
    @task
    def hello_world(self):
        self.client.get("/hello")
        self.client.get("/world")

กำหนดให้ผู้ใช้งานจำลองรอระหว่าง 1 - 5 วินาทีหลังจากดำเนินการแต่ละงาน

locustfile.py
import time
from locust import HttpUser, task, between
 
class QuickstartUser(HttpUser):
    wait_time = between(1, 5)
 
    @task
    def hello_world(self):
        self.client.get("/hello")
        self.client.get("/world")

ทำการ RUN เพื่อใช้งาน เว็บไซต์

locust

การใช้งานเว็บไซต์ Locust

เข้าเว็บไซต์ http://loclhost:8090 (opens in a new tab)

Cassandra Database + Nodejs บน Docker Apple ARM

ระบุข้อมูลดังต่อไปนี้

  1. จำนวนผู้ใช้งานสูงสุดหรือทั้งหมด
  2. จำนวนผู้ใช้งานเข้าต่อช่วงเวลาเป็นวินาที
  3. โดเมน เช่น http://localhost:8080 (opens in a new tab)
Cassandra Database + Nodejs บน Docker Apple ARM

จำลองการยิงชุดข้อมูลตามการออกแบบไฟล์ locustfile.py

Cassandra Database + Nodejs บน Docker Apple ARM

สถานะการยิงในรูปแบบกราฟ เพื่อง่ายต่อการวิเคราะห์

Cassandra Database + Nodejs บน Docker Apple ARM

เมื่อเสร็จสิ้น ให้ทำการกด STOP ปุ่มแดง แล้วทำการ ดาว์นโหลดข้อมูลเพื่อดู รายงานการยิง

Cassandra Database + Nodejs บน Docker Apple ARM

ตัวอย่างผลลัพธ์ที่ทำงานเสร็จสิ้น

[2023-02-21 23:04:24,073] MacBook-Pro-M1.local/INFO/locust.main: Starting web interface at http://0.0.0.0:8089 (accepting connections from all network interfaces)
[2023-02-21 23:04:24,127] MacBook-Pro-M1.local/INFO/locust.main: Starting Locust 2.14.2
[2023-02-21 23:08:04,004] MacBook-Pro-M1.local/INFO/locust.runners: Ramping to 500 users at a rate of 10.00 per second
[2023-02-21 23:08:53,100] MacBook-Pro-M1.local/INFO/locust.runners: All users spawned: {"QuickstartUser": 500} (500 total users)
KeyboardInterrupt
2023-02-21T16:09:42Z
[2023-02-21 23:09:42,252] MacBook-Pro-M1.local/INFO/locust.main: Shutting down (exit code 0)
Type     Name                                                      # reqs      # fails |    Avg     Min     Max    Med |   req/s  failures/s
--------|--------------------------------------------------------|-------|-------------|-------|-------|-------|-------|--------|-----------
GET      /hello                                                      5181     0(0.00%) |      2       0      83      1 |   95.39        0.00
GET      /world                                                      5181     0(0.00%) |      1       0      49      1 |   95.39        0.00
--------|--------------------------------------------------------|-------|-------------|-------|-------|-------|-------|--------|-----------
         Aggregated                                                 10362     0(0.00%) |      1       0      83      1 |  190.77        0.00
 
Response time percentiles (approximated)
Type     Name                                                              50%    66%    75%    80%    90%    95%    98%    99%  99.9% 99.99%   100% # reqs
--------|------------------------------------------------------------|--------|------|------|------|------|------|------|------|------|------|------|------
GET      /hello                                                              1      2      2      2      6      9     13     18     81     83     83   5181
GET      /world                                                              1      1      2      2      3      4      6      8     34     50     50   5181
--------|------------------------------------------------------------|--------|------|------|------|------|------|------|------|------|------|------|------
         Aggregated                                                          1      1      2      2      4      7     10     13     50     83     83  10362

เพียงเท่านี้ก็เป็นอันเสร็จเรียบร้อยแล้ว

หากท่านชอบและรู้สึกว่ามีประโยชน์ รบกวนแชร์และแบ่งปันให้ผู้ที่สนใจและควรจะได้รับการเข้าถึงบทความนี้ แล้วพบกันใหม่ครับ