Picture of the author
Published on

ลองทำ Performance Testing ด้วย JMeter

Cover

ขอบคุณรูปภาพจาก 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

  1. Java - JMeter ต้องใช้ Java 8++ (ใช้ Version ไหนก็ได้ตั้งแต่ 8 ขึ้นไป)

    • Java8 Download ในหัวข้อ Java SE Development Kit 8u202 ก็เลือกเอาตาม OS
  2. 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" มาใช้แทน
      
  3. 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


. . .

การใช้งาน

ผมจะทดสอบด้วยการเรียก REST Service ผ่าน APIs 3 เส้นนะครับ จำลองว่า User 1 คน เข้าระบบมา Login แล้วค้นหาข้อมูลทั้งหมดเพื่อดูรายละเอียดตามรายการครับ

Login > Get Data List > Get Data Detail

  1. เปิดโปรแกรมตาม Install step 2

    Cover
  2. เพิ่ม Threads ที่เป็น Plugin ที่เราเพิ่มเข้าไป จะใช้เป็น Ultimate Thread Group (ถ้า Install Plugin ถูกต้องมีเมนูนี้) ที่เลือกอันนี้เพราะสามารถกำหนดกลุ่มของ Users 1 กลุ่มต่อ 1 Record และสามารถกำหนดได้หลาย Records ต่อ 1 การทดสอบ พร้อมกับแสดงการทดสอบเป็น Graph ให้เห็นภาพได้ชัดเจนยิ่งขึ้น

    Cover
  3. เลือก Add Row ค่าเริ่มต้นจะกำหนด Users มาให้ 100 คน สามารถปรับค่าต่างๆได้

    Cover
    • 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 ให้เหมือนการใช้งานจริงๆมากที่สุดสำหรับระบบของเรา

  1. เมื่อได้แผนการทดสอบที่ต้องการแล้วให้มาเพิ่ม HTTP Request ให้ครบทั้ง 3 เส้นที่เราต้องการทดสอบ

    4.1 Login

    • HTTP Request

      Cover
      Cover
      • HTTP Header Manager

        Cover
        Cover

        ถ้าเป็น POST Method ต้องเปลี่ยน Content-Type ให้เป็น application/json

      • Response Assertion

        Cover
        Cover

        เราคาดหวังค่าอะไรจาก Response ผมเลือก Response Code และใส่ค่า 200

      • JSON Extractor

        Cover
        Cover

        เมื่อ Login สำเร็จเราจะเก็บค่า $.accessToken ที่ได้จาก Response ไว้ในตัวแปรชื่อ access_token เพื่อเอาไปใช้ต่อไป

    4.2 Get Data List

    • HTTP Request

      Cover
      • HTTP Header Manager

        Cover

        เราเอาตัวแปร access_token จากการ Login มาใช้ เพราะเส้นนี้มีการ Verify token

      • Response Assertion - ผมทำเหมือนเดิมกับข้อ 4.1 ผมขอข้าม และใน JMeter สามารถ Copy Response Assertion จาก Login มาใช้ได้เลย

      • JSON Extractor

        Cover

        เมื่อดึงข้อมูลได้สำเร็จ เราจะเก็บค่า $.._id ที่ได้จาก Array Response ไว้ในตัวแปรชื่อ cow_id เพื่อเอาไปใช้ในเส้นต่อไป

    4.3 Get Data Detail

    • HTTP Request

      Cover

      ส่วนอันนี้ผมก็ Duplicate Get Data List มาทั้งหมดเลย เปลี่ยนชื่อแล้วลบ JSON Extractor ออก กับแก้ไข HTTP Request ใส่ตัวแปร /cow/${cow_id} และลบ parameter ออก เสร็จแล้วจะได้ APIs 3 เส้นตามภาพนี้เลย

  2. เพิ่มการแสดงผลการทดสอบเป็น Report ผมจะใช้ 2 แบบ View Result Tree , Summary Report

Cover
  1. เสร็จแล้วเลือกบนสุดแล้วกด Run ปุ่มเขียวรอจนปุ่ม STOP หายไปและกลับมาปุ่มเขียวอีกครั้งเป็นอันเสร็จ เรามาดู Report กัน

    6.1 View Results Tree

    Cover

    ในนี้จะแสดงรายละเอียดให้เห็นทุก Request เลย ดูข้อมูลได้ทั้ง Request , Response , Header และ Error

    6.2 Summary Report

    Cover
    • 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 กับการเรียนรู้ครับ 😁