स्केलेबल और साइड-इफ़ेक्ट फ्री इंटीग्रेशन टेस्ट कैसे बनाएं?


14

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

यहां एक विशिष्ट एकीकरण परीक्षण है (ये परीक्षण डेटाबेस परत को छूते हैं):

public class OrderTests {

    List<Order> ordersToDelete = new ArrayList<Order>(); 

    public testOrderCreation() {
        Order order = new Order();
        assertTrue(order.save());
        orderToDelete.add(order);
    }

    public testOrderComparison() {
        Order order = new Order();
        Order order2 = new Order();
        assertFalse(order.isEqual(order2);
        orderToDelete.add(order);
        orderToDelete.add(order2);
    }
    // More tests

    public teardown() {
         for(Order order : ordersToDelete)
             order.delete();
    }
}

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

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

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

जवाबों:


6

इकाई परीक्षण के लिए हाइपरसोनिक, या दूसरे इन-मेमोरी डीबी का उपयोग करने पर ध्यान दें। न केवल परीक्षण तेजी से निष्पादित होंगे, लेकिन साइड-इफेक्ट प्रासंगिक नहीं हैं। (प्रत्येक परीक्षण के बाद लेन-देन को वापस करना भी एक ही उदाहरण पर कई परीक्षण चलाना संभव बनाता है)

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

हां, मैं स्वयं इस विधि का उपयोग करता हूं, और हां यह पहला समय स्थापित करने के लिए एक पीआईटीए था, लेकिन यह उस परियोजना के जीवनकाल में खुद के लिए भुगतान से अधिक है जो मैं पूरा करने वाला हूं। ऐसे कई टूल भी हैं जो डेटा मॉकअप की मदद करते हैं।


बहुत अच्छा विचार लगता है। मुझे विशेष रूप से इसका पूरा अलगाव पहलू पसंद है; एक नए डेटाबेस इंस्टॉल के साथ शुरुआत। ऐसा लगता है कि यह कुछ प्रयास करेगा, लेकिन एक बार सेटअप करने के बाद यह बहुत फायदेमंद होगा। धन्यवाद।
ग्वेन

3

यह सनातन समस्या है जिसका एकीकरण परीक्षण लिखते समय सभी को सामना करना पड़ता है।

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

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


मुझे विश्वास नहीं हो रहा है कि मैंने लेन-देन रोलबैक के बारे में नहीं सोचा है। मैं उस विचार का उपयोग समाधान के त्वरित समाधान के रूप में करूंगा, लेकिन अंततः इन-मेमोरी डीबी बहुत आशाजनक लगता है।
ग्वेन

3

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

हालांकि आपको अपने लेन-देन के दायरे को बढ़ाने के लिए कभी नहीं करना चाहिए। कुछ लोगों ने लेनदेन पर नियंत्रण रखने और परीक्षणों के बाद इसे वापस करने का सुझाव दिया। जब आप ऐसा करते हैं, तो सभी इकाइयाँ (यह मानकर कि आप JPA का उपयोग कर रही हैं) पूरे परीक्षण निष्पादन के दौरान दृढ़ता के संदर्भ से जुड़ी रहेंगी । इसके परिणामस्वरूप कुछ बहुत ही खराब कीड़े हो सकते हैं जिन्हें ढूंढना बहुत मुश्किल है

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

आपकी प्रदर्शन समस्याओं के अनुसार, आपको प्रत्येक बिल्ड पर एकीकरण परीक्षणों को निष्पादित नहीं करना चाहिए। अपने निरंतर एकीकरण सर्वर को ऐसा करने दें। यदि आप मावेन का उपयोग करते हैं, तो आप फेलसेफ प्लग-इन का आनंद ले सकते हैं, जिससे आप अपने परीक्षणों को इकाई और एकीकरण परीक्षणों में अलग कर सकते हैं।

इसके अलावा, आपको कुछ भी मजाक नहीं करना चाहिए। याद रखें कि आप एकीकरण परीक्षण, यानी रन-टाइम निष्पादन वातावरण के भीतर व्यवहार का परीक्षण कर रहे हैं।


अच्छा उत्तर। एक बिंदु: यह कुछ बाहरी निर्भरता (जैसे ईमेल भेजने) का मजाक उड़ाने के लिए स्वीकार्य हो सकता है। लेकिन आप पूरी तरह से नकली सेवा / सर्वर की स्थापना करके नहीं बल्कि जावा कोड में इसका मजाक उड़ाते हैं।
साल्स्के

Sleske, मैं आपसे सहमत हूं। खासकर जब आप JPA, EJB, JMS का उपयोग कर रहे हों या किसी अन्य विनिर्देश के विरुद्ध कार्यान्वित कर रहे हों। आप एप्लिकेशन सर्वर, दृढ़ता प्रदाता या डेटाबेस को स्वैप कर सकते हैं। उदाहरण के लिए, आप बस सेट-अप और गति में सुधार के लिए एम्बेडेड ग्लासफिश और एचएसक्यूएलडीबी का उपयोग करना चाह सकते हैं (आप एक और प्रमाणित कार्यान्वयन का चयन करने के लिए निश्चित रूप से स्वतंत्र हैं)।
बेनआर

2

स्केलेबिलिटी पर

मुझे कुछ समय पहले यह समस्या हुई है, कि एकीकरण परीक्षण चलाने में बहुत लंबा समय लग रहा था और एक एकल डेवलपर के लिए परिवर्तनों की तंग प्रतिक्रिया पाश में लगातार चलने के लिए व्यावहारिक नहीं थे। इससे निपटने के लिए कुछ रणनीतियाँ हैं:

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

अधिक प्रभाव के लिए इन तकनीकों के संयोजन का प्रयास करें।


1
वास्तव में अच्छे दिशानिर्देश; कम एकीकरण परीक्षण लिखना सर्वोत्तम सलाह के लिए सुनिश्चित है। इसके अलावा, उन्हें समानांतर में चलाना एक बहुत अच्छा विकल्प होगा; यह जांचने के लिए कि क्या मेरे परीक्षण सीधे अलगाव के संदर्भ में हैं, एक संपूर्ण "परीक्षण"।
Guven

2

परीक्षण उद्देश्यों के लिए हमने एक SQLite डेटाबेस की फाइल आधारित तैनाती का उपयोग किया है (बस एक संसाधन की प्रतिलिपि बनाएँ)। ऐसा इसलिए किया गया ताकि हम स्कीमा माइग्रेशन का भी परीक्षण कर सकें। जहाँ तक मुझे जानकारी है, स्कीमा परिवर्तन लेन-देन योग्य नहीं हैं, इसलिए लेन-देन समाप्त होने के बाद वापस नहीं लौटाया जाएगा। इसके अलावा परीक्षण सेटअप के लिए लेनदेन समर्थन पर भरोसा नहीं करने से आपके आवेदन से लेनदेन के व्यवहार का ठीक से परीक्षण करने की अनुमति मिलती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.