ไปไกลแค่ไหนกับการทดสอบหน่วย


11

คำถามที่ถามมาหลายครั้งก่อน แต่มีการพัฒนาเอียง twds mvc เฉพาะ

ฉันเป็นเด็กที่ดีมากและได้เขียนโค้ดแอ็คชั่นคอนโทรลเลอร์ทั้งหมดของฉันด้วยการทดสอบหน่วยที่เกี่ยวข้องซึ่งยอดเยี่ยมมาก (ถ้าซ้ำ ๆ [อ่านมาก ๆ ] ในบางครั้ง) ตามจริงแล้วฉันได้สร้างเทมเพลต T4 เล็ก ๆ น้อย ๆ เพื่อเขียนกระดูกเปลือยส่วนใหญ่ของการทดสอบหน่วยเริ่มต้นจากนั้นปรับแต่งตามความเหมาะสมตามการใช้งาน ฉันจะยอมรับว่าไม่แน่ใจว่าจะจัดการกับการทดสอบในมุมมองที่มีบางส่วนได้อย่างไร - แต่นั่นเป็นเรื่องราวสำหรับคำถามอื่น

ตอนนี้ส่วนที่ยากสำหรับฉันที่จะตัดสินใจก็คือความครอบคลุมที่ลึกแค่ไหนในชั้นบริการของฉัน สาเหตุที่วิธีการบริการบางอย่างของฉัน (ดีขึ้นหรือแย่ลง) ดำเนินการกับคำสั่ง linq ที่หลากหลายซึ่งให้ข้อมูลที่รอบคอบกับตรรกะที่ตามมาภายในวิธีการนั้น ฉันรู้ว่าฉันสามารถ (ควร ??) ทำลายวิธีการเหล่านี้ลงไปเท่านั้นเรียกตรรกะที่จำเป็นสำหรับแต่ละคำสั่ง linq แล้วใช้พวกเขาภายในวิธีการ อย่างไรก็ตามในหลาย ๆ กรณีไม่มีการใช้งานซ้ำของฟังก์ชัน 'linq' และดังนั้นจึงรู้สึกว่าการทำเช่นนี้จะทำให้รหัสออกมาในระดับที่ไกลเกินไป

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

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

btw - ตรวจสอบความคิดนี้แล้ว:

http://dotnetslackers.com/articles/aspnet/Built-in-Unit-Test-for-ASP-NET-MVC-3-in-Visual-Studio-2010-Part-1.aspx

มอง fwd เพื่อ downvotes คงที่ตอนนี้ :)

[แก้ไข] - เพื่อประโยชน์ของซิงเกิ้ล (ดีในช่วงเวลาเดียว !!) 'ปิด' ผู้มีสิทธิเลือกตั้ง คำถามนี้ไม่ใช่เรื่องส่วนตัว ฉันกำลังมองหาข้อสรุปในเรื่องที่เน้นมาก ฉันไม่ได้พยายามที่จะกระตุ้นความสนใจเชิงลบฉันไม่ต้องการเปิดเผยข้อบกพร่องในเทคโนโลยี - ฉันเป็นแฟนตัวยง ดังนั้นโปรดทิ้งความคิดเห็นที่สุภาพเพื่อผลประโยชน์ของฉันหากการลงคะแนนปิดเนื่องจากอาจช่วยให้ฉันปรับโครงสร้างคำถามหากมีความคลุมเครือหรือข้อมูลที่ผิด คำถามนี้จะเป็นประโยชน์ต่อประชากร mvc จำนวนมาก

ขอบคุณ!!

จิม


(ก่อน) ลงคะแนนเพื่อปิดเป็นของฉัน แต่ไม่ใช่เป็น 'อัตนัยและโต้แย้ง' (ซึ่งไม่ใช่) แต่เป็น 'โยกย้ายไปยัง programmers.stackexchange.com' เพราะนี่ไม่ใช่คำถามการเขียนโปรแกรมเฉพาะที่มี คำตอบที่ชัดเจน

aakashm ชื่นชมและเข้าใจ ไม่ได้ขุดแค่อยากจะรู้ :)
จิม

คำตอบ:


4

ก่อนอื่นสิ่งที่คุณกำลังพูดถึงไม่ได้ฟังดูเหมือน TDD TDD แสดงถึงการทดสอบวิธีแรกซึ่งเกี่ยวข้องกับการผลักดันการออกแบบระบบของคุณโดยทำตามรูปแบบของการ ทดสอบ -> รหัส -> ตัวสร้างซ้ำ ดังนั้นบางทีปัญหาแรกของคุณคือจุดประสงค์ของการทดสอบคุณเขียนมันในขณะที่คุณเขียนโค้ดหรือไม่? ถ้าเป็นเช่นนั้นฉันคาดหวังว่าตรรกะทั้งหมดในการทดสอบของคุณจะเกี่ยวข้องกับการทดสอบหน่วย การครอบคลุมโค้ดที่สูงนั้นเป็นผลทางอ้อมของการใช้ TDD

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

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

การทดสอบ TDD ทำหน้าที่ผลักดันการออกแบบและเอกสารและอธิบายการออกแบบให้ผู้อื่นในภาษาธรรมดา (ดังนั้นวิธีที่คุณตั้งชื่อการทดสอบของคุณมีความสำคัญมาก)

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

นอกจากนี้ควรเขียนการทดสอบทุกครั้งที่:

  1. คุณกำลังเขียนรหัสใหม่การทดสอบควรผลักดันและจัดทำเอกสารการออกแบบของคุณและอธิบายสมมติฐานของคุณเกี่ยวกับสิ่งที่รหัสควรทำ ควรเขียนก่อนรหัส

  2. คุณพบข้อบกพร่องการทดสอบที่ล้มเหลวควรแสดงถึงข้อบกพร่อง เมื่อข้อผิดพลาดได้รับการแก้ไขการทดสอบควรผ่าน

  3. คุณเปลี่ยนรหัสด้วยวิธีที่เปลี่ยนแปลงลักษณะของวิธีการหรือคลาส (แม้ว่าจะมีการทดสอบจำนวนมากล้มเหลวเมื่อส่วนหนึ่งของรหัสเปลี่ยนแปลงซึ่งอาจหมายถึงการทดสอบแบบเปราะ) วิธีนี้ทำให้การทดสอบบันทึกรหัสอย่างถูกต้อง

โดยส่วนตัวแล้วฉันได้พบว่าการเรียนรู้ TDD เป็นความท้าทายที่น่าสนใจและต้องใช้เวลาในการพัฒนา "ความรู้สึก" ที่ดีสำหรับมัน การฝึกฝนฝึกฝนฝึกฝนเป็นวิธีที่ดีที่สุดในการเรียนรู้สำหรับฉัน และการอ่านรหัสทดสอบจากโครงการโอเพ่นซอร์สและตอนนี้ก็มีส่วนร่วมกับพวกเขาในขณะที่เขียนการทดสอบใหม่ด้วยการเปลี่ยนแปลงของฉัน


+1 chris - ฉันชอบการตัด jib ของคุณ :-) แต่ที่สำคัญกว่านั้นคุณชี้ให้เห็น (ที่ฉันเข้าใจความแตกต่าง) ที่แยกระหว่างการทดสอบหน่วยและ TDD ของฉันเป็นรุ่นไฮบริดค่อนข้าง (yikes !!)
jim

ใช่ฉันคิดว่ามันอาจเป็นสิ่งที่คุณคุ้นเคย แต่ก็คุ้มค่าที่จะพูดถึง ฉันคิดว่าพวกเราทุกคนคงมีรูปแบบไฮบริดบ้าง ฉันพบว่าตัวเองกำลังทำข้อสอบมากกว่านี้ก่อน ฉันรู้สึกว่าการเปลี่ยนไปใช้ MSpec และการทดสอบรูปแบบข้อมูลจำเพาะช่วยได้ แม้ว่าฉันจะยังคงเขียนรหัสบางอย่างฉันก็ไม่สามารถทดสอบก่อนได้
Chris Nicola

... ฉันประเจิดประเจ้อพยักหน้าหัวของฉันอยู่ในข้อตกลงที่ประโยคสุดท้ายของคุณ :)
จิม

0

เห็นได้ชัดว่าการทดสอบเพียงค่าตอบแทนของวิธีการนั้นมีประสิทธิภาพน้อยกว่าการทดสอบสาขาทั้งหมดที่อยู่ภายใน อินพุตอื่นจะไม่รับประกันพฤติกรรมที่ถูกต้อง

ในทางกลับกันคุณอาจไม่มีเวลาหรือความอดทนพอที่จะทดสอบทุกอย่าง

สิ่งที่คุณสามารถทำได้คือตัดสินใจว่าคุณต้องการให้โค้ดครอบคลุมกับการทดสอบเท่าใด (80-90% หรืออะไรก็ตาม) และบังคับใช้โดยใช้เครื่องมืออัตโนมัติที่ยืนยันสิ่งนี้
"รอบไม่สิ้นสุด" ของการทดสอบการเขียนจะเกิดขึ้นเฉพาะในกรณีที่วงจรการเขียนรหัสไม่สิ้นสุดเท่านั้น :)


เห็นได้ชัดว่าคุณไม่ได้เห็นรหัสของฉัน กลับไปที่ลู่วิ่ง ... :-)
jim

0

คุณต้องการให้โค้ดทำงานอย่างถูกต้องหรือไม่ การทดสอบหน่วยเป็นเพียงเครื่องมือหนึ่งในกระเป๋าของโปรแกรมเมอร์เพื่อช่วยตรวจสอบว่าการใช้งานของคุณทำในสิ่งที่ข้อมูลจำเพาะระบุไว้ว่าจำเป็นต้องทำ คุณอาจไม่ต้องการความคุ้มครอง 100% แต่คุณควรเขียนการทดสอบหน่วยเพื่อให้ครอบคลุมส่วนที่สำคัญยิ่งของรหัสของคุณ เป็นเรื่องที่ดีเสมอเพื่อให้แน่ใจว่าวิธีการของคุณทำงานร่วมกันได้ดีไม่ใช่เพียงอย่างเดียวและคุณควรพยายามเขียนการทดสอบที่ครอบคลุม "ตรรกะเชิงเส้น" ที่สำคัญยิ่งกว่า


0

การทดสอบหน่วยที่เปิดใช้งานการครอบคลุมโค้ดใน Visual Studio ควรให้ตัวบ่งชี้ที่ดี (และกราฟิก) ว่ามีการครอบคลุมโค้ดของคุณได้ดีเพียงใด

หากคุณไม่ได้ใช้เฟรมเวิร์ก MSTest inbuilt คุณอาจต้องดูผลิตภัณฑ์การครอบคลุมโค้ดของบุคคลที่สามเพื่อทำงานกับ NUnit หรือทำตามคำแนะนำที่นี่: /programming/2665799/does-vs2010-code -coverage สนับสนุน-nunit

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