2009-06-17 15 views
5

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

यह स्पष्ट रूप से काफी काम होने जा रहा है! इसमें सालों लग सकते हैं, लेकिन इस तरह के प्रोजेक्ट के लिए यह इसके लायक है।

मुझे यह पता लगाना होगा कि हमारे कोड के कौन से हिस्से हमारे यूनिट-टेस्ट द्वारा कवर नहीं किए गए हैं। अगर मुझे पता था कि मेरे सिस्टम के कौन से हिस्से अनचाहे थे तो मैं नए परीक्षणों को विकसित करने के बारे में सोच सकता था जो अंततः पूर्ण परीक्षण-कवरेज के अपने लक्ष्य की ओर रुख करेंगे।

तो मैं इस प्रकार के विश्लेषण को चलाने के बारे में कैसे जा सकता हूं। मेरे लिए कौन से टूल्स उपलब्ध हैं?

मैं अजगर 2.4 का उपयोग विंडोज 32 बिट XP पर

UPDATE0:

बस स्पष्ट करने के लिए: हम एक बहुत ही व्यापक यूनिट-टेस्ट स्वीट है (प्लस एक अलग और बहुत व्यापक regtest सुइट जो के दायरे से बाहर है यह कसरत)। हमारे पास एक बहुत ही स्थिर निरंतर एकीकरण मंच है (हडसन के साथ बनाया गया है) जिसे हमारी परीक्षण सुविधा में मानक पायथन यूनिट-टेस्ट को विभाजित करने और चलाने के लिए डिज़ाइन किया गया है: कंपनी के स्पेस में बनाए गए लगभग 20 पीसी।

इस अभ्यास का उद्देश्य हमारे पायथन एकजुट सूट (केवल) सूट में किसी भी अंतराल को प्लग करना है ताकि प्रत्येक घटक में कुछ डिग्री अनियंत्रित कवरेज हो। अन्य डेवलपर्स परियोजना के गैर पायथन घटकों (जो दायरे के बाहर भी हैं) के लिए जिम्मेदारी ले रहे हैं।

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

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

उत्तर

6

अकेले कोड कवरेज के लिए, आप coverage.py का उपयोग कर सकते हैं।

coverage.py का सवाल है figleaf बनाम:

figleaf कई मायनों में अजगर कवरेज उपकरण ('coverage.py') के स्वर्ण मानक से अलग है। सबसे पहले, figleaf "रोचक" लाइनों sys.settrace समारोह, जो coverage.py में लेकिन जटिलता से कुछ अनावश्यक (के रूप में कोड की के लिए एक ही मानदंड का उपयोग करता है मतलब है कि अपने "loc" गिनती चला जाता है नीचे)। दूसरा, figleaf पाइथन मानक लाइब्रेरी में निष्पादित कोड रिकॉर्ड नहीं करता है, जो परिणामस्वरूप एक महत्वपूर्ण गतिशीलता में परिणाम देता है।और तीसरा, प्रारूप जिसमें कवरेज प्रारूप सहेजा गया है, सरल और काम करने में आसान है।

आप परीक्षणों के कई प्रकार से यदि आप कवरेज रिकॉर्डिंग कर रहे हैं figleaf का उपयोग करें और की जरूरत करना चाह सकते हैं दिलचस्प तरीकों से कवरेज को संकलित करने, और/या नियंत्रण जब कवरेज दर्ज की गई है। cover.py एक बेहतर कमांड लाइन निष्पादन के लिए विकल्प है, और इसकी रिपोर्टिंग एक उचित थोड़ा अच्छा है।

मुझे लगता है कि दोनों के पास उनके पेशेवर और विपक्ष हैं।

+0

suggegstion के लिए धन्यवाद: क्यों figleaf के बजाय इसका उपयोग करें? –

+0

मैंने अपने जवाब में 'cover.py बनाम figleaf' स्पष्टीकरण जोड़ा। मुझे नहीं लगता कि यह वास्तव में महत्वपूर्ण है जो आप चुनते हैं। निष्पक्ष होने के लिए, मैंने उनमें से किसी का भी उपयोग नहीं किया है, हालांकि ये दो मुख्य उपकरण हैं। – Razzie

+2

कवरेज 3 पिछली कमियों को ठीक करता है, यानी stdlib et al निष्पादित नहीं करता है। – Almad

1

मान लीजिए कि आपके पास पहले से ही अपेक्षाकृत व्यापक परीक्षण सूट है, पाइथन भाग के लिए उपकरण हैं। उपकरण की उपलब्धता के आधार पर सी भाग अधिक समस्याग्रस्त है।

  • लिए python unit tests

  • सी कोड के लिए, यह कई प्लेटफार्मों क्योंकि gprof, ग्नू कोड प्रोफाइलर -fPIC के साथ बनाया गया कोड नहीं संभाल कर सकते हैं पर मुश्किल है। तो आपको इस मामले में स्थिर रूप से प्रत्येक एक्सटेंशन बनाना होगा, जो कई एक्सटेंशन द्वारा समर्थित नहीं है (उदाहरण के लिए, मेरा blog post for numpy देखें)। विंडोज़ पर, संकलित कोड के लिए बेहतर कोड कवरेज टूल हो सकते हैं, लेकिन इसके लिए आपको एमएस कंपाइलर्स के साथ एक्सटेंशन को पुन: संकलित करने की आवश्यकता हो सकती है।

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

+0

मुझे केवल पायथन की परवाह है - और हाँ: हमारे पास परीक्षणों का एक बहुत व्यापक सेट है। –

+0

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

+1

तर्क यह है कि यदि आपके परीक्षण जटिल हैं, तो कोड से अधिक, आपको अपने यूनिट परीक्षणों की जांच करने की आवश्यकता है। –

4

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

बीटीडब्ल्यू, मैं नाक का उपयोग अनजान ढांचे के रूप में करता हूं (http://somethingaboutorange.com/mrl/projects/nose/0.11.1/); यह प्लगइन सिस्टम बहुत अच्छा है और आपके लिए कवरेज विकल्प छोड़ देता है (- नेड के कवरेज के साथ-साथ कवरेज के साथ-साथ टाइटलस के लिए अंजीर; कवरेज 3 के लिए समर्थन आना चाहिए), और आप अपने स्वयं के निर्माण प्रणाली के लिए प्लगइन्स लिख सकते हैं, भी।

+0

परीक्षण पहले से मौजूद हैं: यह 100% पायथन मानक-लाइब्रेरी unittest है। –

+0

फिलीफ एक बहुत अच्छा सुझाव जैसा प्रतीत होता है: मुझे यह तथ्य पसंद है कि यह मूल रिपोर्टिंग टूल के साथ आता है। इसे मेरे उद्देश्यों के अनुरूप अनुकूलित किया जा सकता है। –

+0

खैर, नाक मानक unittests के साथ संगत है, लेकिन आपके पास कुछ मुफ्त विशेषताएं हैं (जैसे प्लगइन्स, लेकिन बेहतर परीक्षण चयन भी)। – Almad

3

"भाग" "हमारी परियोजना के हर एक हिस्से जगह में एक सार्थक परीक्षण है" अनिर्धारित रहता है। "अर्थपूर्ण" अपरिभाषित है। ठीक है, हालांकि, यह बेहतर आगे बढ़ता है।

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

  • प्रत्येक मॉड्यूल की शुद्धता को मान्य करता है।

  • प्रत्येक मॉड्यूल के प्रत्येक वर्ग की शुद्धता को मान्य करता है।

  • प्रत्येक मॉड्यूल के प्रत्येक वर्ग की हर विधि की शुद्धता को मान्य करता है।

आपने कोड कवरेज या तर्क पथ कवरेज की लाइन के बारे में नहीं पूछा है, जो एक अच्छी बात है। इस तरह पागलपन निहित है।

"गारंटी देता है कि जब हम कुछ बदल हम अन्य उप-प्रणालियों को अनजाने में परिवर्तन देखा जा सकता है"

यह प्रतिगमन परीक्षण है। यह किसी यूनिट परीक्षण अनुशासन का तार्किक परिणाम है।

यहां आप क्या कर सकते हैं।

  1. प्रत्येक मॉड्यूल का आकलन करें। उस मॉड्यूल के लिए एक unittest बनाएँ जो सिर्फ एक unittest.main() है। यह जल्दी होना चाहिए - अधिकतर कुछ दिन।

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

  3. अपने मॉड्यूल को प्राथमिकता दें। एक अच्छा नियम "सबसे ज्यादा उपयोग किया जाता है"। एक और नियम "विफलता से उच्चतम जोखिम" है। एक और नियम है "सबसे अधिक बग रिपोर्ट"। इसमें कुछ घंटे लगते हैं।

  4. सूची के शीर्ष पर शुरू करें। बिना किसी वास्तविक तरीके या किसी भी कक्षा के प्रति टेस्टकेस लिखें। बस एक ढांचा। इसमें कुछ दिन लगते हैं। सुनिश्चित करें कि प्रत्येक टेस्टकेस के लिए डॉकस्ट्रिंग सकारात्मक रूप से परीक्षण और परीक्षण कोड की स्थिति के तहत मॉड्यूल और कक्षा की पहचान करता है। परीक्षण कवरेज निर्धारित करने के लिए आप इन दस्तावेज़ों का उपयोग कर सकते हैं।

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

  • परीक्षण कार्यवाही। अपनी सर्वोच्च प्राथमिकता वाले अनचाहे मॉड्यूल से शुरू करना, प्रत्येक मॉड्यूल में प्रत्येक वर्ग के लिए टेस्टकेस भरना प्रारंभ करें।

  • नया विकास। के लिए प्रत्येक कोड परिवर्तन, एक unittest.TestCase क्लास बदलने के लिए बनाया जाना चाहिए।

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

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

मास्टर टेस्ट स्क्रिप्ट का वास्तविक चलन एक क्यूए नौकरी नहीं है - यह हर किसी का काम है। संगठन के हर स्तर पर प्रत्येक प्रबंधक को दैनिक निर्माण स्क्रिप्ट आउटपुट का हिस्सा होना चाहिए।उनकी नौकरियों के सभी को "कल रात पारित सभी परीक्षणों" पर निर्भर होना है। अन्यथा, उत्पाद प्रबंधक संसाधनों को परीक्षण से दूर खींच देगा और आपके पास कुछ भी नहीं होगा।

+0

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

+0

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

+0

@ सलीम फाधले: कृपया इन अतिरिक्त तथ्यों के साथ प्रश्न अपडेट करें। यह सवाल से बिल्कुल स्पष्ट नहीं है कि आपके पास कोई परीक्षण है। –

4

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

  • प्रत्येक पायथन पैकेज में UnitTests है।
  • हम स्वचालित रूप से nose का उपयोग कर यूनिट परीक्षणों का पता लगाते हैं। नाक स्वचालित रूप से मानक पायथन यूनिट परीक्षणों का पता लगाता है (मूल रूप से सबकुछ looks like a test)। इस प्रकार हम इकाई परीक्षणों को याद नहीं करते हैं। नाक में एक प्लग-इन अवधारणा भी है जिससे आप उत्पादन कर सकें, उदा। अच्छा उत्पादन
  • हम यूनिट-परीक्षण के लिए 100% कवरेज के लिए प्रयास करते हैं। इस अंत में, हम a nose-plugin provides integration की जांच के लिए Coverage का उपयोग करते हैं।
  • हमने ग्रहण (हमारे आईडीई) को automatically run nose पर सेट किया है जब भी कोई फ़ाइल बदलती है ताकि इकाई-परीक्षण हमेशा निष्पादित हो जाएं, जो उप-उत्पाद के रूप में कोड-कवरेज दिखाता है।
संबंधित मुद्दे