Codding Gun

การทดสอบ API (API Testing)

ในยุคนี้ถือได้ว่าการทำ Automated Testing ถือเป็นส่วนประกอบหลักในการทำ Software ให้มีประสิทธิภาพ และแน่นอนการทดสอบ API ก็เช่นเดียวกัน ในบทความต่างๆเหล่านี้จะพาทุกท่านไปรู้จักกับเครื่องมือที่สามารถช่วยให้การทดสอบ API ของคุณมีประสิทธิภาพมากขึ้น

API ถือได้ว่าเป็น Business Logic และ Information ของระบบ ถ้า API ไม่มีคุณภาพ ก็จะทำให้ระบทั้งระบบไม่มีคุณภาพตามไปด้วย

API Testing คืออะไร?

API testing คือกระบวนการทดสอบว่า API ทำงานได้ตามที่เรา คาดหวังไว้หรือไม่ ซึ่งเราสามารถทำการทดสอบด้วยมือ(manual) หรือแบบอัตโนมัติ(Automated) ก็ได้

การทดสอบที่ UI(UI testing) จะถูกกำกับการทำงานต่างๆด้วย UI เช่น การแสดงหรือไม่แสดงปุ่ม เมื่อไม่มีปุ่มนั้นอยู่บนหน้าจอก็จะไม่สามารถทำการทดสอบได้ ดังนั้นการทดสอบที่ API(api testing) จะได้ผลลัพธ์ที่ดีกว่าเพราะเรากำลังสนใจที่ business logic โดยที่ไม่มี UI มากำกับการทำงาน

API testing vs UI testing
ความแตกต่างระหว่างการทำ UI testing(presentation layer) กับ API tesing ที่ทดสอบ businees logic

ประเภทของ API

ก่อนจะเข้าไปสู่การทดสอบ API เราต้องรู้จักกับประเภทของ API กันก่อน ซึ่ง ในปัจจุบัน API นั้นแบ่งออกได้หลายประเภท ขึ้นอยู่กับผู้พัฒนาจะเลือกใช้วิธีหรือ Technology ไหนในการพัฒนา ซึ่งเราสามารแบ่ง API ออกเป็นประเภทต่างๆ ดังนี้

  1. REST API เป็น API ที่เราพบได้มาที่สุด เนื่องจากสามารถเรียกใช้บริการได้จากทุก platform
  2. Hypermedia หรือ HATEOAS เป็นอีกรูปแบบของการใช้ REST API เป็นเหมือน REST API แบบปกติ แต่จะเพิ่ม URL เข้าไปใน result ที่ return ออกมาจาก API เพื่อบอกว่าเราสามารถเข้าไปที่ URL ไหนต่อได้บ้าง
  3. SOAP เป็น API ร่นบุกเบิกที่ return ผลลัพธิ์ออกมาเป็น XML
  4. gRPC เป็น protocol ใหม่ที่พัฒนาขึ้นมาโดย google มีประสิทธิภาพสูงกว่า REST แต่ต้องแลกกับ dependency ที่จะเกิดขึ้น(ไม่ได้แพร่หลายเหมือน REST API) ส่วนใหญ่จะใช้ gRPC ในการคุบกันระหว่าง services(เป็น server to server)
  5. GraphQL เป็นการส่ง input เข้ามาที่ API ในรูปแบบของ Query Language ส่วนใหญ่จะใช้กับ Front-end(เป็น client to server)

ประเภทของ API Testing

API testing มีหลายประเภท ซึ่งการทดสอบแต่ละประเภทจะมีจุดประสงค์ที่แตกต่างกัน เราจะแบ่งการทดสอบ api ออกเป็นประเภทต่างๆ ดังนี้

  1. Unit testing เป็นการทดสอบเฉพาะ API endpoint นั้นๆ เป็นการทดสอบว่าเมื่อส่ง parameters แต่ละตัวเข้าไปแล้ว API มี response ตามที่เราต้องการหรือไม่

    API Endpoint คือ จุดที่เราเข้าไปติดต่อกับ API ยกตัวอย่างเช่น REST API จะใช้ URL และ HTTP Method ในการแยก Endpoint

    การทดสอบ API แบบ Unit Testing
    ทดสอบแต่ละ API endpoint แยกกัน

  2. Contract testing เป็นการทดสอบ API โดยเทียบกับ Contract(OpenAPI, WSDL) เพื่อยืนยันว่า API นั้นทำงานตรงกับเอกสาร(API Contracct) ที่ได้อธิบายการทำงานของ API ไว้ การทำ Contract test จะช่วยให้เราสามารถแยกการทำงานออกจากกันได้อย่างเด็ดขาด เพราะเราสสามารถนำ contract ที่มีไป mock เป็น service จำลองได้

    API Contract คือ เอกสารที่อธิบายการทำงานของ API(functionality) ด้วยภาษาที่มนุษย์และ machine สามารถอ่านได้ เช่น YAML, JSON หรือ Markdown

    การทดสอบ API แบบ Unit Testing
    ที่มา https://pactflow.io/how-pact-works

  3. End-2-End testing เป็นการทดสอบการทำงานของ API ที่สนใจการทำงานร่วมกันของ API หลายๆ endpoints โดยเราจะเขียน request ไปยัง API ตัวต่อไปหลังจากที่ได้รับ Response กลับมาแล้ว เราจะเขียน test case โดยอ้างอิงการใช้งานผ่าน UI และเปลี่ยนมาเป็น API แทน

    การทดสอบ API แบบ End-to-End Test

  4. Load testing เป็นการทดสอบยิง requests เข้าไปยัง API เยอะๆ เพื่อให้เราแน่ใจได้ว่า API นั้นสามารถรองรับ traffic ในปริมาณที่เรากำหนดไว้ได้ในทุกๆ endpoints (Load testing tool สามารถจำลองได้ทั้งปริมาณและขนาดของ request)

Top 5 API testing tools สำหรับทำ Automated API Testing

  1. Postman เป็นเครื่องมือทดสอบ API ยอดนิยมสำหรับผู้ที่ต้องพัฒนา API เนื่องจาก Postman นั้นใช้งานได้ง่ายมาก เหมาะสำหรับผู้เริ่มต้น และแน่นอนในความง่ายนั้น การเขียน Test case ต่างๆที่เริ่มซับซ้อนอาจทำได้ยากกว่าเครื่องมืออื่นๆ
  2. SoapUI เป็นเครื่องมือที่ใช้ในการทดสอบ API มาตั้งแต่สมัยเป็น SOAP service(Web Service ยุคเริ่มต้น) ดังนั้น SOAP UI จึงเป็นเครื่องมืออีกตัวที่ถือได้ว่าเป็นคู่แข่งที่ใกล้เคียงกับ Postman มากที่สุด
  3. REST Assured เป็นเครื่องมือที่ใช้ภาษา Java เขียน Test case
  4. JMeter เป็นเครื่องมือที่ใช้สำหรับทำ Load Test ดังนั้นจะแตกต่างจาก Postman, SoapUI และ Rest Assured ที่เน้นการทดสอบ response จาก API ว่าตรงกับที่ต้องการหรือไม่
  5. Dredd เป็นเครื่องมือที่ใช้ทำ Contract test โดยเฉพาะ ซึ่ง dredd จะ support อยู่ 2 format คือ OpenAPI(swagger) และ API blueprint

สิ่งที่ต้องพิจารณา API testing tools

เนื่องจากเครื่องมือที่ใช้ทดสอบ API นั้นมีอยู่เยอะมากดังนั้นสิ่งที่เราต้องนำมาพิจารณา เพื่อเลือกเครื่องมือที่เราจะนำมาใช้คือ

ข้อดีของการทำ API Testing

  1. Quality assurance API testing จะช่วยให้ทั้งทีมมั่นใจได้ว่า API ทำงานได้(Unit testing) และมีการทำงานตรงตามที่ตกลงกันไว้ใน API Contract(Contract test)
  2. Early issue detection and resolution ยิ่งหา defect หรือข้อผิดพลาดได้เร็วเท่าไหร่ยิ่งจะทำให้ต้นทุนในการแก้ปัญหาลงลง ดังนั้นการทดสอบ API จะช่วยทำให้เจอ defect ได้เร็วขึ้น โดยเฉพาะการพัฒนาที่แบบ API first

    API first คือกระบวนการผลิตที่ออกแบบและพัฒนา API ก่อน UI

  3. Resource conservation API นั้นสามารถทำ Automation(Automated API testing) ได้ง่ายกว่า UI ดังนั้นถ้าเราทำการทดสอบแบบอัตโนมัติช่วยประหยัดแรงงานที่ใช้ในการทดสอบ และเมื่อเราใช้เวลาในการทดสอบน้อยลง
  4. Rapid iteration และยิ่งถ้าเราใส่การทดสอบแบบอัตโนมัติเข้าไปใน CI/CD pipeline ก็จะยิ่งมั่นใจได้เลยว่า API ของเราทำงานถูกต้อง เพราะเมื่อเรา test ซ้ำบ่อยๆ(continuous) ก็จะมีโอกาสเกิด bug หรือ defect น้อยลง และยิ่งเราได้ release ออกไปทดสอบบน production ก็ยิ่งทำให้เรามั่นใจได้เลยว่าเรา API ของเราทำงานได้แน่นอน

ประเภทของ API Testing

เราสามารถแบ่งการทดสอบ API ออกเป็น 9 ประเภทดังนี้

Smoke Testing

เป็นการทดสอบ API หลังจากที่ื API เสร็จสมบูรณ์ โดยการทดสอบแบบ Smoke test จะเป็นการทดสอบเฉพาะ function หรือ feature หลักๆของ API เท่านั้น

Functional Testing

ทดสอบว่า API เป็นไปตาม functional requirements และเปรียบเทียบผลลัพธ์ที่ได้(actual results) กับสิ่งที่ควรจะได้(expected results)

Integration Testing

ทำการทดสอบการทำงานร่วมกันระหว่าง API ของเราและ API อื่นๆ ซึ่งรวมทั้ง API ภายในองค์กรและ Third-party API

Regression Testing

การทดสอบระบบซ้ำหลังจากการ update version และ bug fixed เพื่อให้เราแน่ใจว่า API จะยังคงทำงานได้เหมือนเดิมหลังจากที่เรา Update API

Load Testing

เป็นการทดสอบว่า API ของเราสามารถรองรับ users ตามที่เราคาดการณ์ไว้ใน Capacity planning ได้ โดยที่ load test จะต้องจำลองพฤติกรรมของ user(user behavior) ของ user ได้

Stress Testing

เป็นการทดสอบว่า API ของเราสามารถรับ load ได้สูงสุดเท่าไหร่

Security Testing

เป็นการทดสอบเพื่อหาช่องโหว่(vulnerability) ของระบบ

UI Testing

เป็นการทดสอบการทำงานร่วมกันของ UI และ API เพื่อให้แน่ใจว่า input validation และ data ของเรานำไปแสดงผลได้ถูกต้อง

Fuzz Testing

การใส่ input ที่ไม่ได้คาดคิดมาก่อน(unexpected input) ถ้า API สามารถรับมือกับ input ต่างๆที่เราใส่เข้าไปได้โดยไม่ Error ก็จะถือว่าระบบมีความแข็งแกร่งทนทานมากๆ โดยส่วนใหญ่เราจะส่ง input พวก SQL injection หรือ XSS เข้าไปเพื่อหาช่องโหว่ของ API ไปด้วย

ลองตรวจสอบกันดูนะครับว่าเราได้ทดสอบ API กันครบแล้วรึยัง

บทความเกี่ยวกับการทดสอบ API

Phanupong Permpimol
Follow me