หลักการตั้งชื่อสำหรับแพ็คเกจทดสอบ


11

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

src/main/java
    com.hello.world
        helloWorld.java
src/test/java
    com.hello.world
        helloWorldTest.java

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


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

@DavidArno ขอบคุณสำหรับการป้อนข้อมูลของคุณ :) วิธีหลีกเลี่ยงการตั้งชื่อ smurf แล้ว? ฉันหมายความว่าเราจะจบลงด้วย com.hello.world.test.helloWorld.java ใช่มั้ย
OddDev

"การ Smurf" ปัญหามีมากขึ้นเมื่อคุณมีวิธีการในการXXXTest() com.hello.world.test.helloWorldTest.javaคำแนะนำทั่วไปจะมีเพียง "การทดสอบ" ปรากฏขึ้นหนึ่งครั้งในเส้นทางดังนั้น (a) ใช้การทดสอบในชื่อแพ็คเกจ (และตั้งชื่อไฟล์ทดสอบเหมือนกับไฟล์ที่อยู่ใต้การทดสอบ) หรือ (b) ทำให้ชื่อแพคเกจเป็น เหมือนกันและเพิ่ม "ทดสอบ" ลงในชื่อไฟล์ / คลาส
David Arno

@DavidArno อ่าขอบคุณสำหรับการชี้แจง! ฉันได้รับความคิดเห็นแรกของคุณผิด ฉันเข้าใจแล้ว.
OddDev

ดีฉันเถียงว่าถ้ามันไม่ชัดเจนผมได้แสดงความคิดเห็นครั้งแรกของฉันที่ไม่ถูกต้อง :)
เดวิดอาร์โน

คำตอบ:


11

นั่นคือการประชุมที่ดี

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

ไม่ควรมีความสับสนเกี่ยวกับการมีคลาสทดสอบหน่วยในเนมสเปซเดียวกันเนื่องจากไม่ควรอยู่ในคลาสพา ธ เมื่อรวบรวมหรือเรียกใช้รหัสการผลิต

นี่คือตัวอย่างของโมดูลขนาดเล็กที่มีส่วนต่อประสานสาธารณะชั้นโรงงานสาธารณะและชั้นเรียนการใช้งานแพคเกจส่วนตัวสองชั้น:

src/main/java:
    com.hello.transmogrifier
        public interface Transmogrifier
        public class TransmogrifierFactory
        class MapTransmogrifier implements Transmogrifier
        class ListTransmogrifier implements Transmogrifier

scr/test/java:
    com.hello.transmogrifier
        public class TransmogrifierFactoryTest
        public class MapTransmogrifierTest
        public class ListTransmogrifierTest

การซ่อนการใช้งานอินเทอร์เฟซของ Transmogrifier อาจเป็นตัวเลือกการออกแบบที่ถูกต้อง อาจเป็นความรับผิดชอบของคลาสโรงงานที่จะเลือกการใช้งาน

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


1
"โดยปกติคุณต้องการเขียนการทดสอบหน่วยสำหรับคลาสและเมธอดของแพ็คเกจและไพรเวตด้วย" No! นี่เป็นการฝึกฝนที่ไม่ดีจริงๆ ประเภทแพคเกจส่วนตัวเป็นรายละเอียดการใช้งานและไม่ควรทดสอบโดยตรง ทดสอบ API สาธารณะเท่านั้น
David Arno

1
@DavidArno ฉันไม่เห็นด้วย อย่างไรก็ตามฉันแทนที่คำว่า "มักจะ" ด้วยคำว่า "บางครั้ง" เพื่อหลีกเลี่ยงการสนทนานั้น
จาก

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

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

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