हाइलाइट उपयोग cover_pylib=True
मैं जानता हूँ कि यह लंबा है के बाद आप प्रश्न पूछा है, लेकिन मैं अभी जवाब की आवश्यकता होगी, के लिए चारों ओर हो रही है। :)
coverage.py
के लिए वर्तमान बिटबकेट स्रोत का उपयोग करके मैं PyInstaller
जेनरेट EXE फ़ाइल से कवरेज डेटा सफलतापूर्वक एकत्र करने में सक्षम हूं।
मुख्य स्रोत अपने आवेदन के लिए मैं सशर्त इस तरह के कवरेज का संग्रह शुरू करने के लिए कवरेज बता में:
if os.environ.has_key('COVERAGE') and len(os.environ['COVERAGE']) > 0:
usingCoverage = True
import coverage
import time
cov = coverage.coverage(data_file='.coverage.' + version.GetFullString(), data_suffix=time.strftime(".%Y_%m_%d_%H_%M.%S", time.localtime()), cover_pylib=True)
cov.start()
इस कवरेज संग्रह ही शुरू होता है जब मैं इच्छा। Data_suffix का उपयोग बाद में विलय फ़ाइल फ़ाइल के लिए cov.combine()
का अधिक आसानी से उपयोग करने की अनुमति देता है। version.GetFullString()
सिर्फ मेरे अनुप्रयोग संस्करण संख्या है।
cover_pylib
में क्योंकि सभी मानक अजगर लाइब्रेरी मॉड्यूल __file__
विशेषता अन्य कोड है कि एक पैकेज के अंदर मौजूद नहीं है से इस ...\_MEIXXXXX\random.pyc
की तरह लग रही है और (एक पथ के आधार पर) इस प्रकार अप्रभेद्य हैं True
यहाँ पर सेट है।
जब अनुप्रयोग मैं इस छोटे स्निपेट से बाहर निकलने के लिए तैयार है:
if usingCoverage:
cov.stop()
cov.save()
एक बार अपने आवेदन स्वचालित रूप से मेरे लिए अपने HTML रिपोर्ट उत्पन्न नहीं होगा अभी भी coverage.py चलाया जा रहा है। कवरेज डेटा को साफ करने की आवश्यकता है ताकि ...\_MEIXXXX\...
फ़ाइल संदर्भ वास्तविक स्रोत पथ में पूर्ण फ़ाइल पथ में परिवर्तित हो जाएं।
मैं कोड के इस स्निपेट चल ऐसा करते हैं:
import sys
import os.path
from coverage.data import CoverageData
from coverage import coverage
from glob import glob
def cleanupLines(data):
"""
The coverage data collected via PyInstaller coverage needs the data fixed up
so that coverage.py's report generation code can analyze the source code.
PyInstaller __file__ attributes on code objecters are all in subdirectories of the _MEIXXXX
temporary subdirectory. We need to replace the _MEIXXXX temp directory prefix with the correct
prefix for each source file.
"""
prefix = None
for file, lines in data.lines.iteritems():
origFile = file
if prefix is None:
index = file.find('_MEI')
if index >= 0:
pathSepIndex = file.find('\\', index)
if pathSepIndex >= 0:
prefix = file[:pathSepIndex + 1]
if prefix is not None and file.find(prefix) >= 0:
file = file.replace(prefix, "", 1)
for path in sys.path:
if os.path.exists(path) and os.path.isdir(path):
fileName = os.path.join(path, file)
if os.path.exists(fileName) and os.path.isfile(fileName):
file = fileName
if origFile != file:
del data.lines[origFile]
data.lines[file] = lines
for file in glob('.coverage.' + version.GetFullString() + '*'):
print "Cleaning up: ", file
data = CoverageData(file)
data.read()
cleanupLines(data)
data.write()
The Loop यहाँ के लिए कवरेज फ़ाइलों को साफ हो जाने जोड़ा जाएगा के सभी सुनिश्चित करने के लिए पूरी तरह से है।
नोट: केवल कवरेज डेटा इस कोड को नहीं डिफ़ॉल्ट रूप से सफाई PyInstaller
संबंधित फ़ाइलें जो उनके __file__
विशेषताओं में _MEIXXX
डेटा शामिल नहीं हैं है।
अब आप सफलतापूर्वक एचटीएमएल या एक्सएमएल (या जो कुछ भी) coverage.py
सामान्य तरीके से रिपोर्ट कर सकते हैं।
मेरे मामले में यह इस तरह दिखता है:
cov = coverage(data_file='.coverage.' + version.GetFullString(), data_suffix='.combined')
cov.load()
cov.combine()
cov.save()
cov.load()
cov.html_report(ignore_errors=True,omit=[r'c:\python27\*', r'..\3rdParty\PythonPackages\*'])
निर्माता में data_file के उपयोग सुनिश्चित करना है कि लोड/गठबंधन मेरी साफ कवरेज फ़ाइलों के सभी सही ढंग से पहचान लेंगे है।
html_report
कॉल coverage.py
बताता मानक अजगर पुस्तकालय (और अजगर पुस्तकालयों मेरी संस्करण नियंत्रण पेड़ में जाँच) की उपेक्षा और सिर्फ अपने आवेदन कोड पर ध्यान दें।
मुझे उम्मीद है कि इससे मदद मिलती है।
आपके द्वारा पाइथन स्क्रिप्ट के लिए कौन से कोड कवरेज टूल का उपयोग किया जाता है जो निष्पादन योग्य नहीं होते हैं? – selbie
उस जानकारी को शामिल करने के लिए संपादित –
आप कवरेज का परीक्षण करने के लिए क्या चाहते हैं? क्या आपके पास केवल उस अनजान स्क्रिप्ट तक पहुंच नहीं है जिसे आप कवरेज चला सकते हैं? –