परीक्षण पैकेज के लिए नामकरण सम्मेलन


11

हम वास्तव में अपने टेस्ट पैकेजों का नामकरण उनके टेस्ट-समकक्षों की तरह कर रहे हैं। इसलिए हम इस संरचना को समाप्त करते हैं:

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

मैंने हमेशा महसूस किया कि यह बहुत स्मार्ट नहीं है क्योंकि आप "टेस्ट" और "टू-टेस्ट" के बीच अंतर नहीं कर सकते हैं यदि केवल पैकेज नाम के साथ प्रदान किया गया है। दूसरी ओर मुझे वास्तव में ऐसा मामला नहीं मिला जहां यह किसी तरह से मायने रखता हो। क्या पैकेज (परीक्षण मामलों और स्रोत कक्षाओं के लिए) दोनों के लिए समान नामकरण परंपराओं का पालन करना अच्छा है? यदि नहीं, तो एक बेहतर तरीका क्या होगा?


1
अगर यह अच्छा अभ्यास है, तो कोई विचार नहीं है, लेकिन यह एक लोकप्रिय है। अन्य विकल्प (पैकेज के नाम, विधि के नाम आदि में "टेस्ट" डालने के लिए "स्मर्फ नामकरण" का थोड़ा बहुत स्मैक है। जैसा कि आप कहते हैं, ऐसे मामले के बारे में सोचना मुश्किल है जहां "परीक्षण" और "टू-टेस्ट" के बीच अंतर करने में असमर्थ होने पर "केवल पैकेज नाम के साथ प्रदान किया गया" एक समस्या होगी।
डेविड अरनो

@DavidArno आपके इनपुट के लिए धन्यवाद :) फिर स्मर्फ-नेमिंग से कैसे बचें? मेरा मतलब है कि हम com.hello.world.test.helloWorld.java के साथ समाप्त करेंगे, हम नहीं करेंगे?
OddDev

जब आपके पास कोई विधि हो तो "smurf" समस्या अधिक होती XXXTest()है com.hello.world.test.helloWorldTest.java। सामान्य सलाह केवल पथ में एक बार "टेस्ट" दिखाई देने की होगी, इसलिए या तो (ए) पैकेज नाम में परीक्षण का उपयोग करें (और परीक्षण फ़ाइल को परीक्षण के तहत फ़ाइल के रूप में नाम दें) या (बी) पैकेज का नाम बनाएं समान और फ़ाइल / वर्ग नाम में "परीक्षण" जोड़ें।
डेविड अरनो

@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
"आमतौर पर आप पैकेज-निजी कक्षाओं और विधियों के लिए इकाई परीक्षण लिखना चाहते हैं"। नहीं! यह वास्तव में बुरा अभ्यास है। पैकेज निजी प्रकार कार्यान्वयन विवरण हैं और कभी भी सीधे परीक्षण नहीं किए जाने चाहिए। केवल सार्वजनिक एपीआई का परीक्षण करें।
डेविड अरनो

1
@DavidArno मैं असहमत हूं। हालांकि, मैंने उस विशेष चर्चा से बचने के लिए "कभी-कभी" शब्द के साथ "आमतौर पर" शब्द को बदल दिया।
आया

1
आप अपने इच्छित सभी असहमत हो सकते हैं, लेकिन कोड के एक टुकड़े के आंतरिक कामकाज का परीक्षण करना उन दोनों आंतरिक कामकाज और परीक्षणों के बीच युग्मन को कसने और भंगुर परीक्षणों की ओर जाता है जो कि सरल रीफैक्टरिंग के दौरान आसानी से टूट जाते हैं। यह बहुत बुरा अभ्यास है।
डेविड अरनो

यदि मैं यह सुनिश्चित करना चाहता हूं कि मेरे सभी ट्रांसमोग्रिफ़र कार्यान्वयन काम करते हैं, तो कोई फर्क नहीं पड़ता कि कारखाना क्या करता है, तो मैं इकाई परीक्षण लिखने जा रहा हूं जो प्रत्येक कार्यान्वयन का परीक्षण करते हैं। ध्यान दें कि वर्गों के पैकेज-निजी होने के बावजूद कार्यान्वयन में एक साझा सार्वजनिक API है। जब तक मैं सार्वजनिक एपीआई नहीं बदल देता, ये परीक्षण नहीं टूटना चाहिए। वास्तव में, मैं शायद एक ट्रांसमोग्रिफ़र के लिए एक सामान्य परीक्षण लिखूंगा और फिर इसे प्रत्येक कार्यान्वयन के खिलाफ चलाऊंगा। हालांकि कारखाने का उपयोग करते हुए प्रत्येक कार्यान्वयन प्राप्त करना संभव है, ट्रांसएमोग्रिफ़ायर का परीक्षण करते समय उस निर्भरता को न करना बेहतर है।
से आया

फिर एक दिन, अपने आप को देखो MapTransmogrifierऔर ListTransmogrifierऔर तय करते हैं वे, एक वर्ग में बनाया जा सकता है तो आपके द्वारा बनाए गए ListMapTransmogrifier, कारखाने का उपयोग करने कि और दो वर्गों को नष्ट संशोधित करते हैं। कोड अब संकलित नहीं करता है, इसलिए आपको प्रत्येक परीक्षण को दोनों में संशोधित करना होगा MapTransmogrifierTestऔर ListTransmogrifierTestइसे संकलित करना होगा। एक परीक्षण विफल रहता है। क्या यह परीक्षण बदलने या बनाने के कारण था ListMapTransmogrifier? डिबगर को पता लगाने के लिए बाहर आता है ... वैकल्पिक रूप से जब परीक्षण कारखाने का उपयोग करते हैं, तो आप उस रिफ्लेक्टर को करते हैं और सभी अभी भी संकलित करते हैं ...
डेविड अरनो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.