2013-01-22 22 views
6

वहाँ pyinstaller के साथ बनाया गया एक निष्पादन के खिलाफ कवरेज को चलाने के लिए कोई तरीका है? मैं सिर्फ एक है जैसे कि यह चल रहा है की कोशिश की है कि यह एक अजगर स्क्रिप्ट था और यह इनपुट के रूप में निष्पादन योग्य फ़ाइल तरह फ्लॉप (मैं वास्तव में यह काम करने की उम्मीद फ्लॉप) और मुझे लगता है कि जवाब नहीं एक निर्मित निष्पादन के खिलाफ कवरेज को चलाने के लिए कोई आसान तरीका नहीं है है .... (इस पर खिड़कियों .exe है)कवरेज

कवरेज पैकेज मैं उपयोग कर रहा हूँ बस सामान्य कवरेज पैकेज है कि आप से nedbatchelder.com (http://nedbatchelder.com/code/coverage/)

+0

आपके द्वारा पाइथन स्क्रिप्ट के लिए कौन से कोड कवरेज टूल का उपयोग किया जाता है जो निष्पादन योग्य नहीं होते हैं? – selbie

+0

उस जानकारी को शामिल करने के लिए संपादित –

+1

आप कवरेज का परीक्षण करने के लिए क्या चाहते हैं? क्या आपके पास केवल उस अनजान स्क्रिप्ट तक पहुंच नहीं है जिसे आप कवरेज चला सकते हैं? –

उत्तर

6

यह isn "easy_install कवरेज" के साथ मिलता है ' एक पूरी तरह से तैयार जवाब नहीं है लेकिन जो मैंने अभी तक पाया है।

कैसे काम करता है pyinstaller की मेरी समझ से है कि एक द्विआधारी एक छोटी सी सी कार्यक्रम है कि एक अजगर दुभाषिया और एक स्क्रिप्ट लोड बूटस्ट्रैप एम्बेड करता है का निर्माण किया जाता है। PyInstaller का निर्माण EXE में वास्तविक बाइनरी के अंत के बाद एक संग्रह शामिल है जिसमें पायथन कोड के लिए संसाधन शामिल हैं। यह http://www.pyinstaller.org/export/develop/project/doc/Manual.html#pyinstaller-archives समझाया गया है।

वहाँ Pyinstaller/लोडर/iu.py Docs से iu.py है। आप बाइनरी से आयात करने के लिए एक आयात हुक बनाने में सक्षम होना चाहिए। pyinstaller disassembler के लिए Googling https://bitbucket.org/Trundle/exetractor/src/00df9ce00e1a/exetractor/pyinstaller.py ऐसा दिखता है जैसे आवश्यक भागों निकालने सकता है पाया।

इसका दूसरा हिस्सा यह है कि बाइनरी संग्रह में सभी संसाधनों को पाइथन कोड संकलित किया जाएगा। सबसे अधिक संभावना है, cover.py आपको सामान्य स्थिति के तहत चलते समय किसी भी अन्य संकलित मॉड्यूल को मारने के समान ही अनुपयोगी आउटपुट देगा।

3

हाइलाइट उपयोग 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 बताता मानक अजगर पुस्तकालय (और अजगर पुस्तकालयों मेरी संस्करण नियंत्रण पेड़ में जाँच) की उपेक्षा और सिर्फ अपने आवेदन कोड पर ध्यान दें।

मुझे उम्मीद है कि इससे मदद मिलती है।

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