มันเพียงพอแล้วหรือไม่ที่จะใช้การทดสอบการยอมรับและการรวมเข้าด้วยกันแทนที่จะเป็นการทดสอบหน่วย?


62

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

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

ที่ทำงานฉันมีรหัสดั้งเดิมมากมาย ที่นี่ฉันเขียนมากขึ้นและมากขึ้นการทดสอบการยอมรับและการทดสอบหน่วยน้อย สิ่งนี้ดูเหมือนจะไม่ใช่วิธีที่ไม่ดีเนื่องจากข้อบกพร่องส่วนใหญ่ถูกตรวจพบโดยการทดสอบการยอมรับและการรวม

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

หลังจากที่ผมถูกมองผ่านทางเว็บผมพบว่ามีความคิดที่คล้ายกันมากกับเหมืองกล่าวถึงที่นี่และมี คุณคิดอย่างไรกับความคิดนี้

แก้ไข

การตอบคำถามตัวอย่างหนึ่งที่การออกแบบนั้นดี แต่ฉันต้องการการรีแฟคเตอร์ขนาดใหญ่สำหรับข้อกำหนดต่อไป:

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

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

ข้อกำหนดต่อไปคือทุกคำสั่งควรมีมุมมองเป็นของตนเอง - ตัวอย่างบางส่วนของผลลัพธ์ของคำสั่ง ฉันออกแบบโปรแกรมใหม่เพื่อให้ได้การออกแบบที่ดีขึ้นสำหรับข้อกำหนดใหม่: การออกแบบที่สอง

สิ่งนี้ก็เป็นสิ่งที่ดีเพราะตอนนี้ทุกคำสั่งมีรูปแบบมุมมองของตัวเองและตัวอย่างของมันเอง

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

ทั้งหมดที่ฉันอยากรู้ ณ จุดนี้คือถ้าการออกแบบใหม่ไม่ทำลายข้อกำหนดที่มีอยู่ ฉันไม่ต้องเปลี่ยนการทดสอบตอบรับใด ๆ ฉันต้อง refactor หรือลบการทดสอบเกือบทุกหน่วยซึ่งเป็นกองงานขนาดใหญ่

สิ่งที่ฉันต้องการแสดงที่นี่เป็นสถานการณ์ทั่วไปที่เกิดขึ้นบ่อยครั้งในระหว่างการพัฒนา ไม่มีปัญหากับการออกแบบเก่าหรือใหม่พวกเขาเพียงแค่เปลี่ยนไปตามข้อกำหนด - ฉันเข้าใจได้อย่างไรนี่เป็นข้อดีอย่างหนึ่งของ TDD ที่การออกแบบวิวัฒนาการ

ข้อสรุป

ขอบคุณสำหรับคำตอบและการอภิปรายทั้งหมด ในบทสรุปของการสนทนานี้ฉันมีความคิดของวิธีการที่ฉันจะทดสอบกับโครงการต่อไปของฉัน

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


คำถามเหล่านี้ดูเหมือนจะแก้ปัญหาได้มากกว่าว่าทำไมการเขียนการทดสอบเลย ฉันต้องการหารือว่าการเขียนแบบทดสอบการใช้งานแทนการทดสอบหน่วยอาจเป็นวิธีที่ดีกว่า
Yggdrasil

ต่อการอ่านของฉันคำตอบในคำถามที่ซ้ำกันเป็นหลักเกี่ยวกับเมื่อการทดสอบที่ไม่ใช่หน่วยทำให้รู้สึกมากขึ้น
gnat

ลิงค์แรกนั้นซ้ำซ้อนกัน คิดว่าคุณหมายถึง: programmers.stackexchange.com/questions/66480/…
Robbie Dee

คำตอบจากลิงก์จาก Robbie Dee นั้นยิ่งมากขึ้นเกี่ยวกับสาเหตุที่ต้องทำการทดสอบเลย
Yggdrasil

คำตอบ:


37

มันเปรียบเทียบส้มกับแอปเปิ้ล

การทดสอบการรวมการทดสอบการยอมรับการทดสอบหน่วยการทดสอบพฤติกรรม - เป็นการทดสอบทั้งหมดและพวกเขาทั้งหมดจะช่วยคุณในการปรับปรุงโค้ดของคุณ แต่มันก็ค่อนข้างแตกต่างกัน

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

การทดสอบการรวม:

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

การทดสอบการยอมรับ:

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

การทดสอบหน่วย:

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

การทดสอบพฤติกรรม:

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

ทั้งหมดนี้อยู่ในความคิดของฉันผ่านประสบการณ์การเขียนแบบทดสอบมากมาย ฉันไม่ชอบที่จะให้ความสำคัญกับแนวทางของตำราเรียน แต่ให้ความสำคัญกับสิ่งที่ให้คุณค่ากับการทดสอบของคุณ


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

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

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

1
ขึ้นอยู่กับสิ่งที่คุณกำลังทดสอบ - คุณกำลังทดสอบคุณสมบัติธุรกิจ (การทดสอบการยอมรับ) หรือไม่ คุณกำลังทดสอบการรวม (การทดสอบการรวม) หรือไม่ คุณกำลังทดสอบสิ่งที่เกิดขึ้นเมื่อคุณคลิกปุ่ม (ทดสอบพฤติกรรม) หรือไม่? คุณกำลังทดสอบอัลกอริทึม (การทดสอบหน่วย) หรือไม่
Michael

4
"ฉันไม่ชอบที่จะมุ่งเน้นไปที่แนวทางตำราเรียน - แต่ให้ความสำคัญกับสิ่งที่ให้คุณค่าการทดสอบของคุณ" โอ้จริงเหรอ! คำถามแรกที่ถามเสมอคือ "ฉันจะแก้ปัญหาอะไรโดยการทำเช่นนี้? และโครงการที่แตกต่างกันอาจมีปัญหาที่แตกต่างกันในการแก้ปัญหา!
Laurent Bourgault-Roy

40

TL; DR:ตราบใดที่มันตอบสนองความต้องการของคุณได้

ฉันทำการพัฒนาแบบทดสอบตอบรับการยอมรับ (ATDD) มาหลายปีแล้ว มันสามารถประสบความสำเร็จมาก มีบางสิ่งที่ต้องระวัง

  • การทดสอบหน่วยจะช่วยบังคับใช้ IOC อย่างแท้จริง หากไม่มีการทดสอบหน่วย onus จะอยู่ในกลุ่มผู้พัฒนาเพื่อให้แน่ใจว่าตรงตามข้อกำหนดของโค้ดที่เขียนได้ดี
  • พวกเขาสามารถช้าลงและมีความล้มเหลวที่ผิดพลาดหากคุณใช้ทรัพยากรที่มักจะล้อเลียน
  • การทดสอบไม่ได้ระบุปัญหาเฉพาะตามที่หน่วยทดสอบต้องการ คุณต้องทำการตรวจสอบเพิ่มเติมเพื่อแก้ไขความล้มเหลวในการทดสอบ

ตอนนี้ผลประโยชน์

  • ครอบคลุมการทดสอบที่ดีขึ้นมากครอบคลุมคะแนนการรวม
  • มั่นใจว่าระบบโดยรวมเป็นไปตามเกณฑ์การยอมรับซึ่งเป็นจุดรวมของการพัฒนาซอฟต์แวร์
  • ทำให้ refactors ขนาดใหญ่ง่ายขึ้นเร็วขึ้นและถูกลง

ขึ้นอยู่กับคุณที่จะทำการวิเคราะห์และพิจารณาว่าการฝึกฝนนี้เหมาะสมกับสถานการณ์ของคุณหรือไม่ ฉันไม่คิดว่าจะมีคำตอบที่ถูกต้อง มันจะขึ้นอยู่กับความต้องการและความต้องการของคุณ


8
จุดที่ดีเยี่ยม มันง่ายเกินไปที่จะกลายเป็นช่องว่างเล็ก ๆ น้อย ๆ เกี่ยวกับการทดสอบและเขียนหลายร้อยคดีเพื่อให้ได้ความพึงพอใจอันอบอุ่นเมื่อมัน "ผ่าน" ด้วยสีที่บินได้ พูดง่ายๆก็คือ: หากซอฟต์แวร์ของคุณไม่ได้ทำในสิ่งที่ต้องทำจากมุมมองของ USER คุณจะไม่ผ่านการทดสอบครั้งแรกและสำคัญที่สุด
Robbie Dee

จุดที่ดีสำหรับการหาปัญหาที่เฉพาะเจาะจง ถ้าฉันมีความต้องการมากฉันเขียนแบบทดสอบตอบรับซึ่งทดสอบทั้งระบบและเขียนแบบทดสอบซึ่งทดสอบงานย่อยขององค์ประกอบบางอย่างของระบบเพื่อให้บรรลุความต้องการ ด้วยสิ่งนี้ฉันสามารถระบุในกรณีส่วนใหญ่เป็นส่วนประกอบที่มีข้อบกพร่องอยู่
Yggdrasil

2
"การทดสอบหน่วยช่วยในการบังคับใช้ IOC"?! ฉันแน่ใจว่าคุณหมายถึง DI ที่นั่นแทนที่จะเป็น IoC แต่ทำไมคนที่ต้องการบังคับใช้ DI? โดยส่วนตัวแล้วฉันพบว่าในทางปฏิบัติ DI นำไปสู่การไม่ใช่วัตถุ (การเขียนโปรแกรมแบบขั้นตอน)
Rogério

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

@starmandeluxe แน่นอนว่าพวกเขาจะไม่ได้เกิดร่วมกัน ค่อนข้างเป็นคำถามของค่าที่คุณต้องการได้รับจากการทดสอบ ฉันจะทดสอบหน่วยใดก็ได้ที่มีค่าเกินกว่าค่าใช้จ่ายในการพัฒนา / สนับสนุนการเขียนการทดสอบ อดีต แน่นอนฉันจะทดสอบหน่วยดอกเบี้ยทบต้นในใบสมัครทางการเงิน
dietbuddha

18

ฉันใช้วิธี TDD เหมือนวิธีการเพื่อให้การทดสอบ / ความต้องการพัฒนาการออกแบบของโปรแกรม ปัญหาคือกว่าครึ่งหนึ่งของเวลาในการพัฒนาสำหรับการทดสอบการเขียน / การรีแฟคเตอร์

การทดสอบหน่วยทำงานได้ดีที่สุดเมื่อส่วนต่อประสานสาธารณะของส่วนประกอบที่ใช้ไม่เปลี่ยนแปลงบ่อยเกินไป ซึ่งหมายความว่าเมื่อส่วนประกอบได้รับการออกแบบมาอย่างดีแล้ว (เช่นปฏิบัติตามหลักการของ SOLID)

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

เมื่อความต้องการของคุณเปลี่ยนไปและคุณต้องเปลี่ยน internals ของส่วนประกอบและสิ่งนี้จะทำลาย 90% ของการทดสอบหน่วยของคุณดังนั้นคุณต้องปรับโครงสร้างบ่อยครั้งมากจากนั้นการออกแบบส่วนใหญ่อาจไม่ดีนัก

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

เมื่อคุณไม่สามารถออกแบบได้ทันทีการทดสอบการยอมรับและการรวมเข้าด้วยกันอาจเป็นการเริ่มต้นที่ดีกว่า

แก้ไข: บางครั้งการออกแบบส่วนของคุณสามารถปรับ แต่การออกแบบของการทดสอบหน่วยของคุณอาจทำให้เกิดปัญหา ตัวอย่างง่าย ๆ : คุณต้องการทดสอบวิธีการ "MyMethod" ของคลาส X และเขียน

    var x= new X();
    Assert.AreEqual("expected value 1" x.MyMethod("value 1"));
    Assert.AreEqual("expected value 2" x.MyMethod("value 2"));
    // ...
    Assert.AreEqual("expected value 500" x.MyMethod("value 500"));

(ถือว่าค่ามีความหมายบางอย่าง)

สมมติเพิ่มเติมว่าในรหัสการผลิตมีเพียงการโทรX.MyMethodเดียว ตอนนี้สำหรับข้อกำหนดใหม่เมธอด "MyMethod" ต้องการพารามิเตอร์เพิ่มเติม (ตัวอย่างเช่นบางอย่างcontext) ซึ่งไม่สามารถข้ามได้ หากไม่มีการทดสอบหน่วยเราจะต้องสร้างรหัสการโทรซ้ำในที่เดียว ด้วยการทดสอบหน่วยหนึ่งต้อง refactor 500 แห่ง

แต่สาเหตุที่นี่ไม่ใช่หน่วยทดสอบเองมันเป็นความจริงที่ว่าการเรียกซ้ำ "X.MyMethod" ซ้ำแล้วซ้ำอีกไม่ได้ปฏิบัติตามหลักการ "อย่าทำซ้ำตัวเอง (DRY) อย่างเคร่งครัดดังนั้นวิธีการแก้ไข นี่คือการใส่ข้อมูลการทดสอบและค่าที่คาดหวังที่เกี่ยวข้องในรายการและเรียกการเรียกไปที่ "MyMethod" ในลูป (หรือหากเครื่องมือทดสอบสนับสนุนที่เรียกว่า "การทดสอบไดรฟ์ข้อมูล" เพื่อใช้คุณสมบัตินั้น) จำนวนสถานที่ที่จะเปลี่ยนในการทดสอบหน่วยเมื่อวิธีการเปลี่ยนลายเซ็นเป็น 1 (ตรงข้ามกับ 500)

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


"ซึ่งหมายความว่าเมื่อส่วนประกอบได้รับการออกแบบมาอย่างดีแล้ว": ฉันเห็นด้วยกับคุณ แต่ส่วนประกอบจะได้รับการออกแบบอย่างไรถ้าคุณเขียนแบบทดสอบก่อนที่จะเขียนรหัสและรหัสคือการออกแบบ? อย่างน้อยนี่เป็นวิธีที่ฉันเข้าใจ TDD
Giorgio

2
@Giorgio: จริง ๆ แล้วมันไม่สำคัญว่าคุณจะเขียนแบบทดสอบก่อนหรือหลัง การออกแบบหมายถึงการตัดสินใจเกี่ยวกับความรับผิดชอบของส่วนประกอบ, เกี่ยวกับส่วนต่อประสานสาธารณะ, เกี่ยวกับการพึ่งพา (โดยตรงหรือฉีด), เกี่ยวกับเวลาทำงานหรือพฤติกรรมเวลารวบรวม, เกี่ยวกับความไม่แน่นอน, เกี่ยวกับชื่อ, เกี่ยวกับการไหลของข้อมูล, การควบคุมการไหล การออกแบบยังหมายถึงการเลื่อนเวลาการตัดสินใจไปยังจุดที่เป็นไปได้ล่าสุด การทดสอบหน่วยสามารถแสดงให้คุณเห็นทางอ้อมหากการออกแบบของคุณใช้ได้: ถ้าคุณต้องการปรับโครงสร้างจำนวนมากหลังจากนั้นเมื่อความต้องการเปลี่ยนไปมันอาจไม่ได้
Doc Brown

@Giorgio: ตัวอย่างอาจชี้แจง: สมมติว่าคุณมีองค์ประกอบ X ที่มีวิธีการ "MyMethod" และ 2 พารามิเตอร์ การใช้ TDD คุณเขียนX x= new X(); AssertTrue(x.MyMethod(12,"abc"))ก่อนนำวิธีการไปใช้จริง ใช้การออกแบบล่วงหน้าคุณสามารถเขียนclass X{ public bool MyMethod(int p, string q){/*...*/}}ก่อนและเขียนการทดสอบในภายหลัง ในทั้งสองกรณีคุณได้ตัดสินใจออกแบบเดียวกัน หากการตัดสินใจดีหรือไม่ดี TDD จะไม่บอกคุณ
Doc Brown

1
ฉันเห็นด้วยกับคุณ: ฉันค่อนข้างสงสัยเมื่อเห็นว่า TDD ใช้งานแบบสุ่มโดยมีสมมติฐานว่ามันจะสร้างการออกแบบที่ดีโดยอัตโนมัติ ยิ่งไปกว่านั้นบางครั้ง TDD ก็เข้ามาในทางถ้าการออกแบบยังไม่ชัดเจน: ฉันถูกบังคับให้ทดสอบรายละเอียดก่อนที่ฉันจะเห็นภาพรวมของสิ่งที่ฉันกำลังทำอยู่ ดังนั้นถ้าฉันเข้าใจถูกต้องเราก็เห็นด้วย ฉันคิดว่า (1) การทดสอบหน่วยช่วยในการตรวจสอบการออกแบบ แต่การออกแบบเป็นกิจกรรมแยกต่างหากและ (2) TDD ไม่ใช่วิธีที่ดีที่สุดเสมอเพราะคุณจำเป็นต้องจัดระเบียบความคิดของคุณก่อนที่จะเริ่มเขียนแบบทดสอบและ TDD อาจทำให้คุณช้าลง นี้.
Giorgio

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

9

ใช่แน่นอนมันคือ

พิจารณาสิ่งนี้:

  • การทดสอบหน่วยเป็นการทดสอบชิ้นเล็ก ๆ ที่มีเป้าหมายซึ่งจะฝึกรหัสขนาดเล็ก คุณเขียนจำนวนมากเพื่อให้ได้รหัสครอบคลุมที่เหมาะสมเพื่อให้ทุกคน (หรือบิตส่วนใหญ่อึดอัดใจ) ได้รับการทดสอบ
  • การทดสอบการรวมเป็นชิ้นใหญ่ของการทดสอบที่กว้างที่ออกกำลังกายรหัสของคุณ คุณเขียนบางส่วนของพวกเขาเพื่อให้ได้รหัสครอบคลุมที่เหมาะสมเพื่อให้ทดสอบทั้งหมด (หรือบิตส่วนใหญ่ที่น่าอึดอัดใจ)

ดูความแตกต่างโดยรวม ....

ปัญหานี้เป็นหนึ่งในการครอบคลุมโค้ดหากคุณสามารถทำการทดสอบทั้งหมดของรหัสของคุณโดยใช้การทดสอบการรวม / การยอมรับแล้วก็ไม่มีปัญหา รหัสของคุณผ่านการทดสอบแล้ว นั่นคือเป้าหมาย

ฉันคิดว่าคุณอาจจำเป็นต้องรวมมันเป็นทุกโครงการที่ใช้ TDD จะต้องมีการทดสอบบูรณาการเพียงเพื่อให้แน่ใจว่าทุกหน่วยทำงานร่วมกันได้ดีจริง ๆ (ฉันรู้จากประสบการณ์ว่า 100% ผ่านการทดสอบ codebase หน่วยไม่จำเป็นต้องทำงาน เมื่อคุณรวมทั้งหมดเข้าด้วยกัน!)

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

ไม่ว่าจะด้วยวิธีใดคุณยังคงได้รับรหัสทดสอบคุณเพียงแค่ต้องตัดสินใจว่ากลไกใดที่เหมาะกับคุณดีกว่า (ฉันจะไปกับการผสมผสานหน่วยทดสอบอัลกอริทึมที่ซับซ้อนและรวมทดสอบส่วนที่เหลือ)


7
ไม่เป็นความจริงเลย ... ด้วยการทดสอบการรวมตัวมันมีความเป็นไปได้ที่จะมีสององค์ประกอบที่เป็นรถม้าชนิดเล็ก แต่ข้อบกพร่องของพวกมันถูกยกเลิกในการทดสอบการรวมตัว มันไม่ได้เรื่องมากจนกว่าผู้ใช้จะใช้มันในทางซึ่งมีเพียงหนึ่งในองค์ประกอบเหล่านี้จะใช้ ...
ไมเคิลชอว์

1
การครอบคลุมโค้ด! = ผ่านการทดสอบ - นอกเหนือจากข้อบกพร่องที่ยกเลิกซึ่งกันและกันแล้วสถานการณ์ที่คุณไม่เคยคิดถึง การทดสอบการรวมเป็นสิ่งที่ดีสำหรับการทดสอบเส้นทางที่มีความสุข แต่ฉันไม่ค่อยเห็นการทดสอบการรวมที่เพียงพอเมื่อสิ่งต่าง ๆ ไม่เป็นไปด้วยดี
Michael

4
@Polemmy ฉันคิดว่าความหายากของ 2 องค์ประกอบบั๊กกี้ที่ยกเลิกซึ่งกันและกันนั้นอยู่ไกลมากต่ำกว่า 2 ส่วนประกอบที่ทำงานซึ่งรบกวนซึ่งกันและกัน
gbjbaanb

2
@Michael ถ้างั้นคุณก็ไม่ได้ใช้ความพยายามมากพอในการทดสอบฉันบอกว่ามันยากกว่าที่จะทำการทดสอบแบบรวมที่ดีเนื่องจากการทดสอบจะต้องมีรายละเอียดมากขึ้น คุณสามารถให้ข้อมูลที่ไม่ดีในการทดสอบการรวมได้อย่างง่ายดายในการทดสอบหน่วย การทดสอบการรวม! = เส้นทางที่มีความสุข มันเกี่ยวกับการออกกำลังกายให้มากที่สุดเท่าที่คุณสามารถทำได้นั่นคือสาเหตุที่มีเครื่องมือครอบคลุมรหัสที่แสดงให้คุณเห็นว่ามีการใช้รหัสจำนวนเท่าใด
gbjbaanb

1
@Michael เมื่อฉันใช้เครื่องมือเช่น Cucumber หรือ SpecFlow อย่างถูกต้องฉันสามารถสร้างการทดสอบการรวมซึ่งยังทำการทดสอบข้อยกเว้นและสถานการณ์ที่รุนแรงเช่นเดียวกับการทดสอบหน่วย แต่ฉันเห็นด้วยถ้าชั้นหนึ่งมีการเรียงสับเปลี่ยนมากฉันชอบเขียนการทดสอบหน่วยสำหรับชั้นนี้ แต่นี่จะน้อยกว่ากรณีที่มีชั้นเรียนที่มีเพียงไม่กี่เส้นทาง
Yggdrasil

2

ฉันคิดว่ามันเป็นความคิดที่น่ากลัว

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

ไม่คุณมักจะเขียนการทดสอบหน่วยเพิ่มเติมเว้นแต่ว่าคุณจะมีแอพแปลก ๆ ที่เป็น 90% UI หรืออย่างอื่นที่ทดสอบการทดสอบหน่วยได้อย่างไม่น่าเชื่อ ความเจ็บปวดที่คุณพบไม่ใช่จากการทดสอบหน่วย แต่ทำการทดสอบก่อนพัฒนา โดยทั่วไปคุณควรใช้เวลาเพียง 1/3 ในการทดสอบการเขียนส่วนใหญ่ ท้ายที่สุดพวกเขาอยู่ตรงนั้นเพื่อรับใช้คุณไม่ใช่กลับกัน


2
เนื้อหลักที่ฉันได้ยินจาก TDD คือมันขัดขวางการไหลของการพัฒนาตามธรรมชาติและบังคับใช้การตั้งโปรแกรมการป้องกันตั้งแต่เริ่มต้น หากโปรแกรมเมอร์อยู่ภายใต้ความกดดันเรื่องเวลาพวกเขามีแนวโน้มที่จะต้องการตัดรหัสและขัดเกลาในภายหลัง แน่นอนว่าการประชุมกำหนดเวลาโดยพลการด้วยรหัสรถเป็นเศรษฐกิจที่ผิดพลาด
Robbie Dee

2
แน่นอนโดยเฉพาะอย่างยิ่งเมื่อ "ขัดต่อในภายหลัง" ดูเหมือนจะไม่เกิดขึ้นจริง - ทุกการตรวจสอบฉันทำในที่ที่ผู้พัฒนาผลัก "ต้องออกไปข้างนอกเราจะทำในภายหลัง" เมื่อเราทุกคนรู้ว่าจะไม่เกิดขึ้น - ทางเทคนิค หนี้สิน = นักพัฒนาล้มละลายในความคิดของฉัน
Michael

3
คำตอบนั้นสมเหตุสมผลสำหรับฉันไม่รู้ว่าทำไมมันถึงมีข้อบกพร่องมากมาย หากต้องการอ้างอิง Mike Cohn: "การทดสอบหน่วยควรเป็นรากฐานของกลยุทธ์การทดสอบอัตโนมัติที่แข็งแกร่งและเป็นส่วนที่ใหญ่ที่สุดของปิรามิดการทดสอบหน่วยอัตโนมัตินั้นยอดเยี่ยมเพราะให้ข้อมูลเฉพาะแก่โปรแกรมเมอร์ - มีข้อบกพร่องและมันอยู่ใน บรรทัด 47 " mountaingoatsoftware.com/blog/…
guillaume31

4
@ guillaume31 เพียงเพราะผู้ชายบางคนพูดเมื่อพวกเขาดีไม่ได้หมายความว่าพวกเขาดี ในประสบการณ์ของฉันไม่พบข้อบกพร่องโดยการทดสอบหน่วยเพราะพวกเขาเปลี่ยนเป็นข้อกำหนดใหม่ล่วงหน้า นอกจากนี้ข้อบกพร่องส่วนใหญ่เป็นข้อบกพร่องการรวม ดังนั้นฉันจึงตรวจสอบพวกเขาส่วนใหญ่ด้วยการทดสอบการรวมของฉัน
Yggdrasil

2
@Yggdrasil ฉันสามารถอ้าง Martin Fowler: "ถ้าคุณได้รับความล้มเหลวในการทดสอบระดับสูงไม่เพียง แต่คุณมีข้อผิดพลาดในรหัสการทำงานของคุณคุณยังมีการทดสอบหน่วยที่ขาดหายไป" martinfowler.com/bliki/TestPyramid.htmlอย่างไรก็ตามหากการทดสอบการรวมเข้าด้วยกันใช้งานได้สำหรับคุณ ประสบการณ์ของฉันคือในขณะที่จำเป็นพวกเขาจะช้าส่งข้อความความล้มเหลวที่แม่นยำน้อยกว่าและแก้ไขได้น้อยลง (combinatorial มากขึ้น) กว่าการทดสอบหน่วย นอกจากนี้ฉันมักจะพิสูจน์ในอนาคตน้อยลงเมื่อฉันเขียนการทดสอบการรวม - การใช้เหตุผลเกี่ยวกับสถานการณ์ที่ผิดพลาดมากกว่าความถูกต้องของวัตถุ
guillaume31

2

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

นี่คือที่มา BDD เป็นพฤติกรรมที่สามารถรวมอยู่ในการทดสอบหน่วยเพื่อให้กระบวนการโดยนิยามที่เป็นนามธรรมน้อยลงและเป็นรูปธรรมมากขึ้น

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

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

หากคุณกำลังเขียนวิดเจ็ตบรรทัดคำสั่งสำหรับการใช้งานส่วนตัวคุณจะสนใจการทดสอบหน่วยเป็นหลัก ในขณะที่บริการเว็บกล่าวว่าจะต้องมีการทดสอบบูรณาการ / พฤติกรรมจำนวนมาก

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


1
ฉันเขียนแบบทดสอบล่วงหน้าและเขียนแบบทดสอบเพียงพอที่จะครอบคลุมข้อผิดพลาดส่วนใหญ่ สำหรับข้อบกพร่องซึ่งพื้นผิวในภายหลัง ฟังดูแล้วสำหรับฉันว่าความต้องการเปลี่ยนไปหรือมีข้อกำหนดใหม่เข้ามาเล่น นอกเหนือจากการทดสอบบูรณาการ / พฤติกรรมที่จะต้องมีการเปลี่ยนแปลงเพิ่ม หากมีข้อบกพร่องปรากฏในข้อกำหนดเก่าการทดสอบของฉันสำหรับสิ่งนี้จะแสดง เช่นเดียวกับระบบอัตโนมัติ การทดสอบทั้งหมดของฉันทำงานอยู่ตลอดเวลา
Yggdrasil

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

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

แน่นอน มีตลาดที่เฟื่องฟูสำหรับเครื่องมือของบุคคลที่สามอัตโนมัติที่มีอยู่นอกขอบเขตการพัฒนาเป็นระยะเวลาพอสมควร
Robbie Dee

1

ข้อได้เปรียบสุดท้ายของการทดสอบหน่วยคือพวกมันเร็วกว่า ฉันได้เขียนการทดสอบการรวมเข้าด้วยกันพอที่จะรู้ว่าพวกเขาสามารถทำได้เร็วเท่ากับการทดสอบหน่วย

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

แน่นอนการทดสอบหน่วยกำลังช้าลงเช่นกัน แต่ก็ยังมีขนาดที่ใหญ่กว่าเร็วกว่า ตัวอย่างเช่นในโครงการก่อนหน้าของฉัน (c ++ บางการทดสอบ 600 kLOC, 4000 หน่วยและการทดสอบการรวม 200 ครั้ง) ใช้เวลาประมาณหนึ่งนาทีในการดำเนินการทั้งหมดและมากกว่า 15 รายการเพื่อดำเนินการทดสอบการรวม ในการสร้างและดำเนินการทดสอบหน่วยสำหรับชิ้นส่วนที่ถูกเปลี่ยนจะใช้เวลาโดยเฉลี่ยน้อยกว่า 30 วินาที เมื่อคุณทำได้เร็วคุณจะต้องทำตลอดเวลา

เพียงเพื่อให้ชัดเจน: ฉันไม่ได้บอกว่าจะไม่เพิ่มการทดสอบการรวมและการยอมรับ แต่ดูเหมือนว่าคุณทำ TDD / BDD ในทางที่ผิด

การทดสอบหน่วยก็ดีสำหรับการออกแบบเช่นกัน

ใช่การออกแบบที่คำนึงถึงการทดสอบจะทำให้การออกแบบดีขึ้น

ปัญหาคือกว่าครึ่งหนึ่งของเวลาในการพัฒนาสำหรับการทดสอบการเขียน / การรีแฟคเตอร์ ดังนั้นในที่สุดฉันก็ไม่ต้องการที่จะใช้คุณสมบัติอื่น ๆ อีกต่อไปเพราะฉันจะต้องปรับโครงสร้างและเขียนการทดสอบจำนวนมาก

เมื่อความต้องการเปลี่ยนแปลงคุณต้องเปลี่ยนรหัส ฉันจะบอกคุณว่างานของคุณไม่เสร็จถ้าคุณไม่ได้เขียนบททดสอบ แต่นั่นไม่ได้หมายความว่าคุณควรมีความคุ้มครอง 100% ด้วยการทดสอบหน่วย - นั่นไม่ใช่เป้าหมาย บางสิ่ง (เช่น GUI หรือการเข้าถึงไฟล์, ... ) ไม่ได้มีไว้สำหรับทดสอบหน่วย

ผลลัพธ์ที่ได้คือคุณภาพของรหัสที่ดีขึ้นและการทดสอบอีกชั้นหนึ่ง ฉันจะบอกว่ามันคุ้มค่า


เรามีการทดสอบการยอมรับหลายพันครั้งและใช้เวลาตลอดทั้งสัปดาห์ในการดำเนินการทั้งหมด


1
คุณเคยดูตัวอย่างของฉันไหม สิ่งนี้เกิดขึ้นตลอดเวลา ประเด็นก็คือเมื่อฉันใช้คุณสมบัติใหม่ฉันเปลี่ยน / เพิ่มการทดสอบหน่วยเพื่อให้พวกเขาทดสอบคุณลักษณะใหม่ - ดังนั้นจะไม่มีการทดสอบหน่วยใดเสีย ในกรณีส่วนใหญ่ฉันมีผลข้างเคียงของการเปลี่ยนแปลงที่ไม่ถูกตรวจพบโดยการทดสอบหน่วย - เนื่องจากสภาพแวดล้อมถูกล้อเลียน จากประสบการณ์ของฉันเนื่องจากการทดสอบหน่วยนี้ไม่เคยบอกฉันว่าฉันใช้คุณสมบัติที่มีอยู่แล้ว มันเป็นการทดสอบการรวมและการยอมรับเสมอ
Yggdrasil

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

@ Yggdrasil ดังที่ฉันได้กล่าวการทดสอบหน่วยไม่ได้ทั้งหมดอันยิ่งใหญ่ แต่พวกเขามักจะเป็นชั้นแรกของการทดสอบเนื่องจากพวกเขาจะเร็วที่สุด การทดสอบอื่น ๆ ก็มีประโยชน์เช่นกันและควรนำมารวมกัน
BЈовић

1
เพียงเพราะพวกเขาเร็วขึ้นไม่ได้หมายความว่าพวกเขาควรจะใช้เพียงเพราะสิ่งนี้หรือเพราะมันเป็นเรื่องธรรมดาที่จะเขียนสิ่งเหล่านั้น อย่างที่ฉันบอกว่าการทดสอบหน่วยของฉันไม่แตก - ดังนั้นพวกเขาจึงไม่มีคุณค่าใด ๆ สำหรับฉัน
Yggdrasil

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