การทดสอบกับการพึ่งพาทั้งหมดในสถานที่ยังคงมีความสำคัญ แต่ก็มีมากขึ้นในขอบเขตของการทดสอบการรวมเป็นเจฟฟรีย์เฟาสท์กล่าวว่า
หนึ่งในสิ่งสำคัญที่สุดของการทดสอบหน่วยคือการทำให้การทดสอบของคุณเชื่อถือได้ หากคุณไม่เชื่อว่าการทดสอบที่ผ่านหมายความว่าสิ่งที่ดีและการทดสอบที่ล้มเหลวนั้นหมายถึงปัญหาในรหัสการผลิตการทดสอบของคุณก็ไม่ได้มีประโยชน์เท่าที่ควร
เพื่อให้การทดสอบของคุณเชื่อถือได้คุณต้องทำบางสิ่ง แต่ฉันจะเน้นไปที่คำตอบเดียว คุณต้องตรวจสอบให้แน่ใจว่าพวกเขาใช้งานง่ายเพื่อให้นักพัฒนาซอฟต์แวร์ทุกคนสามารถเรียกใช้พวกเขาก่อนที่จะตรวจสอบรหัส "ง่ายต่อการเรียกใช้" หมายความว่าการทดสอบของคุณทำงานได้อย่างรวดเร็วและไม่มีการตั้งค่าหรือการตั้งค่ามากมาย เป็นการดีที่ทุกคนควรจะสามารถตรวจสอบรหัสรุ่นล่าสุดทำการทดสอบได้ทันทีและเห็นว่าพวกเขาผ่าน
การหลีกเลี่ยงการพึ่งพาสิ่งอื่น ๆ (ระบบไฟล์ฐานข้อมูลบริการบนเว็บ ฯลฯ ) ช่วยให้คุณหลีกเลี่ยงการกำหนดค่าและทำให้คุณและนักพัฒนาอื่น ๆ อ่อนแอต่อสถานการณ์ที่คุณอยากจะพูดว่า "โอ้การทดสอบล้มเหลวเพราะฉันไม่ได้" ไม่ได้มีการตั้งค่าการแชร์เครือข่ายแหมดีฉันจะรันพวกเขาในภายหลัง "
หากคุณต้องการทดสอบสิ่งที่คุณทำกับข้อมูลหน่วยของคุณทดสอบสำหรับรหัสตรรกะทางธุรกิจนั้นไม่ควรสนใจว่าคุณจะได้รับข้อมูลนั้นได้อย่างไร ความสามารถในการทดสอบตรรกะหลักของแอปพลิเคชันของคุณโดยไม่ขึ้นอยู่กับการสนับสนุนสิ่งต่าง ๆ เช่นฐานข้อมูลยอดเยี่ยม หากคุณไม่ได้ทำคุณจะพลาด
ป.ล. ฉันควรเพิ่มว่ามันเป็นไปได้อย่างแน่นอนที่จะเอาชนะได้ในชื่อของความสามารถในการทดสอบ ทดสอบการขับเคลื่อนแอปพลิเคชันของคุณจะช่วยลดปัญหาดังกล่าว แต่ไม่ว่าในกรณีใดการใช้งานวิธีการที่ไม่ดีจะไม่ทำให้วิธีการใช้งานมีความถูกต้องน้อยลง มีสิ่งใดที่สามารถนำไปใช้ในทางที่ผิดและใช้มากเกินไปหากไม่ถามต่อไป "ทำไมฉันถึงทำอย่างนี้?" ขณะที่กำลังพัฒนา
เท่าที่มีความเกี่ยวข้องกับการพึ่งพาภายในองค์กรสิ่งต่าง ๆ ก็เริ่มขุ่นเคือง วิธีที่ฉันชอบคิดเกี่ยวกับเรื่องนี้คือฉันต้องการปกป้องชั้นเรียนของฉันให้มากที่สุดเท่าที่จะทำได้จากการเปลี่ยนแปลงด้วยเหตุผลที่ผิด หากฉันมีการตั้งค่าแบบนี้ ...
public class MyClass
{
private SomeClass someClass;
public MyClass()
{
someClass = new SomeClass();
}
// use someClass in some way
}
โดยทั่วไปฉันไม่สนใจว่าSomeClass
จะสร้างอย่างไร ฉันแค่อยากจะใช้มัน ถ้า SomeClass เปลี่ยนไปและตอนนี้ต้องการพารามิเตอร์ให้กับ Constructor ... นั่นไม่ใช่ปัญหาของฉัน ฉันไม่ควรเปลี่ยน MyClass เพื่อรองรับสิ่งนั้น
ตอนนี้มันเป็นเพียงแค่การสัมผัสในส่วนของการออกแบบ เท่าที่มีการทดสอบหน่วยฉันยังต้องการป้องกันตนเองจากชั้นเรียนอื่น ถ้าฉันกำลังทดสอบ MyClass ฉันชอบที่จะรู้ว่าไม่มีการอ้างอิงภายนอกเพราะ SomeClass ไม่ได้แนะนำการเชื่อมต่อฐานข้อมูลหรือลิงก์ภายนอกอื่น ๆ
แต่ปัญหาที่ใหญ่กว่าคือฉันรู้ด้วยว่าผลลัพธ์ของวิธีการบางอย่างของฉันนั้นขึ้นอยู่กับผลลัพธ์จากบางวิธีใน SomeClass หากไม่มีการเยาะเย้ย / ขัดจังหวะ SomeClass ฉันอาจไม่มีวิธีที่จะเปลี่ยนแปลงอินพุตที่ต้องการ ถ้าฉันโชคดีฉันอาจจะสามารถเขียนสภาพแวดล้อมของฉันในแบบทดสอบเพื่อให้เกิดการตอบสนองที่ถูกต้องจาก SomeClass แต่การทำเช่นนั้นจะทำให้เกิดความซับซ้อนในการทดสอบของฉันและทำให้พวกมันเปราะ
การเขียน MyClass ใหม่เพื่อยอมรับอินสแตนซ์ของ SomeClass ในตัวสร้างช่วยให้ฉันสามารถสร้างอินสแตนซ์ปลอมของ SomeClass ที่ส่งคืนค่าที่ฉันต้องการ (ไม่ว่าจะผ่านทางกรอบการเยาะเย้ยหรือด้วยการจำลองด้วยตนเอง) โดยทั่วไปฉันไม่จำเป็นต้องแนะนำอินเทอร์เฟซในกรณีนี้ ไม่ว่าจะทำเช่นนั้นหรือไม่มีหลายทางเลือกในการเลือกใช้ภาษาที่คุณเลือก (เช่นอินเทอร์เฟซมีแนวโน้มมากกว่าใน C # แต่แน่นอนว่าคุณไม่จำเป็นต้องใช้ Ruby)