จริง ๆ แล้วมันคุ้มค่ากับการทดสอบหน่วยลูกค้า API หรือไม่


38

นี่เป็นสิ่งที่ทำให้ฉันหนักใจอยู่พักหนึ่งแล้ว จริง ๆ แล้วมันคุ้มค่ากับการทดสอบหน่วยลูกค้า API หรือไม่

สมมติว่าคุณกำลังสร้างชั้นเรียนขนาดเล็กเพื่อสรุปการโทรหาสัตว์เลี้ยง REST API Petshop เป็น API ที่ง่ายมากและมีชุดวิธีพื้นฐาน:

  • listProducts()
  • getProductDetails(ProductID)
  • addProduct(...)
  • removeProduct(ProductID)

ในการทดสอบสิ่งนี้เราต้องสร้างบริการจำลองหรือตอบกลับ แต่นั่นดูเหมือน overkill; ฉันเข้าใจว่าเราต้องการตรวจสอบให้แน่ใจว่าวิธีการของเราไม่หยุดทำงานผ่านข้อผิดพลาดของ typo / syntax แต่เนื่องจากเรากำลังเขียนฟังก์ชั่นที่เรียกใช้วิธีการทางไกลแล้วเรากำลังสร้างการตอบกลับปลอมจากวิธีการทางไกลเหล่านั้น เป็นการเสียความพยายามและเรากำลังทดสอบบางสิ่งที่ไม่สามารถล้มเหลวได้จริงๆ ที่แย่กว่านั้นหากวิธีการระยะไกลเปลี่ยนการทดสอบหน่วยของเราจะผ่านในขณะที่การใช้การผลิตล้มเหลว

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


1
หากนี่ไม่ใช่ API อย่างง่ายที่มีวิธีการพื้นฐานคุณจะรู้สึกแตกต่างกันหรือไม่ แม้แต่โรงเก็บของก็ต้องยืนขึ้นไปบนหิมะ
JeffO

คำตอบ:


31

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

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

ที่กล่าวว่าการทดสอบคลาสที่ประกอบด้วยการมอบหมายไปยังคลาสอื่นอาจมีลำดับความสำคัญต่ำเนื่องจากมีความเสี่ยงเล็กน้อยจากข้อผิดพลาดที่ซับซ้อน แต่สำหรับคลาสใดก็ตามที่มีเพียงหนึ่ง liners ที่เหมือนกันมันไม่มีอะไรเกี่ยวข้องกับการโทรออกไปยังรหัสของผู้ขายรายอื่น


อืมฉันไม่แน่ใจ คุณสามารถทดสอบที่foo()ได้รับการโทรมาก่อนbar()แต่นั่นไม่ได้หมายความว่าการโทรfoo()มาก่อนbar()เป็นสิ่งที่ถูกต้อง การทดสอบหน่วยเช่นนั้นจะผ่านแม้ว่ารหัสผิด และถ้านั่นคือสิ่งที่ลูกค้าทำอยู่การตั้งค่า mocks ที่ตรวจสอบว่าfoo()ได้รับการโทรมาก่อนbar()นั้นค่อนข้างลำบากสำหรับบางสิ่งที่สามารถตรวจสอบได้ด้วยคร่าวๆคร่าวๆที่รหัสลูกค้า
Doval

1
คุณสามารถทดสอบว่าadd()วิธีการเพิ่มตัวเลขสองอย่างถูกต้อง แต่นั่นไม่ได้หมายความว่าการเพิ่มเป็นสิ่งที่ถูกต้องที่จะทำในจุดนี้ในอัลกอริทึม - การadd()ทดสอบหน่วยจะประสบความสำเร็จแม้ว่าโปรแกรมของคุณจะผิด หากเป็นสิ่งที่ผิดlevenshteinDistance()วิธีการของคุณคือการตำหนิไม่ใช่add()วิธีการ นี่คือสิ่งเดียวกัน จุดที่มีรหัสแยกออกเป็นวิธีการที่เป็นเสมอว่าแต่ละวิธีมีเพียงการดูแลเกี่ยวกับการเป็นหนึ่งในสิ่งที่ถูกต้อง
Kilian Foth

3
ตอนนี้ฉันเห็นว่าเราไม่เห็นด้วย! หากคุณพึ่งพาร้านขายสัตว์เลี้ยงภายนอกสำหรับฉันนี่หมายความว่าระบบของคุณจะสิ้นสุดที่ขอบเขต HTTP ดังนั้นการเรียกใช้ REST ที่ออกจะเป็นเอาต์พุตและอาจมีการทดสอบ หากคุณพิจารณาร้านขายสัตว์เลี้ยงเป็นส่วนหนึ่งของโมดูลนี้แล้วใช่รูปแบบของการโทรออกเป็นรายละเอียดการใช้งานและการทดสอบเครื่องไม่มีธุรกิจกำหนดอะไรเกี่ยวกับพวกเขา
Kilian Foth

2
"ดังนั้นการทดสอบควรตรวจสอบว่ามันออกสายเหล่านั้น" ฉันคิดว่านั่นคือมุมมองที่ฉันไม่สามารถมองเห็นได้ ขอบคุณ!
ฟิลลิป B โอลด์แฮม

1
ตัวอย่างเช่นการทดสอบหน่วยของฉันสามารถตรวจสอบว่าได้รับพารามิเตอร์บางอย่างเนื้อหาของคำขอที่เกี่ยวข้องกับการดำเนินการเป็นสิ่งที่ถูกต้องหรือไม่
Maria Ines Parnisari

9

คำตอบสั้น ๆ :

วิธีการทั้งหมดควรได้รับการทดสอบโดยหน่วย

คำตอบยาว:

ใช่. มันคุ้มค่า

นี่คือบางสิ่งที่ทดสอบหน่วยในวิธีการเรียก API เหล่านั้นควรทดสอบ:

  • ว่าคุณกำลังส่งพารามิเตอร์ที่มีรูปแบบถูกต้องหรือถูกต้องไปยังการเรียก API
  • ว่าคุณตอบสนองต่อข้อมูลบางประเภทที่ส่งคืนโดย API (ล้อเลียนหรือไม่) ตัวอย่างเช่นบางทีเมื่อ API ส่งคืนสตริงว่างเปล่าวิธีการของคุณควรคืนค่าเริ่มต้น (เพียงตัวอย่าง)
  • วิธีการที่ผู้เรียกใช้นั้นทำงานอย่างถูกต้องเมื่อการเรียก API ก่อให้เกิดข้อผิดพลาด

สิ่งเหล่านี้เป็นสิ่งที่วิธีการที่เรียกว่าสามารถแยกบริการเยาะเย้ยบริการ API ของฉันและโดยการทดสอบอย่างดีมั่นใจได้ว่าข้อผิดพลาดไม่ได้เกิดจากข้อผิดพลาดในรหัสลูกค้าที่เรียก API


คุณพูดว่า "เยาะเย้ยหรือไม่" ... ดังนั้นจะทดสอบกับ API จริงหรือไม่? ฉันสามารถเรียกว่าเป็นการทดสอบการรวมระบบได้หรือไม่แม้ว่าจะดูเหมือนการทดสอบหน่วย หรือมีสิ่งอื่นที่จะเรียกสิ่งนี้หรือไม่? ฉันชอบที่จะทดสอบที่ห่อหุ้ม API ของฉันไม่สิ่งที่มันบอกว่ามันไม่อย่างใด ...
แดน Rosenstark

1
@DanRosenstark ฉันเดาว่าในกรณีที่บริการ API ไม่ถูกล้อเลียนเป็นการทดสอบการรวมระบบ
Tulains Córdova

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

5

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

ระวังให้มากเมื่อคุณพูดว่า"ดูเหมือนว่าจะเสียความพยายามและเรากำลังทดสอบบางสิ่งที่ไม่สามารถล้มเหลวได้" - อาจล้มเหลวได้ก็จะล้มเหลวมันอาจจะล้มเหลวในแบบที่คุณคาดไม่ถึง ความล้มเหลวจะเลวร้ายยิ่งขึ้นถ้าคุณไม่มีการทดสอบ

ความผิดพลาดที่คุณทำที่นี่คือการประดิษฐ์ล้อ: การโทรไปยังบริการระยะไกลและ API เป็นสถานการณ์ที่พบบ่อยมากดังนั้นจึงมีเครื่องมือที่ดีพอที่จะช่วยคุณทดสอบ ครั้งล่าสุดที่ฉันทำงานกับแอพพลิเคชั่นที่เชื่อมต่อกับบริการทางไกลฉันใช้SoapUIซึ่งสามารถดูบริการและทำการโทรไปที่บริการนั้น ๆ หรือทำตัวเป็นสำเนาเฉพาะของเซิร์ฟเวอร์ที่คุณสามารถทำการทดสอบการโทรและติดตามการร้องขอและการตอบกลับ การตั้งค่าใช้เวลาไม่กี่นาทีและเช่นเดียวกันก็รวดเร็วในการอัปเดตหากอินเทอร์เฟซระยะไกลเปลี่ยนไป ฉันไม่ได้ใช้มันในสถานการณ์ REST แต่แม้ว่ามันจะไม่ได้ผลสำหรับเรื่องนั้น (หรืออาจมีบางคนกำลังอ่านคำตอบนี้ในอนาคตเมื่อมีเครื่องมือที่ดีกว่าอยู่) คุณควรจะสามารถหาเครื่องมือที่สามารถจำลองได้ บริการสำหรับคุณและเมื่อถึงเวลาต้องปรับใช้รหัสของคุณคุณจะดีใจที่คุณทำ

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