पीआईएमपीएल मुहावरे परीक्षण को अधिक आसान बनाता है। ओपी के बाद इतने लंबे समय तक जवाब देने के लिए प्रेरित करने के लिए "कार्यान्वयन का परीक्षण न करें" विषय पर उत्तर का एक सेट देखने के लिए पर्याप्त अजीब बात है।
सामान्य रूप से, गैर-पिंपल आधारित सी ++ आपके पास सार्वजनिक और निजी क्षेत्रों के साथ एक कक्षा है। सार्वजनिक क्षेत्रों का परीक्षण करना आसान है, निजी क्षेत्र कुछ हद तक अधिक कठिन हैं। सार्वजनिक और निजी के बीच विभाजन महत्वपूर्ण है, क्योंकि यह एपीआई की चौड़ाई को कम करता है और आमतौर पर बाद में परिवर्तनों को आसान बनाता है।
इस मुहावरे का उपयोग करते समय एक बेहतर विकल्प उपलब्ध है। आपके पास एक ही कक्षा के साथ बिल्कुल "सार्वजनिक" इंटरफेस हो सकता है, लेकिन अब केवल एक निजी क्षेत्र है जिसमें किसी प्रकार का सूचक होता है, उदा।
class my_things
{
public:
my_things();
~my_things();
void do_something_important(int);
int also_this();
private:
struct my_things_real;
std::unique_ptr<my_things_real> state;
};
my_things_real वर्ग बाहर से दिखाई देने वर्ग के नाशक के रूप में ही स्रोत फ़ाइल में दिखाई दे होने की उम्मीद है, लेकिन शीर्षक में नहीं। यह सार्वजनिक इंटरफ़ेस का हिस्सा नहीं है, इसलिए सभी फ़ील्ड सार्वजनिक हो सकते हैं।
void my_things::do_something_important(int x) { state->doit(x); } // etc
class my_things_real // I'd probably write 'struct'
{
public:
int value;
void doit(int x) { value = x; }
int getit() { return value; }
};
यूनिट परीक्षण तब वास्तविक कक्षा के खिलाफ लिखे जाते हैं। जितना चाहें उतना या उससे कम परीक्षण करें। मैंने जानबूझकर इसे "प्रत्यारोपण" के बजाय "वास्तविक" कहा है ताकि यह सुनिश्चित करने में सहायता मिल सके कि यह केवल कार्यान्वयन विस्तार के लिए गलत नहीं है।
इस वर्ग का परीक्षण करना बहुत आसान है क्योंकि सभी फ़ील्ड सार्वजनिक हैं। बाहरी इंटरफ़ेस बहुत छोटा है क्योंकि इसे अन्य वर्ग द्वारा परिभाषित किया गया है। वेफर-पतली अनुवाद परत गलत होने में मुश्किल होती है, लेकिन आप अभी भी बाहरी एपीआई के माध्यम से परीक्षण करने के लिए स्वागत करते हैं। इंटरफ़ेस और कार्यान्वयन को और अधिक महत्वपूर्ण रूप से अलग करने से यह एक स्पष्ट जीत है।
एक अस्पष्ट रूप से संबंधित नोट पर, यह मुझे बेतुका मानता है कि अन्यथा सुसंगत लोग बाहरी एपीआई के माध्यम से आसानी से सुलभ नहीं होने वाली किसी भी चीज़ के लिए यूनिट परीक्षण छोड़ने का समर्थन करते हैं। सबसे कम स्तर के कार्य प्रोग्रामर त्रुटियों के लिए शायद ही प्रतिरक्षा हैं। यह सत्यापित करने के लिए परीक्षण कि एपीआई प्रयोग योग्य है, यह सत्यापित करने के लिए कि कार्यान्वयन विवरण सही हैं, दोनों महत्वपूर्ण और ऑर्थोगोनल हैं।
आपके संपादन का जवाब देने के लिए, यदि आपकी "निजी" कार्यक्षमता पर्याप्त जटिलता है, तो इसे स्वतंत्र रूप से परीक्षण करने की आवश्यकता है, तो आपको इसे अपने मॉड्यूल में रखना चाहिए जिसे आप स्वतंत्र रूप से परीक्षण करते हैं। – zdan