2012-07-02 13 views
7

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

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

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

public interface SpatialMap<K, V> extends Iterable<SpatialMap.Entry<K, V>> 
{ 
// Query Operations 

/** 
* Returns the number of key-value mappings in this map. If the map contains more than 
* <tt>Integer.MAX_VALUE</tt> elements, returns <tt>Integer.MAX_VALUE</tt>. 
* 
* @return The number of key-value mappings in this map. 
*/ 
int size(); 

/** 
* Returns <tt>true</tt> if this map contains no key-value mappings. 
* 
* @return <tt>true</tt> if this map contains no key-value mappings. 
*/ 
boolean isEmpty(); 

/** 
* Returns <tt>true</tt> if this map contains a mapping for the specified key. 
* 
* @param key 
*   The key whose presence in this map is to be tested. 
* @return <tt>true</tt> if this map contains a mapping for the specified key. 
*/ 
boolean containsKey(K key); 

/** 
* Returns the value to which the specified key is mapped, or {@code null} if this map contains 
* no mapping for the key. 
* 
* <p>A return value of {@code null} does not <i>necessarily</i> indicate that the map contains 
* no mapping for the key; it's also possible that the map explicitly maps the key to 
* {@code null}. The {@link #containsKey containsKey} operation may be used to distinguish these 
* two cases. 
* 
* @see #put(Comparable, Comparable, Object) 
* 
* @param key 
*   The key whose associated value is to be returned. 
* @return The value to which the specified key is mapped, or {@code null} if this map contains 
*   no mapping for the key. 
*/ 
V get(K key); 

// Modification Operations 

/** 
* Associates the specified value with the specified key in this map. If the map previously 
* contained a mapping for the key, the old value is replaced. 
* 
* @param key 
*   The key with which the specified value is to be associated. 
* @param data 
*   The value to be associated with the specified key. 
* @return The previous value associated with the key, or <tt>null</tt> if there was no mapping 
*   for the key. (A <tt>null</tt> return can also indicate that the map previously 
*   associated <tt>null</tt> with <tt>key</tt>.) 
*/ 
V put(K key, V data); 

/** 
* Removes the mapping for the specified key from this map if present. 
* 
* @param key 
*   The key whose mapping is to be removed from the map. 
* @return The previous value associated with the key, or <tt>null</tt> if there was no mapping 
*   for the key. (A <tt>null</tt> return can also indicate that the map previously 
*   associated <tt>null</tt> with <tt>key</tt>.) 
*/ 
V remove(K key); 

// Bulk Operations 

/** 
* Removes all of the mappings from this map. The map will be empty after this call returns. 
*/ 
void clear(); 
} 

यह यह करने के लिए कठिन बना देता है:

और इसलिए मैं किसी को भी सिर्फ अस्पष्ट ramblings के साथ मदद करने के लिए तैयार नहीं छोड़ते, इंटरफ़ेस मेरी पेड़ों को लागू निम्नलिखित (बंद आधारित जावा संग्रह का मानचित्र इंटरफेस) है के साथ केवल सार्वजनिक विधियों के साथ परीक्षण करें, क्योंकि मुझे कुछ डेटा (बच्चों/अभिभावक पॉइंटर्स) की आवश्यकता है जो सार्वजनिक इंटरफ़ेस से उपलब्ध नहीं हैं। इसके अलावा, त्रिभुज संरचनाओं (पीआर क्वाड्री, पीआरकेडीटी, एमएक्स वेरिएंट, आदि) में नोड्स हैं जो डेटा से अलग होते हैं, इसलिए एक सार्वजनिक विधि बनाना जो "नोड" देता है, मुझे भी सही डेटा प्राप्त करने के लिए बहुत दूर किया जाएगा।

किस तरह की परीक्षण विधि (या तकनीकों जिन्हें मैं जुनीट के साथ उपयोग कर सकता हूं और ऐसा नहीं लगता कि मैं सुंदर संज्ञानात्मक सीमाओं को नष्ट कर रहा हूं) क्या मैं ढूंढ रहा हूं?

उत्तर

5

ऐसे मामले हैं जहां कभी-कभी आपको वास्तव में संरचना की आंतरिक स्थिति का परीक्षण करने की आवश्यकता होती है। इस मामले में मैं प्रतिबिंब का उपयोग कर आंतरिक चर का उपयोग करूंगा। कुछ जुनीट एडॉन्स (PrivateAccessor http://junit-addons.sourceforge.net/junitx/util/PrivateAccessor.html) हैं जो इसे आसान बनाते हैं।

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

+0

आंतरिक स्थिति जहां तक ​​नोड ऑर्डरिंग नहीं जाती है, तब तक कभी नहीं बदलना चाहिए, जब तक कि मेरे शुद्धता प्रमाण वास्तव में सही हों;) – efritz

+2

दाएं लेकिन यदि परिवर्तनीय नाम उदाहरण के लिए बदलते हैं, तो परीक्षण तोड़ सकता है। यह एक श्वेत बॉक्स इकाई परीक्षण (ब्लैकबॉक्स के विपरीत) के अधिक है।कभी-कभी यह शैली उपयुक्त है, और यह आपके मामले में लगता है, यह वही है जो आप खोज रहे हैं। –

1

इस प्रकार की स्थिति में मैंने जिस विधि का उपयोग किया है वह उन आंतरिक क्षेत्रों को संरक्षित करना है, और परीक्षण के लिए उप-वर्ग बनाना है। उस सबक्लास के माध्यम से, आप अपने श्वेत बॉक्स परीक्षण के लिए जो भी राज्य की आवश्यकता है उसका पर्दाफाश कर सकते हैं।

0

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

यूनिट-परीक्षण "purists" के लिए यह अच्छा नहीं है, लेकिन आमतौर पर मैं इसके बारे में कैसे जाता हूं, जब मैं अपनी कक्षा के बाकी हिस्सों में अपनी कक्षा के झटके का पर्दाफाश नहीं करना चाहता लेकिन मैं अभी भी दावा करना चाहता हूं अपने आंतरिक व्यवहार पर।

संबंधित मुद्दे