มีสองประเด็นที่เราต้องดูที่นี่
สิ่งแรกคือคุณดูเหมือนจะดูการทดสอบทั้งหมดของคุณจากมุมมองการทดสอบหน่วย การทดสอบหน่วยมีค่าอย่างยิ่ง แต่ไม่ใช่การทดสอบประเภทเดียว การทดสอบสามารถจริงจะแบ่งออกเป็นชั้นที่แตกต่างกันได้อย่างรวดเร็วมากจากการทดสอบหน่วยอย่างรวดเร็วน้อยทดสอบการรวมที่จะได้ช้ากว่าการทดสอบการยอมรับ (อาจมีเลเยอร์มากขึ้นเช่นการทดสอบการทำงาน )
ข้อที่สองคือคุณผสมการโทรไปยังรหัสของ บริษัท อื่นด้วยตรรกะทางธุรกิจของคุณสร้างความท้าทายในการทดสอบและอาจทำให้รหัสของคุณเปราะบางยิ่งขึ้น
การทดสอบหน่วยควรเร็วและควรรันบ่อย การจำลองการอ้างอิงช่วยให้การทดสอบเหล่านี้ทำงานได้อย่างรวดเร็ว แต่อาจช่วยแนะนำช่องโหว่ให้ครอบคลุมหากการเปลี่ยนแปลงการพึ่งพาและการจำลองไม่ได้ รหัสของคุณอาจเสียหายในขณะที่การทดสอบของคุณยังคงเป็นสีเขียว ห้องสมุดที่เยาะเย้ยบางคนจะเตือนคุณหากส่วนต่อประสานของผู้อื่นเปลี่ยนแปลงไม่ได้
ในทางกลับกันการทดสอบการรวมถูกออกแบบมาเพื่อทดสอบการโต้ตอบระหว่างส่วนประกอบรวมถึงห้องสมุดบุคคลที่สาม ไม่ควรใช้ Mocks ในการทดสอบในระดับนี้เพราะเราต้องการดูว่าวัตถุจริงมีปฏิสัมพันธ์กันอย่างไร เนื่องจากเราใช้วัตถุจริงการทดสอบเหล่านี้จะช้าลงและเราจะไม่เรียกใช้พวกเขาเกือบเท่าการทดสอบหน่วยของเรา
การทดสอบการยอมรับจะดูที่ระดับที่สูงขึ้นการทดสอบว่าตรงตามข้อกำหนดของซอฟต์แวร์ การทดสอบเหล่านี้ทำงานกับทั้งระบบที่สมบูรณ์ซึ่งจะถูกนำไปใช้งาน ไม่ควรใช้การเยาะเย้ยอีกครั้ง
คนหนึ่งได้พบแนวทางที่มีค่าเกี่ยว mocks คือการไม่ได้เยาะเย้ยประเภทคุณทำไม่ได้เอง Amazon เป็นเจ้าของ API ถึง S3 ดังนั้นพวกเขาจึงมั่นใจได้ว่าจะไม่มีการเปลี่ยนแปลงด้านล่าง ในทางกลับกันคุณไม่มีการรับรองเหล่านี้ ดังนั้นหากคุณจำลอง S3 API ในการทดสอบของคุณมันอาจเปลี่ยนและทำลายรหัสของคุณในขณะที่การทดสอบของคุณทั้งหมดแสดงสีเขียว ดังนั้นเราจะทดสอบรหัสหน่วยที่ใช้ไลบรารีบุคคลที่สามได้อย่างไร
เราทำไม่ได้ ถ้าเราทำตามคำแนะนำเราไม่สามารถเยาะเย้ยวัตถุที่เราไม่ได้เป็นเจ้าของ แต่…ถ้าเราเป็นเจ้าของการพึ่งพาโดยตรงของเราเราสามารถเยาะเย้ยพวกเขาออกมา แต่อย่างไร เราสร้าง wrapper ของเราเองสำหรับ S3 API เราสามารถทำให้มันดูเหมือน S3 API หรือเราสามารถทำให้มันเหมาะกับความต้องการของเราอย่างใกล้ชิด (ต้องการ) เรายังสามารถทำให้มันเล็ก ๆ น้อย ๆ ที่เป็นนามธรรมมากขึ้นพูดมากกว่าPersistenceService
จะเป็นอินเทอร์เฟซที่มีเมธอดเช่นและประเภทของวิธีที่เราอาจต้องการดู (นี่คือตัวอย่างคุณอาจต้องการวิธีการที่แตกต่างกัน) ตอนนี้เราสามารถใช้S3 API (พูดก), encapsulating มันออกไปจากรหัสโทรศัพท์ของเราAmazonS3Bucket
PersistenceService
#save(Thing)
#fetch(ThingId)
PersistenceService
S3PersistenceService
ตอนนี้ถึงรหัสที่เรียก S3 S3 เราจำเป็นต้องแทนที่การโทรเหล่านั้นด้วยการโทรไปยังPersistenceService
วัตถุ เราใช้การฉีดพึ่งพาเพื่อส่งผ่านของเราPersistenceService
เป็นวัตถุ มันเป็นสิ่งสำคัญไม่ได้ที่จะถามหาแต่จะถามหาS3PersistenceService
PersistenceService
สิ่งนี้ทำให้เราสามารถสลับการใช้งานระหว่างการทดสอบ
รหัสทั้งหมดที่ใช้ในการใช้ S3 API ตอนนี้ใช้ของเราโดยตรงPersistenceService
และS3PersistenceService
ตอนนี้เราทำการโทรไปยัง S3 API ในการทดสอบของเราเราสามารถเยาะเย้ยPersistenceService
เพราะเราเป็นเจ้าของและใช้จำลองเพื่อให้แน่ใจว่ารหัสของเราทำการโทรที่ถูกต้อง S3PersistenceService
แต่ตอนนี้ที่ใบวิธีการทดสอบ มีปัญหาเช่นเดียวกับก่อนหน้านี้: เราไม่สามารถทดสอบหน่วยโดยไม่เรียกใช้บริการภายนอก ดังนั้น…เราไม่ได้ทำการทดสอบ เราสามารถเยาะเย้ยการพึ่งพา S3 API แต่สิ่งนี้จะทำให้เรามีความมั่นใจเพิ่มขึ้นเล็กน้อย แต่เราต้องทดสอบในระดับที่สูงกว่า: การทดสอบการรวมระบบ
นี่อาจฟังดูน่ากังวลเล็กน้อยที่บอกว่าเราไม่ควรทดสอบหน่วยในส่วนของรหัสของเรา แต่ลองดูสิ่งที่เราทำสำเร็จ PersistenceService
เรามีพวงของรหัสทั่วทุกสถานที่ที่เราไม่สามารถทดสอบหน่วยที่ตอนนี้สามารถเป็นหน่วยทดสอบผ่าน เรามีระเบียบห้องสมุดบุคคลที่สามของเราถูกคุมขังในชั้นเรียนการใช้งานเพียงครั้งเดียว คลาสนั้นควรมีฟังก์ชันที่จำเป็นในการใช้ API แต่ไม่ได้แนบตรรกะทางธุรกิจภายนอกไว้กับมัน ดังนั้นเมื่อมีการเขียนควรมีเสถียรภาพมากและไม่ควรเปลี่ยนแปลงมากนัก เราสามารถพึ่งพาการทดสอบที่ช้ากว่าซึ่งเราไม่ได้เรียกใช้บ่อยเพราะรหัสนั้นเสถียร
S3PersistenceService
ขั้นตอนต่อไปคือการเขียนการทดสอบบูรณาการสำหรับ สิ่งเหล่านี้ควรแยกออกจากชื่อหรือโฟลเดอร์เพื่อให้เราสามารถเรียกใช้แยกต่างหากจากการทดสอบหน่วยที่รวดเร็วของเรา การทดสอบการรวมมักจะใช้กรอบการทดสอบเดียวกันกับการทดสอบหน่วยหากรหัสมีข้อมูลเพียงพอดังนั้นเราไม่จำเป็นต้องเรียนรู้เครื่องมือใหม่ รหัสที่แท้จริงสำหรับการทดสอบการรวมเป็นสิ่งที่คุณจะเขียนสำหรับตัวเลือกที่ 1 ของคุณ