- Published on
ลองทำ Performance Testing ด้วย JMeter
ขอบคุณรูปภาพจาก https://www.techaheadcorp.com
Performance Testing คืออะไร ?
เป็นการวัดประสิทธิภาพของ Software ว่าสามารถรองรับการใช้งานพร้อมๆกันได้มากที่สุดกี่ Request หรือถ้ามี User ใช้งานพร้อมกันจำนวนตั้งแต่หลักร้อยไปจนถึงหลักล้านคน (อยู่ที่เรากำหนด) Software จะมีการตอบสนอง (Response Time) อยู่ที่เท่าไหร่ ? รองรับไหวหรือไม่ ? จะล่มหรือเปล่า ? ซึ่งเป็นสิ่งที่ไม่ควรมองข้ามอย่างยิ่ง!!
JMeter คืออะไร ?
JMeter เป็นโปรแกรม Open Source ตัวหนึ่งที่ค่อนข้างนิยมนำมาใช้ในการทำ Performance Testing ทั้งที่เป็น Static และ Dynamic ใช้ได้ทั้ง Window , Linux หรือ Mac แน่นอนว่าก็ยังมี Tool อีกหลายตัวที่สามารถทำได้ทั้งฟรีและไม่ฟรี ก็ขึ้นอยู่กับความถนัดในการเลือกใช้ของแต่ล่ะคน ในช่วงแรกเลย JMeter เองสามารถใช้งานได้กับ Web Appliction เท่านั้น แต่ในปัจจุบันมีการพัฒนาอยู่ตลอดทำให้ สามารถทดสอบได้ทั้ง Web (HTTP,HTTPS) , SOAP/REST , FTP , Database , LDAP และอื่นๆอีกมากมาย เมื่อทดสอบเสร็จแล้วสามารถสรุปภาพรวมทำเป็น Report ได้ด้วย
การติดตั้ง JMeter
Java - JMeter ต้องใช้ Java 8++ (ใช้ Version ไหนก็ได้ตั้งแต่ 8 ขึ้นไป)
- Java8 Download ในหัวข้อ Java SE Development Kit 8u202 ก็เลือกเอาตาม OS
JMeter - Download Apache JMeter
- เลือกดาวน์โหลด
.zip
จากหัวข้อ Binaries > apache-jmeter-5.6.2.zip - เมื่อได้ไฟล์มาแล้วให้ unzip
- MAC OSX - เปิด terminal แล้วใช้คำสั่ง
cd apache-jmeter-5.6.2/bin
เมื่อเข้ามาใน bin แล้วเปิดโปรแกรมด้วยคำสั่ง./jmeter.sh
- Window - เข้าไปใน bin แล้วดับเบิ้ลคลิก
jmeter.bat
ปัญหาที่ชอบเจอสำหรับ Window คือเปิดโปรแกรมไม่ขึ้น เจอ Error ว่า "Unable to access jarfile ApacheJMeter.jar" ให้ลองแก้ไขดังนี้ 1. ใช้ cmd เข้าไปที่ bin ใน folder jmeter พิมพ์ "java -jar ApacheJMeter.jar" 2. ถ้าวิธีที่ 1 แก้ไม่ได้ ให้เข้าไปที่ "https://downloads.apache.org/jmeter/binaries/" แล้วโหลด "apache-jmeter-5.5.zip" มาใช้แทน
- MAC OSX - เปิด terminal แล้วใช้คำสั่ง
- เลือกดาวน์โหลด
Plugins - ใช้ Plugin เข้ามาช่วย เพื่อให้ใช้ง่ายขึ้น
- Plugins Manager - เพื่อให้ JMeter ใช้ Plugin อื่นๆได้ จะได้ไฟล์
.jar
มาชื่อว่าjmeter-plugins-manager-1.9.jar
- jpgc-casutg - Plugin ที่เราเลือกจะรวมเป็น Thread Groups ให้เราเลือกใช้ได้ 5 ตัว จะได้ไฟล์
.zip
มา ให้ unzip แล้วจะได้ folder ชือว่า lib ไฟล์.jar
จะอยู่ในlib > ext > jmeter-plugins-casutg-2.9.jar
ต่อไปให้นำไฟล์
.jar
ทั้ง 2 ตัวไปไว้ในapache-jmeter-5.6.2/lib/ext
เสร็จสิ้นการติดตั้ง Plugins- Plugins Manager - เพื่อให้ JMeter ใช้ Plugin อื่นๆได้ จะได้ไฟล์
การใช้งาน
ผมจะทดสอบด้วยการเรียก REST Service ผ่าน APIs 3 เส้นนะครับ จำลองว่า User 1 คน เข้าระบบมา Login แล้วค้นหาข้อมูลทั้งหมดเพื่อดูรายละเอียดตามรายการครับ
Login > Get Data List > Get Data Detail
เปิดโปรแกรมตาม Install step 2
เพิ่ม Threads ที่เป็น Plugin ที่เราเพิ่มเข้าไป จะใช้เป็น Ultimate Thread Group (ถ้า Install Plugin ถูกต้องมีเมนูนี้) ที่เลือกอันนี้เพราะสามารถกำหนดกลุ่มของ Users 1 กลุ่มต่อ 1 Record และสามารถกำหนดได้หลาย Records ต่อ 1 การทดสอบ พร้อมกับแสดงการทดสอบเป็น Graph ให้เห็นภาพได้ชัดเจนยิ่งขึ้น
เลือก Add Row ค่าเริ่มต้นจะกำหนด Users มาให้ 100 คน สามารถปรับค่าต่างๆได้
- Start Thread Count - จำนวน Users ที่จะเข้ามาใช้งานพร้อมกัน
- Initial Delay,sec - เป็นการกำหนดว่าจะเริ่มให้ Users ทั้งหมดเข้ามาใช้ระบบ เมื่อผ่านไปแล้วกี่ sec เรากำหนดไว้ 0 คือไม่มี Delay
- Startup Time,sec - เป็นการกำหนดว่าเราจะให้เวลา Users ทั้งหมดค่อยๆทยอยใช้ระบบเป็นเวลาเท่าไหร่ ถ้าตามรูปก็จะเห็นว่าจำนวน User ค่อยๆเพิ่มขึ้นจนไปครบ 100 คนเมื่อเวลาผ่านไป 10 sec ตามที่เรากำหนด
- Hold Load For,sec - เป็นการกำหนดว่าจะให้ Users ทั้งหมด อยู่ในระบบและใช้ระบบของเราเป็นเวลาเท่าไหร่ ผมกำหนดไว้ที่ 60 sec หรือ 1 minute จะเห็นว่า Graph วิ่งอยู่ที่ 100 เป็นเวลา 60 sec
- Shutdown Time - กำหนดว่าจะให้เวลา Users เลิกใช้งานและออกจากระบบเป็นเวลาเท่าไหร่ ผมกำหนดไว้ที่ 5 sec จำนวน User ก็จะค่อยๆลดลงจนเหลือ 0 ภายใน 5 sec
ซึ่งเราจะเพิ่มอีกกี่ Row ก็ได้และพยายามกำหนดพฤติกรรมการใช้งานของ User ให้เหมือนการใช้งานจริงๆมากที่สุดสำหรับระบบของเรา
เมื่อได้แผนการทดสอบที่ต้องการแล้วให้มาเพิ่ม HTTP Request ให้ครบทั้ง 3 เส้นที่เราต้องการทดสอบ
4.1 Login
HTTP Request
HTTP Header Manager
ถ้าเป็น POST Method ต้องเปลี่ยน Content-Type ให้เป็น application/json
Response Assertion
เราคาดหวังค่าอะไรจาก Response ผมเลือก Response Code และใส่ค่า 200
JSON Extractor
เมื่อ Login สำเร็จเราจะเก็บค่า
$.accessToken
ที่ได้จาก Response ไว้ในตัวแปรชื่อ access_token เพื่อเอาไปใช้ต่อไป
4.2 Get Data List
HTTP Request
HTTP Header Manager
เราเอาตัวแปร access_token จากการ Login มาใช้ เพราะเส้นนี้มีการ Verify token
Response Assertion - ผมทำเหมือนเดิมกับข้อ 4.1 ผมขอข้าม และใน JMeter สามารถ Copy Response Assertion จาก Login มาใช้ได้เลย
JSON Extractor
เมื่อดึงข้อมูลได้สำเร็จ เราจะเก็บค่า
$.._id
ที่ได้จาก Array Response ไว้ในตัวแปรชื่อ cow_id เพื่อเอาไปใช้ในเส้นต่อไป
4.3 Get Data Detail
HTTP Request
ส่วนอันนี้ผมก็ Duplicate Get Data List มาทั้งหมดเลย เปลี่ยนชื่อแล้วลบ JSON Extractor ออก กับแก้ไข HTTP Request ใส่ตัวแปร
/cow/${cow_id}
และลบ parameter ออก เสร็จแล้วจะได้ APIs 3 เส้นตามภาพนี้เลย
เพิ่มการแสดงผลการทดสอบเป็น Report ผมจะใช้ 2 แบบ View Result Tree , Summary Report
เสร็จแล้วเลือกบนสุดแล้วกด Run ปุ่มเขียวรอจนปุ่ม STOP หายไปและกลับมาปุ่มเขียวอีกครั้งเป็นอันเสร็จ เรามาดู Report กัน
6.1 View Results Tree
ในนี้จะแสดงรายละเอียดให้เห็นทุก Request เลย ดูข้อมูลได้ทั้ง Request , Response , Header และ Error
6.2 Summary Report
- Samples - จำนวน Requests ทั้งหมดที่สามารถยิงได้ภายในระยะเวลาตามที่แผนการทดสอบกำหนดไว้
- Average - เวลาเฉลี่ยของทั้งหมด (ms)
- Min - เวลาในการตอบสนองน้อยที่สุด (ms)
- Max - เวลาในการตอบสนองมากที่สุด (ms)
- Std. Dev. - ค่า Standard Deviation (ส่วนเบี่ยงเบนมาตรฐาน) เพื่อบอกว่ามีความผันผวนมากหรือน้อยแค่ไหน
- Error - มี Error ทั้งหมดกี่ % (นับรวมทุกรอบที่กด Run)
- Throughput - ส่วนใหญ่แล้วจะวัดผลกันที่ตรงนี้เลย เป็นตัวชี้วัด ว่าระบบรับได้กี่ Request/Second ยิ่งตัวเลขมากเท่าไหร่ยิ่งดี
- Received KB/sec - เป็นเรื่องขนาด Data ที่ Response กลับมารวมแล้วกี่ KB/sec
- Sent KB/sec - เป็นเรื่องขนาด Data ที่ Request ไปรวมแล้วกี่ KB/sec
- Avg. Bytes - ค่าเฉลี่ยของขนาด Data หน่วยเป็น Bytes
ซึ่งการใช้งานยังมีอีกหลากหลาย Function มากๆ ให้เราได้เลือกใช้ และมีการทดสอบอีกหลายแบบ บทความนี้เป็นเพียงแค่ตัวอย่างการใช้งานเบื้องต้นเท่านั้นเพื่อให้เข้าใจง่ายที่สุด ยังมีอีกการทดสอบที่ผมสนใจ นั่นก็คือทดสอบแบบ Dynamic โดยข้อมูลที่ใช้ในการ Request จะเปลี่ยนค่าไปเรื่อยๆ ตามที่เรากำหนด เพราะบางระบบก็อาจจะมีเงื่อนไขไม่สามารถส่งข้อมูลที่เคยใช่้ไปแล้วได้ อาจจะเป็นบทความต่อๆไป ถ้าอ่านมาถึงตรงนี้ ผมก็ขอบคุณมากๆ หวังว่าจะเป็นประโยชน์กับทุกคนไม่มากก็น้อย ยังไงก็ฝากติดตามกันด้วย ขอให้ Enjoy กับการเรียนรู้ครับ 😁