강조 사용 cover_pylib=True
난 당신이 질문을 한 후이가 긴 알고 있지만 난 그냥 대답을 필요로 주위를 얻고있다. :)
coverage.py
에 대한 현재 bitbucket 소스를 사용하여 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()
(가) 여기에 루프 정리됩니다 결합됩니다 커버리지 모든 파일을 보장하기 위해 전적으로이다.
참고 :이 코드가 기본적으로 정리하지 못하는 유일한 적용 범위 데이터는 관련 파일로 __file__
특성에 _MEIXXX
데이터를 포함하지 않습니다.
정상적으로 HTML 또는 XML (또는 무엇이든) 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
에 표준 파이썬 라이브러리 (및 내 버전 제어 트리에 체크인 된 Python 라이브러리)를 무시하고 내 응용 프로그램 코드에만 초점을 맞 춥니 다.
이 정보가 도움이되기를 바랍니다.
실행 파일에 구워지지 않은 파이썬 스크립트에 어떤 코드 적용 도구를 사용합니까? – selbie
해당 정보가 포함되도록 편집 됨 –
적용 범위를 테스트 하시겠습니까? 당신은 그 범위를 넘어 설 수있는 고정되지 않은 스크립트에 액세스 할 수 있습니까? –