2016-04-09 12 views
9

मैंने अभी Coverage.py मॉड्यूल का उपयोग करना शुरू कर दिया है और इसलिए यह जांचने के लिए एक सरल परीक्षण करने का निर्णय लिया है कि यह कैसे काम करता है।पायथन में cover.py का सही तरीके से उपयोग कैसे करें?

Sample.py

def sum(num1, num2): 
    return num1 + num2 


def sum_only_positive(num1, num2): 
    if num1 > 0 and num2 > 0: 
     return num1 + num2 
    else: 
     return None 

test.py

from sample import sum, sum_only_positive 

def test_sum(): 
    assert sum(5, 5) == 10 

def test_sum_positive_ok(): 
    assert sum_only_positive(2, 2) == 4 

def test_sum_positive_fail(): 
    assert sum_only_positive(-1, 2) is None 

जैसा कि आप देख, मेरे सारे कोड परीक्षण और py.test साथ कवर किया जाता है उन सभी को पारित कहते हैं। मैं Coverage.py 100% कवरेज दिखाने की उम्मीद करता हूं। नहीं।

Coverage.py results

खैर, Coverage.py test.py फ़ाइल नहीं देख सकते हैं, तो मैं sample.py फाइल करने के लिए परीक्षण कार्यों की नकल की और कवरेज फिर से भाग:
enter image description here

तब मैं कोड के इस ब्लॉक कहा:

if __name__ == "__main__": 
    print(sum(2, 4)) 
    print(sum_only_positive(2, 4)) 
    print(sum_only_positive(-1, 3)) 

और सभी परीक्षण कार्यों को हटा दिया गया।

enter image description here

क्यों यह इतना है: उसके बाद, Coverage.py 100% पता चलता है? Coverage.py कोड निष्पादन कवरेज नहीं, केवल निष्पादन कवरेज नहीं दिखाना चाहिए? मैंने Coverage.py के लिए एक आधिकारिक F.A.Q. पढ़ा है, लेकिन समाधान नहीं मिला।
चूंकि कई SO उपयोगकर्ता कोड परीक्षण और कोड कवरेज से परिचित हैं, मुझे उम्मीद है कि आप मुझे बता सकते हैं, मैं कहां गलत हूं।

मेरे पास सिर्फ एक विचार है: Coverage.py बस देख सकता है कि कोड की कौन सी रेखाएं निष्पादित नहीं की गई हैं इसलिए मुझे उन पंक्तियों के लिए परीक्षण लिखना चाहिए। लेकिन ऐसी लाइनें हैं जिन्हें पहले ही निष्पादित किया गया है लेकिन परीक्षणों से ढके नहीं हैं इसलिए Coverage.py यहां विफल हो जाएगा।

+0

आप कवरेज/पायस्टेस्ट का आह्वान कैसे करते हैं? –

+0

@Rogalski pytest: 'python -m py.test test.py' और कवरेज: 'python -m कवरेज run sample.py' (विंडोज़ पर) – Groosha

उत्तर

7

कवरेज लग रहा है के लिए एक .coverage फ़ाइल को पढ़ने और आप के लिए है कि रिपोर्ट तैयार करें। Py.test अपने आप पर एक नहीं बनाता है। आप कवरेज के लिए py.test प्लगइन की आवश्यकता:

pip install pytest-cov 

आप पहले से ही यह है, तो आप दोनों एक ही बार में इस तरह चला सकते हैं:

py.test test.py --cov=sample.py 

कौन सा चलाने परीक्षण मॉड्यूल test.py और रिकॉर्ड/प्रदर्शन कवरेज का मतलब sample.py पर रिपोर्ट करें।

आप अनेक परीक्षण रन है और उनके दर्ज की कवरेज जमा और फिर एक अंतिम रिपोर्ट प्रदर्शित करने के लिए की जरूरत है, तो आप इसे इस तरह चला सकते हैं:

py.test test.py --cov=sample.py --cov-report= 
py.test test.py --cov=sample2.py --cov-report= 
py.test test.py --cov=sample3.py --cov-report= 

जिसका मतलब है कि परीक्षण मॉड्यूल test.py और रिकॉर्ड (केवल) कवरेज चलाने sample.py पर - एक रिपोर्ट प्रदर्शित न करें।

अब आप एक पूरी रिपोर्ट के लिए अलग से कवरेज आदेश चला सकते हैं:

coverage report -m 

उपरोक्त आदेश बस पिछले परीक्षण रन से संचित .coverage डेटा फ़ाइल पर आधारित स्वरूपित कवरेज रिपोर्ट दिखाता है। -m का मतलब शो लाइनों याद अर्थात लाइनें नहीं परीक्षण द्वारा कवर:

Name  Stmts Miss Cover Missing 
----------------------------------------- 
sample.py  6  0 100% 

कवरेज शामिल/पथ पैटर्न का उपयोग करके फ़ाइलें बाहर करने के लिए --include और --omit की तरह अधिक स्विच का समर्थन करता है। अधिक जानकारी के लिए अपने दस्तावेज़ देखें: http://coverage.readthedocs.org/en/coverage-4.0.3/cmd.html#reporting

+0

यह काम किया। धन्यवाद! – Groosha

+0

यदि फ़ाइल जांचने के लिए फ़ाइल में परीक्षण किया गया है, तो परीक्षण में आयात किए गए पैकेज में एक सबमिशन है। जो कुछ भी मैं निर्दिष्ट करता हूं - -cov = <> '- बस फ़ाइल का नाम, relativ ई या पूर्ण पथ - मुझे "त्रुटि मिलती है: रिपोर्ट जेनरेट करने में विफल: रिपोर्ट करने के लिए कोई डेटा नहीं।" –

+0

पूरी तरह से योग्य मॉड्यूल नाम निर्दिष्ट करना काम किया। –

6

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

python -m py.test test.py 

तो आप उन्हें coverage.py के तहत के साथ चला सकते हैं:

coverage run -m py.test test.py 
+0

वैसे, मैंने परीक्षण और कवरेज चलाने के लिए उपयोग किए गए कमांड को शामिल किया है मेरी टिप्पणी के तहत दूसरी टिप्पणी में: pytest: 'python -m py.test test.py' और कवरेज: 'पायथन -एम कवरेज run sample.py' (विंडोज़ पर)। मैं तुम्हारा दूसरा आदेश मेरी ओर से अलग देखता हूं, यह जांचूंगा, धन्यवाद! – Groosha

+1

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

+0

मेरे लिए काम नहीं करता है :('कवरेज -एम' -> 'ऐसा कोई विकल्प नहीं है-'' कवरेज रन py.test test.py' -> अज्ञात कमांड py.test' (py.test स्थापित है) – Groosha

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