การแยกคลาส JUnit ออกเป็นชุดทดสอบพิเศษ?


118

ฉันเรียนรู้แนวคิดการพัฒนาทดสอบขับเคลื่อนผ่านการอ่านบทความช่าง (คลิกช่างภายใต้ตามกระทู้ ) แนะนำไว้ในคำตอบสำหรับคำถามของฉันก่อนหน้า"โครงการตัวอย่างสำหรับการเรียนรู้ JUnit และวิศวกรรมซอฟต์แวร์ที่เหมาะสม" โดนใจสุด ๆ !

แต่ตอนนี้ฉันอยากจะนั่งลงและลองด้วยตัวเอง ฉันมีคำถามที่หวังว่าจะต้องการเพียงคำตอบง่ายๆ

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

คุณใส่คลาสทดสอบใน org.myname.project.test. * และโค้ดปกติใน org.myname.project. * หรือไม่ คุณจัดชั้นเรียนทดสอบควบคู่ไปกับชั้นเรียนปกติหรือไม่? คุณชอบที่จะนำหน้าชื่อชั้นเรียนด้วย Test มากกว่าคำต่อท้ายหรือไม่?

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

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


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


คำตอบ:


154

ฉันชอบใส่คลาสทดสอบลงในแพ็คเกจเดียวกับคลาสโปรเจ็กต์ที่พวกเขาทดสอบ แต่อยู่ในไดเร็กทอรีฟิสิคัลอื่นเช่น:

myproject/src/com/foo/Bar.java
myproject/test/com/foo/BarTest.java

ในโครงการ Maven จะมีลักษณะดังนี้:

myproject/src/main/java/com/foo/Bar.java
myproject/src/test/java/com/foo/BarTest.java

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

ดังตัวอย่างข้างต้นแสดงให้เห็นว่าคลาสทดสอบของฉันมีชื่อของคลาสทดสอบบวกTestเป็นส่วนต่อท้าย สิ่งนี้ช่วยให้ค้นหาได้อย่างรวดเร็ว - ไม่ใช่เรื่องตลกที่จะลองค้นหาในชั้นเรียนทดสอบสองร้อยคลาสโดยแต่ละชื่อเริ่มต้นด้วยTest...

อัปเดตโดยได้รับแรงบันดาลใจจากความคิดเห็นของ @ Ricket: วิธีนี้ชั้นเรียนทดสอบ (โดยทั่วไป) จะปรากฏขึ้นทันทีหลังจากเพื่อนที่ทดสอบในรายการตามตัวอักษรของโครงการ (ตลกดีที่ฉันได้รับประโยชน์จากสิ่งนี้ในแต่ละวันโดยไม่ได้ตระหนักถึงวิธีการ ... )

อัปเดต 2:นักพัฒนาจำนวนมาก (รวมถึงตัวฉันเอง) เช่น Maven แต่อย่างน้อยก็มีหลายคนที่ไม่ทำเช่นนั้น IMHO มีประโยชน์มากสำหรับโปรเจ็กต์ Java "กระแสหลัก" (ฉันจะใส่ประมาณ 90% ของโปรเจ็กต์ในหมวดหมู่นี้ ... แต่อีก 10% ยังเป็นส่วนน้อยที่มีขนาดใหญ่) ใช้งานง่ายหากสามารถยอมรับอนุสัญญา Maven ได้ แต่ถ้าไม่มันก็ทำให้ชีวิตต้องดิ้นรนอย่างน่าสังเวช Maven ดูเหมือนจะเป็นเรื่องยากที่จะเข้าใจสำหรับคนจำนวนมากที่เข้าสังคม Ant เพราะเห็นได้ชัดว่าต้องใช้วิธีคิดที่แตกต่างกันมาก (ตัวฉันเองไม่เคยใช้ Ant เลยไม่สามารถเปรียบเทียบทั้งสองได้) สิ่งหนึ่งที่แน่นอนคือมันทำให้การทดสอบหน่วย (และการรวม) เป็นขั้นตอนที่เป็นธรรมชาติชั้นหนึ่งในกระบวนการซึ่งช่วยให้นักพัฒนานำแนวทางปฏิบัติที่จำเป็นนี้ไปใช้


6
ฉันเห็นด้วยกับหมายเหตุต่อท้ายด้วย นอกจากนี้เนื่องจากคลาสทดสอบถูกแยกออกเป็นโฟลเดอร์ทางกายภาพที่แตกต่างกันจึงไม่จำเป็นต้องพยายามและนำหน้าด้วยการทดสอบในบางครั้งเพื่อหลอกล่อลำดับตัวอักษรในการจัดกลุ่มและฉันคิดว่า SomeClassTest อ่านได้ดีกว่า
Ricket

การประชุมที่ยอดเยี่ยม +1
วิสกี้เซียร่า

1
สิ่งหนึ่งเกี่ยวกับการใส่คลาสทดสอบในแพ็คเกจเดียวกัน: แม้ว่าจะอนุญาตให้ใช้สมาชิกแบบแพ็กเกจส่วนตัว (ซึ่งทำไมฉันถึงใช้โครงร่างนี้ด้วย) แต่ก็ไม่อนุญาตให้ทดสอบการมองเห็นโดยอัตโนมัติโดยเฉพาะ หากคุณใช้ TDD และปล่อยให้ IDE ของคุณสร้างต้นขั้วเมธอดที่จำเป็น อาจสร้างสิ่งเหล่านี้ด้วยการมองเห็นแบบแพ็คเกจส่วนตัว (NetBeans ฉันกำลังมองหาคุณ) ซึ่งทำให้การทดสอบของคุณผ่านไปอย่างสมบูรณ์แบบ (หลังจากที่คุณนำการใช้งานไปใช้จริงในต้นขั้วนั้น) แต่อาจล้มเหลวในการใช้งานจริง (หากคุณลืมเพิ่มpublic) .
Sergei Tachenov

แม้ว่าการประชุมนี้จะน่าสนใจ แต่คุณจะทำอย่างไรเมื่อชุดทดสอบเติบโตขึ้น เช่นสมมติว่าคุณมี 6 วิธีในชั้นเรียนแต่ละวิธีมีแบบทดสอบ 10 ข้อ คุณมีการทดสอบ 60 ครั้งในชั้นเรียนของคุณหรือไม่? โดยปกติฉันจะแบ่งย่อยคลาสทดสอบ (หนึ่งคลาสทดสอบต่อหนึ่งวิธี) ปัญหานี้คือคุณอาจพบคลาสมากมายในชุดทดสอบของคุณ
mmalmeida

1
@Thick_propheT ใน Eclipse: คลิกขวาที่ชื่อโปรเจ็กต์คลิกใหม่ - อื่น ๆ ... จากนั้นภายในโฟลเดอร์ Java ให้เลือกโฟลเดอร์ซอร์ส ตั้งชื่อว่า "ทดสอบ" จากนั้นถ้าคุณทำตามขั้นตอนข้างต้นให้เพิ่มแพ็คเกจใหม่ในโฟลเดอร์ทดสอบนี้ที่มีชื่อเดียวกันกับแพ็คเกจของคลาสที่คุณต้องการเขียนกรณีทดสอบจากนั้นในแพ็คเกจให้เพิ่ม JUnit Test Case ใหม่ (อยู่ใน โฟลเดอร์ Java / Junit เมื่อคุณทำ New-Other ... ) ในการที่วิซาร์ดใหม่ที่คุณสามารถระบุระดับที่ถูกทดสอบและตั้งชื่อกรณีทดสอบของคุณเป็นชื่อเดียวกันกับ "ทดสอบ" ต่อท้าย
Inor

15

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


12

ผมใช้Maven โครงสร้างที่ Maven ส่งเสริมคือ: -

src/main/java/org/myname/project/MyClass.java

src/test/java/org/myname/project/TestMyClass.java

กล่าวคือคลาสทดสอบที่มีการทดสอบนำหน้าชื่อของคลาสภายใต้การทดสอบอยู่ในโครงสร้างไดเร็กทอรีคู่ขนานกับการทดสอบหลัก

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


18
ฉันว่ามัน<class>Test.javaไม่ใช่Test<class>.java
Mike Rylander

2
Maven จะยอมรับรูปแบบการอย่างใดอย่างหนึ่งตามเอกสาร Maven Surefire ปลั๊กอิน
Elijah Woodward

3
ฉันขอยืนยันว่า<class>Test.javaรูปแบบการตั้งชื่อทำให้ทั้งคลาสหลักและคลาสทดสอบแสดงอย่างใกล้ชิดเมื่อใช้คุณสมบัติการค้นหา IDE ซึ่งทำให้ดีกว่าTest<class>.javaเล็กน้อย
christopheml

1
@christopheml ฉันเห็นด้วยนั่นคือสิ่งที่ฉันทำตอนนี้
Martin

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