CupCode.cc
Section 03 · Module 04 · Lesson 01 · ~15-20 นาที

โครงสร้าง Arrange-Act-Assert

เวลาเรียน: 15-20 นาที ต้องรู้มาก่อน: Module 03 - Test Pyramid and Automation Strategy รูปแบบ: อ่าน + แบบฝึกสั้น ๆ

จบบทนี้แล้วคุณจะ...

  • เข้าใจโครงสร้าง Arrange-Act-Assert (AAA) ของ automated test
  • เชื่อมโยง AAA กับ Given-When-Then (BDD)
  • เข้าใจหลักการ "one assertion per test"
  • จัดโครงสร้าง test case ที่ได้รับมาเป็น AAA format ได้
1 · ทุก Test มีโครงสร้างเดียวกัน

Arrange-Act-Assert (AAA)

ไม่ว่าจะเป็น unit test, integration test, หรือ E2E test ทุก automated test มีโครงสร้าง 3 ส่วนเหมือนกัน:

Arrange (จัดเตรียม)

  • เตรียมข้อมูล, สร้าง object, setup environment
  • "ก่อนทำอะไร ต้องเตรียมอะไรบ้าง?"

Act (ลงมือทำ)

  • เรียกฟังก์ชัน, click ปุ่ม, ส่ง request
  • "ทำสิ่งที่ต้องการทดสอบ"

Assert (ตรวจสอบ)

  • ตรวจผลลัพธ์ว่าตรงที่คาดไว้ไหม
  • "ผลลัพธ์ถูกต้องหรือไม่?"
2 · ตัวอย่าง Pseudocode

ตัวอย่าง 1: ทดสอบฟังก์ชันคำนวณส่วนลด

TEST "คำนวณส่วนลด 10% จากราคา 1000 บาท ได้ 900 บาท"

  // Arrange
  price = 1000
  discount_percent = 10

  // Act
  result = calculate_discount(price, discount_percent)

  // Assert
  EXPECT result TO EQUAL 900

ตัวอย่าง 2: ทดสอบ login flow

TEST "login ด้วย username/password ที่ถูกต้อง เข้าสู่หน้า dashboard"

  // Arrange
  open_browser()
  navigate_to("/login")
  username = "[email protected]"
  password = "SecurePass123"

  // Act
  fill("username_field", username)
  fill("password_field", password)
  click("login_button")

  // Assert
  EXPECT current_url TO CONTAIN "/dashboard"
  EXPECT page TO SHOW "Welcome, testuser"

ตัวอย่าง 3: ทดสอบ API

TEST "GET /api/users/1 return ข้อมูล user ที่ถูกต้อง"

  // Arrange
  create_test_user(id=1, name="สมชาย", email="[email protected]")

  // Act
  response = GET("/api/users/1")

  // Assert
  EXPECT response.status TO EQUAL 200
  EXPECT response.body.name TO EQUAL "สมชาย"
  EXPECT response.body.email TO EQUAL "[email protected]"
3 · Given-When-Then (BDD equivalent)

AAA ในภาษา Business

AAA และ Given-When-Then เป็นสิ่งเดียวกัน แค่ใช้คนละภาษา:

AAA Given-When-Then ความหมาย
Arrange Given (สมมติว่า...) เงื่อนไขเริ่มต้น
Act When (เมื่อ...) สิ่งที่ทำ
Assert Then (จะได้...) ผลลัพธ์ที่คาดหวัง

ตัวอย่าง Given-When-Then:

Given ผู้ใช้มีสินค้าในตะกร้า 3 ชิ้น รวม 1,500 บาท
When ผู้ใช้ใส่โค้ดส่วนลด "SAVE20"
Then ราคารวมจะลดเหลือ 1,200 บาท
4 · One Assertion per Test?

ข้อถกเถียงที่ยังไม่จบ

มีสองสำนักคิด:

สำนัก Strict: 1 assertion = 1 test

  • ข้อดี: เมื่อ test fail รู้ทันทีว่าผิดตรงไหน
  • ข้อเสีย: test เยอะมาก setup ซ้ำ ๆ

สำนัก Practical: หลาย assertion ได้ ถ้าทดสอบ "สิ่งเดียวกัน"

  • ข้อดี: test กระชับ ไม่ซ้ำซ้อน
  • ข้อเสีย: เมื่อ fail อาจต้องดูว่า assertion ไหนที่พัง

คำแนะนำ: ใช้สำนัก Practical — 1 test ทดสอบ 1 behavior แต่อาจมีหลาย assertion ที่ตรวจผลลัพธ์ของ behavior เดียวกัน เช่น ทดสอบ API response อาจตรวจทั้ง status code, body, และ headers ในtest เดียว

5 · เคล็ดลับการเขียน Test ที่ดี
  • ส่วน Arrange ไม่ควรยาวเกิน Act + Assert รวมกัน — ถ้า setup ซับซ้อนมาก ให้ย้ายไป helper function
  • ส่วน Act ควรสั้น — ปกติ 1-3 บรรทัด ถ้ายาวกว่านี้ อาจทดสอบหลาย behavior ในtest เดียว
  • ส่วน Assert ต้องชัดเจน — อ่านแล้วเข้าใจทันทีว่าคาดหวังอะไร
  • ชื่อ test ต้องบอกว่าทดสอบอะไร — อ่านชื่อแล้วรู้เลยว่า test นี้ทำอะไร โดยไม่ต้องอ่าน code
แบบฝึก: จัดโครงสร้าง Test Cases เป็น AAA Format

จัดโครงสร้าง test cases ต่อไปนี้เป็น AAA format (Arrange / Act / Assert)

Test Case 1

"ทดสอบว่าระบบแสดง error เมื่อผู้ใช้พยายาม login ด้วย password ที่ผิด"

Test Case 2

"ทดสอบว่าระบบคำนวณค่าจัดส่งถูกต้อง สำหรับสินค้าน้ำหนัก 5 kg ส่งไปต่างจังหวัด"

Test Case 3

"ทดสอบว่าผู้ใช้สามารถเพิ่มสินค้าลงตะกร้า และจำนวนสินค้าในตะกร้าเพิ่มขึ้น 1"

ดูคำตอบแนะนำ

Test Case 1:

Arrange: เปิดหน้า login, เตรียม username ที่มีในระบบ + password ที่ผิด
Act: กรอก username, กรอก password ที่ผิด, กดปุ่ม login
Assert: ระบบแสดง error message "Username หรือ password ไม่ถูกต้อง", ไม่ redirect ไปหน้า dashboard

Test Case 2:

Arrange: สร้างข้อมูลสินค้า (น้ำหนัก 5 kg), กำหนดที่อยู่ปลายทาง (ต่างจังหวัด), ดึงอัตราค่าจัดส่ง
Act: เรียกฟังก์ชัน calculate_shipping(weight=5, destination="ต่างจังหวัด")
Assert: ผลลัพธ์ = ค่าจัดส่งที่ถูกต้องตามอัตรา (เช่น 150 บาท)

Test Case 3:

Arrange: เปิดหน้าสินค้า, ตรวจว่าตะกร้ามีสินค้า 0 ชิ้น (หรือจำนวนเริ่มต้น)
Act: กดปุ่ม "เพิ่มลงตะกร้า"
Assert: จำนวนสินค้าในตะกร้าเพิ่มขึ้น 1 จากเดิม, สินค้าที่เพิ่มปรากฏในรายการตะกร้า
สิ่งที่ต้องเอาติดตัวไป
  • ทุก automated test มีโครงสร้าง 3 ส่วน: Arrange (เตรียม) → Act (ทำ) → Assert (ตรวจ)
  • AAA = Given-When-Then ในภาษา BDD — เป็นสิ่งเดียวกันแค่ต่างภาษา
  • 1 test ควรทดสอบ 1 behavior — แต่อาจมีหลาย assertion ที่เกี่ยวกับ behavior เดียวกัน
  • ส่วน Act ควรสั้น (1-3 บรรทัด) ส่วน Arrange ไม่ควรยาวเกินไป
  • ชื่อ test ต้องบอกว่าทดสอบอะไร — อ่านชื่อแล้วเข้าใจทันที