แต่ละวิธีควรมีคลาสทดสอบ JUnit แยกต่างหากหรือไม่?


14

ฉันกำลังเขียนการทดสอบหน่วย JUnit สำหรับชั้นเรียนของฉัน

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

คำตอบ:


19

การจัดระเบียบข้อสอบของคุณนั้นค่อนข้างไม่สำคัญเมื่อเทียบกับความสำคัญของการทดสอบเลย

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

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


9

สำหรับคำถามเฉพาะของคุณการประชุม JUnitคือต้องมีการโต้ตอบ 1: 1 ระหว่างคลาสแอ็พพลิเคชันของคุณ ( Foo1.java, Foo2.java) และคลาสทดสอบ JUnit ( Foo1Test.java, Foo2Test.java)

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


4

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

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


2

ฉันคิดว่า "คลาสทดสอบหนึ่งวิธีต่อหนึ่งวิธี" และ "หนึ่งคลาสทดสอบต่อคลาส" มักจะสุดโต่งเกินไป

โดยทั่วไปคุณต้องการตรวจสอบหนึ่งวิธีต่อการทดสอบ / การทดสอบหน่วย ตัวอย่างเช่นสิ่งเหล่านี้อาจเป็นการยืนยันที่หลากหลายเพื่อตรวจสอบว่า a list.isEmpty = trueและlist.Length = 0ดังนั้นวิธีการทดสอบ / การทดสอบหนึ่งหน่วยต่อพฤติกรรมหนึ่งอย่าง

สิ่งนี้ทำให้ง่ายต่อการสร้างชื่อวิธีทดสอบที่อธิบายลักษณะการทำงาน คุณต้องการที่จะวิธีการทดสอบในกลุ่มระดับการทดสอบดังนั้นเมื่อคุณอ่านtest classname.test methodมันทำให้รู้สึก โดยทั่วไปจะมีรหัสการตั้งค่าที่ใช้ร่วมกันซึ่งง่ายต่อการใส่ในการตั้งค่าการทดสอบ / การติดตั้ง ทั้งนี้ขึ้นอยู่กับชั้นเรียนที่อยู่ภายใต้การทดสอบนี้สามารถเป็นชั้นทดสอบหนึ่งสำหรับทั้งชั้นเรียนและยังสามารถเป็นชั้นทดสอบหนึ่งสำหรับวิธีการหนึ่ง แต่โดยปกติมันจะอยู่ที่ไหนสักแห่งในระหว่าง

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

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

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

แน่นอนฉันเห็นด้วยกับ Kilian Foth: ในทางปฏิบัติคุณสามารถโชคดีที่มีการทดสอบหน่วยสำหรับโค้ดที่คุณใช้งานอยู่ และการทดสอบที่แปลเป็นภาษาท้องถิ่นเล็ก ๆ นั้นดีกว่าการทดสอบไม่เลยหรือการทดสอบการรวมขนาดใหญ่ที่รันบน build server ใช้เวลานานและมักจะไม่แปลเป็นภาษาท้องถิ่น จะต้องทำงานกับมันเล็กน้อย)


จุดดี: "คุณต้องการจัดกลุ่ม testmethods ใน testclass ดังนั้นเมื่อคุณอ่าน testclassname.test วิธีที่เหมาะสม"
MAChitgarha

1

ฉันคิดว่ามันถูกต้องว่าแต่ละชั้นมีชั้นทดสอบ แนวคิดคือการรวมการทดสอบหน่วยทั้งหมดที่เกี่ยวข้องกับคลาสเป้าหมายในคลาสทดสอบเดียว แล้วสำหรับตัวอย่างเช่นจะมีการทดสอบระดับที่เรียกว่าMyClass.javaMyClassTest.java


0

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

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