ตอบคำถามของคุณ
มีสิ่งใดที่เหมือนกับการทดสอบหน่วยมากเกินไปหรือไม่?
แน่นอนว่า ... ตัวอย่างเช่นคุณอาจมีการทดสอบหลายแบบซึ่งดูเหมือนจะแตกต่างกันตั้งแต่แรกเห็น แต่ทดสอบในสิ่งเดียวกันจริง ๆ (ขึ้นอยู่กับตรรกะในบรรทัดเดียวกันของรหัสแอปพลิเคชัน "น่าสนใจ" ภายใต้การทดสอบ)
หรือคุณสามารถทดสอบ internals ของรหัสของคุณที่ไม่เคยปรากฏออกมาด้านนอก (กล่าวคือไม่ได้เป็นส่วนหนึ่งของสัญญาอินเทอร์เฟซชนิดใด ๆ ) ที่หนึ่งสามารถโต้เถียงเกี่ยวกับว่าเหมาะสมหรือไม่ ตัวอย่างเช่นถ้อยคำที่แน่นอนของข้อความบันทึกภายในหรืออะไรก็ตาม
ฉันได้รับมอบหมายให้เขียนการทดสอบหน่วยสำหรับแอปพลิเคชันที่มีอยู่ หลังจากเสร็จไฟล์แรกของฉันฉันมีรหัสทดสอบ 717 บรรทัดสำหรับรหัสต้นฉบับ 419 บรรทัด
นั่นทำให้ฉันรู้สึกปกติ การทดสอบของคุณใช้รหัสบรรทัดจำนวนมากในการตั้งค่าและการฉีกขาดที่อยู่ด้านบนของการทดสอบจริง อัตราส่วนอาจดีขึ้นหรือไม่ ตัวผมเองนั้นค่อนข้างทดสอบหนักและมักจะลงทุนที่ตั้งและเวลาในการทดสอบมากกว่ารหัสจริง
อัตราส่วนนี้จะไม่สามารถจัดการได้เมื่อเราเพิ่มการครอบคลุมโค้ดของเราหรือไม่?
อัตราส่วนไม่ได้มีส่วนเกี่ยวข้องมากนัก มีคุณสมบัติอื่น ๆ ของการทดสอบที่มีแนวโน้มที่จะทำให้พวกเขาไม่สามารถจัดการได้ หากคุณต้องทำการทดสอบซ้ำอีกครั้งอย่างสม่ำเสมอเมื่อทำการเปลี่ยนแปลงที่ค่อนข้างง่ายในโค้ดของคุณคุณควรดูเหตุผล และนั่นไม่ใช่จำนวนบรรทัดที่คุณมี แต่วิธีการเข้ารหัสของการทดสอบ
ความเข้าใจของฉันเกี่ยวกับการทดสอบหน่วยคือการทดสอบแต่ละวิธีในชั้นเรียนเพื่อให้แน่ใจว่าทุกวิธีทำงานตามที่คาดไว้
ถูกต้องสำหรับการทดสอบ "หน่วย" ในความหมายที่เข้มงวด ที่นี่ "หน่วย" เป็นบางสิ่งบางอย่างเช่นวิธีการหรือชั้นเรียน จุดของการทดสอบ "หน่วย" คือการทดสอบโค้ดเฉพาะหน่วยเดียวไม่ใช่ทั้งระบบ เป็นการดีที่คุณจะลบส่วนที่เหลือทั้งหมดของระบบ (ใช้คู่หรืออะไรก็ตาม)
อย่างไรก็ตามในคำขอดึงนำเทคโนโลยีของฉันตั้งข้อสังเกตว่าฉันควรมุ่งเน้นไปที่การทดสอบในระดับที่สูงขึ้น
จากนั้นคุณก็ตกหลุมพรางของคนสมมติว่าจริงๆแล้วหมายถึงการทดสอบหน่วยเมื่อพวกเขากล่าวว่าการทดสอบหน่วย ฉันได้พบโปรแกรมเมอร์หลายคนที่พูดว่า "การทดสอบหน่วย" แต่หมายถึงสิ่งที่แตกต่างกันมาก
เขาแนะนำการทดสอบ 4-5 กรณีการใช้งานที่มักใช้กับชั้นเรียนที่มีปัญหามากกว่าการทดสอบแต่ละฟังก์ชั่นอย่างละเอียดถี่ถ้วน
แน่นอนว่าเพียงแค่มุ่งเน้นไปที่ 80% ของรหัสสำคัญที่สำคัญช่วยลดการโหลดเช่นกัน ... ฉันขอขอบคุณที่คุณคิดว่าเจ้านายของคุณเป็นอย่างสูง แต่นี่ไม่ได้เป็นตัวเลือกที่ดีที่สุด
สำหรับฉันความคุ้มครองการทดสอบหน่วย 100% เป็นเป้าหมายที่สูงส่ง แต่แม้ว่าเราจะทำได้เพียง 50% เราก็จะรู้ว่า 100% ของการครอบคลุม 50% นั้น
ฉันไม่ทราบว่า "การทดสอบหน่วยครอบคลุม" คืออะไร ฉันถือว่าคุณหมายถึง "การครอบคลุมโค้ด" นั่นคือหลังจากรันชุดทดสอบแล้วโค้ดทุกบรรทัด (= 100%) ได้รับการดำเนินการอย่างน้อยหนึ่งครั้ง
นี่เป็นตัวชี้วัด ballpark ที่ดี แต่ก็ไม่ใช่มาตรฐานที่ดีที่สุดเท่าที่จะทำได้ เพียงแค่รันโค้ดบรรทัดไม่ใช่ภาพรวมทั้งหมด สิ่งนี้ไม่ได้อธิบายถึงเส้นทางที่แตกต่างผ่านสาขาที่ซับซ้อนซ้อนกันเป็นต้น มันเป็นมากกว่าตัวชี้วัดที่ชี้นิ้วของมันที่ชิ้นส่วนของรหัสที่ทดสอบน้อยเกินไป (เห็นได้ชัดว่าถ้าชั้นเรียนครอบคลุมรหัส 10% หรือ 5% แสดงว่ามีบางอย่างผิดปกติ); ในทางกลับกันความคุ้มครอง 100% จะไม่บอกคุณว่าคุณได้ทดสอบเพียงพอหรือถ้าคุณทดสอบอย่างถูกต้อง
การทดสอบบูรณาการ
มันทำให้ฉันรำคาญอย่างมากเมื่อมีคนพูดถึงการทดสอบหน่วยในวันนี้ตามค่าเริ่มต้น ในความคิดของฉัน (และประสบการณ์) การทดสอบหน่วยเหมาะสำหรับไลบรารี / API ในพื้นที่ธุรกิจที่มุ่งเน้นมากขึ้น (ที่เราพูดถึงกรณีการใช้งานเช่นในคำถามที่อยู่ในมือ) พวกเขาไม่จำเป็นต้องเป็นตัวเลือกที่ดีที่สุด
สำหรับรหัสแอปพลิเคชันทั่วไปและในธุรกิจโดยเฉลี่ย (ซึ่งการหารายได้การกดปุ่มกำหนดเวลาและการตอบสนองความพึงพอใจของลูกค้าเป็นสิ่งสำคัญและคุณต้องการหลีกเลี่ยงข้อบกพร่องที่อาจเกิดขึ้นโดยตรงต่อผู้ใช้หรืออาจนำไปสู่ภัยพิบัติจริงพูดคุยนาซ่าเปิดตัวจรวดที่นี่) บูรณาการหรือคุณลักษณะการทดสอบมีมากมีประโยชน์มากขึ้น
สิ่งเหล่านี้ไปพร้อมกับการพัฒนาพฤติกรรมขับเคลื่อนหรือการพัฒนาคุณลักษณะขับเคลื่อน สิ่งเหล่านั้นไม่ทำงานกับการทดสอบหน่วย (เข้มงวด) ตามคำจำกัดความ
เพื่อให้สั้น (ish) การทดสอบบูรณาการ / คุณสมบัติการออกกำลังกายทั้งกองใบสมัคร ในแอปพลิเคชันบนเว็บมันจะทำหน้าที่เหมือนเบราว์เซอร์ที่คลิกผ่านแอปพลิเคชัน (และไม่แน่นอนว่าไม่จำเป็นต้องเป็นแบบง่ายๆมีกรอบที่ทรงพลังมากในการทำเช่นนั้น - ลองดูhttp: // แตงกวา ioเป็นตัวอย่าง)
โอ้ตอบคำถามสุดท้ายของคุณ: ให้ทีมงานทั้งหมดของคุณมีการทดสอบที่ครอบคลุมโดยตรวจสอบให้แน่ใจว่าฟีเจอร์ใหม่นั้นได้รับการตั้งโปรแกรมหลังจากการทดสอบฟีเจอร์นั้นได้รับการติดตั้งและล้มเหลวเท่านั้น และใช่นั่นหมายถึงทุกคุณสมบัติ สิ่งนี้รับประกันว่าคุณจะได้รับความคุ้มครองคุณสมบัติ (บวก) 100% โดยคำจำกัดความรับรองว่าคุณสมบัติของแอปพลิเคชันของคุณจะไม่ "หายไป" ไม่รับประกันความครอบคลุมของรหัส 100% (ตัวอย่างเช่นหากคุณไม่ตั้งโปรแกรมคุณสมบัติเชิงลบคุณจะไม่ใช้ข้อผิดพลาด / การจัดการข้อยกเว้น)
มันไม่รับประกันว่าคุณจะเป็นแอปพลิเคชั่นที่ปราศจากข้อผิดพลาด; แน่นอนคุณจะต้องเขียนการทดสอบคุณสมบัติสำหรับสถานการณ์บั๊กกี้ที่ชัดเจนหรืออันตรายมากการป้อนข้อมูลผู้ใช้ผิดการแฮ็ค (ตัวอย่างเช่นการจัดการเซสชันโดยรอบการรักษาความปลอดภัยและอื่น ๆ ); แต่การเขียนโปรแกรมเพียงอย่างเดียวการทดสอบเชิงบวกมีประโยชน์อย่างมากและค่อนข้างเป็นไปได้ด้วยกรอบการทำงานที่ทันสมัยและทรงพลัง
เห็นได้ชัดว่าการทดสอบคุณสมบัติ / การรวมระบบมีเวิร์มของตัวเอง (เช่นประสิทธิภาพการทดสอบซ้ำซ้อนของเฟรมเวิร์กของบุคคลที่สามเนื่องจากคุณมักจะไม่ใช้คู่ผสมพวกเขามักจะเขียนยากกว่าในประสบการณ์ของฉัน ... ) แต่ฉัน d ใช้แอปพลิเคชันที่ทดสอบคุณสมบัติบวก 100% ผ่านแอปพลิเคชันทดสอบรหัสครอบคลุมหน่วย 100% (ไม่ใช่ไลบรารี่!) ทุกวัน