ตรงกันข้ามกับคำตอบอื่น ๆ เป็นสิ่งสำคัญที่จะต้องทราบว่าวิธีการทดสอบบางอย่างอาจเปราะบางเมื่อระบบภายใต้การทดสอบ (SUT) ถูก refactored หากการทดสอบเป็น whitebox
ถ้าฉันใช้กรอบการเยาะเย้ยที่ตรวจสอบลำดับของวิธีการที่เรียกว่าบน mocks (เมื่อคำสั่งนั้นไม่เกี่ยวข้องเพราะการโทรนั้นไม่มีผลข้างเคียง) ถ้ารหัสของฉันสะอาดขึ้นด้วยวิธีการเหล่านั้นเรียกใช้ในลำดับที่แตกต่างกันและฉัน refactor แล้วการทดสอบของฉันจะแตก โดยทั่วไป mocks สามารถแนะนำให้ทดสอบความเปราะบาง
หากฉันกำลังตรวจสอบสถานะภายในของ SUT ของฉันโดยการเปิดเผยสมาชิกส่วนตัวหรือป้องกัน (เราสามารถใช้ "เพื่อน" ใน visual Basic หรือขยายระดับการเข้าถึง "ภายใน" และใช้ "internalsvisibleto" ใน c #; ในภาษา OO จำนวนมากรวมถึง c # a " สามารถใช้คลาสเฉพาะการทดสอบได้ ") จากนั้นสถานะภายในของคลาสจะสำคัญ - คุณอาจทำการปรับโครงสร้างคลาสเป็นกล่องดำ แต่การทดสอบกล่องสีขาวจะล้มเหลว สมมติว่ามีการใช้เขตข้อมูลเดียวซ้ำเพื่อหมายถึงสิ่งต่าง ๆ (ไม่ใช่แนวปฏิบัติที่ดี!) เมื่อ SUT เปลี่ยนสถานะ - หากเราแยกมันออกเป็นสองเขตข้อมูลเราอาจจำเป็นต้องเขียนการทดสอบที่ขาดอีกครั้ง
การทดสอบเฉพาะคลาสย่อยยังสามารถใช้ในการทดสอบวิธีการป้องกันซึ่งอาจหมายความว่าผู้ปรับเปลี่ยนจากมุมมองของรหัสการผลิตเป็นการเปลี่ยนแปลงที่เกิดขึ้นจากมุมมองของรหัสการทดสอบ การย้ายสองสามบรรทัดเข้าหรือออกจากวิธีการป้องกันอาจไม่มีผลข้างเคียงจากการผลิต แต่หยุดการทดสอบ
ถ้าฉันใช้ " test hooks " หรือรหัสเฉพาะการทดสอบหรือการรวบรวมตามเงื่อนไขอื่น ๆ มันอาจเป็นเรื่องยากที่จะตรวจสอบให้แน่ใจว่าการทดสอบไม่หยุดทำงานเนื่องจากการพึ่งพาที่เปราะบางต่อตรรกะภายใน
ดังนั้นเพื่อป้องกันไม่ให้การทดสอบเป็นคู่กับรายละเอียดภายในของ SUT อย่างใกล้ชิดมันอาจช่วยในการ:
- ใช้ต้นขั้วมากกว่า mocks หากเป็นไปได้ สำหรับข้อมูลเพิ่มเติมโปรดดูที่บล็อกของฟาบิโอ Periera ในการทดสอบซ้ำและบล็อกของฉันเกี่ยวกับการทดสอบซ้ำ
- หากใช้ mocks ให้หลีกเลี่ยงการตรวจสอบลำดับของวิธีการที่เรียกว่ายกเว้นว่ามีความสำคัญ
- พยายามหลีกเลี่ยงการตรวจสอบสถานะภายในของ SUT ของคุณ - ใช้ API ภายนอกถ้าเป็นไปได้
- พยายามหลีกเลี่ยงตรรกะเฉพาะของการทดสอบในรหัสการผลิต
- พยายามหลีกเลี่ยงการใช้คลาสย่อยเฉพาะสำหรับทดสอบ
จุดทั้งหมดข้างต้นเป็นตัวอย่างของการเชื่อมต่อกล่องขาวที่ใช้ในการทดสอบ ดังนั้นเพื่อหลีกเลี่ยงการทดสอบซ้ำอีกครั้งอย่างสมบูรณ์ให้ใช้การทดสอบกล่องดำของ SUT
คำแถลงการณ์ปฏิเสธความรับผิดชอบ: เพื่อจุดประสงค์ในการพูดคุยเกี่ยวกับการปรับโครงสร้างใหม่ที่นี่ฉันกำลังใช้คำกว้างขึ้นเล็กน้อยเพื่อรวมการเปลี่ยนแปลงการใช้ภายในโดยไม่มีผลกระทบภายนอก นักพิถีพิถันบางคนอาจไม่เห็นด้วยและอ้างถึงหนังสือ Refactoring ของมาร์ตินฟาวเลอร์และเคนท์เบ็คโดยเฉพาะ
ในทางปฏิบัติเรามักจะทำตามขั้นตอนที่ไม่ใหญ่กว่าการปฏิบัติการปรมาณูที่อธิบายไว้เล็กน้อยและโดยเฉพาะอย่างยิ่งการเปลี่ยนแปลงที่ทำให้รหัสการผลิตมีพฤติกรรมเหมือนกันจากภายนอกอาจไม่ปล่อยให้ผ่านการทดสอบ แต่ฉันคิดว่ามันยุติธรรมที่จะรวม "อัลกอริทึมทดแทนสำหรับอัลกอริทึมอื่นที่มีพฤติกรรมที่เหมือนกัน" เป็น refactor และฉันคิดว่าฟาวเลอร์เห็นด้วย มาร์ตินฟาวเลอร์บอกว่าการปรับโครงสร้างอาจทำลายการทดสอบ:
เมื่อคุณเขียนการทดสอบการเยาะเย้ยคุณกำลังทดสอบการโทรออกของ SUT เพื่อให้แน่ใจว่ามันจะพูดคุยกับซัพพลายเออร์อย่างถูกต้อง การทดสอบแบบคลาสสิกเพียงแค่สนใจเกี่ยวกับสถานะสุดท้าย - ไม่ใช่วิธีการที่ได้รับมา การทดสอบการเยาะเย้ยถากถางจึงมีมากขึ้นควบคู่ไปกับการใช้วิธีการ การเปลี่ยนลักษณะของการโทรไปหาผู้ทำงานร่วมกันมักจะทำให้การทดสอบการล้อเลียนแตก
[ ... ]
การเชื่อมต่อกับการนำไปใช้ยังรบกวนการปรับโครงสร้างเนื่องจากการเปลี่ยนแปลงการใช้งานมีแนวโน้มที่จะทำลายการทดสอบมากกว่าการทดสอบแบบดั้งเดิม
ฟาวเลอร์ - Mocks ไม่สมบูรณ์