ในยุคนี้ถือได้ว่าการทำ 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
ก่อนจะเข้าไปสู่การทดสอบ API เราต้องรู้จักกับประเภทของ API กันก่อน ซึ่ง ในปัจจุบัน API นั้นแบ่งออกได้หลายประเภท ขึ้นอยู่กับผู้พัฒนาจะเลือกใช้วิธีหรือ Technology ไหนในการพัฒนา ซึ่งเราสามารแบ่ง API ออกเป็นประเภทต่างๆ ดังนี้
- REST API เป็น API ที่เราพบได้มาที่สุด เนื่องจากสามารถเรียกใช้บริการได้จากทุก platform
- Hypermedia หรือ HATEOAS เป็นอีกรูปแบบของการใช้ REST API เป็นเหมือน REST API แบบปกติ แต่จะเพิ่ม URL เข้าไปใน result ที่ return ออกมาจาก API เพื่อบอกว่าเราสามารถเข้าไปที่ URL ไหนต่อได้บ้าง
- SOAP เป็น API ร่นบุกเบิกที่ return ผลลัพธิ์ออกมาเป็น XML
- gRPC เป็น protocol ใหม่ที่พัฒนาขึ้นมาโดย google มีประสิทธิภาพสูงกว่า REST แต่ต้องแลกกับ dependency ที่จะเกิดขึ้น(ไม่ได้แพร่หลายเหมือน REST API) ส่วนใหญ่จะใช้ gRPC ในการคุบกันระหว่าง services(เป็น server to server)
- GraphQL เป็นการส่ง input เข้ามาที่ API ในรูปแบบของ Query Language ส่วนใหญ่จะใช้กับ Front-end(เป็น client to server)
ประเภทของ API Testing
API testing มีหลายประเภท ซึ่งการทดสอบแต่ละประเภทจะมีจุดประสงค์ที่แตกต่างกัน เราจะแบ่งการทดสอบ api ออกเป็นประเภทต่างๆ ดังนี้
-
Unit testing เป็นการทดสอบเฉพาะ API endpoint นั้นๆ เป็นการทดสอบว่าเมื่อส่ง parameters แต่ละตัวเข้าไปแล้ว API มี response ตามที่เราต้องการหรือไม่
API Endpoint คือ จุดที่เราเข้าไปติดต่อกับ API ยกตัวอย่างเช่น REST API จะใช้ URL และ HTTP Method ในการแยก Endpoint
-
Contract testing เป็นการทดสอบ API โดยเทียบกับ Contract(OpenAPI, WSDL) เพื่อยืนยันว่า API นั้นทำงานตรงกับเอกสาร(API Contracct) ที่ได้อธิบายการทำงานของ API ไว้ การทำ Contract test จะช่วยให้เราสามารถแยกการทำงานออกจากกันได้อย่างเด็ดขาด เพราะเราสสามารถนำ contract ที่มีไป mock เป็น service จำลองได้
API Contract คือ เอกสารที่อธิบายการทำงานของ API(functionality) ด้วยภาษาที่มนุษย์และ machine สามารถอ่านได้ เช่น YAML, JSON หรือ Markdown
-
End-2-End testing เป็นการทดสอบการทำงานของ API ที่สนใจการทำงานร่วมกันของ API หลายๆ endpoints โดยเราจะเขียน request ไปยัง API ตัวต่อไปหลังจากที่ได้รับ Response กลับมาแล้ว เราจะเขียน test case โดยอ้างอิงการใช้งานผ่าน UI และเปลี่ยนมาเป็น API แทน
-
Load testing เป็นการทดสอบยิง requests เข้าไปยัง API เยอะๆ เพื่อให้เราแน่ใจได้ว่า API นั้นสามารถรองรับ traffic ในปริมาณที่เรากำหนดไว้ได้ในทุกๆ endpoints (Load testing tool สามารถจำลองได้ทั้งปริมาณและขนาดของ request)
Top 5 API testing tools สำหรับทำ Automated API Testing
- Postman เป็นเครื่องมือทดสอบ API ยอดนิยมสำหรับผู้ที่ต้องพัฒนา API เนื่องจาก Postman นั้นใช้งานได้ง่ายมาก เหมาะสำหรับผู้เริ่มต้น และแน่นอนในความง่ายนั้น การเขียน Test case ต่างๆที่เริ่มซับซ้อนอาจทำได้ยากกว่าเครื่องมืออื่นๆ
- SoapUI เป็นเครื่องมือที่ใช้ในการทดสอบ API มาตั้งแต่สมัยเป็น SOAP service(Web Service ยุคเริ่มต้น) ดังนั้น SOAP UI จึงเป็นเครื่องมืออีกตัวที่ถือได้ว่าเป็นคู่แข่งที่ใกล้เคียงกับ Postman มากที่สุด
- REST Assured เป็นเครื่องมือที่ใช้ภาษา Java เขียน Test case
- JMeter เป็นเครื่องมือที่ใช้สำหรับทำ Load Test ดังนั้นจะแตกต่างจาก Postman, SoapUI และ Rest Assured ที่เน้นการทดสอบ response จาก API ว่าตรงกับที่ต้องการหรือไม่
- Dredd เป็นเครื่องมือที่ใช้ทำ Contract test โดยเฉพาะ ซึ่ง dredd จะ support อยู่ 2 format คือ OpenAPI(swagger) และ API blueprint
สิ่งที่ต้องพิจารณา API testing tools
เนื่องจากเครื่องมือที่ใช้ทดสอบ API นั้นมีอยู่เยอะมากดังนั้นสิ่งที่เราต้องนำมาพิจารณา เพื่อเลือกเครื่องมือที่เราจะนำมาใช้คือ
- ต้องสามารถทำงานแบบอัตโนมัติได้(Automated API testing)
- ต้องสามารถนำเข้าไปใส่ใน Continuous Integration(CI) และ Continuous Deployment(CD) ได้
- ต้องสามารถ random หรือ fake ค่าที่ต้องการทดสอบได้
- ต้องทำงานได้อย่างรวดเร็ว ไม่ขัดขวางขั้นตอนการพัฒนา
- ต้องรองรับ API Contract ของ technology ต่างๆ เช่น OpenAPI, GraphQL Schema ,WSDL หรือ proto file(contract ของ gRPC)
- ต้องสามารถใช้งานผ่าน UI ได้ง่ายไม่ยุ่งยาก
ข้อดีของการทำ API Testing
- Quality assurance API testing จะช่วยให้ทั้งทีมมั่นใจได้ว่า API ทำงานได้(Unit testing) และมีการทำงานตรงตามที่ตกลงกันไว้ใน API Contract(Contract test)
- Early issue detection and resolution ยิ่งหา defect หรือข้อผิดพลาดได้เร็วเท่าไหร่ยิ่งจะทำให้ต้นทุนในการแก้ปัญหาลงลง ดังนั้นการทดสอบ API จะช่วยทำให้เจอ defect ได้เร็วขึ้น โดยเฉพาะการพัฒนาที่แบบ API first
API first คือกระบวนการผลิตที่ออกแบบและพัฒนา API ก่อน UI
- Resource conservation API นั้นสามารถทำ Automation(Automated API testing) ได้ง่ายกว่า UI ดังนั้นถ้าเราทำการทดสอบแบบอัตโนมัติช่วยประหยัดแรงงานที่ใช้ในการทดสอบ และเมื่อเราใช้เวลาในการทดสอบน้อยลง
- 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 กันครบแล้วรึยัง