2008-12-15 29 views
5

मुझे लगभग 100 यूनिट परीक्षण मिलते हैं और% 20 के कवरेज के साथ, जो मैं कवरेज बढ़ाने की कोशिश कर रहा हूं और यह विकास में एक परियोजना है इसलिए नए परीक्षणों को जोड़ना जारी रखें।लंबे समय तक चलने वाले यूनिट टेस्ट से कैसे निपटें?

वर्तमान में प्रत्येक बिल्ड के बाद मेरे परीक्षण चलाना संभव नहीं है, उन्हें लगभग 2 क्षण लगते हैं।

टेस्ट में शामिल हैं:

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

अधिकांश कार्यक्षमताओं में HTTP पढ़ने, टीसीपी करने आदि की आवश्यकता होती है। मैं उन्हें बदल नहीं सकता क्योंकि अगर मैं इन परीक्षणों को बदलता हूं तो यह परियोजना का पूरा विचार है, यह परीक्षण सामग्री के लिए व्यर्थ होगा।

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

इस समस्या को हल करने के लिए आप मुझे क्या सलाह देंगे? मैं वर्तमान में बीटीयू में बदलाव के बाद यूनिट-टेस्ट चलाने के लिए चाहता हूं कि यह समस्या मेरे प्रवाह में बाधा डाल रही है।

आगे स्पष्टीकरण संपादित करें:

कोड अत्यधिक युग्मित है! दुर्भाग्यवश और बदलना एक बड़ी refatoring प्रक्रिया की तरह है। और इसमें एक चिकन अंडे सिंड्रोम है जहां मुझे ऐसे बड़े कोड को दोबारा करने के लिए यूनिट परीक्षण की आवश्यकता है, लेकिन अगर मैं इसे दोबारा नहीं मानता तो मुझे और यूनिट परीक्षण नहीं मिल सकते हैं :)

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

और मैं पुष्टि कर सकता हूं कि सभी यूनिट परीक्षण (उचित अलगाव के साथ) वास्तव में काफी तेजी से हैं, और मेरे पास उनके साथ प्रदर्शन समस्या नहीं है।


आगे स्पष्टीकरण:

कोड अत्यधिक युग्मित है! दुर्भाग्यवश और बदलना एक बड़ी refatoring प्रक्रिया की तरह है। और इसमें एक चिकन अंडे सिंड्रोम है जहां मुझे ऐसे बड़े कोड को दोबारा करने के लिए यूनिट परीक्षण की आवश्यकता है, लेकिन अगर मैं इसे दोबारा नहीं मानता तो मुझे और यूनिट परीक्षण नहीं मिल सकते हैं :)

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

और मैं पुष्टि कर सकता हूं कि सभी यूनिट परीक्षण (उचित अलगाव के साथ) वास्तव में काफी तेजी से हैं, और मेरे पास उनके साथ प्रदर्शन समस्या नहीं है।

उत्तर

10

ये मेरे लिए यूनिट परीक्षण की तरह नहीं लगते हैं, लेकिन अधिक कार्यात्मक परीक्षणों की तरह। यह ठीक है, स्वचालित कार्यात्मक परीक्षण अच्छा है, लेकिन धीमे होने के लिए कार्यात्मक परीक्षणों के लिए यह बहुत आम है। वे पूरी प्रणाली (या इसके बड़े टुकड़े) का परीक्षण कर रहे हैं।

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

क्या आप बता सकते हैं कि आपके पास कौन से परीक्षण हैं जो यूनिट परीक्षण (केवल 1 चीज का परीक्षण कर रहे हैं) बनाम कार्यात्मक परीक्षण (एक ही समय में 2 या अधिक चीजों का परीक्षण)? कौन सा तेज़ है और कौन सा धीमा है?

+0

तो मुझे लगता है कि सही कदम होगा: कोड को ऐसे तरीके से दोबारा दोहराएं जहां मेरे पास यह अधिक युग्मन नहीं है। फिर रोज़ाना कार्यात्मक परीक्षण चलाते हैं लेकिन प्रत्येक निर्माण के बाद इकाई परीक्षण चलाते हैं? –

+0

इसके अलावा मैंने आपके उत्तर के बारे में प्रश्न अपडेट किया है। –

+0

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

7

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

3

सबसे पहले, वे यूनिट परीक्षण नहीं हैं।

प्रत्येक छोटे बदलाव के बाद इस तरह के एक बिंदु चलने वाले कार्यात्मक परीक्षण नहीं हैं। एक बड़े बदलाव के बाद आप अपने कार्यात्मक परीक्षणों को चलाने के लिए चाहते हैं।

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

मैं आपके एकीकरण स्तर परीक्षण रखूंगा, लेकिन वास्तविक इकाई परीक्षण बनाने का प्रयास करता हूं। यह आपकी गति समस्याओं को हल करेगा। वास्तविक इकाई परीक्षणों में डीबी इंटरैक्शन, या HTTP इंटरैक्शन नहीं होता है।

1

मैं हमेशा "लॉन्गटेस्ट" के लिए एक श्रेणी का उपयोग करता हूं। उन परीक्षणों को हर रात निष्पादित किया जाता है और दिन के दौरान नहीं। इस तरह आप अपना प्रतीक्षा समय बहुत से कर सकते हैं। इसे आज़माएं: अपनी इकाई परीक्षण श्रेणी।

+0

मुझे लगता है कि मुझे वीएस टीएस पैनलों के साथ खेलने की ज़रूरत है, मैं आमतौर पर एनयूनीट का उपयोग करता हूं लेकिन अंतिम रूप से .NET Framework अद्यतनों के बाद एनयूएनआईटी जीयूआई काम नहीं करता है, इसलिए मैं बेवकूफ एमएस टेस्ट सूट और गैलियो के साथ फंस गया। –

1

ऐसा लगता है कि आपको विकास टीम के बीच अपेक्षाओं को प्रबंधित करने की आवश्यकता हो सकती है।

मुझे लगता है कि लोग प्रति दिन कई बिल्ड कर रहे हैं और प्रत्येक निर्माण के बाद परीक्षण चलाने के लिए जुड़े हुए हैं। आप दोपहर के भोजन के दौरान परीक्षण के साथ एक और फिर रात में परीक्षण के साथ अपने परीक्षण कार्यक्रम को स्विच करने के लिए अच्छी तरह से सेवा कर सकते हैं।

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

+0

वास्तव में वर्तमान में मैं यही कर रहा हूं। दिन में 3 बार लगभग यूनिट परीक्षण चलाएं। –

7

मैं आपकी समस्या का एक संयुक्त दृष्टिकोण की सिफारिश करेंगे:

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

सबसे महत्वपूर्ण बातें मैं किताब जैसा कि ऊपर उल्लेख से सीखा में से एक: कोई जादू नहीं है, विरासत कोड के साथ काम करने दर्द है, और हमेशा दर्द हो जाएगा। आप जो कुछ भी कर सकते हैं वह उस तथ्य को स्वीकार कर लेता है, और धीरे-धीरे गड़बड़ी से बाहर निकलने के लिए अपना सर्वश्रेष्ठ प्रयास करता है।

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