2008-10-24 26 views
10

बड़े डेटा सेटों का परीक्षण करने का सबसे अच्छा तरीका क्या है? कुछ विरासत कोड जो मैं रख रहा हूं उनमें सौ सदस्यों या अधिक की संरचनाएं हैं; कोड के अन्य हिस्सों जिन्हें हम सैकड़ों नमूनों के डेटा सेट बनाने या विश्लेषण करने पर काम कर रहे हैं।यूनिट परीक्षण बड़े डेटा सेट?

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

क्या कोई बेहतर समाधान है?

+0

यदि आप डेटा का परीक्षण कर रहे हैं, तो मुझे लगता है कि आपको डिस्क को छूना है। – MrBoJangles

+0

यदि आप डेटा को नकली बना सकते हैं, तो आप इसे स्मृति में बना सकते हैं - लेकिन यदि यह वास्तविक डेटा है जिसे आप परीक्षण करना चाहते हैं, तो आपको इसे डिस्क से पढ़ना होगा। मुझे नहीं पता कि आप किस प्रकार का डेटा वर्णन कर रहे हैं, लेकिन आप इसे एक टेक्स्ट फ़ाइल में पढ़ सकते हैं और इसे अपने कोड, स्मृति में, शायद संकलित कर सकते हैं। – pc1oad1etter

उत्तर

1

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

मैं जब डेटा की बड़ी मात्रा का परीक्षण इस दृष्टिकोण का उपयोग किया है, और मैं इसे काफी अच्छी तरह से काम करता है क्योंकि छोटी इकाइयों पोषणीय हैं, और फिर मुझे पता है कि थोक परीक्षण काम करता है, और यह सब स्वचालित है।

3

यदि आप जो हासिल करने की कोशिश कर रहे हैं, वास्तव में, एक इकाई परीक्षण आपको अंतर्निहित डेटा संरचनाओं का नकल करना चाहिए और डेटा अनुकरण करना चाहिए। यह तकनीक आपको इनपुट पर पूर्ण नियंत्रण देती है। उदाहरण के लिए, आपके द्वारा लिखे गए प्रत्येक परीक्षण में एक डेटा बिंदु संभाल सकता है और आपके पास प्रत्येक शर्त के लिए परीक्षणों का एक संक्षिप्त संयोजन होगा। वहां कई खुले स्रोत मॉकिंग फ्रेमवर्क हैं, मैं व्यक्तिगत रूप से राइनो मोक्स (http://ayende.com/projects/rhino-mocks/downloads.aspx) या एनएमॉक (http://www.nmock.org) की अनुशंसा करता हूं।

यदि डेटा संरचनाओं का नकल करना आपके लिए संभव नहीं है तो मैं refactoring की सलाह देता हूं ताकि आप यह कर सकें :-) इसके लायक है! या आप TypeMock (http://www.typemock.com/) को भी आजमा सकते हैं जो कंक्रीट कक्षाओं का मज़ाक उड़ाता है।

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

1

सबसे अच्छा तरीका मैं अब तक मिल गया है, डिस्क से संरचनाओं या डेटा सेट को क्रमानुसार परीक्षण के अंतर्गत कार्रवाई करने, डिस्क के लिए परिणाम क्रमानुसार करने है, तो diff फ़ाइलों के खिलाफ धारावाहिक परिणाम युक्त फ़ाइलों की उम्मीद युक्त परिणाम है।

मैंने कोड लिखा है जो परीक्षण में डिस्क से क्रमबद्ध करने के अलावा उपर्युक्त तकनीक का उपयोग करता है, मैंने धारावाहिक डेटा को बाइट सरणी में परिवर्तित कर दिया है जो संकलक आपके लिए निष्पादन योग्य में रख सकता है।

उदाहरण के लिए, अपने धारावाहिक डेटा में परिवर्तित किया जा सकता है:

unsigned char mySerialisedData[] = { 0xFF, 0xFF, 0xFF, 0xFF, ... }; 

test() 
{ 
    MyStruct* s = (MyStruct*) mySerialisedData; 

} 

एक और अधिक वर्बोज़ उदाहरण के लिए (सी # में) इस unit test देखते हैं। यह परीक्षणों में इनपुट के रूप में कुछ हार्डकोडेड धारावाहिक डेटा का उपयोग करने, असेंबली हस्ताक्षर का परीक्षण करने का एक उदाहरण दिखाता है।

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