feature-image-gatling-load-and-performance-testing-101
feature-image-gatling-load-and-performance-testing-101

หลังจากเรียนรู้ไปแล้วว่า Apache jMeter คืออะไร? แล้วเราก็รู้ว่าเจ้าตัวนี้เป็นตัวยอดนิยมของแต่ละทุกบริษัทเลย แต่จริงๆเรื่องความนิยมเนี่ยมันเปลี่ยนกันได้เหมือน Jenkins Pipeline ที่อยู่ดีๆก็มาเป็นตัวยอดนิยม เพราะอะไรกันล่ะ?

ความเห็นส่วนตัวเลยน่ะ เป็นเพราะเรื่องของการ manage as a code ของ gatling เนี้ยแหละ ทําให้มันง่ายขึ้นเยอะเลย ลองคิดง่ายๆงี้ว่า อย่างที่เคยบอกว่าเป้าหมายการทํา automate ไม่ใช่เรื่องแค่การทํา script บนคอมพิวเตอร์ของเราไปวันๆ แต่คือการมองให้ครบ Flow ของ Continuous Integration และ Continuous delivery pipeline น่ะ

ทีนี้ถ้าจะให้ครบ Flow แบบนั้นได้ จะให้ใช้ performance script แบบเดิมที่เป็นไฟล์ jmeter script (jmx) มาร้อยเข้า flow กับ Jenkins มันก็ทําได้อยู่ โดยใช้ Performance Plugin แต่การจะอ่านไฟล์ตรงๆของ jMeter ทําไม่ได้ เพราะมัน save ในรูปแบบของ XML ซึ่งบางทีมันก็ Maintain test script ยากไปหน่อย (แถม GUI ของ Jmeter ยังชวนงงๆด้วย) โดยส่วนตัวเลยขอบ Gatling ที่เป็น code-like scripting มากกว่า และ Gatling ยังเขียนในูปแบบของ Domain Specific Language (DSL) ทําให้อ่านได้ง่ายกว่ามากๆ แบบตัวอย่างข้างล่าง

example-gatling-http-post
example-gatling-http-post

จะเห็นว่ามันอ่านง่ายมาก คือ มี Scenario อันนี้ “Recorded Simulation” (เพราะใช้ Recorder Tool ของ Gatling มันเลยขึ้น default มาให้ แปลง่ายๆหมายถึงตัวที่มันมันบันทึกทุกการทํางานของเราบนหน้าเว็ปแล้วออกมาเป็น scala code ให้เรา) ที่ scenario นี้เปิดหน้าเว็ป และ ยิง Post พร้อม param 4 ตัวไปที่ server นึง

ในทางกลับกันถ้าเป็น jMeter มันจะเป็น GUI based เพราะฉะนั้นถ้าเรามาเปิดยังงี้จะเจอแต่ xml เต็มไปหมด

jmeter-source-code
jmeter-source-code

เพราะฉะนั้นเลยโดนบังคับดูจาก GUI อย่างเดียวเลยละ ซึ่งส่วนตัวคิดว่ามัน Maintain ยากไปหน่อยน่ะ

ดังนั้นกลับมาเรื่องเดิม พอเอาไปรวมกับ CI อย่าง Jenkins มันเลย Manage และ Maintain ง่ายกว่า แถมมันรองรับอยู่แล้วด้วยล่ะ ดูจาก CI feature ของมันได้ และนี้ก็ plugin ของมัน กับ docs ซึ่งการเอามารวมกันอย่างงี้ทําให้เราเล่นได้หลายอย่างเลย เช่น วิเคราะห์ผล performance test ถ้าเกณฑ์ตํ่ากว่าที่ระบุ ให้ส่งอีเมลล์แจ้งอะไรแบบนั้น

ส่วน feature อื่นๆของ gatling เราสามารถไปหาอ่านได้อยู่ละ ที่นี้เลย แต่เหตุผลที่ยกเรื่อง code-like scripting นี้เพราะชอบจุดนี้มากสุดละ ลองจินตนการว่ามันเป็น complex scenario มากๆๆ เราก็สร้าง scala class ต่างๆแยก script ออกเป็นส่วนๆ เพื่อ manage และ reuseable ได้อย่างง่ายดายมากๆ (ถ้า jMeter เราอาจจะไปงงกับ GUI ต่างๆอีกเพียบบบ)

ฟังมาเยอะละ มาลองเล่นกันดีกว่า

เรามาลองแบบ basic มากๆๆๆก่อน โดยการใช้ Recorder Tool ของ Gatling ในการทํา Performance Test ตัวอย่างเว็ปของมันเอง http://computer-database.gatling.io

ด้วย Tool ตัวนี้ทําให้เราสบายมาก ไม่ต้องใช้ สมองอะไรเท่าไร แค่เล่นหน้าเว็ปไปตาม behavior ของ user ที่จะใช้เท่านั้น ซึ่งเจ้าเว็ปตัวนี้คือเว็ปที่จําลอง ข้อมูลของ computer ทั้งหมดเอาไว้ หน้าตาจะเป็นงี้

Gatling-example-web-performance-test
Gatling-example-web-performance-test

สิ่งที่ทําได้บนหน้าเว็ปก็จะเป็น CRUD แบบทั่วไปของเว็ปเลย ที่นี้เราก็แค่ไปที่ %GATLING_HOME%\bin\recorder.bat (สมมุติว่าโหลดลงมา แตกzip และ ตั้ง path ไว้แล้วน่ะ) เปิดมามันก็จะมีหน้าตาง่ายๆงี้เลย

gatling-recorder
gatling-recorder

การจะใช้ gatling recorder มีจุดสําคัญ 3 อย่างคือ

  1. listening port – การใช้ recorder ของมัน เราต้อง setproxy ของ web browser ไปที่ recorder เพื่อทุกอย่างที่เรา Interact บนหน้าเว็ปจะได้ถูกบันทึกเอาไว้
  2. output folder – ระบุตําแหน่งไฟล์ และ ชื่อไฟล์ได้ในนี้เลย
  3. start button (แน่ละ)

หลังจากเรากด start มันก็จะเริ่มบันทึกทุกอย่างที่วิ่งผ่าน Port นี้เลย และจะ generate ออกมาเป็น scala file ดังนี้

full-code-recorder-gatling-example
full-code-recorder-gatling-example

ง่ายมากเลยใช่มั้ยล่ะ แค่นี้ก็ได้ Performance Testing Script ละ เพียงแต่ว่าวิธีนี้พอถึงเวลาจริงๆมันไม่ได้ง่ายแบบนี้หรอก เพราะบางอย่างเราก็ต้องเขียน script ขึ้นมาเทสเองบ้าง แต่ถ้าเทียบกับ jMeter Recorder ก็ต้องยอมรับว่ามันง่ายกว่าเยอะมาก

ซึ่งหลังจากเราได้ script มา เรายังไม่จบเพราะเรายังไม่ได้ลองรันกันเลย สิ่งที่เราต้องทําคือ ไปที่ %GATLING_HOME%\bin\gatling.bat แล้วใช้ตัวนี้เป็นตัวรัน script เรา โดยมันจะไปอ่านจาก user-files ของเรา และ list script ทั้งหมดของเราออกมา แล้้วให้เราเลือกลงไป

example-gatling-exec
example-gatling-exec

โดยถ้าเราไม่ชอบมานั่งกดๆๆแบบนี้ ไม่ยากเลย เราสามารถใช้ gatling command line options ส่งไปให้แทนได้

หลังจาก execute test เสร็จมันก็จะสร้าง %GATLING_HOME%\result ออกมาและสรุป report test ไว้ในนั้น

gatling-report-test-example
gatling-report-test-example

นี่แหละจบแล้ว การใช้งานของ Gatling แบบพื้นฐานมากๆๆเลย 🙂 ง่ายมากเลยเนอะ แถมได้ report สวยงามมากมายอีก

แต่ก็อย่างที่บอกอะนะ ชีวิตจริงไม่ง่ายดายแบบนี้ เราควรจะเขียน gatling script เอง เพราะ recorder มันไม่ได้ช่วยได้ทุกอย่างหรอก 🙂

มาลองดูกันแบบ Advance ๆๆกันบ้างน่ะ

example-gatling-http-post
example-gatling-http-post

ยังจํา script นี้กันได้ไหม? นี้คือ script ที่ recorder มัน generate ออกมานั้นเอง แต่การเขียนแบบนี้ในชีวิตจริงมันปวดหัวมาก และก็ไม่ reuseable เลย สิ่งที่เราควรทําคือ isolate แต่ละ Object ออกมา

PageObject

การทํา Performance Test ด้วย Gatling ไม่ยากเพราะเราสามารถมองมันให้เป็นเหมือน Automate ด้วย Selenium นั้นก็คือ PageObject Pattern หรือพูดง่ายๆก็คือมองทุกหน้าออกมาเป็น PageObject เพื่อให้เราเอา code มา reuse ได้นั้นเอง โดยการแยกออกมา

gatling-pageobject
gatling-pageobject

เห็นมะมันแยกแต่ละส่วนใส่ Object ไว้ ซึ่งใน scala มันก็คือ singletons น่ะ 🙂

ทีนี้เราสามารถที่จะแยก Object ได้แบบชิวๆละ แทนที่จะมาเขียนปนๆกันแบบนี้ด้วยการ

pageobject-gatling-scn-flow
pageobject-gatling-scn-flow

ทีนี้เราก็เอามา reuse ได้สบายๆละ หลังจากนั้นถ้ากลับไปดูที่รูปแรก code ที่เรา record ออกมาเนี้ยมัน….ยิง performance Test ด้วย User 1 คน!!! เยอะไปมั้ยสําหรับการทําโหลด test

User Profile

setUp(scn.inject(atOnceUsers(1))).protocols(httpProtocol)

ดังนั้นเราสามารถจัดการกับ user ได้โดยการเพิ่มตัวเลขเป็น 3,000 users ตรงนี้ได้ แต่การเปลี่ยนตรงนี้มันต้องสอดคล้องกับ Business ที่มีน่ะ เพระาลองคิดว่า Business แบบไหนที่ user เข้ามาทีเดียวกันเป็น พันๆแบบนั้นนั้นเอง โดยเรื่องของ Profile ที่ใช้ในการ config user เราก็มีหลากหลาย สามารถดูจากด้านล่างได้

gatling-profile-config-example
gatling-profile-config-example

เท่าที่เห็นมีแบบ rampUsers ขึ้นทีละนิด เข้ามาทีเดียวและอื่นๆเพียบเลย

เวลาทํา Performance Test หรือ Automate Test อีกเรื่องนึงที่ต้องคิดเสมอคือ Test Data นั้นเอง แล้วใน gatling จัดการยังไง?

Dynamics Data with Feeder

ขอแนะนําให้รู้จักกับ Feeder ผู้ provide data ให้กับเหล่าเทสที่หิวโหยยยย 🙂 เจ้า feeder ตัวนี้เบื้องหลังมันคือ ITerator[Map[String,T]] หรืออีกความหมายก็คือมันจะ loop ข้อมูลที่ส่งไปแล้วเอาเข้า test นั้นแหละ

ซึ่งจริงๆเราเองก็ไม่ต้องลําบากไปเขียนไรเยอะแยะ ถ้าจะใช้ถ้ามาตราฐานเพราะ gatling ก็ได้เตรียม character-separated values files และอื่นๆไว้หลากหลายแบบล่ะ เช่น

  • CSV
  • TSV
  • SSV
  • JSON (แถมยังมีไปดึง Json URL มาเป็น feed ก็ได้ด้วยน่ะ)
  • JDBC
  • Sitemap
  • Redis (มีด้วยรึเนี่ย)
  • etc. เยอะมาก

ทํา Looping ก็ได้นะเออ

jMeter ยังมี While controller หรือ Loop Controller เลย เจ้า gatling ก็มีเหมือนกันพวก condition ต่างๆ เราสามารถจัดการได้ เช่นตัวอย่างนี้

gatling-loop-example
gatling-loop-example

ทําให้เราไม่ต้อง repeat ตัวเอง เราใช้ loop จัดการได้เลย หรืออยากไปดู condition statements อื่นๆได้อีกเยอแยะ นี้เลย

failure management

เวลาเราเขียนโปรแกรมเรายังมีการ try-catch ได้ เจ้าตัวนี้ก็ไม่ต่างกัน เราสามารภ manage failure ได้โดยการใช้ check keyword ซึ่งเป็นตัวตรวจสอบ condition ว่ามันตรงไม๊ ถ้าไม่ตรงก็ Fail ไปตามระเบียบ

gatling-check-failure
gatling-check-failure

สรุปแล้ว

สรุปแล้วไม่ว่า jMeter หรือ gatling มันก็มีข้อดีกันคนละแบบแหละ เพราะลองนึกดูน่ะว่า QA ธรรมดายังแทบไม่รอดเมื่อเจอ jMeter ในการทํา Performance Testing แล้วถ้าให้ QA มาเขียน gatling พวกเค้าไม่ร้องไห้ตายกันหรอ เพราะฉะนั้นถ้าใช้ jMeter กันยังง่ายกว่า

แต่สําหรับ QA automation แล้วการใช้ jMeter บางทีมันก็ขัดไม้ขัดมือหลายอย่างทั้งเรื่องของ debug และอื่นๆอีกหลายอย่างมากๆ เพราะฉะนั้น gatling code-like script ก็เป็นทางเลือกที่ดีและสนุกมาก

ส่วนถ้าพูดถึงแง่ของความแตกต่างหลายๆอย่างเราสามารถหาอ่านในเนตได้เยอะมาก แต่หลักๆที่แตกต่างคือ

  1. jMeter เป็น synchronous แต่ gatling เป็น async สร้างด้วย framework Akka เพระาฉะนั้นเวลาทำ jMeter จะมองเป็น One Thread = One User Paradigm แถมเวลา user ทํางานมันเป็นการใช้ Thread.Sleepนั้นเอง ในบางเคสแบบพวก Ajax อาจจะต้องคิดหน่อย หรือหา plugin ช่วย
  2. Gatling เป็น code-like script maintain ง่าย ผูกกับ CI อย่าง Jenkins ก็ยิ่งง่ายด้วย
  3. Resuource ของเครื่อง เห็นหลายบทความพูดว่า gatling มันกิน resource น้อยกว่า jMeter เยอะมากๆๆ (ซึ่งจริงเพราะเวลาใช้ jMeter เราต้องไปเพิ่ม ram ให้มันเสมอๆๆเลย ไม่งั้นค้าง บทความที่นี้)

โดยรวมแล้ว gatling ก็มีเท่านี้แหละ ที่เหลือก็ไปลงใน in action ที่หลังน่ะ แต่ถ้าเบื้องต้นอ่านเท่านี้น่าจะเข้าใจ ความเป้นมาของ Gatling หมดแล้ว (โดยส่วนตัวชอบมากๆเลย 🙂 น่าเอาไปใช้สุดๆ)

Noted:

  • Cheat Sheet Gatling ที่รวมทุกอย่างที่จําเป็นไว้ที่เดียวกัน

2
Leave a Reply

avatar
1 Comment threads
1 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
2 Comment authors
Martnuinoii Recent comment authors

This site uses Akismet to reduce spam. Learn how your comment data is processed.

newest oldest most voted
nuinoii
nuinoii

Gatling สามารถ encrypt / decrypt message แบบมี session key ได้ไหมครับ

คือตอนนี้กำลังหา tool ทำ loadtest service ซึ่งมีการ encrypt ทั้งขา request/response และพวก status success จะอยู่ใน message นั้นจึงจำเป็นต้อง decrypt ออกมาด้วยว่ามัน OK หรือ KO