feature-image-jmeter-basic-101
feature-image-jmeter-basic-101

สรุปสั้นๆ

การทํา Performance Testing ไม่ได้มีแต่ jMeter เจ้าเดียว ยังมีอีกหลายเจ้าเช่น Gatling แต่ด้วยความนิยมและ learning curve ตํ่าทําให้ jMeter ค่อนข้างฮิตมากในทุกบริษัท

jMeter หลักๆที่ต้องรู้มีแค่ elements พวกนี้ Test Plan, Thread Group, Sampler, Controller, Listener ที่เหลือก็แค่ตัวช่วยให้ทํางานง่ายขึ้น

jMeter มีเทคนิคและ Plugins ชอบมากคือ jMeter + graphite/influxdb + grafana มันทําให้ได้ dashboard สวยงามเหมาะกับโชว์คนอื่นมากๆ

ส่วนรายละเอียดอื่นๆอยู่ด้านล่างนี้เลยยย

Apache jMeter คืออะไร?

Apache jMeter คือ Opensource ตัวนึงที่เขียนด้วย Java ล้วนๆ ถูกออกแบบมาให้ทํา performance test และ ช่วยวัดผลของการ test ให้สะดวกสบายมากขึ้น

จริงๆแล้วถ้าเราอยู่ในวงการนี้  jMeter เป็นชื่อที่ทุกคนเคยได้ยินแน่นอน (เกิดในปี 1998) เพราะเวลาเราจะทํา Performance Testing เราก็ไม่พ้นที่จะเลือกเครื่องมือตัวนี้มาใช้งาน ด้วยความที่ว่ามันสร้างขึ้นมาด้วย Java ทําให้หลายๆคนเลือกใช้เพราะเป็นอะไรที่เราต่อยอดได้ง่าย (Learning Curve ตํ่า) เช่นเขียน Plugins เพิ่มให้มัน เป็นต้น

ตอนนี้ออก apache jmeter 3.0 มาล่ะ แต่ขอไม่เขียนว่ามีไรใหม่ เพราะแค่นั้นหาอ่านเองได้

Performance tools มี jMeter เจ้าเดียวหรอ?

เจ้า jMeter เนี่ยไม่ใช่ Performance testing tools ตัวเดียวในตลาดหรอกน่ะ มันยังมีอีกหลายเจ้ามากๆ ที่น่าสนใจ แต่ถ้าจะพูดถึงตัวที่น่าสนใจจริงๆคงไม่พ้นกับ Gatling Tool (เกิดในปี 2011 เขียนด้วย Scala)

เจ้าสองตัวนี้มีข้อดีข้อเสียแตกต่างกันไปแต่ที่แตกต่างกันอย่างเห็นได้ชัดน่าจะเป็น 2 เรื่องนี้

  1. Designed
  2. Scalable
  3. Protocols

Designed

jMeter ถูกออกแบบมาด้วย concept ว่า “One Thread = One User” แปลว่ามันจะจําลอง User ให้เราด้วยการสร้าง user ทั้งหมดนั้นบน single thread อันเดียว เช่น User A บน Thread X เป็นต้น (มันเป็นอารมณ์แบบ Synchronous processing)

Gatling ถูกออกแบบ และ ใช้  AKKA toolkit หรือสรุปง่ายๆคือ Asynchronous processing ซึ่งมันสามารถทําได้กระทั่ง Async HTTP request ไปที่ server (จริงๆ jMeter ก็สามารถโม ให้มันยิ่งแบบ Async ได้น่ะ แต่อาจจะต้องปรับยุ่งยากหน่อยแบบนี้)

Scalable

สิ่งที่ชอบกับ jMeter อีกอย่างก็คือเรื่องของ distributed ของ jMeter เนี่ยแหละ เพราะมันมี Master / Slave Architecture เนี่ยแหละ ที่ทําให้เราเทสกันสนุกสนานเลย (แปลภาษาคนคือ มันกระจาย Performance test ออกไปได้เรื่อยๆทําให้เราสามารถทําฟาร์มเครื่องเทสได้)

Master / Slave Architecture ของ jMeter เนี่ยเราจะต้องตั้งเครื่องนึงเป็น Master แล้วก็ให้มันคุยกับ Slave ด้วย RMI Protocol โดย master จะส่ง JMX เพื่อให้ slave ทํางาน  แล้วผลลัพธ์จะถูกส่งกลับมาที่เครื่อง master (ลองอ่านนี้เพิ่มได้ถ้าอยากรู้)

example-jmeter-master-slave-architecture
example-jmeter-master-slave-architecture

น่าเสียดายที่ ณ เวลานี้ Gatling ไม่มีเรื่องของ distributed mode เคยมีการคุยถึงเรื่องนี้ตั้งแต่ปี 2012 ล่ะลองหาอ่านดูได้ แต่ข้อสรุปคือ Issues ฐน Github นี้

gatling-owner-distributed-commercial
gatling-owner-distributed-commercial

owner gatling บอกงี้น่ะครัช ไม่มีสําหรับ version free เน๊อะ distributed

Protocols

jMeter ค่อนข้างเด่นกว่าเรื่องของ Protocols เพราะมันค่อนข้างหลากหลายมากๆ เช่น Web (HTTP,HTTPS), SOAP,FTP,Database,LDAP,JMS,TCP,Mail (SMTP) แต่กลับกัน Gatling (2.1) ยัง Support เฉพาะตัวเด่นๆเช่น HTTP,JMS,Websocket, SSE (Server Side Events)

แล้วอะไรดีกว่า?

ไม่มีไรดีกว่ากัน เพียงแต่เลือกใช้ให้เหมาะกับงานก็พอ เราจะเอาช้อนมาเปรียบเทียบกับมีดไม่ได้ ลองคิดดูน่ะ มีดตัดขนมปังได้ดีกว่าช้อนแน่ๆ แต่มันก็ตักอาหารได้ไม่ดีเท่าช้อนเหมือนกัน เพราะฉะนั้นเลือกให้เหมาะกับงาน

Gatling จะออกแนว Programming จ๋าๆเลย ถ้าใครถนัดการเขียนโปรแกรม ก็น่าจะลองฝึกเขียน Scala เพื่อใช้งานมัน (มี Async ให้เล่นเยอะ)

แต่ถ้า jMeter มี UI ใช้งานง่าย เขียน Plugins ไม่ยาก Learning curve ตํ่า เหมาะกับ performance tester มากกว่า (document ดีเยี่ยม)

แล้ว jMeter ทํางานยังไง?

จริงๆการทํา Test ไม่ว่าจะเป็น UI Automate หรือ Performance Automate testing หลักการเดียวกันเลยคือ

“KISS – Keep it simple stupid”

เราไม่จําเป็นต้องคิดเยอะ แค่จําลอง footprint ของ user ออกมาในรูปแบบของ scripts เท่านั้น ใครๆก็ทําได้ แต่สิ่งที่ยากกว่าคือการแก้ปัญหาที่เกิดขึ้นระหว่างทางมากกว่า เช่น env. ที่ไม่เสถียร, proxy ที่บริษัทกันไว้, session ที่ไม่ยอม generate ขึ้นมา เพราะ network policy สิ่งเหล่านี้ยากกว่าเยอะในการทํา automate

การทํางานสายนี้ไม่ได้ยากที่ technical แต่ยากในการออกแบบมองภาพรวม และ ความรู้รอบตัวมากกว่า

ส่วนการใช้งานของ jMeter มีหลักๆเพียงแค่ 5 อย่างเท่านั้นในการเริ่มต้น ใช้งาน

  1. Test Plan
  2. Thread Group
  3. Logical Controller
  4. Sampler
  5. Listener
jmeter-example-basic-elements
jmeter-example-basic-elements-login-request

5 สิ่งเหล่านี้คือพื้นฐานที่เราต้องรู้จัก เวลาจะเริ่มใช้งาน jMeter

Test Plan

เป็น Element แรกของทุกๆโปรเจคที่ต้องมี Root of Everything เลย มันเป็นตัวที่อธิบายว่า jMeter จะทํางานอะไรบ้าง จะเพิ่มตัวแปรสําหรับ test plan นี้ หรือเพิ่ม Libraries เราก็สามารถทําเป็น global ได้ใน test plan เราก็มาใส่ไว้ในนี้ให้หมดแค่นั้นเอง

Thread Group

เป็น element ที่ไว้ควบคุมเรื่องของ thread ที่จะเกิดขึ้นทั้งหมด เช่น

  1. จํานวนของ Threads ที่จะใช้เทส (จํานวน user ทั้งหมด)
  2. ระยะเวลา ramp-up period (เวลาที่ใช้ของเทส และมันจะกระจายให้ thread เท่าๆกันตรงนี้ เช่น ตั้งเวลา ramp-up ไว้ 100 วินาที กับ 10 threads แปลว่าแต่ละ thread จะถูก ยิงออกมาทุกๆ 10 วินาที)
  3. จํานวนครั้งที่เทสจะถูกรัน

Logical Controller

เป็น element ที่ควบคุมเรื่องของ หลักการคิดเหมือน flowchart ถ้า A ไป B, ถ้ามี condition นี้ให้ทําอย่างไร อารมณ์เหมือนกับ if-else,foreach,while ในการเขียนโปรแกรมแบบนั้นแหละ

Sampler

มาถึงตัวเด็ด และหัวใจหลักของ jMeter ล่ะ นั่นก็คือเจ้า Sampler ตัวนี้นนี้แหละ เพราะมันคือ element ที่จําลอง Request ไปที่ใดๆนั้นเอง ถ้าไม่มีตัวนี้ Request ไปที่ใดๆก็จะไม่เกิด จําง่ายๆคือ Sampler = Request

ส่วนว่า Samplers จะมีอะไรบ้างก็จะมีหลักๆตามนี้

  • FTP Request
  • HTTP Request (can be used for SOAP or REST Webservice also)
  • JDBC Request
  • Java object request
  • JMS request
  • JUnit Test request
  • LDAP Request
  • Mail request
  • OS Process request
  • TCP request

แต่ละ Samplers ก็จะมี properies ของมันเองที่เราสามารถไป customize ได้ ขึ้นอยู่กับว่าเราจะเทสอะไรนั้นเอง โดยปกติเราจะใช้เจ้า Sampler คู่กับ

  • Configuration Element (เพื่อเข้าหลักการณ์ DRY จะได้ไม่เกิด redundant เยอะ)
  • Assertion (เพื่อดูผลลลัพธ์ว่าที่ยิงไปถูกไม๊?)

Listener

เป็น element ที่ไม่จําเป็นต้องอยู่ใต้ Thread Group ใดๆ เพราะมันจะสามารถเข้าถึงทุก element ได้หมดในขณะที่ element อื่นๆของ jMeter กําลังทํางาน เจ้าตัวนี้มันไว้จัดการเรื่องของ Monitor หลายๆอย่างๆเช่น

  • Graph Results
  • Result Tree

เพื่อไว้ดูผลลัพธ์ของการทํางานนั้นแหละ เราสามารถให้มันแสดงผลเป็น CSV หรือ XML Format ได้

แต่ที่เด็ดและหลายๆบริษัทชอบใช้คือการดูผลแบบ Real time นั้นเอง โดยการใช้ Backend listener ควบคู่กับ Graphite หรือ InfluxDB แล้วนําไปแสดงผลบน Grafana ด้วยเทคนิคนี้เห็นกันทุกบริษัทเลย นิยมใช้กันมากๆที่จะแสดงผลให้เหล่าบอร์ดๆผู้บริหารดูว่างานของเราเป็นอย่างไร (วิธีการทํา Real Time Result)

รวมๆแล้ว

นี้คือหลักของ jMeter แล้วล่ะ ที่เหลือก็มองว่าเป็นส่วนเสริมที่ทําให้ทํางานง่ายขึ้น เช่น

  • Config Element (เอาไว้ set ค่า default ต่างๆ อาทิเช่น HTTP header,cookie,etc.)
  • Timer (ควบคุมเวลาในการรันของ Thread ให้มันดีเลย์ หรือ เร็วก็ตรงนี้)
  • Pre Processing (สร้าง action ที่จะทําก่อน run sampler)
  • Post Processing (สร้าง action ที่จะทําหลัง run sampler)

สิ่งที่ควรรู้เวลาลงสนามจริง

  • jMeter มันก็มีการเขียน scripts เพื่อให้มันทํางานง่ายขึ้น เพราะฉะนั้นมีสิทธิ์ที่จะ error ได้ ดังนั้นเราสามารถ ดู log ได้ด้วยใน jmeter

    jmeter-log-console
    jmeter-log-console
  • jMeter มี pluginsไว้รอให้เราไปใช้งานเพียบเลย แต่เราไม่ควรที่จะ Download แล้วลงเองทีล่ะตัวน่ะ เราควรใช้ Package Manger ของ jMeter โหลดให้ มันจะได้ consistency กันทุกอย่างเวลาลง plugin ใหม่
    jmeter-plugin-manager
    jmeter-plugin-manager

     

  • โดยส่วนมาก jMeter เวลาเราไปใช้งานจะต้องมีการ set proxy ให้มันเพราะ เวลาทํางานในบริษัท มันต้องมี proxy กั้นกับ internet แน่ๆ เพราะฉะนั้นเราต้องเรียกตั้ง password ให้มันด้วย ตามนี้
    jMeter-prxoy-settings
    jMeter-prxoy-settings

     

  • ในบางกรณีที่เราต้องการผล performance ของ hardware เราอาจจะเก็บได้ยาก เพราะเครื่องมันอาจจะเป็นการแชร์ แต่ท่าปกติแล้วเราจะใช้ javamelody ไม่ก็ New Relic APM (Application Monitor) ในการ monitor ผล
  • ถ้าเครื่องเราไม่พอจริงๆที่จะทําการ test ในปริมาณมหาศาล เราหนีไปใช้พวก Cloud load testing ได้ง่ายๆเลยที่ Load Impact, Flood.io และ Blitz
  • ปิด caching ทุกครั้งในการทดสอบน่ะ เพราะว่าจะได้ผลที่ถูกต้องมากขึ้น
  • เราต้องจัดการเก็บผลเทสทุกครั้งไว้ให้ดี เพื่อที่จะได้นํามา compare กับการทําเทสล่าสุดได้ ไม่งั้นจะไม่มีผลดีอะไรกับเราเลย ถ้าเราไม่รู้ว่ามันดีขึ้นหรือแย่ลงนั้นเอง

Leave a Reply

avatar

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