← MockServer Professional Day 6 • Module 6 (Final)

Day 6 / Module 6: Enterprise Security (OAuth2/OIDC, SAML, SCIM), Contract Testing (OpenAPI), Verification Assertions & High-Throughput Load Testing

คู่มือพิมพ์เขียวเชิงลึกและการวิเคราะห์ทางเทคนิค: การจำลอง OAuth2/JWT Flow, การทำ Contract Testing ตรวจสอบโครงสร้าง Mocks ร่วมกับ OpenAPI Specification, การทำ Verification Assertions ใน CI/CD และการปรับแต่ง Netty Performance รองรับโหลด 15,000+ RPS

[1] ส่วนที่ 1: หมุดเชื่อมโยง & Roadmap Progress Tracker

Day Tracker: 6/6 (Completed)

ชื่อบท/หัวข้อหลัก: Module 6: Enterprise Security, Contract Testing (OpenAPI), Verification Assertions & High-Throughput Load Testing

❓ หมุดตั้งโจทย์: "ทำไมบทนี้ถึงชื่อนี้? และเรากำลังเรียนเรื่องนี้ไปเพื่ออะไร?"

ตอบ: ในระบบระดับองค์กร (Enterprise) การทดสอบซอฟต์แวร์ไม่สามารถละเลยเรื่อง ความปลอดภัย (Security), การป้องกันสัญญา API คลาดเคลื่อน (Contract Drift) และ การรองรับภาระงานหนัก (High-Throughput Load Testing) บทนี้ตั้งชื่อว่า Enterprise Security, Contract Testing & Load Testing เพื่อเรียนรู้วิธีการจำลอง OAuth2/JWT Flow, การทำ Contract Testing ตรวจสอบโครงสร้าง Mocks ร่วมกับ OpenAPI/Swagger Specification, การทำ Verification Assertions ใน CI/CD Pipeline และการปรับแต่ง Netty Performance เพื่อใช้ MockServer รับมือทราฟฟิกทดสอบระดับหมื่น Requests Per Second (RPS) ได้อย่างมั่นคง

PROGRESS ROADMAP:
✓ Day 1: Mod 1
✓ Day 2: Mod 2
✓ Day 3: Mod 3
✓ Day 4: Mod 4
✓ Day 5: Mod 5
✓ Day 6: Mod 6

[2] ส่วนที่ 2: เรื่องราวและมโนทัศน์เชิงลึก (Narrative, Case Study & Mental Models)

1. ฉากสถานการณ์จริง (The Narrative/Case Study)

ระบบ Enterprise Banking Gateway กับวิกฤต API Drift และระบบ Load Test พังพินาศ

สถาบันการเงินแห่งหนึ่งกำลังเปิดตัวระบบ Open Banking API ที่ต้องเชื่อมต่อกับ FinTech Partners นับร้อยราย ระบบมีมาตรการความปลอดภัยเข้มงวดด้วย OAuth2/OIDC (JWT Bearer Token) และกำหนดสเปก API ไว้ในไฟล์ OpenAPI Specification (.yaml)

อย่างไรก็ตาม ในระหว่างการพัฒนาเกิดปัญหาใหญ่ 3 ประการ:

  • API Contract Drift: ทีม Backend ปรับเปลี่ยนโครงสร้าง JSON ฟีลด์ในระบบจริง แต่ไม่ได้แจ้งทีม Frontend ส่งผลให้ Mocks ที่ทีม Frontend ใช้ทดสอบไม่ตรงกับระบบจริง เมื่อเปิดระบบจริงจึงเกิด Error พังทลายทันที
  • Security Integration Bottleneck: ทีมพัฒนาไม่สามารถยิงทดสอบระบบย่อยได้ง่ายๆ เพราะต้องคอยขอ OAuth Token จาก Identity Provider (IdP) จริง ซึ่งมักติด Rate Limit หรือ Token หมดอายุระหว่างรัน Automated Tests
  • Mock Infrastructure Crash During Load Testing: เมื่อทีม QA ทำการทดสอบประสิทธิภาพ (Load Testing) ยิงทราฟฟิกขนาด 10,000 RPS ใส่ระบบผ่าน Mock Server เดิม ตัว Mock Server กลับพังค้างก่อนที่ระบบหลักจะถูกทดสอบเสียอีก

💡 การนำ Enterprise Security, Contract Testing & Netty Tuning เข้ามาแก้ปัญหา: ทีมงานนำ MockServer เข้ามาทำหน้าที่จำลอง OAuth2 Token Provider และตรวจจับสิทธิ์ JWT, นำไฟล์ OpenAPI Specification มาผูกเข้ากับ MockServer เพื่อทำ Contract Testing อัตโนมัติ (หาก Mocks ไม่ตรงกับ OpenAPI Spec จะถูกปฏิเสธทันที) และปรับแต่ง Netty Thread Pool / Memory Engine ของ MockServer ให้รองรับ Load Test ระดับ 15,000+ RPS ได้สบายๆ

2. ถอดรหัสศัพท์เทคนิคและอุปมาอุปไมย (Explicit Terms & Mental Models)
01. Contract Testing (OpenAPI Spec)
พิมพ์เขียวสัญญาก่อสร้างอาคาร API

แปลตรงตัว: การทดสอบการปฏิบัติตามสัญญาข้อตกลง API

อุปมาอุปไมย: เหมือน "การตรวจสอบพิมพ์เขียวก่อสร้าง" ไฟล์ OpenAPI/Swagger เปรียบเหมือนพิมพ์เขียวอาคาร Contract Testing คือการนำสถาปนิกมาสแกนดูว่า Mocks และ Request/Response ที่รับส่งกัน มีขนาด เสา และคาน ตรงตามพิมพ์เขียวเป๊ะๆ หรือไม่

02. OAuth2/OIDC JWT Validation
ตั๋วเข้างานติดลายเซ็นดิจิทัล

แปลตรงตัว: การตรวจสอบความถูกต้องของสิทธิ์การเข้าถึงผ่าน JWT

อุปมาอุปไมย: เหมือน "ตั๋วคอนเสิร์ตระบุชื่อพร้อมตราประทับลายน้ำ" เจ้าหน้าที่ประตูด้านหน้า (MockServer) สามารถสแกนตรวจดูลายเซ็นดิจิทัลและวันหมดอายุได้ทันทีโดยไม่ต้องโทรไปถามผู้จัดการใหญ่ (Identity Provider) ทุกครั้ง

03. Verification Assertions in CI/CD
ผู้ตรวจการบัญชีหลังปิดงบ

แปลตรงตัว: การตรวจสอบความยืนยันการทำงานหลังรัน Test Suite

อุปมาอุปไมย: เหมือน "ผู้ตรวจการบัญชี" ที่เข้ามาเปิดสมุดบันทึกหลังปิดงบ เพื่อยืนยันว่าทุกธุรกรรมยิงเข้ามาครบตามเงื่อนไขเป๊ะๆ ก่อนอนุญาตให้ผ่าน Pipeline

04. High-Throughput Netty Tuning
การขยายทางด่วนเป็น 16 เลน

แปลตรงตัว: การปรับแต่งเอนจินเครือข่ายสำหรับภาระงานสูง

อุปมาอุปไมย: เหมือน "การขยายถนนและเพิ่มช่องจ่ายเงินทางด่วนเป็น 16 เลน" พร้อมปรับจูนแรมและ Thread Pool เพื่อให้รองรับรถ (Requests) นับหมื่นคันต่อวินาทีได้โดยไม่เกิดรถติดค้าง

⚠️ Root Cause (รากของปัญหา)

เกิด API Contract Drift ระหว่างทีมพัฒนาเพราะไม่มีตัวตรวจสอบอัตโนมัติ และระบบ Mock ไม่ถูกปรับแต่งด้านประสิทธิภาพ (Tuning) ให้รองรับการทำ Load Testing

📉 Business Impact (ผลกระทบทางธุรกิจ)

เกิด Breaking Changes บน Production, เสียเวลาในการขอ Security Token และไม่สามารถการันตีความสามารถในการรองรับภาระงานหนักของระบบได้ก่อนเปิดตัวจริง

[3] ส่วนที่ 3: การถอดรหัสและอธิบายโค้ดอย่างละเอียด (Line-by-line Breakdown)

1. OpenAPI Contract Matcher (type: OPENAPI)
{
  "httpRequest": {
    "method": "POST",
    "path": "/api/v1/payments",
    "body": {
      "type": "OPENAPI",                                   # [Line 5] ใช้เอนจินการตรวจจับแบบ OPENAPI
      "specUrlOrPayload": "contracts/payment-spec.yaml",   # [Line 6] ชี้ไปยังไฟล์ OpenAPI Specification (.yaml หรือ .json)
      "operationId": "createPayment"                       # [Line 7] ระบุ operationId ที่นิยามไว้ใน OpenAPI Spec
    }
  },
  "httpResponse": {
    "statusCode": 200,
    "headers": { "Content-Type": ["application/json"] },
    "body": "{\"status\": \"SUCCESS\", \"transactionId\": \"TX-998811\"}"
  }
}
2. JWT OAuth2 Bearer Authorization Header Regex Matcher (Authorization Bearer)
{
  "httpRequest": {
    "method": "GET",
    "path": "/api/v1/secure-data",
    "headers": {
      "Authorization": ["Bearer eyJ[A-Za-z0-9-_=]+\\.[A-Za-z0-9-_=]+\\.[A-Za-z0-9-_=]+"] 
      # [Line 6] ใช้ Regex ตรวจจับโครงสร้าง JWT 3 ส่วน (Header.Payload.Signature) อย่างแม่นยำ
    }
  },
  "httpResponse": {
    "statusCode": 200,
    "headers": { "Content-Type": ["application/json"] },
    "body": "{\"data\": \"Confidential Enterprise Data\"}"
  }
}
3. High-Throughput Netty Performance Configuration (mockserver.properties)
# [Line 1] ปรับขนาด Thread Pool (Event Loop) สำหรับรองรับ Connection จำนวนมากพร้อมกัน
mockserver.nioEventLoopThreadCount=16

# [Line 3] ปรับขนาดแคชสำหรับเก็บบันทึก Logs ในหน่วยความจำ
mockserver.maxExpectations=5000

# [Line 5] ปิดการเก็บบันทึก Log ระดับย่อยในระหว่างทำ Load Test เพื่อประหยัด CPU และ RAM
mockserver.logLevel=WARN

[4] ส่วนที่ 4: คู่มือการใช้งานผ่าน Web UI / Dashboard

เปิดเว็บเบราว์เซอร์ไปที่: http://localhost:1080/mockserver/dashboard

========================================================================================
                          MOCKSERVER WEB DASHBOARD (PORT 1080)
========================================================================================
 [ Active Expectations ] | [ Recorded Requests / Logs ] | [ Breakpoints ] | [ Reset All ]
----------------------------------------------------------------------------------------
OpenAPI Matcher Status:     - ในแท็บ Active Expectations ตรวจดูว่าข้อที่ผูกกับ OpenAPI Spec ขึ้นสถานะ Validated

Security Match Failures:    - หาก Client ส่ง JWT Token ผิดรูปแบบ สามารถเปิดแท็บ Recorded Requests / Logs เพื่อดูจุดที่ Mismatch

High-Load Metrics:          - ส่องดูความเร็วในการประมวลผลคำสั่ง Mocks เมื่อถูกยิงด้วย Load Test Tool (เช่น k6 หรือ Locust)

[5] ส่วนที่ 5: โครงสร้างไฟล์โปรเจกต์มาตรฐาน (Enterprise File Structure Best Practice)

mockserver-module6-enterprise/
├── docker-compose.yml
├── config/
│   └── mockserver.properties             # ปรับแต่ง Netty & High-Throughput Parameters
├── contracts/
│   └── payment-service-v1.yaml           # ไฟล์ OpenAPI 3.0 Specification
├── expectations/
│   ├── security/
│   │   ├── oauth2-token-mock.json        # จำลอง Endpoint ออก Token
│   │   └── jwt-protected-endpoint.json   # ตรวจสอบ Bearer JWT
│   └── contracts/
│       └── openapi-contract-mock.json    # Mocks ผูกกับ OpenAPI Spec
├── scripts/
│   ├── run_load_test.sh                  # สคริปต์รัน k6 Load Testing
│   └── seed_enterprise_mocks.sh
└── tests/
    └── ContractAndSecurityTest.java

[6] ส่วนที่ 6: แบบฝึกหัดภาคปฏิบัติแน่นๆ (Hands-on Refactoring & 6 Drills)

❌ Flawed Approach (สร้าง Mocks อิสระโดยไม่ตรวจสเปก)

พิมพ์ฟีลด์ผิดเป็น trans_id แทน transactionId -> Test ผ่าน แต่ขึ้น Prod พัง:

{ "httpRequest": { "path": "/pay" }, "httpResponse": { "body": "{\"trans_id\": 123}" } }
✅ Refactored Approach (ผูก Mocks เข้ากับ OpenAPI Spec)

ถ้าโครงสร้างไม่ตรงกับสเปก ระบบจะไม่อนุญาตให้ผ่านตั้งแต่ตอนเขียน Test:

{
  "httpRequest": {
    "path": "/pay",
    "body": { "type": "OPENAPI", "specUrlOrPayload": "contracts/api.yaml", "operationId": "payOrder" }
  }
}
ชุดแบบฝึกหัดปฏิบัติการ 6 ข้อ (Hands-on Drill Pack)

ก่อนเริ่มทำ ตรวจสอบว่าเปิด MockServer ไว้ที่ http://localhost:1080 เรียบร้อยแล้ว

Drill 6.1: OpenAPI Spec Matching (ผูกสเปก Contract)

Setup:

curl -X PUT "http://localhost:1080/mockserver/expectation" -H "Content-Type: application/json" -d '{"httpRequest": { "method": "POST", "path": "/api/v1/payments", "body": { "type": "JSON_SCHEMA", "jsonSchema": "{\"type\": \"object\", \"properties\": {\"amount\": {\"type\": \"number\"}}, \"required\": [\"amount\"]}" } }, "httpResponse": { "statusCode": 200, "headers": { "Content-Type": ["application/json"] }, "body": "{\"status\": \"SUCCESS\"}" }}'

Test: curl -i -X POST http://localhost:1080/api/v1/payments -H "Content-Type: application/json" -d '{"amount": 1500.50}' (ได้ 200 OK)

Drill 6.2: JWT Authorization Header Regex Matcher

Setup:

curl -X PUT "http://localhost:1080/mockserver/expectation" -H "Content-Type: application/json" -d '{"httpRequest": { "method": "GET", "path": "/api/v1/secure-data", "headers": { "Authorization": ["Bearer eyJ[A-Za-z0-9-_=]+\\.[A-Za-z0-9-_=]+\\.[A-Za-z0-9-_=]+"] } }, "httpResponse": { "statusCode": 200, "headers": { "Content-Type": ["application/json"] }, "body": "{\"data\": \"SECURE_CONTENT\"}" }}'

Test: curl -i http://localhost:1080/api/v1/secure-data -H "Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.s6K73N_A" (ได้ 200 OK)

Drill 6.3: Complex Verification with Request Count Range (atLeast, atMost)

Action: ยิง 3 ครั้ง:

curl -X POST http://localhost:1080/api/v1/audit -d '{"event": "1"}'
curl -X POST http://localhost:1080/api/v1/audit -d '{"event": "2"}'
curl -X POST http://localhost:1080/api/v1/audit -d '{"event": "3"}'

Verify (ระหว่าง 2 ถึง 5 ครั้ง): curl -X PUT "http://localhost:1080/mockserver/verify" -H "Content-Type: application/json" -d '{"httpRequest": { "method": "POST", "path": "/api/v1/audit" }, "times": { "atLeast": 2, "atMost": 5 }}' (ได้ HTTP 202 Accepted)

Drill 6.4: Mocking OAuth2 Token Endpoint (POST /oauth/token)

Setup:

curl -X PUT "http://localhost:1080/mockserver/expectation" -H "Content-Type: application/json" -d '{"httpRequest": { "method": "POST", "path": "/oauth/token", "body": { "type": "PARAMETERS", "parameters": { "grant_type": ["client_credentials"] } } }, "httpResponse": { "statusCode": 200, "headers": { "Content-Type": ["application/json"] }, "body": "{\"access_token\": \"mocked-jwt-token-xyz\", \"token_type\": \"Bearer\", \"expires_in\": 3600}" }}'

Test: curl -i -X POST http://localhost:1080/oauth/token -d "grant_type=client_credentials" (ได้ 200 OK พร้อม Access Token)

Drill 6.5: Netty High-Throughput Tuning Verification

Test (ยิงขนานรวดเร็ว 10 ครั้ง):

for i in {1..10}; do curl -s http://localhost:1080/api/v1/health > /dev/null & done; wait

Expected: ทุก Request ได้รับคำตอบสมบูรณ์โดยไม่มี Connection Drop

Drill 6.6: Reset & Verification Clean-up

Action:

curl -X PUT "http://localhost:1080/mockserver/reset"

Expected: ระบบล้างข้อมูลพร้อมเริ่มรอบถัดไป

⚡ Instant Feedback Quiz

ส่วนที่ 7: แบบทดสอบประเมินความรู้ Day 6 / Module 6 (10 ข้อ)

คลิกเลือกคำตอบข้อที่ถูกต้อง ระบบจะตรวจให้คะแนนและแสดงผลเฉลยพร้อมคำอธิบายทันที!

คะแนนสด 0 / 10
[8]

ส่วนที่ 8: สรุปหมุดเชื่อมโยงกลับหาหัวข้อบท (Closing Title Connection Wrap-up)

เนื้อหาและแบบฝึกหัดทั้งหมดในวันนี้ ตอบและสะท้อนชื่อบท Day 6 / Module 6: Enterprise Security, Contract Testing & Load Testing อย่างสมบูรณ์: การใช้ OpenAPI Contract Testing ช่วยปิดรอยรั่ว API Drift, การจำลอง OAuth2/JWT Security ช่วยให้การทดสอบระบบความปลอดภัยราบรื่น, การใช้ Verification Assertions ช่วยการันตีความถูกต้องใน CI/CD Pipeline และการปรับแต่ง Netty Engine ก็ทำให้ MockServer พร้อมลุยศึกหนักในระดับ Enterprise Load Testing ได้อย่างมั่นใจครับ! ครบถ้วนสมบูรณ์ทั้ง 6 โมดูลตามหลักสูตร MockServer Professional Mastery แล้วครับ!