Feb 2026

Apache JMeter

คู่มือครบวงจรสำหรับการทดสอบประสิทธิภาพแอปพลิเคชัน

Performance Testing Tool ที่นิยมใช้กันอย่างแพร่หลาย - จากผู้เริ่มต้นถึงผู้เชี่ยวชาญ

เรียนรู้การใช้งาน Apache JMeter อย่างละเอียด ตั้งแต่การติดตั้ง โครงสร้าง Test Plan ไปจนถึงการวิเคราะห์ผลทดสอบสำหรับแอปพลิเคชันของคุณ

Apache
Server
Performance
Testing

1. บทนำ: JMeter คืออะไร?

Apache JMeter เป็น Performance Testing Tool ที่พัฒนาโดย Apache Software Foundation ซึ่งเป็นแบบ open-source และมีความยืดหยุ่นสูงในการทดสอบระบบต่างๆ

ตั้งแต่การทดสอบเว็บแอปพลิเคชัน (HTTP/HTTPS) ไปจนถึงฐานข้อมูล (Database), FTP, LDAP และอื่นๆ JMeter สามารถจำลองการใช้งานจริงได้หลายร้อยหรือหลายพันผู้ใช้พร้อมกัน

ด้วยความสามารถของ JMeter ทำให้เป็นเครื่องมือที่นิยมใช้ในทีม DevOps และ QA สำหรับการทดสอบประสิทธิภาพ โหลด (Load Testing) และความทนทาน (Stress Testing) ของระบบ

ประสิทธิภาพสูง

รองรับการทดสอบโหลดพร้อมกันหลายพันผู้ใช้

โมดูลาร์

ขยายฟังก์ชันด้วยปลั๊กอินและ Custom Samplers

Open Source

ฟรี ไม่มีค่าใช้จ่าย ใช้งานได้อย่างเต็มรูปแบบ

Rich Reporting

สร้าง report และ dashboard พร้อมวิเคราะห์ผล

2. ฟีเจอร์หลักของ Apache JMeter

JMeter มีฟีเจอร์ที่ครอบคลุมสำหรับการทดสอบประสิทธิภาพทุกรูปแบบ ดังนี้

การทดสอบเว็บแอปพลิเคชัน

HTTP/HTTPS Protocol รองรับทั้ง REST API และ Web UI Testing พร้อมการจัดการ Session และ Cookies

การทดสอบฐานข้อมูล

ทดสอบ DatabasePerformance ด้วย JDBC Request รองรับทุกฐานข้อมูลที่มี JDBC Driver

FTP & Messaging

ทดสอบ FTP Server และระบบส่งข้อความด้วย JMS, SMTP, POP3

Custom Testing

สร้าง Custom Sampler ด้วย Java หรือใช้ Scripting (BeanShell, JavaScript, Groovy)

Reporting & Dashboard

สร้าง HTML Dashboard อย่างละเอียดพร้อมรายงานสรุปผลทดสอบ

3. การติดตั้ง JMeter

ขั้นตอนการติดตั้ง Apache JMeter บนระบบปฏิบัติการต่างๆ

Ubuntu / Debian / Linux

วิธีที่ 1: ติดตั้งผ่าน APT (เร็วที่สุด)

# อัปเดตรายการ package
sudo apt update

# ติดตั้ง JMeter
sudo apt install jmeter

# หรือติดตั้งผ่าน Snap
sudo snap install jmeter

วิธีที่ 2: ติดตั้งแบบ Manual (แนะนำสำหรับเวอร์ชันล่าสุด)

# ดาวน์โหลด JMeter
wget https://dlcdn.apache.org/jmeter/binaries/apache-jmeter-5.5.tgz

# แตกไฟล์
tar -xzf apache-jmeter-5.5.tgz

# ย้ายไปตำแหน่งที่ต้องการ
sudo mv apache-jmeter-5.5 /opt/jmeter

# ตั้งค่า environment variables
echo 'export PATH=$PATH:/opt/jmeter/bin' >> ~/.bashrc
source ~/.bashrc

Windows

ขั้นตอนการติดตั้ง:

  1. เข้าไปที่ เว็บไซต์ JMeter
  2. ดาวน์โหลดไฟล์ apache-jmeter-5.5.zip
  3. แตกไฟล์ไปยังโฟลเดอร์ที่ต้องการ (เช่น C:\jmeter)
  4. เปิดโฟลเดอร์ bin แล้วรันไฟล์ jmeter.bat
  5. เสร็จสิ้น! ตอนนี้ JMeter พร้อมใช้งานแล้ว

macOS

วิธีที่ 1: ใช้ Homebrew (แนะนำ)

# ติดตั้งผ่าน Homebrew
brew install jmeter

# หรือติดตั้งแบบทั้ง GUI และ CLI
brew install jmeter-langs

วิธีที่ 2: ติดตั้งแบบ Manual

# ดาวน์โหลดและแตกไฟล์
brew install wget
wget https://dlcdn.apache.org/jmeter/binaries/apache-jmeter-5.5.tgz
tar -xzf apache-jmeter-5.5.tgz

# เคลื่อนย้ายไปยัง /usr/local
sudo mv apache-jmeter-5.5 /usr/local/jmeter

# เพิ่ม PATH
echo 'export PATH=/usr/local/jmeter/bin:$PATH' >> ~/.zshrc
source ~/.zshrc

ตรวจสอบการติดตั้ง

# ตรวจสอบเวอร์ชัน JMeter
jmeter --version

# หรือรัน JMeter แบบ GUI
jmeter

# รันแบบ CLI (headless)
jmeter -n -t test.jmx -l results.jtl

4. ส่วนประกอบสำคัญของ JMeter

JMeter มีโครงสร้างแบบ Hierarchical ที่สำคัญที่สุด ได้แก่ Test Plan, Thread Group และ Samplers

Test Plan

โฟลเดอร์หลักที่เก็บการกำหนดค่าทั้งหมดสำหรับการทดสอบ เช่น Global Properties, Variables, Config Elements และตัวทดสอบจริง (Test Elements)

Thread Group

กำหนดจำนวนผู้ใช้ (Threads) ที่จะจำลองในการทดสอบ, ระยะเวลาในการรัน (Ramp-up), และจำนวนรอบการทดสอบ (Loop Count)

Samplers

ตัวส่งคำขอ (Request) ตัวอย่างเช่น HTTP Request, JDBC Request, FTP Request เป็นต้น ซึ่งทำหน้าที่เหมือนการคลิกของผู้ใช้

Listeners

ตัวรับผลการทดสอบ (Result Collector) เช่น View Results Tree, Summary Report, Aggregate Report ใช้สำหรับวิเคราะห์ผลลัพธ์

โครงสร้างของ JMeter

โครงสร้างภายในของ JMeter ที่แสดงความสัมพันธ์ระหว่างส่วนประกอบต่างๆ

Test Plan Thread Group Num Threads: 100 HTTP Sampler JDBC Sampler FTP Sampler Listener Results Tree

5. สร้าง Test Plan อย่างมืออาชีพ

การสร้าง Test Plan ที่ดีเป็นหัวใจสำคัญของการทดสอบประสิทธิภาพที่ประสบความสำเร็จ ต่อไปนี้คือขั้นตอนการสร้าง Test Plan แบบละเอียด

1

สร้าง Test Plan ใหม่

เปิด JMeter > File > New หรือคลิกไอคอนเพิ่ม Test Plan ใหม่

Key Point: ตั้งชื่อ Test Plan ให้สั้นและเข้าใจง่าย เช่น "API_Load_Test_2026"

2

เพิ่ม Thread Group

คลิกขวาที่ Test Plan > Add > Threads (Users) > Thread Group

Configuration:

  • Num Threads (Users): จำนวนผู้ใช้พร้อมกันที่ต้องการทดสอบ (เช่น 100, 500, 1000)
  • Ramp-up period (seconds): เวลาที่ JMeter สร้าง threads ทั้งหมด (เช่น 60 วินาที)
  • Loop Count: จำนวนรอบที่จะรัน (เช่น 10 รอบ หรือ Infinite)
3

เพิ่ม Samplers

คลิกขวาที่ Thread Group > Add > Sampler > HTTP Request (สำหรับเว็บแอปพลิเคชัน)

HTTP Request Configuration:

  • Protocol: http หรือ https
  • Server Name or IP: ชื่อโดเมนหรือ IP (เช่น api.example.com)
  • Port Number: 80 (HTTP) หรือ 443 (HTTPS)
  • Path: API Path (เช่น /api/v1/users)
  • Method: GET, POST, PUT, DELETE
4

เพิ่ม Configuration Elements

เพื่อให้ทดสอบมีความสมจริง ให้เพิ่ม Configuration Elements เช่น

HTTP Request Defaults: ตั้งค่า mặcินให้กับ HTTP Requests ทั้งหมด

CSV Data Set Config: โหลดข้อมูลจาก CSV file สำหรับ data-driven testing

HTTP Header Manager: ตั้งค่า Headers (Content-Type, Authorization, etc.)

5

เพิ่ม Listeners

คลิกขวาที่ Thread Group > Add > Listener > Summary Report (สำหรับสรุปผล)

Listeners ที่แนะนำ:

  • Summary Report: สรุปผลการทดสอบแบบรวม (Recommended)
  • Aggregate Report: ตารางสรุปผลพร้อม Percentiles
  • View Results Tree: ดูรายละเอียดผลของแต่ละ request (เฉพาะ time-1)
  • View Results in Table: แสดงผลในรูปแบบตาราง

โครงสร้าง Test Plan แบบละเอียด

โครงสร้าง hierarchical ของ JMeter Test Plan ที่แสดงความสัมพันธ์และลำดับชั้น

Test Plan JMeter Test Configuration Thread Group 100 threads, 60s rampup HTTP Config HTTP Request CSV Data Summary Report

6. Types of Tests (ประเภทการทดสอบ)

HTTP/HTTPS Test

ทดสอบเว็บแอปพลิเคชันและการ API โดยใช้ HTTP Request Sampler รองรับทั้ง GET, POST, PUT, DELETE methods

Use Case: Web App, REST API, GraphQL

Database Test

ใช้ JDBC Request Sampler เพื่อทดสอบ performance ของ database queries รองรับ MySQL, PostgreSQL, Oracle, SQL Server

Use Case: DB Query Performance, Connection Pool

FTP Test

ทดสอบ FTP Server ด้วย FTP Request Sampler สำหรับ testing file upload/download performance

Use Case: FTP Server, SFTP, File Transfer

LDAP/Directory Test

ทดสอบ LDAP Server ด้วย JNDI LDAP Request สำหรับการทดสอบ authentication และ directory service

Use Case: LDAP, Active Directory, Authentication

เปรียบเทียบประเภทการทดสอบ

Load Testing: ทดสอบด้วยผู้ใช้จำนวนมากเพื่อดูประสิทธิภาพในสภาพปกติ
Stress Testing: เพิ่มปริมาณผู้ใช้จนเกินขีดจำกัด เพื่อดูจุดที่ระบบล้มเหลว
Spike Testing: เพิ่มผู้ใช้แบบกระทันหัน เพื่อทดสอบการตอบสนองต่อ traffic surge
Endurance Testing: ทดสอบด้วยโหลดคงที่เป็นเวลานาน เพื่อดู memory leak

7. ตัวอย่างการใช้งานจริง

1 ทดสอบ REST API

ตัวอย่าง Test Plan สำหรับทดสอบ REST API โดยใช้ HTTP Request Sampler

test-plan.jmx
<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="5.0" jmeter="5.5">
  <stringProp name="TestPlan.user_comment">REST API Load Test</stringProp>

  <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="REST API Test" enabled="true">
    <_boolProp name="TestPlan.functional_mode">false</boolProp>
    <boolProp name="TestPlan.tearDown_on_shutdown">true</boolProp>

    <stringProp name="TestPlan.user_define_classpath"></stringProp>
  </TestPlan>

  <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="HTTP(Thread Group)" enabled="true">
    <stringProp name="ThreadGroup.num_threads">100</stringProp>
    <stringProp name="ThreadGroup.ramp_up">60</stringProp>
    <stringProp name="ThreadGroup.duration">300</stringProp>
    <boolProp name="ThreadGroup.scheduler">true</boolProp>

    <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="GET /api/users" enabled="true">
      <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
      <stringProp name="HTTPSampler.domain">api.example.com</stringProp>
      <stringProp name="HTTPSampler.port">443</stringProp>
      <stringProp name="HTTPSampler.protocol">https</stringProp>
      <stringProp name="HTTPSampler.method">GET</stringProp>
      <stringProp name="HTTPSampler.path">/api/v1/users</stringProp>
    </HTTPSamplerProxy>
  </ThreadGroup>

  <SummaryReport guiclass="SummaryReport" testclass="SummaryReport" testname="Summary Report" enabled="true"/>
</jmeterTestPlan>

คำอธิบาย: Test Plan นี้จะจำลองผู้ใช้ 100 คน รันเป็นเวลา 5 นาที โดยส่ง GET request ไปยัง API endpoint

  • Thread Group: 100 threads, 60s ramp-up, duration 300s
  • HTTP Request: เข้าถึง https://api.example.com/api/v1/users
  • Listener: Summary Report สำหรับวิเคราะห์ผล

2 ทดสอบ Database Query

ตัวอย่าง Test Plan สำหรับทดสอบ Database Performance โดยใช้ JDBC Request Sampler

database-test.jmx
<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="5.0" jmeter="5.5">
  <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Database Test" enabled="true">
    <stringProp name="TestPlan.user_define_classpath">mysql-connector-java-8.0.33.jar</stringProp>
  </TestPlan>

  <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="DB Thread Group" enabled="true">
    <stringProp name="ThreadGroup.num_threads">50</stringProp>
    <stringProp name="ThreadGroup.ramp_up">30</stringProp>
    <stringProp name="ThreadGroup.duration">180</stringProp>
    <boolProp name="ThreadGroup.scheduler">true</boolProp>

    <JDBCSampler guiclass="JDBCTestVIew" testclass="JDBCSampler" testname="Get Users" enabled="true">
      <stringProp name="DBConnection.url">jdbc:mysql://localhost:3306/production</stringProp>
      <stringProp name="DBConnection.username">testuser</stringProp>
      <stringProp name="DBConnection.password">password</stringProp>
      <stringProp name="DBConnection.driver">com.mysql.cj.jdbc.Driver</stringProp>
      <stringProp name="query">SELECT * FROM users WHERE status = 'active' LIMIT 100</stringProp>
      <stringProp name="queryTimeout">30</stringProp>
      <stringProp name="resultVariable"></stringProp>
      <stringProp name="variableNames"></stringProp>
    </JDBCSampler>
  </ThreadGroup>

  <AggregateReport guiclass="AggregateReport" testclass="AggregateReport" testname="Aggregate Report" enabled="true"/>
</jmeterTestPlan>

คำอธิบาย: Test Plan นี้จะทดสอบการดึงข้อมูลจาก MySQL database

  • Thread Group: 50 threads, 30s ramp-up, duration 180s
  • DB Connection: MySQL, localhost:3306, database 'production'
  • Query: SELECT * FROM users WHERE status = 'active' LIMIT 100
  • Listener: Aggregate Report

8. Best Practices สำหรับการทดสอบ

คู่มือปฏิบัติที่ถูกต้องเพื่อให้การทดสอบประสิทธิภาพมีคุณภาพและได้ผลลัพธ์ที่เชื่อถือได้

1

ทดสอบบน environment ที่เหมาะสม

  • หลีกเลี่ยงการทดสอบบน production environment
  • ใช้ staging or test environment ที่มีโครงสร้างคล้าย production
  • รีเซ็ตฐานข้อมูลก่อนการทดสอบแต่ละครั้งเพื่อให้ข้อมูลสม่ำเสมอ
2

เริ่มจากจำนวนผู้ใช้น้อยแล้ค่อยเพิ่ม

  • เริ่มต้นด้วย 10-50 users เพื่อทดสอบ basic functionality
  • ค่อยๆ เพิ่มจำนวน users ทีละขั้น (100, 500, 1000)
  • สังเกตจุดที่ระบบเริ่มมี latency หรือ error เพิ่มขึ้น
3

ใช้ Realistic Test Data

  • ใช้ข้อมูลที่สมจริง (ไม่ใช้ข้อมูลทดสอบที่สั้นเกินไป)
  • หมุนเวียน data ด้วย CSV Data Set Config
  • หลีกเลี่ยงการ cache ด้วยการตั้งค่า headers
4

บันทึกผลการทดสอบทุกครั้ง

  • บันทึกผลด้วย .jtl file after each test run
  • สร้าง HTML dashboard สำหรับ report
  • เปรียบเทียบผลระหว่าง run ต่างๆ เพื่อดู trend
5

ใช้ Command Line สำหรับ CI/CD

  • รัน JMeter แบบ headless ด้วย option -n -t
  • ใช้ Jenkins integration สำหรับ automated testing
  • ตั้ง alert ถ้า performance metrics ไม่ผ่าน threshold

9. Troubleshooting: ปัญหาพบบ่อยและวิธีแก้ไข

คู่มือแก้ไขปัญหาเมื่อเกิดข้อผิดพลาดระหว่างการทดสอบประสิทธิภาพ

java.lang.OutOfMemoryError

JMeter มีข้อจำกัดหน่วยความจำ (default: 512MB)

วิธีแก้ไข:

  1. แก้ไข JMeter configuration ที่ jmeter.ini/jmeter.properties
  2. เพิ่ม memory: HEAP="-Xms1g -Xmx4g -XX:MaxMetaspaceSize=512m"
  3. หรือใช้ command: JVM_ARGS="-Xms1g -Xmx4g" jmeter

Connection Refused / Timeout

Server ไม่ตอบสนองหรือ connection time out

วิธีแก้ไข:

  • ตรวจสอบ URL, port และ protocol ถูกต้องหรือไม่
  • เพิ่ม timeout value ใน HTTP Request Sampler
  • ตรวจสอบ Firewall หรือ Network ACLs
  • ใช้ Connection Pool Configuration ที่เหมาะสม

Results Not Updating / Slow Response

Listener แสดงผลช้าหรือไม่อั�เดต

วิธีแก้ไข:

  • ลดจำนวน Listener ที่รันพร้อมกัน (เฉพาะ Summary Report ที่ต้องการ)
  • ใช้ command-line mode สำหรับการทดสอบขนาดใหญ่
  • หลีกเลี่ยง "View Results Tree" ในการทดสอบจริง
  • บันทึกผลด้วย .jtl file แล้ววิเคราะห์ทีหลัง

Authentication Errors

Request ต้อง authentication แต่ JMeter ไม่ได้ส่ง credentials

วิธีแก้ไข:

  • ใช้ HTTP Header Manager เพื่อส่ง Authorization header
  • ตั้งค่า HTTP Cookie Manager สำหรับ session management
  • ใช้ HTTP Request Defaults เพื่อตั้งค่า default credentials
  • ตรวจสอบว่า credentials ที่ใช้ถูกต้องและยังไม่หมดอายุ