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

Loadtest คือ ?
การทดสอบโหลดโดยจำลองการใช้งานโปรแกรมซอฟต์แวร์ที่คาดไว้จะจำลองผู้ใช้หลายคนที่เข้าถึงโปรแกรมพร้อมกัน การทดสอบนี้จึงมีความเกี่ยวข้องมากที่สุดสำหรับระบบที่มีผู้ใช้จำนวนหลากหลาย มักจะสร้างโดยใช้โมเดลไคลเอ็นต์หรือเซิฟเวอร์ โดยการทดสอบในส่วนของทฤษฏีหรือเชิงวิเคราะห์มักจะไม่แม่นยำ และด้วยข้อกฏหมายและข้อบังคับจะต้องมีการตรวจสอบความแม่นยำที่สุด การทดสอบโหลดโดยจำลองผู้ใช้งานจึงเป็นทางเลือกที่ช่วยในการตรวจสอบความแม่นยำ
Locust Framework คือ ?
เครื่องมือในการจำลองพฤติกรรมของผู้ใช้งานหลากหลายคนพร้อมกัน โดยสามารถกระจายและปรับขนาดการเข้าใช้งานได้ พิสูจน์การจำลองว่ามีการใช้งาน และรองรับการใช้งานผ่าน UI บนเว็บไซต์ได้ด้วยเช่นกัน
สิ่งที่น่าสนใจ
- ใช้ภาษาในการพัฒนาและทดสอบ Python
- รองรับและปรับขนาดปริมาณการส่งข้อมูลพร้อมกันได้หลายแสนคน
- มี UI บนเว็บไซต์ให้ใช้งาน
- สามารถทดสอบได้เกือบทุก Procotol
- สามารถแฮกหรือ DDOS ได้ (อย่าหาทำ โดยไม่ได้รับอนุญาตจากเจ้าของเว็บไซต์นะเด็ก ๆ)
ขั้นตอนการเตรียมตัว
อย่างแรกสิ่งที่จำเป็นจะต้องเตรียมความพร้อมและต้องมีได้แก่
- Python เวอร์ชั่นใดก็ได้ แนะนำ (3.8+)
- Vscode (ส่วนตัวหากเพื่อน ๆ คนไหนมีโปรแกรมที่ชื่นชอบ IDE ก็เลือกตัวนั้นได้เลย)
- สร้างโฟลเดอร์ Project ขึ้นมาและสร้างไฟล์ locustfile.py
pip3 install locust
locust --version # ตรวจสอบเวอร์ชั่น
mkdir <project_name> # สร้างโฟลเดอร์
cd <project_name> # เข้าโฟลเดอร์
touch locustfile.py # สร้างไฟล์
ขั้นตอนการใช้งาน
อย่างแรกจะต้องทำการเรียกใช้งาน library เข้ามาก่อน
import time
from locust import HttpUser, task, between
เมื่อเราทำการเรียกมาใช้งานแล้ว หลักการใช้งาน locust จะเป็นรูปแบบตายตัว โดยจะต้องทำการสร้างในรูปแบบ Class เพื่อใช้งาน และทำการสร้างฟังก์ชั่นขึ้นมา
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 วินาทีหลังจากดำเนินการแต่ละงาน
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)

ระบุข้อมูลดังต่อไปนี้
- จำนวนผู้ใช้งานสูงสุดหรือทั้งหมด
- จำนวนผู้ใช้งานเข้าต่อช่วงเวลาเป็นวินาที
- โดเมน เช่น http://localhost:8080 (opens in a new tab)

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

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

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

ตัวอย่างผลลัพธ์ที่ทำงานเสร็จสิ้น
[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
เพียงเท่านี้ก็เป็นอันเสร็จเรียบร้อยแล้ว
หากท่านชอบและรู้สึกว่ามีประโยชน์ รบกวนแชร์และแบ่งปันให้ผู้ที่สนใจและควรจะได้รับการเข้าถึงบทความนี้ แล้วพบกันใหม่ครับ