Highlight użycie cover_pylib=True
wiem, że to długo po poprosił Cię pytanie, ale jestem po prostu poruszanie się do konieczności odpowiedzi. :)
Używanie bieżącego źródła bitów do coverage.py
Jestem w stanie pomyślnie zebrać dane dotyczące zasięgu z pliku EXE wygenerowanego przez PyInstaller
.
W głównym źródłem dla mojej aplikacji warunkowo powiedzieć zasięg, aby rozpocząć zbieranie pokrycie tak:
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()
ten rozpoczyna zbieranie pokrycia Dopiero kiedy zapragniesz. Użycie sufiksu data_ffix pozwala mi łatwiej wykorzystać cov.combine()
do późniejszego scalania plików pokrycia. version.GetFullString()
to tylko numer mojej aplikacji.
cover_pylib
jest ustawiony na True
tutaj w bo wszystkie standardowe moduły Python Library __file__
atrybut wyglądać następująco ...\_MEIXXXXX\random.pyc
a więc są nie do odróżnienia (na podstawie ścieżki) z innym kodem, który nie istnieje wewnątrz opakowania.
Gdy aplikacja jest gotowa do wyjścia mam ten mały fragment:
if usingCoverage:
cov.stop()
cov.save()
Raz mój wniosek został uruchomiony coverage.py nadal nie będzie automatycznie wygenerować raport HTML dla mnie. Dane pokrycia muszą zostać wyczyszczone, aby odwołania do plików ...\_MEIXXXX\...
zostały przekształcone w bezwzględne ścieżki plików do rzeczywistego kodu źródłowego.
to zrobić uruchamiając ten fragment kodu:
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()
Pętla for jest tu wyłącznie w celu zapewnienia wszystkich plików pokrycia, które zostaną połączone są czyszczone.
UWAGA: Jedyne dane dotyczące zasięgu, które domyślnie nie są usuwane z tego kodu, to PyInstaller
powiązane pliki, które nie zawierają danych _MEIXXX
w ich atrybutach __file__
.
Możesz teraz z powodzeniem generować raport HTML lub XML (lub coś podobnego) coverage.py
zgłosić normalny sposób.
W moim przypadku wygląda to tak:
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\*'])
Zastosowanie data_file w konstruktorze jest zapewnienie, że ładunek/połączyć rozpozna wszystkie moje wyczyszczoną plików pokrycia poprawnie.
Zadzwoń pod numer , aby zignorować standardowe biblioteki python (i biblioteki Python zaznaczone w moim drzewie kontroli wersji) i skupić się tylko na kodzie aplikacji.
Mam nadzieję, że to pomoże.
Jakie narzędzia do obsługi kodu są używane w skryptach Pythona, które nie są upieczone do pliku wykonywalnego? – selbie
edytowane w celu uwzględnienia tych informacji –
Co chcesz przetestować? Czy masz nie tylko dostęp do niezamrożonych skryptów, które można uruchomić na pokrycie? –