ฉันวนเวียนวนไปรอบ ๆ เพื่อหาวิธีที่ดีที่สุดในการทดสอบหน่วยห้องสมุดลูกค้า API ที่ฉันกำลังพัฒนา ห้องสมุดที่มีClient
ระดับซึ่งโดยทั่วไปมี 1: การทำแผนที่ 1 กับ API และอีกชั้นซึ่งมีอินเตอร์เฟซที่ใช้งานง่ายขึ้นกว่าด้านบนของWrapper
Client
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
ชั้นเรียน ฉันเห็นตัวเลือกต่อไปนี้:
ฉันออกจาก
Client
ชั้นเรียนและทดสอบว่าวิธีการที่เหมาะสมเรียกว่า ด้วยวิธีนี้ฉันทำเช่นเดียวกับข้างต้น แต่ถือว่าClient
เป็น stand-in สำหรับ API สิ่งนี้ทำให้ฉันกลับไปที่จุดเริ่มต้น อีกครั้งสิ่งนี้ทำให้ฉันรู้สึกอึดอัดในการทดสอบการใช้งานไม่ใช่ส่วนต่อประสานWrapper
ได้เป็นอย่างดีจะดำเนินการโดยใช้ลูกค้าที่แตกต่างอย่างสิ้นเชิงClient
ฉันจะสร้างจำลอง ตอนนี้ฉันต้องตัดสินใจว่าจะไปไกลแค่ไหนกับการเยาะเย้ย - การสร้างการจำลองที่สมบูรณ์ของบริการจะต้องใช้ความพยายามอย่างมาก (การทำงานมากกว่าที่จะเข้าไปในห้องสมุดของตัวเอง) ตัว API นั้นเรียบง่าย แต่บริการค่อนข้างซับซ้อน (เป็นแหล่งข้อมูลหลักที่มีการดำเนินการกับข้อมูลนั้น)Client
และอีกครั้งก็จะมีการให้การเยาะเย้ยฉันในซิงค์กับความเป็นจริงฉันเพิ่งทดสอบว่ามีการร้องขอ HTTP ที่เหมาะสม หมายความว่า
Wrapper
จะมีการเรียกผ่านClient
วัตถุจริงเพื่อให้คำขอ HTTP เหล่านั้นดังนั้นฉันไม่ได้ทดสอบแยก นี่ทำให้เป็นการทดสอบหน่วยที่แย่มาก
ดังนั้นฉันจึงไม่พอใจกับการแก้ปัญหาเหล่านี้เป็นพิเศษ คุณจะทำอย่างไร มีวิธีที่จะไปเกี่ยวกับเรื่องนี้?