หน่วยทดสอบไคลเอนต์และห่อหุ้ม API


14

ฉันวนเวียนวนไปรอบ ๆ เพื่อหาวิธีที่ดีที่สุดในการทดสอบหน่วยห้องสมุดลูกค้า API ที่ฉันกำลังพัฒนา ห้องสมุดที่มีClientระดับซึ่งโดยทั่วไปมี 1: การทำแผนที่ 1 กับ API และอีกชั้นซึ่งมีอินเตอร์เฟซที่ใช้งานง่ายขึ้นกว่าด้านบนของWrapperClient

Wrapper --> Client --> External API

ก่อนอื่นฉันเขียนการทดสอบทั้งคู่ClientและWrapperทดสอบอย่างมีประสิทธิภาพว่าจะส่งต่อไปยังฟังก์ชันที่เหมาะสมของสิ่งที่ทำงาน ( WrapperทำงานClientและClientทำงานกับการเชื่อมต่อ HTTP) ฉันเริ่มรู้สึกอึดอัดกับสิ่งนี้เพราะฉันรู้สึกว่าฉันกำลังทดสอบการใช้งานคลาสเหล่านี้มากกว่าที่จะเป็นส่วนต่อประสาน ในทางทฤษฎีฉันสามารถเปลี่ยนคลาสให้มีการใช้งานที่ถูกต้องสมบูรณ์แบบอื่น แต่การทดสอบของฉันจะล้มเหลวเพราะฟังก์ชั่นที่ฉันคาดว่าจะเรียกไม่ถูกเรียก ฟังดูเหมือนการทดสอบที่เปราะบางสำหรับฉัน

หลังจากนี้ฉันคิดถึงอินเทอร์เฟซของคลาส การทดสอบควรตรวจสอบว่าชั้นเรียนทำงานตามที่ตั้งใจจริงมากกว่าที่จะทำ แล้วฉันจะทำสิ่งนี้ได้อย่างไร สิ่งแรกที่ควรคำนึงถึงคือการขัดคำขอ API ภายนอก อย่างไรก็ตามฉันกังวลใจเกี่ยวกับการขยายบริการภายนอก ตัวอย่างของ API ที่ถูก stubbed จำนวนมากที่ฉันเคยเห็นเพียงแค่ให้การตอบกลับสำเร็จรูปซึ่งดูเหมือนเป็นวิธีที่ง่ายมากที่จะทดสอบว่าโค้ดของคุณทำงานได้อย่างถูกต้องกับ API ปลอมของคุณ ทางเลือกคือการเยาะเย้ยบริการซึ่งเป็นไปไม่ได้และจะต้องได้รับการปรับปรุงให้ทันสมัยอยู่เสมอเมื่อใดก็ตามที่มีการเปลี่ยนแปลงการบริการจริง - ซึ่งรู้สึกว่าเกินความเป็นจริงและเสียเวลา

ในที่สุดฉันอ่านข้อความนี้จากคำตอบอื่นของโปรแกรมเมอร์ SE :

งานของไคลเอนต์ API ระยะไกลคือการออกสายบางอย่าง - ไม่มากไม่น้อย ดังนั้นการทดสอบควรตรวจสอบว่าจะออกสายเหล่านั้น - ไม่มากไม่น้อย

และตอนนี้ฉันเชื่อมั่นมากขึ้นหรือน้อยลง - เมื่อทำการทดสอบClientสิ่งที่ฉันต้องทดสอบก็คือมันทำให้คำขอที่ถูกต้องไปยัง API (แน่นอนมีความเป็นไปได้ที่ API จะเปลี่ยนแปลงเสมอ แต่การทดสอบของฉันจะดำเนินต่อไป - แต่นั่นคือ การทดสอบการรวมระบบจะมีประโยชน์ที่ไหน) เนื่องจากClientเป็นเพียงที่ 1: การทำแผนที่ 1 กับ API กังวลของฉันก่อนที่จะเกี่ยวกับการเปลี่ยนจากการดำเนินงานที่ถูกต้องหนึ่งไปยังอีกไม่ได้จริงๆใช้ - Clientมีเพียงหนึ่งการดำเนินงานที่ถูกต้องสำหรับแต่ละวิธีการ

อย่างไรก็ตามฉันยังคงติดอยู่กับWrapperชั้นเรียน ฉันเห็นตัวเลือกต่อไปนี้:

  1. ฉันออกจากClientชั้นเรียนและทดสอบว่าวิธีการที่เหมาะสมเรียกว่า ด้วยวิธีนี้ฉันทำเช่นเดียวกับข้างต้น แต่ถือว่าClientเป็น stand-in สำหรับ API สิ่งนี้ทำให้ฉันกลับไปที่จุดเริ่มต้น อีกครั้งสิ่งนี้ทำให้ฉันรู้สึกอึดอัดในการทดสอบการใช้งานไม่ใช่ส่วนต่อประสาน Wrapperได้เป็นอย่างดีจะดำเนินการโดยใช้ลูกค้าที่แตกต่างอย่างสิ้นเชิง

  2. Clientฉันจะสร้างจำลอง ตอนนี้ฉันต้องตัดสินใจว่าจะไปไกลแค่ไหนกับการเยาะเย้ย - การสร้างการจำลองที่สมบูรณ์ของบริการจะต้องใช้ความพยายามอย่างมาก (การทำงานมากกว่าที่จะเข้าไปในห้องสมุดของตัวเอง) ตัว API นั้นเรียบง่าย แต่บริการค่อนข้างซับซ้อน (เป็นแหล่งข้อมูลหลักที่มีการดำเนินการกับข้อมูลนั้น) Clientและอีกครั้งก็จะมีการให้การเยาะเย้ยฉันในซิงค์กับความเป็นจริง

  3. ฉันเพิ่งทดสอบว่ามีการร้องขอ HTTP ที่เหมาะสม หมายความว่าWrapperจะมีการเรียกผ่านClientวัตถุจริงเพื่อให้คำขอ HTTP เหล่านั้นดังนั้นฉันไม่ได้ทดสอบแยก นี่ทำให้เป็นการทดสอบหน่วยที่แย่มาก

ดังนั้นฉันจึงไม่พอใจกับการแก้ปัญหาเหล่านี้เป็นพิเศษ คุณจะทำอย่างไร มีวิธีที่จะไปเกี่ยวกับเรื่องนี้?


ฉันมักจะหลีกเลี่ยงการทดสอบหน่วยในสถานการณ์เหล่านี้ที่มีห้องสมุดของบุคคลที่สามที่ทำหน้าที่ส่วนใหญ่และฉันมีเสื้อคลุม (ส่วนใหญ่เป็นเพราะฉันไม่รู้ว่าจะทำอย่างไรในแบบที่ทดสอบสิ่งที่มีความหมายจริงๆ) โดยทั่วไปฉันทำการทดสอบการรวมในกรณีเหล่านั้นอาจมีบริการจำลอง อาจมีบางคนรู้วิธีทำการทดสอบหน่วยที่มีความหมายจริง ๆ สำหรับสิ่งเหล่านี้ - ฉันมักจะจัดลำดับความสำคัญส่วนประกอบที่สำคัญที่สุดในระบบภายใต้การควบคุมของเรา ส่วนที่สำคัญอยู่เหนือการควบคุมของเรา :-(

คำตอบ:


10

TLDR : แม้จะมีความยากลำบาก แต่คุณควรหยุดให้บริการและใช้สำหรับการทดสอบหน่วยลูกค้า


ฉันไม่แน่ใจว่า "งานของไคลเอนต์ API ระยะไกลคือการโทรออกไม่มากไม่น้อย ... " ยกเว้นว่า API จะประกอบด้วยปลายทางเท่านั้นที่ส่งคืนสถานะคงที่และไม่ใช้หรือผลิต ข้อมูลใด ๆ นี่จะไม่ใช่ API ที่มีประโยชน์ที่สุด ...

นอกจากนี้คุณยังต้องการตรวจสอบว่าลูกค้าไม่เพียง แต่ส่งคำขอที่ถูกต้อง แต่มันจัดการกับเนื้อหาการตอบสนองข้อผิดพลาดการเปลี่ยนเส้นทางและอื่น ๆ ได้อย่างถูกต้องและทดสอบสำหรับกรณีเหล่านี้ทั้งหมด

ดังที่คุณทราบคุณควรมีการทดสอบการรวมที่ครอบคลุมสแต็คเต็มรูปแบบจาก wrapper -> ไคลเอนต์ -> บริการ -> DB และเกิน แต่เพื่อตอบคำถามหลักของคุณเว้นแต่ว่าคุณมีสภาพแวดล้อมที่การทดสอบการรวมสามารถทำงานเป็นส่วนหนึ่งของทุก CI build โดยไม่ต้องปวดหัวมาก (ฐานข้อมูลการทดสอบที่ใช้ร่วมกัน ฯลฯ ) คุณควรลงทุนเวลาในการสร้าง stub ของ API

stub จะช่วยให้คุณสร้างการใช้งานของบริการ แต่ไม่ต้องใช้ชั้นใด ๆ ด้านล่างของบริการ

คุณสามารถลองใช้โซลูชัน DI-based เพื่อทำสิ่งนี้ให้สำเร็จด้วยการใช้รูปแบบ Repository ภายใต้ทรัพยากร REST:

  • แทนที่โค้ดการทำงานทั้งหมดในตัวจัดการ REST ด้วยการเรียกไปยัง IWhethingRepository
  • สร้าง ProductionWhethingRepository ด้วยรหัสที่ดึงมาจากทรัพยากร REST และ TestWhethingRespository ซึ่งส่งคืนการตอบกลับสำเร็จรูปสำหรับใช้ในระหว่างการทดสอบหน่วย
  • ใช้คอนเทนเนอร์ DI เพื่อฉีดไฟล์ / คลาส TestWhethingRepository หรือ TestWhethingRepository DLL เป็นต้นขึ้นอยู่กับการกำหนดค่า

อย่างไรก็ตามเว้นแต่การขัดเกลาและ / หรือการปรับโครงสร้างบริการใหม่นั้นไม่ได้เกิดจากคำถามทางการเมืองหรือในทางปฏิบัติฉันอาจทำสิ่งที่คล้ายกับข้างต้น หากไม่สามารถทำได้ฉันจะต้องแน่ใจว่ามีการครอบคลุมการรวมที่ดีมากและใช้งานได้บ่อยเท่าที่เป็นไปได้ในการตั้งค่าการทดสอบที่คุณมี

HTH

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.