DEV Community

Cover image for การทดสอบอัตโนมัติคืออะไร? คู่มือฉบับสมบูรณ์
Thanawat Wongchai
Thanawat Wongchai

Posted on • Originally published at apidog.com

การทดสอบอัตโนมัติคืออะไร? คู่มือฉบับสมบูรณ์

การทดสอบด้วยตนเองใช้ได้ดีจนถึงจุดที่ระบบเริ่มโต นักพัฒนาคนหนึ่งอาจคลิกตรวจสอบ endpoints ไม่กี่ตัวก่อนปล่อยได้ แต่ทีมที่ดูแลหลายสิบบริการ หลาย environment และมี release ถี่ ๆ ทำแบบนั้นซ้ำทุกครั้งไม่ได้อย่างน่าเชื่อถือ การทดสอบอัตโนมัติจึงเข้ามาช่วยให้เครื่องทำงานตรวจสอบซ้ำ ๆ อย่างสม่ำเสมอ เพื่อให้ทีมโฟกัสกับการออกแบบ การดีบัก และเคสที่ต้องใช้วิจารณญาณของมนุษย์

ลองใช้ Apidog วันนี้

คู่มือนี้อธิบายว่า automated testing คืออะไร ควรใช้เมื่อไร มีข้อจำกัดอะไร และวิธีตั้งค่า automated API testing แบบเป็นขั้นตอนใน Apidog

การทดสอบอัตโนมัติคืออะไร

การทดสอบอัตโนมัติคือการใช้ซอฟต์แวร์รัน test case และตรวจสอบผลลัพธ์แทนการทำทุกขั้นตอนด้วยมือ คุณกำหนดสิ่งต่อไปนี้ไว้ล่วงหน้า:

  • input ที่ต้องใช้
  • action หรือ request ที่ต้องเรียก
  • expected result ที่ต้องผ่าน
  • assertion สำหรับตรวจสอบผลลัพธ์

จากนั้นเครื่องมือจะรัน test ได้ตามคำสั่ง ตามตารางเวลา หรือทุกครั้งที่มีการเปลี่ยนโค้ดใน CI/CD pipeline แล้วรายงานว่า test ผ่านหรือไม่ผ่าน

สิ่งสำคัญไม่ใช่แค่ “เร็วขึ้น” แต่คือ “ทำซ้ำได้เหมือนเดิม” มนุษย์อาจตรวจ endpoint เดิม 50 ครั้งแล้วเผลอข้ามบางขั้นตอน แต่ automated test จะรันครั้งที่ 50 เหมือนครั้งแรกทุกประการ

การทดสอบอัตโนมัติใช้ได้หลายระดับ เช่น:

  • Unit tests: ตรวจฟังก์ชันหรือคลาสเดี่ยว
  • Integration tests: ตรวจการทำงานร่วมกันของหลาย component
  • API tests: ตรวจ endpoints ผ่าน HTTP
  • UI / End-to-end tests: ตรวจ workflow ผ่าน interface จริง

สำหรับหลายทีม การเริ่มจาก API tests ให้ผลคุ้มค่ามาก เพราะ API มักเสถียรกว่า UI รันเร็วกว่า และครอบคลุม business logic สำคัญได้โดยไม่ต้องพึ่ง browser automation ที่อาจไม่เสถียร

ทำไมทีมถึงควรทำการทดสอบอัตโนมัติ

1. Manual testing ขยายตามระบบไม่ทัน

ทุก endpoint ใหม่เพิ่มงานตรวจสอบ ทุก environment เพิ่มจำนวนรอบที่ต้องตรวจ เมื่อระบบโตขึ้น การตรวจทุกอย่างด้วยมือก่อน release จะกลายเป็น bottleneck และมักทำให้บางส่วนถูกข้ามโดยไม่ตั้งใจ

2. Regression bugs เล็ดลอดง่ายถ้าไม่มี automation

การแก้ service หนึ่งอาจทำให้ contract ของอีก service พังได้ Automated test suite ที่รันซ้ำทุกครั้งที่มี change ช่วยจับ regression ก่อน merge หรือ deploy

3. Test case กลายเป็น asset ที่ใช้ซ้ำได้

Manual test หายไปหลังจากทำเสร็จ แต่ automated test ถูกเขียนครั้งเดียวและรันซ้ำได้หลายพันครั้ง ยิ่ง test stable และอยู่ใน pipeline นานเท่าไร ผลตอบแทนยิ่งสูงขึ้น

4. Feedback loop เร็วขึ้น

ถ้า test รันใน CI นักพัฒนาจะรู้ภายในไม่กี่นาทีว่า change ล่าสุดทำให้ระบบพังหรือไม่ การแก้ bug ตอน context ยังสดใหม่ถูกกว่าการไล่แก้หลัง production incident มาก

5. คนได้ทำงานที่เครื่องทำแทนไม่ได้

Automation ไม่ได้แทนที่ tester แต่ช่วยลดงานคลิกซ้ำ ๆ เพื่อให้ tester ใช้เวลากับ exploratory testing, edge cases, usability และการวิเคราะห์ความเสี่ยงของระบบ

สิ่งที่การทดสอบอัตโนมัติไม่สามารถแก้ไขได้

Automation มีต้นทุน ทั้งตอนสร้างและตอนดูแล ถ้า API เปลี่ยน test ก็ต้องเปลี่ยนตาม Test suite ที่ล้าสมัยและ fail ด้วยเหตุผลผิด ๆ จะทำให้ทีมเริ่มไม่เชื่อ report และเพิกเฉยต่อ build ที่แดง

Automation ยังบอกไม่ได้ว่าซอฟต์แวร์ “ดี” หรือไม่ มันบอกได้แค่ว่าผลลัพธ์ตรงกับสิ่งที่คุณกำหนดไว้หรือเปล่า เช่น response อาจถูก schema แต่ใช้งานจริงไม่สะดวก หรือ workflow อาจถูกต้องเชิงเทคนิคแต่สับสนสำหรับผู้ใช้ สิ่งเหล่านี้ยังต้องใช้การตัดสินใจของมนุษย์

ไม่ใช่ทุกอย่างควร automate ถ้าเป็นการตรวจที่ทำแค่ครั้งเดียวหรือสองครั้ง อาจไม่คุ้มค่า ให้เริ่มจากงานที่:

  • รันซ้ำบ่อย
  • มี business impact สูง
  • มี expected result ชัดเจน
  • เสถียรพอที่จะ automate
  • ควรรันทุก commit, pull request หรือ release

วิธีตั้งค่าการทดสอบ API แบบอัตโนมัติใน Apidog

Apidog ช่วยสร้าง API test แบบ visual โดยไม่จำเป็นต้องเริ่มจากการเขียน test script ทั้งหมดเอง ขั้นตอนหลักมีดังนี้

ขั้นตอนที่ 1: กำหนดหรือนำเข้า API

เริ่มจากนำเข้า API definition เช่น:

  • OpenAPI specification
  • Postman collection
  • หรือสร้าง endpoint โดยตรงใน Apidog

สำหรับแต่ละ endpoint ให้กำหนด request schema และ response schema ให้ชัดเจน เพราะข้อมูลนี้จะเป็นฐานสำหรับ assertion และ contract testing

ตัวอย่างสิ่งที่ควรมีใน API spec:

GET /users/{id}
parameters:
  - name: id
    in: path
    required: true
responses:
  "200":
    description: User detail
    content:
      application/json:
        schema:
          type: object
          required:
            - id
            - email
          properties:
            id:
              type: string
            email:
              type: string
Enter fullscreen mode Exit fullscreen mode

ถ้าเริ่มจาก spec ที่ดี contract และ test จะดูแลให้อยู่ในทิศทางเดียวกันได้ง่ายขึ้น

ขั้นตอนที่ 2: เพิ่ม assertion ให้แต่ละ request

request ที่ไม่มี assertion แค่พิสูจน์ว่า server ตอบกลับ แต่ยังไม่พิสูจน์ว่าระบบทำงานถูกต้อง ให้เพิ่ม assertion เช่น:

  • status code ต้องเป็น 200
  • response body ต้องมี field ที่ต้องการ
  • field ต้องมี type ถูกต้อง
  • response ต้องตรงกับ schema
  • response time ต้องต่ำกว่าค่าที่กำหนด

ตัวอย่าง assertion ที่ควรมีสำหรับ GET /users/{id}:

status == 200
body.id exists
body.email exists
body.email is string
response matches schema
response time < 500ms
Enter fullscreen mode Exit fullscreen mode

อ่านเพิ่มเติมเกี่ยวกับ API assertions

ขั้นตอนที่ 3: สร้าง test scenario

จัดกลุ่ม request ที่เกี่ยวข้องกันเป็น scenario เช่น “วงจรชีวิตผู้ใช้” หรือ “User lifecycle”

ตัวอย่าง flow:

  1. POST /login เพื่อรับ token
  2. เก็บ token จาก response
  3. ใช้ token เรียก GET /users/me
  4. ตรวจว่า user profile ถูกต้อง
  5. เรียก PATCH /users/me
  6. ตรวจว่า field ถูก update จริง

แนวคิดสำคัญคือให้ output ของ step ก่อนหน้าไหลไปยัง step ถัดไป เช่น token, user id หรือ order id

ตัวอย่าง pseudo-flow:

POST /login
  assert status == 200
  save body.token as authToken

GET /users/me
  header Authorization: Bearer {{authToken}}
  assert status == 200
  assert body.email exists
Enter fullscreen mode Exit fullscreen mode

ดูแนวทางเพิ่มเติมได้ที่ วิธีเขียนกรณีทดสอบ API

ขั้นตอนที่ 4: เพิ่ม data-driven testing

ถ้า endpoint ต้องทดสอบหลาย input อย่าสร้าง test case ซ้ำ ๆ ด้วยมือ ให้ใช้ CSV หรือ JSON เป็น test data แทน

ตัวอย่าง CSV:

email,password,expectedStatus
valid@example.com,correct-password,200
invalid@example.com,wrong-password,401
missing@example.com,,400
Enter fullscreen mode Exit fullscreen mode

จากนั้นให้ scenario เดิมรันกับข้อมูลหลายแถว วิธีนี้ช่วยเพิ่ม coverage โดยไม่ทำให้ test suite บวมเกินไป

อ่านเพิ่มเติมเกี่ยวกับ การทดสอบ API ที่ขับเคลื่อนด้วยข้อมูล

ขั้นตอนที่ 5: รัน scenario และดู report

รัน scenario ตามคำสั่งเพื่อเช็คว่า test ผ่านทั้งหมดหรือไม่ คุณสามารถรันซ้ำหลายรอบ เช่น 50 ครั้ง เพื่อดูความเสถียรของ endpoint ภายใต้การเรียกซ้ำ

Report ที่ดีควรบอกได้ว่า:

  • request ไหนล้มเหลว
  • assertion ไหนไม่ผ่าน
  • expected value คืออะไร
  • actual value คืออะไร
  • response body ที่เกี่ยวข้องคืออะไร

ข้อมูลเหล่านี้ช่วยให้ developer debug ได้ทันทีโดยไม่ต้องเดาจาก error กว้าง ๆ

ขั้นตอนที่ 6: จัดกลุ่มเป็น test suite

เมื่อมีหลาย scenario ให้รวมเป็น ชุดทดสอบ เช่น:

  • Smoke test suite
  • Regression test suite
  • Authentication suite
  • Payment API suite
  • User management suite

แนวทางที่ใช้ได้จริง:

  • Smoke tests ควรรันเร็วและครอบคลุม path สำคัญ
  • Regression tests ครอบคลุมกว้างกว่าและอาจรันก่อน merge หรือก่อน release
  • Test suite ที่ใหญ่ควรแบ่งตาม domain เพื่อ debug ง่าย

ขั้นตอนที่ 7: เชื่อมเข้ากับ CI/CD

จุดที่ทำให้ test กลายเป็น automation จริงคือการรันโดยไม่ต้องมีคนจำได้ว่าต้องกดเอง ให้เชื่อม test suite เข้ากับ pipeline เช่น:

  • ทุก pull request
  • ทุก merge เข้า main branch
  • ก่อน deploy ไป staging
  • ก่อน release production

ตัวอย่างแนวคิดใน CI:

name: API Tests

on:
  pull_request:
  push:
    branches:
      - main

jobs:
  api-tests:
    runs-on: ubuntu-latest
    steps:
      - name: Run API test suite
        run: |
          echo "Run Apidog API tests here"
Enter fullscreen mode Exit fullscreen mode

รายละเอียดการเชื่อมต่อ pipeline ดูได้ที่ การทำให้การทดสอบ API เป็นอัตโนมัติใน CI/CD และ การรันการทดสอบ API ใน GitHub Actions

คุณสามารถ ดาวน์โหลด Apidog เพื่อสร้าง scenario อัตโนมัติชุดแรกและทดลองรันกับ API ของคุณ

ประเภทหลักของการทดสอบอัตโนมัติ

Automated testing ไม่ใช่ test แบบเดียว แต่เป็นหลายชั้นที่ช่วยจับ bug ต่างประเภทกัน

Unit tests

Unit tests ตรวจฟังก์ชันหรือคลาสเดี่ยวแบบแยกส่วน เหมาะกับ business logic ขนาดเล็กและรันได้เร็วมาก

ตัวอย่าง:

function calculateDiscount(price, percent) {
  return price - price * percent;
}

test("calculate discount", () => {
  expect(calculateDiscount(100, 0.2)).toBe(80);
});
Enter fullscreen mode Exit fullscreen mode

ข้อดีคือเร็วและดูแลง่าย แต่ไม่จับปัญหาระหว่าง service, database หรือ network

Integration tests

Integration tests ตรวจว่าหลาย component ทำงานร่วมกันได้ เช่น service กับ database หรือ service กับ service อื่น

ตัวอย่างสิ่งที่ควรตรวจ:

  • query database ได้ถูกต้อง
  • message queue ส่ง/รับ message ได้
  • service A เรียก service B แล้ว handle response ได้ถูกต้อง

ข้อเสียคือช้ากว่า unit tests และต้องเตรียม environment มากกว่า

API tests

API tests ตรวจ endpoint ผ่าน HTTP เหมือน client จริง จึงเหมาะสำหรับตรวจ contract และ business workflow

ตัวอย่างสิ่งที่ API test ควรเช็ค:

POST /orders
  assert status == 201
  assert body.id exists
  assert body.status == "created"

GET /orders/{{orderId}}
  assert status == 200
  assert body.id == {{orderId}}
Enter fullscreen mode Exit fullscreen mode

สำหรับหลายทีม นี่คือชั้นที่คุ้มที่สุด เพราะเร็วกว่า end-to-end tests และครอบคลุม logic สำคัญมากกว่า unit tests เพียงอย่างเดียว

End-to-end tests

End-to-end tests รัน workflow เต็มผ่านระบบจริง มักรวม UI ด้วย เช่น login, เพิ่มสินค้าใน cart, checkout และชำระเงิน

ข้อดีคือใกล้เคียงประสบการณ์ผู้ใช้จริงที่สุด แต่ข้อเสียคือช้า ดูแลยาก และ flaky ได้ง่าย จึงควรใช้กับ journey สำคัญเท่านั้น

แนวคิด test pyramid ยังใช้ได้ดี:

  • ฐาน: unit tests จำนวนมาก
  • กลาง: integration และ API tests
  • ยอด: end-to-end tests จำนวนเล็กน้อย

ถ้า test suite กลับหัวและพึ่ง end-to-end tests มากเกินไป pipeline จะช้าและ fail แบบไม่เสถียรได้ง่าย

วิธีทำให้ automated test คุ้มค่าในระยะยาว

เก็บ test ให้อยู่ใกล้ API design

เมื่อ API contract และ test อยู่ใกล้กัน การเปลี่ยน schema หรือ endpoint จะถูกสะท้อนใน test ได้ง่ายขึ้น ลดโอกาสที่ test ล้าสมัย

ตรวจผลลัพธ์จริง ไม่ใช่แค่ status code

การเช็คแค่ 200 OK ไม่พอ เพราะ API อาจตอบ 200 พร้อมข้อมูลผิด ควรตรวจ body, schema, type และ business rule ด้วย

ตัวอย่างที่ดีกว่า:

status == 200
body.items is array
body.items[0].id exists
body.total >= 0
response matches schema
Enter fullscreen mode Exit fullscreen mode

ทำ failure ให้อ่านง่าย

Report ควรบอกชัดเจนว่า assertion ไหน fail ไม่ใช่แค่บอกว่า scenario fail การ debug จะเร็วขึ้นมากถ้า developer เห็น expected และ actual value ทันที

รัน test ในจุดที่ทีมตัดสินใจ

ถ้า test ต้องรอให้คนกดเอง มักถูกลืม ให้ใส่ test ไว้ใน pipeline ที่มีผลต่อ decision เช่น PR check, staging deployment หรือ release gate

ใช้ AI ช่วยงานซ้ำ ๆ แต่ยังต้อง review

AI ช่วยร่าง test case จาก spec หรือช่วยเสนอ edge cases ได้ดี แต่ยังต้องมีมนุษย์ตรวจว่า assertion สอดคล้องกับ business rule จริงหรือไม่ อ่านเพิ่มเติมที่ การทดสอบ API อัตโนมัติที่เสริมด้วย AI

คำถามที่พบบ่อย

การทดสอบอัตโนมัติดีกว่าการทดสอบด้วยตนเองหรือไม่?

ไม่ใช่การแทนที่กัน ควร automate งานที่เสถียร ซ้ำบ่อย และมี expected result ชัดเจน ส่วน exploratory testing, usability review และงานที่ต้องใช้การตัดสินใจยังควรทำด้วยมนุษย์ ทีมที่ดีใช้ทั้งสองแบบร่วมกัน

ต้องเขียนโค้ดเป็นไหมถึงจะทำ automated API testing ได้?

ไม่จำเป็นเสมอไป ถ้าใช้เครื่องมือแบบ visual เช่น Apidog คุณสามารถสร้าง request, assertion และ scenario ผ่าน UI ได้ และค่อยใช้ script เมื่อมี logic เฉพาะที่ UI แสดงไม่ได้

ทีมควรเริ่ม automate จากจุดไหน?

เริ่มจาก API tests โดยเฉพาะ endpoint ที่สำคัญต่อ business เช่น authentication, payment, order, user profile หรือ workflow ที่พังแล้วกระทบผู้ใช้มาก จากนั้นค่อยขยาย coverage

Automated tests ต้องดูแลมากแค่ไหน?

ต้องดูแลตามการเปลี่ยนแปลงของ API ถ้า endpoint, schema หรือ business rule เปลี่ยน test ก็ต้องอัปเดตด้วย ควรเผื่อเวลา maintenance ไว้เสมอ เพราะ test ที่ไม่มีคนดูแลจะค่อย ๆ หมดความน่าเชื่อถือ

อะไรทำให้ automated test flaky?

สาเหตุที่พบบ่อยคือ:

  • พึ่งพาเวลาแบบไม่แน่นอน
  • ใช้ shared state ระหว่าง test
  • test ต้องรันตามลำดับเท่านั้น
  • assert ค่าที่เปลี่ยนตลอด เช่น timestamp หรือ generated id
  • environment ไม่เสถียร

วิธีลดความ flaky:

  • แยก test data ต่อ test case
  • assert โครงสร้างแทนค่าที่ไม่ deterministic
  • ล้าง state ก่อนหรือหลัง test
  • หลีกเลี่ยง dependency ระหว่าง test
  • จัดการ timeout และ retry อย่างระมัดระวัง

จะวัดได้อย่างไรว่า automated testing ทำงานได้ดี?

อย่าวัดแค่จำนวน test ให้ดู metric ที่สะท้อนคุณภาพจริง เช่น:

  • จำนวน bug ที่ test จับได้ก่อน release
  • จำนวน bug ที่หลุดไป production
  • เวลาที่ test suite ใช้รัน
  • อัตรา flaky test
  • coverage ของ assertion ที่มีความหมาย
  • เวลาที่ developer ใช้ debug failure

Test suite ที่เขียวตลอดแต่ยังมี bug หลุด production บ่อย แปลว่า assertion อาจไม่ครอบคลุมสิ่งสำคัญพอ เป้าหมายคือ test ที่รันเร็ว เชื่อถือได้ และจับ regression ที่มีผลต่อผู้ใช้จริงได้ก่อน deploy.

Top comments (0)