2011-12-19 14 views
11

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

कि इकाई परीक्षण को देखते हुए, मैं आसानी से अपने सभी पिछले गर्त जाना करता है और कहा कि इकाई परीक्षण के साथ निर्माण का परीक्षण, ताकि मैं इंगित कर सकते हैं जो प्रतिबद्ध टूटना का कारण बना सकते हैं?

उत्तर

10

इस के लिए उपयोग git bisect, कृपया this page देखते हैं।

चूंकि आप जावास्क्रिप्ट का परीक्षण कर रहे हैं, तो आपको शायद हाथ से परीक्षण चलाएं और git bisect good और git bisect bad उचित के रूप में चलाएं। हालांकि, अगर आप कमांड लाइन से अपने इकाई परीक्षण चला सकते हैं, तो आप git bisect run Git बार-बार परीक्षण को अंजाम दिया है और ट्रैक दोषपूर्ण स्वचालित रूप से प्रतिबद्ध करने के लिए उपयोग कर सकते हैं:

$ git bisect run my-script.sh 

शुद्ध जादू पहली बार जब आप यह देखते हैं कि ! :-)

11

आप git bisect का काम का वर्णन किया। गिट बुक में a good tutorial है।

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

+0

स्पष्टीकरण के लिए धन्यवाद। लेकिन एक परीक्षण एक इकाई परीक्षण और एक रिग्रेशन परीक्षण दोनों हो सकता है। दो श्रेणियां छेड़छाड़ की जाती हैं, है ना? – Randomblue

+2

@Randomblue: हां, कभी-कभी, जब एक परीक्षण दोनों उद्देश्यों को पूरा करता है क्योंकि एक बग एक लापता इकाई परीक्षण के कारण होता है। हालांकि, आपको चौराहे से सावधान रहना चाहिए। रिग्रेशन परीक्षण अक्सर लंबे समय से चलने वाले मामलों (असली दुनिया के डेटा और समय के कारण) होते हैं और बड़े झुंड में आते हैं। वे आपके यूनिट परीक्षणों को पकड़ते हैं, इसलिए उन्हें यथासंभव दूर रखें। इसके अलावा, यूनिट परीक्षणों को रिफैक्टरिंग में गिरा दिया जाने की संभावना है, इसलिए वे खराब रिग्रेशन परीक्षण हैं। – thiton

+0

मैं देखता हूं, धन्यवाद! – Randomblue

1

हां, इसे git bisect कहा जाता है, और इसे पहली बार गिट में पेश किया गया था।

सिद्धांत:

  • हड़पने एक अतीत जहां पता है कि यह काम किया में प्रतिबद्ध है, चलो यह c1 फोन करते हैं;
  • हड़पने एक c1 तुम्हें पता है के बाद प्रतिबद्ध विफल रहता है, यह c2 कहते हैं;
  • git bisect start c2 c1

यदि आप जानते हैं तुम भी उपपथ में द्विविभाजित सीमित कर सकते हैं जहां यह विफल रहता है, और यदि आप एक स्क्रिप्ट जो परीक्षण गैर सहभागी चला सकते है, git bisect run का उपयोग करें।

3

Git वास्तव में आप क्या चाहते करने के लिए एक आदेश, git bisect

द्विआधारी खोज द्वारा खोजें परिवर्तन यह है कि एक बग

शुरू की अपनी मामले में आप git bisect run /path/to/script के रूप में उपयोग करना चाहते हैं, जो खराब प्रतिबद्धता खोजने के लिए स्वचालित रूप से प्रतिबद्धता का परीक्षण करेगा और प्रत्येक प्रतिबद्धता के साथ एक चेक करेगा।

ध्यान दें कि स्क्रिप्ट (उपरोक्त उदाहरण में my_script) यदि वर्तमान स्रोत, कोड 0 यदि वर्तमान स्रोत कोड अच्छा है, और 1 और 127 (सम्मिलित) के बीच एक कोड के साथ बाहर निकलने के साथ बाहर निकलने चाहिए 125 को छोड़कर कोड खराब है।

कोई अन्य निकास कोड बिसेक्ट प्रक्रिया को रोक देगा। यह ध्यान दिया जाना चाहिए कि "निकास (-1)" के माध्यम से समाप्त होने वाला एक प्रोग्राम $ छोड़ देता है? = 255, (बाहर निकलें (3) मैन्युअल पृष्ठ देखें), क्योंकि मान "& 0377" के साथ कटा हुआ है।

वर्तमान स्रोत कोड का परीक्षण नहीं किया जा सकता है जब विशेष निकास कोड 125 का उपयोग किया जाना चाहिए। यदि स्क्रिप्ट इस कोड से निकलती है, तो वर्तमान संशोधन छोड़ा जाएगा (उपरोक्त गिट बिस्केट छोड़ें)। 125 को इस उद्देश्य के लिए उपयोग करने के लिए उच्चतम समझदार मूल्य के रूप में चुना गया था, क्योंकि 126 और 127 का उपयोग पॉसिक्स शैल द्वारा विशिष्ट त्रुटि स्थिति को इंगित करने के लिए किया जाता है (127 कमांड के लिए नहीं है, 126 कमांड के लिए है लेकिन निष्पादन योग्य नहीं है --- ये विवरण कोई फर्क नहीं पड़ता, क्योंकि वे स्क्रिप्ट में सामान्य त्रुटियां हैं, जहां तक ​​"बिस्केट रन" का संबंध है)।

तो, आपकी स्क्रिप्ट आपके स्रोतों को संकलित करेगी, अपना यूनिट टेस्ट सूट चलाएगी और फिर संबंधित निकास कोड दें। bisect manpage के उदाहरण अनुभाग में यह अच्छी तरह से शामिल है (टूटी बिल्ड, विलय हॉटफिक्स काम आदि)

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