Load Test คืออะไร? และมีเครื่องมืออะไรน่าใช้บ้าง?
Load Test คือการทดอบประสิทธิภาพ(Performance Testing) ของระบบรูปแบบหนึ่ง ซึ่งจุดประสงค์ของการทดสอบคือดูว่าระบบสามารถรองรับการใช้งานจริงได้หรือไม่ โดยที่เราต้องจำลองขนาดของ Requests ให้เหมือนหรือใกล้เคียงกับการใช้งานของ User มากที่สุด
Load Test vs Performance Test
การทำ Load Test เป็นหนึ่งในการทำ Performance Test ซึ่งนอกจากการทดสอบการใช้งานแล้ว ยังมีมุมมองอื่นๆ อีกหลายอย่าง ซึ่งนั่นก็คือวิธีการทำ Performance รูปแบบต่างๆนั่นเอง โดยเราจะสามารถแบ่งการทำ Performance Test เป็นรูปแบบต่างๆได้ ดังนี้
-
Stress Test คือการทดสอบที่ยิง Workload เข้าไปในปริมาณมากๆ จะคล้ายกับ Load test แต่จะต้องเพิ่มปริมาณ Workload ขึ้นไปเรื่อยๆจนกว่าระบบจะ down เพื่อทดสอบว่าระบบรองรับ Load ได้สูงสุดเท่าไหร่
-
Endurance Test คือการทดสอบที่จะส่ง Workload เข้าไปในระบบ(เหมือนกับ load test) แต่จะ run script ค้างไว้นานๆ เพื่อทดสอบความทนทาน(endurace) ของระบบ
-
Spike Testing คือการทดสอบโดยใช้ WorkLoad ที่มีขนาดใหญ่ ส่งเข้าไปทำงานในช่วงเวลาสั้นๆ ส่วนใหญ่จะมีการทดสอบแบบนี้ไว้เพื่อป้องกันปัญหา Distributed Denial of Service(DDoS)
-
Scalability Testing คือการทดสอบการขยายตัว(Scale) ของระบบ เมื่อเรามีการออกแบบให้ระบบมีการ Scale-In หรือ Scale-Out โดยอัตโนมัติ เราต้องทดสอบเพื่อให้แน่ใจว่าระบบจะ Scale ตามที่เราต้องการเมื่อมี Workload เข้ามา และการ Scale นั้นยังต้องใช้เวลาที่เหมาะสมเพื่อให้สามารถ Scale ขึ้นมาทำงานได้ทันเวลา
จะเห็นว่าการทดสอบ Performance Test มีหลายรูปแบบมากๆ ดังนั้นเมื่อเรากำลังทำ Load Test เราจะต้องพยายามทำให้ Workload ที่ส่งเข้าไปเป็นตัวแทนของการใช้งานระบบของ Users จริงๆได้ และแน่นอนการทำ Load Test เพียงอย่างเดียวอาจยังไม่เพียงพอเราต้องทำ Performance Test รูปแบบอื่นๆเพิ่มเติมด้วย
Load Testing Software
หลังจากที่เรารู้จักกับวิธีการทำ Load Test กันแล้วคราวนี้ลองมาดูเครื่องมือท่ี่เราจะนำมาใช้ในการทดสอบกันบ้างว่ามีเครื่องมือตัวไหนที่น่าใช้กันบ้าง
1. JMeter
Features
- สามารถสร้าง Load จากหลายๆเครื่อง ซึ่งจะทำให้ใกล้เคียงกับสถานการณ์จริงมากขึ้น
- รองรับ Protocols ที่หลากหลาย เช่น HTTP, HTTPS, SOAP, JDBC, และ FTP
- สามารถสร้าง report และมีเครื่องมือการวิเคราะห์แบบ Graphic เพื่อตรวจสอบหาจุดที่เกิดคอขวด(bottlenecks) ได้ง่ายขึ้น
- มี Interface ที่ใช้งานง่าย สามารถเขียน Script เพื่อปรับเปลี่ยนการทำงานได้ทั้ง GUI และภาษา Groovy
- สามารถเพิ่มความสามารถให้กับ JMeter ได้ด้วยการติดตั้ง Plugins เพิ่มเข้าไป
2. Locust
Features
- Locust ใช้ Python ในการสร้าง Scnario ในการทดสอบ
- รองรับการ Scale และการสร้าง Load จากหลายๆเครื่อง เพื่อจำลอง Traffic ที่มีขนาดใหญ่และเหมือนการใช้งานจริงมากขึ้น
- สามารถทำ Distributed Load Test ได้โดยติดตั้ง Locust ลงบน Kubernetes Cluster ได้
- มี Real-time monitoring ผ่านทางหน้า Web ซึ่งจะทำให้เรามองเห็นผลลัพธ์จากการทำ Load Test ได้ทันที
- เป็นเครื่องมือที่สามารถ Customize ได้ตา Testing requirements
- สามารถเขียนด้วย Gherkin syntax ที่มนุษย์สามารถอ่านได้ง่าย เพื่อเพิ่มความสะดวกระหว่างการสื่อสารภายในทีม
3. Grafana k6
Features
- K6 ใช้ Javascript ในกรเขียน Test script(เลยเหมาะสำหรับ Developer)
- สามารถสร้าง Load และ Scale ได้ผ่านทาง Virtual Machine(VM) เพื่อที่จะได้จำลอง Load ได้ใกล้เคียงกับการใช้งานของ User จริงๆ
- เนื่องจากมาจาก Grafana K6 จึงมี Real-time monitoring คอยแสดงผลลัพธ์ของการทดสอบ ทำให้เราสามารถค้นหาปัญหาคอขวด(bottlenecks) ได้ง่ายขึ้น
- K6 เปิดให้เราพัฒนา Plugins เข้าไปใช้งานเพื่อเพิ่มความสามารถให้กับ K6 ได้
- K6 รองรับ Peroformance checks และ Thresholds ที่ใช้ตรวจสอบว่าระบบนั้นผ่านหรือไม่ผ่านการทดสอบ
4. Postman
Features
- ใช้งานได้ง่าย สามารถสร้าง Load ได้ผ่านทาง GUI
- สามารถเลือกรูปแบบของ Load ได้ว่าจะเป็นแบบ Fixed หรือ Ramp up
- มีหน้าแสดงผลลัพธ์จากการทดสอบ Load Test กับ API
5. Apache Bench(ab)
Features
- เป็น Command-line ที่สามารถสร้าง Load test ได้อย่างง่าย เหมาะกับ Developer หรือ Tester ที่ต้องการทดสอบแบบง่ายๆ ไม่ซับซ้อน
- สามารถ Generate request ไปยัง URL ที่กำหนด โดยการ Simulate traffic ขึ้นมาเพื่อจำลองการใช้งานของ User
- มีตัววัด(Metrics)ให้เฉพาะตัวง่าย เช่น Requests per Second และ Response time สำหรับการตรวจสอบ Performance แบบง่ายๆ และรวดเร็ว
Best Practices สำหรับการทำ Load Test
หลังจากที่คุณเลือกเครื่องมือที่จะนำมาใช้สำหรับการทำ Load Test แล้ว สิ่งที่คุณจำเป็นต้องพิจารณาในระหว่างการทำ Load Test มีดังต่อไปนี้
- End-User Exprience เราต้องคิดถึงวิธีการเข้าใช้งานระบบในมุมมองของ End-user ตลอดเวลา เพราะการทำ Load test ไม่ใช่การสร้าง Request เข้าไปในระบบจำนวนมากๆ จนกว่าระบบจะตาย แต่เราต้องการตรวจสอบว่าระบบของเรานั้นสามารถรองรับการใช้งานของ End-User ในปริมาณที่ต้องการได้หรือไม่ ดังนั้นเราจึงต้องเน้นสร้าง Scnario ของการทดสอบให้ใกล้เคียงกับการใช้งานจริงของ End-User ให้มากที่สุด
- Varity ในการทดสอบเราต้องสร้าง Scnario ที่หลากหลายทั้งการจำลองการใช้งานจากหลาย Browser หรือหลาย OS ซึ่งเราต้องคิดเสมอว่าเราไม่สามารถคาบคุม Environments ของ End-User ได้โดยเฉพาะผู้ที่สร้าง Web หรือ API ที่เปิดให้บริการแก่ประชาชนโดยทั่วไป
- Realistic Benchmarks เราอาจนำเอา Data ที่เราเคยเก็บเอาไว้ก่อนหน้ามาใช้เป็นต้นแบบของการทำ Load Test ได้ เช่นจำนวน Users ในช่วงเวลาต่างๆ, ปริมาณของ Load ที่จะเข้ามาใน 1 ช่วงเวลา หรือค่าที่บ่งบอกถึงประสิทธิภาพของระบบอย่าง Time to First Byte(TTFB) ซึ่งถ้าระบบที่พัฒนาขึ้นมาใหม่นั้นมีประสิทธิภาพที่แย่ลงกว่าเดิม นั่นแสดงว่า Developer ต้องเข้าไปแก้ปํญหาต่างๆเหล่านี้ก่อนนำไปใช้งานจริง
- Early and Regulary เราต้องเริ่มต้นรัน Load test ตั้งแต่ช่วงต้นๆของการพัฒนา(Early) และต้องรันบ่อยๆ(Regulary) ซึ่งเราควรมีการทำ Load test เป็นหนึ่งใน Task ที่อยู่ใน CI/CD Pipeline แทนที่จะรอให้พัฒนา Application เสร็จแล้วถึงค่อยทดสอบ เพราะบางปัญหาอาจสายเกินกว่าจะแก้ไขได้แล้ว