BugDay 2024 miniEvent EP 6: How we used Mock APIs to speedup microservices development and testing — LMWN #LearningWithSCK
โลกการพัฒนาตอนนี้ ส่วนมากจะแบ่งเป็น Frontend (ที่ User มองเห็น) กับ Backend (เบื้องหลังการทำงาน ที่ทำร่วมกันอยู่ คอยประมวลผลต่างๆ)
- User กดปุ่ม Login
- Client ส่ง Request หา Service
- แล้ว Service ก็ทำการอะไรบางอย่าง
- ส่วน User ก็จะเห็น Loading อะไรบางอย่าง
- พอ Service ทำเสร็จก็จะ Response กลับมาที่ Client
- แล้ว User ก็จะ Login เข้าได้ แต่หน้า App ยังไม่เห็นอะไร
- ก็จะส่งไปขออะไรบางอย่างอีก แล้ว Service ก็จะส่งข้อมูลกลับมา
- ทำให้ User เห็นข้อมูล
ในโลกของการทำงานจริงเป็นการทำงานของ Service ย่อยๆ หลายตัว อาจจะถูกแบ่งตาม Business Function เช่น Auth, Product, Order เป็นสิ่งที่เราคุ้นเคยกัน ที่เรียกว่า Microservices
หรือ Internal ต่อกับ External Services ที่เรียกว่า 3rd parties
เช่น E-commerce ซื้อของออนไลน์แล้วจ่ายด้วยบัตรเครดิต ก็จะมีส่วนที่ต้อง Call ไปที่ Payment Gateway
บางที่เราอาจจะแบ่งทีมดูแลเฉพาะส่วน เช่น Frontend, Backend แล้วในแต่ละส่วนก็แบ่งย่อยในแต่ละ Service อีก
ปัญหาที่อาจจะพบเจอได้เช่น ทำงานเสร็จไม่พร้อมกัน เกิดเป็น Bottleneck หรือ ล่าช้า ในส่วนพัฒนาและทดสอบ และอาจจะตอนต่อกับ 3rd party ด้วยเช่นกัน เช่นเขายังทำไม่เสร็จ
ในเรื่องของการทดสอบ ก็ต้องคุยกับ 3rd party ว่า เราจะเรียกไปหาเขาต้องมีข้อมูลอะไรบ้าง มี End point, Request, Response อย่างไร ยกตัวอย่างเช่น
สิ่งที่เกิดขึ้นจริง คือ เราไม่สามารถทดสอบทุกอย่างได้ที่เกิดขึ้นบนนี้ เช่น บัตรเครดิตที่ได้มา ได้แค่ 1 Success Case กับ เงินไม่พอ ปัญหาก็จะเกิดขึ้นแล้ว แล้วเราจะทำยังไงล่ะ? เพราะเคสจริงบน Production บัตรมัน Invalid หรือ 3rd party — service down หรือ ตอบกลับช้า เป็นสิ่งที่เป็น Blocker เราใน Test Env
อีกปัญหาที่สามารถพบเจอได้ เช่น Service ของ 3rd party มีความไม่เสถียร (Maintenance อยู่) ถ้าเราทำ Automation Test ที่รวม 3rd party เข้าไป ก่อให้เกิดความ Flakiness ได้ คือ รันผ่านบ้าง ไม่ผ่านบ้าง ส่งผลให้การทดสอบของเราเชื่อถือไม่ได้
ปัญหาที่เกิดขึ้นเหล่านี้ จะแก้ไขด้วยการใช้ Mock APIs เข้ามาช่วยในการพัฒนาและทดสอบ
จากปัญหาที่เราเจอมา เช่น Dependency service ยังทำไม่เสร็จ เราใช้ Mock Server แทนไปเลย ไม่ต้องไปต่อ 3rd party
หรือ 3rd party พร้อมให้เราไปต่อ แต่ไม่สามารถทดสอบบางเคสได้ เช่น ตอบสนองช้า หรือ Service Down ก็เอา Mock มาคั่นกลาง
ถ้ามีลูกค้าชื่อนาย A ส่งเข้ามา ให้ทำตัวเป็น Proxy แล้ว Fwd หา 3rd party
หรือ จากเงินที่ลูกค้าจ่าย ถ้าลูกค้าจ่ายเกิน 2,000 บาท ให้ตอบค่า Mock กลับไป
หรือ มีชื่อ แล้วในชื่อประกอบไปด้วย Automation Test ให้ตอบ Mock กลับไป ก็ได้เช่นกัน
Tools ที่เอามาเล่นให้ดูชื่อ Node-RED (Open Source)
ใช้สำหรับ Mock Server และใช้เป็นหลักเลย ค่อนข้างครอบคลุม ซึ่งทางผู้แชร์ประสบการณ์วันนี้ ยังไม่เคยใช้ Tool ตัวอื่นมาก่อน
ส่วนพี่หนุ่มแชร์ว่า พวกป๋าๆ ที่ SCK จะใช้ mountebank
เป็น Browser-based เขียนจากหน้าจอได้เลย ไม่ต้องเขียนโค้ด (Low code) แล้วก็ Deploy ได้ทันที โดยคลิกที่ปุ่มเดียว และ สามารถ Set Conditions ได้ แต่ถ้าต้องการอะไรยากๆ ตัวนี้ก็สามารถเขียนโค้ดเพิ่มเข้าไปได้เช่นกัน
สามารถทำ Authentication ได้ สามารถ Integrate กับองค์กร ด้วยการใช้ Google Email ของพนักงานได้
ข้อเสีย ถึงแม้จะ Integate กับ Version Control System ได้ แต่ไม่มี Automate Push ขึ้นไป ต้องใช้ Manual กด ถ้าทีมเราทำงานด้วยกันเยอะๆ แล้วจัดการไม่ดี โค้ดอาจจะทับกันหรือโค้ดหายได้
Core Node คือพวกกล่องๆ ที่เอามาใช้
- ลากเสร็จ รันทดสอบยิง ใช้ได้เลย (นี่ว้าวมาก)
- ลากแล้วใส่ conditions ต่างๆ เข้าไป กดยิงได้เลย
- สามารถเขียนเป็น javascript code ได้
- สามารถใส่ payload เป็น HTML ได้ — ยกตัวอย่าง Login page
- ต่อ Database ก็ได้ เช่น mongoDB เป็น LIB ที่มีอยู่เลย แต่ถ้าอยากได้ตัวอื่นก็ install เพิ่มได้อีก
- context แบ่งเป็น node, flow, global
Test Strategy
- เอา Node-RED มาแทน
- รัน End to End Business ได้โดยไม่ติด Blocker
ถ้า 3rd party API มีการเปลี่ยน อาจจะทำให้ Integration Fail สิ่งที่เอามาใช้ได้คือ Contract-Test
สิ่งที่เอามาใช้คือ Schema Testing
- ถ้าเปลี่ยน field, type ส่งมาไม่ถูก มันพังก็จะบอกได้ทันที
ยกตัวอย่างในชีวิตจริง
- ถ้า CVV เป็น 111, 112, 113 จะเรียก Mock Server ขึ้นมา (Success = 1, Alternatives = 2)
- แต่ถ้าใส่ CVV เลขจริง ก็จะ Forward ไป 3rd party จริง
Node-RED สามารถเอาไปใช้กับการทำ Performance Testing ได้ (ในทีมกำลังทำกันอยู่) ปัญหาที่เจอ เราไม่อยากไปยิงถล่ม หรือบอมบ์ 3rd party เราจะเอา Node-RED มาคั่นกลางระหว่าง Service ที่เราจะทำ Performace Testing
โดย Set User นี้เป็นคนทำ Performace Testing ถ้าไม่ใช่ User นี้ก็เข้าท่าปกติไป
ทดลองเล่นได้ที่ https://example-nr-xljmjvrxca-as.a.run.app/ (แต่ถ้าอยากได้ username, password) ทักมาทางหลังไมค์อีกทีนะคะ ผู้แชร์ประสบการณ์เปิดไว้แค่ 2 pod เดี๋ยวน้องร่วง 55+
ช่วง Q&A
- สามารถกำหนด Delay ได้ แบบที่ Fix Time และ Random Time
- จำเป็นต้องอ่าน Spec API เป็นบ้าง ถึงจะมาเล่นสิ่งนี้ได้
- มี LIB ที่สามารถ Install เพิ่มได้ พัฒนาอยู่บน nodeJS อะไรที่ภาษานี้ทำได้ ก็จะทำได้แทบทุกอย่างเลย
- สามารถเพิ่ม Debug Node เข้าไปได้ เห็นทั้ง Request, Response เอาไปจิ้มตรงไหนก็ได้ จิ้มตรง End Point ก็ได้ จิ้มต่อท้าย Node ก็ได้ว่า ของที่ออกมาเป็นอะไร ดัก packet ได้ แอบทำตัวเป็น sniffer ได้
- สามารถ mock เป็น gRPC ได้ (ต้อง Install Lib เข้าไป)
- (หน้าม้าของคุณปุนแชร์) WireMock
- ถ้าใช้ node-RED ตัวเดียว แล้วอยาก mock 2 ตัว ก็สามารถแยก Tab ได้ (กรณีคนละ URL)
- หรือจะเพิ่ม node-RED อีกตัวก็ได้
ช่วงขายของ โดยส่งต่อให้คุณกมล
- สิ่งต่างๆ สามารถ Improve ได้
- Coverage ไม่ครบ ทำไมไม่ครบ ก็ไปหาจุดที่มันไม่ครบ หาทางแก้
- Automation Test ยาก ยากยังไง ก็หา Tools ไปช่วย
- ทีมนี้มีปัญหาให้แก้ตลอดเวลา ยิ่ง Product มากขึ้น ก็มีสิ่งต่างๆ ให้มาช่วยแก้ พอเจอปัญหาเหมือนๆ กัน ก็สร้างออกมาเป็น Framework ให้ทุกทีมใช้
- Automation Tester สนุกไหม? ก็ยังสนุกแล้วแต่คนชอบ คนละมุมมอง
ทักษะประสบการณ์พื้นฐาน หากต้องการสมัครเข้าทีมคุณกมล
- มีความรู้ด้าน Coding ต่อให้เป็น Low Code มันก็มี Config อะไรบางอย่างอยู่ดี
- การเข้าใจมุมมอง Logic ต่างๆ ข้างในวิ่งยังไงบ้าง การทำงานของ Software เป็นยังไง
ถ้าใครสนใจ ก็ยื่นใบสมัครได้ที่ https://careers.lmwn.com/ หรือจะทักหาพี่หนุ่ม ซึ่งพี่หนุ่มจะส่งต่อตรงให้ตรงคุณกมลค่ะ 5555+