9

रन पूर्ण PHPUnit सूट उठाने के लिए आवश्यक समय के रूप में, हमारी टीम सोचती है कि समानांतर में यूनिट परीक्षण चलाने की संभावना है या नहीं। हाल ही में मैंने पैराुनिट के बारे में एक लेख पढ़ा, सेबेस्टियन बर्गमैन ने भी लिखा, वह PHPUnit 3.7 में समांतरता जोड़ देगा।एकीकरण परीक्षणों में समांतर PHPUnit परीक्षण

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

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

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

+1

इससे संबंधित एक प्रश्न (समानांतर XUnit के बारे में आम तौर पर): http://programmers.stackexchange.com/q/56092/58909 लेकिन फिर, कैसे-परीक्षण के साथ डेटाबेस वास्तव में tackled नहीं है। –

+0

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

+0

मैं उन्हें अलग-अलग वीएम में चलाऊंगा। –

उत्तर

4

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

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

पीडीओ का उपयोग करते समय, मैं आमतौर पर एसक्लाइट :: मेमोरी का उपयोग करता हूं: प्रत्येक परीक्षण का अपना डेटाबेस होता है। परीक्षण समाप्त होने पर यह अज्ञात है और स्वचालित रूप से साफ़ हो जाता है। (लेकिन मैंने इस बारे में कुछ समस्याएं देखी हैं जब आप वास्तविक अनुप्रयोग एसक्लाइट का उपयोग नहीं कर रहे हैं: Suggestions to avoid DB deps when using an in-memory sqlite DB to speed up unit tests)

डेटाबेस का उपयोग करते समय जिसमें स्मृति में कोई विकल्प नहीं है, डेटाबेस को यादृच्छिक नाम के साथ बनाएं। यदि समांतरता PHPUnit प्रक्रिया स्तर पर है, तो काफी मोटे, आप प्रक्रिया पिड का उपयोग कर सकते हैं। लेकिन इसका यादृच्छिक नाम पर कोई वास्तविक लाभ नहीं है। (मुझे पता है कि PHP एकल-थ्रेडेड है, लेकिन शायद भविष्य में हमारे पास एक कस्टम phpUnit मॉड्यूल होगा, जो समानांतर में परीक्षण चलाने के लिए थ्रेड का उपयोग करता है; हम इसके लिए भी तैयार हो सकते हैं।)

यदि आपके पास xUnit टेस्ट है पैटर्न पुस्तक, अध्याय 13 परीक्षण डेटाबेस (अपेक्षाकृत कम) के बारे में है। क्षणिक बनाम लगातार फिक्स्चर पर अध्याय 8 और 9 भी उपयोगी हैं। और, बेशक, पुस्तक के सबसे अमूर्त परतों पर आसान :-)

+0

उत्तर के लिए धन्यवाद। हमारे यूनिट परीक्षणों में हम मोक्स का उपयोग करते हैं, और वे वास्तव में तेज़ हैं!लेकिन अब हम अपने आरईएसटी-इंटरफ़ेस के लिए परीक्षण बना रहे हैं और इसे पूरी तरह कार्यात्मक परीक्षणों के साथ परीक्षण करना चाहते हैं, और वे धीमे हैं। मैंने पर्यावरण चर के साथ [paratest] (https://github.com/brianium/paratest) टूल की कोशिश की है TEST_TOKEN प्रत्येक phpunit प्रक्रिया के लिए अस्थायी डीबी बनाने के लिए प्रयोग किया जाता है। लेकिन अभी भी ZF2/सिद्धांत/कैशिंग के कारण कुछ दौड़ की स्थिति हैं, और समस्या को ढूंढना वाकई मुश्किल है। इसलिए हमने सेबेस्टियन बर्गमैन से phpunit के समानांतर कार्यान्वयन की प्रतीक्षा करने का फैसला किया। –

0

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

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

आप एकीकरण परीक्षण से बच सकते हैं 2 तरीके का विरोध करता है:

  • केवल उन परीक्षण समानांतर है, जो अपने डेटाबेस की बहुत अलग तालिकाओं का उपयोग करता चल रहा है, तो वे संघर्ष नहीं है
  • के लिए एक नया डेटाबेस बनाने विरोधाभासी परीक्षण

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

ध्यान रखें, वही संघर्ष PHP में भारी लोडिंग के तहत समवर्ती मुद्दों का कारण बन सकता है। उदाहरण के लिए यदि आप दो अलग-अलग नियंत्रक कार्रवाई के तहत 2 फ़ाइलों को रिवर्स ऑर्डर में लॉक करते हैं, तो आपका एप्लिकेशन डेडलॉक में समाप्त हो सकता है ... मैं PHP में समवर्ती मुद्दों का परीक्षण करने का एक तरीका ढूंढ रहा हूं, लेकिन अब तक कोई भाग्य नहीं है। मेरे पास वर्तमान में अपना समाधान लिखने का समय नहीं है, और मुझे यकीन नहीं है कि मैं इसे प्रबंधित कर सकता हूं, यह बहुत कठिन सामान है ...: एस

0

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

हमारा पुराना कोडबेस 30 मिनट में चलता है, अब 4 प्रोसेसर के साथ 7 मिनट में चलता है।

सुविधाएँ

  • कार्यात्मक परीक्षण वातावरण चर का उपयोग कर प्रोसेसर प्रति एक डेटाबेस इस्तेमाल कर सकते हैं।
  • टेस्ट डिफ़ॉल्ट रूप से यादृच्छिक हैं।
  • PhpUnit के साथ नहीं जोड़ा गया है, आप कोई भी आदेश चला सकते हैं।
  • PHP में कोई निर्भरता नहीं है।
  • इनपुट के रूप में आप phpunit.xml.dist फ़ाइल का उपयोग कर सकते हैं या पाइप का उपयोग कर सकते हैं।
  • आसानी से पाइप परिदृश्यों को आसानी से बेथ एक्सटेंशन शामिल करता है।
  • -v विकल्प के साथ वर्बोसिटी बढ़ाएं।

प्रयोग

find tests/ -name "*Test.php" | ./bin/fastest "bin/phpunit -c app {};"

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