Download Detección código no usado por usuarios en Python
Document related concepts
no text concepts found
Transcript
Detección código no usado por usuarios en Python Málaga Python Meetup – Noviembre 2016 Detección código no usado por usuarios en Python Miguel Ángel Moreno Ruiz Backend Developer emigue@gmail.com @emigue Málaga Python Meetup – Noviembre 2016 Detección código no usado por usuarios en Python Podemos encontrar código no referenciado (código muerto): ● Librería Vulture ● Pycharm code inspector ● Scripts en bash sobre ficheros Pero: ¿Cómo detectar código referenciado pero no ejecutado por los usuarios? Código inútil Málaga Python Meetup – Noviembre 2016 Detección código no usado por usuarios en Python Librería Coverage.py ● ● ● Es una herramienta para medir la cobertura de código en programas Python. Habitualmente se usa para medir la cobertura de pruebas en un sistema Python. Nosotros la usaremos para saber el código que usan los usuarios. Málaga Python Meetup – Noviembre 2016 Detección código no usado por usuarios en Python ● Comandos básicos de coverage.py: $ coverage run my_program.py arg1 arg2 $ coverage report -m Name Stmts Miss Cover Missing ------------------------------------------------------my_program.py 20 4 80% 33-35, 39 my_other_module.py 56 6 89% 17-23 ------------------------------------------------------TOTAL 76 10 87% $ coverage html $ coverage xml $ coverage combine Málaga Python Meetup – Noviembre 2016 Detección código no usado por usuarios en Python ● Contenido fichero .coverage !coverage.py: This is a private format, don't read it directly!{"file_tracers": {"/home/emigue/code/ppap/fusion/templates/fusion/main.html": "django_coverage_plugin.DjangoTemplatePlugin"}, "lines": {"/home/emigue/code/ppap/fusion/views.py": [36, 37, 38, 44, 45, 46, 47, 48, 18, 19, 20, 21, 22, 24, 25, 26], "/home/emigue/code/ppap/fusion/forms.py": [], "/home/emigue/code/ppap/ppap/settings.py": [128, 129, 130, 131, 134, 135, 136, 137, 11, 13, 16, 23, 26, 28, 34, 35, 36, 37, 38, 39, 40, 44, 45, 46, 47, 48, 49, 50, 53, 56, 57, 58, 59, 60, 62, 63, 64, 65, 67, 72, 78, 79, 80, 81, 90, 91, 93, 94, 96, 97, 99, 100, 108, 110, 112, 114, 116, 122, 124, 126, 127], "/home/emigue/code/ppap/ppap/__init__.py": [1], "/home/emigue/code/ppap/fusion/tests.py": [], "/home/emigue/code/ppap/fusion/migrations/0001_initial.py": [], "/home/emigue/code/ppap/fusion/admin.py": [32, 1, 2, 5, 6, 9, 10, 13, 14, 17, 18, 21, 22, 24, 25, 27, 28, 29, 30, 31], "/home/emigue/code/ppap/ppap/wsgi.py": [], "/home/emigue/code/ppap/fusion/migrations/__init__.py": [], "/home/emigue/code/ppap/manage.py": [], "/home/emigue/code/ppap/fusion/__init__.py": [1], "/home/emigue/code/ppap/ppap/urls.py": [], "/home/emigue/code/ppap/fusion/templates/fusion/main.html": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 55, 56], "/home/emigue/code/ppap/fusion/models.py": [1, 3, 6, 8, 9, 11, 12, 13, 22, 23, 26, 27, 30, 31, 34, 36, 37, 40, 42, 43, 45, 46, 48], "/home/emigue/code/ppap/fusion/apps.py": []}} Málaga Python Meetup – Noviembre 2016 Detección código no usado por usuarios en Python ● Contenido fichero .coverage !coverage.py: This is a private format, don't read it directly! { "file_tracers":{ "/home/emigue/code/ppap/fusion/templates/fusion/main.html":"django_coverage_plugin.DjangoTemplatePlugin" }, "lines":{ "/home/emigue/code/ppap/fusion/views.py":[36, 37, 38, 44, 45, 46, 47, 48, 18, 19, 20, 21, 22, 24, 25, 26], "/home/emigue/code/ppap/fusion/forms.py":[], } } Málaga Python Meetup – Noviembre 2016 Detección código no usado por usuarios en Python ● Ejemplo de detalle de cobertura en html: Málaga Python Meetup – Noviembre 2016 Detección código no usado por usuarios en Python ● Configuración de coverage.py (.coveragerc) # .coveragerc to control coverage.py [run] data_file = .coverage parallel = True [report] # Regexes for lines to exclude from consideration exclude_lines = # Don't complain if tests don't hit defensive assertion code: raise AssertionError raise NotImplementedError if __name__ == .__main__.: ignore_errors = True [html] directory = coverage_html_report [xml] output = coverage.xml Málaga Python Meetup – Noviembre 2016 Detección código no usado por usuarios en Python ● Coverage API. Ejemplo básico: import coverage cov = coverage.Coverage() cov.start() # .. call your code .. cov.stop() cov.save() cov.html_report() ● Generar resultados si import coverage coverage.process_startup() COVERAGE_PROCESS_START $ export COVERAGE_PROCESS_START=.coveragerc # .. call your code .. Málaga Python Meetup – Noviembre 2016 Detección código no usado por usuarios en Python ● Cobertura en comandos Django (manage.py) import os import sys import coverage import warnings from coverage.misc import CoverageException from django.core.management import execute_from_command_line def run_project_command(): """ Run django project command. To run with coverage, set COVERAGE_PROCESS_START=.coveragerc as environment variable To set django settings, set DJANGO_SETTINGS_MODULE as environment variable :return: None """ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "bos.settings.ebury.devel") if os.environ.get("COVERAGE_PROCESS_START"): warnings.warn("Running command with coverage mode") try: coverage.process_startup() except CoverageException as ex: warnings.warn("Error loading coverage. Running without coverage") execute_from_command_line(sys.argv) if __name__ == "__main__": run_project_command() Málaga Python Meetup – Noviembre 2016 Detección código no usado por usuarios en Python ● Procesos habituales en Django: – Lanzar el servidor web (ok) ● ● – python manage.py runserver gunicorn wsgi.py Procesos con Celery (no va) ● Require usar la opción -P threads en los workers e incluir la librería threadpool como requerimiento. Málaga Python Meetup – Noviembre 2016 Detección código no usado por usuarios en Python ● Recolección cobertura distribuida: – Múltiples servidores recibiendo peticiones de usuarios. – Procesos de celery usando el mismo código. – Necesitamos la cobertura total usada. – Usando la opción parallel de coverage.py obtenemos ficheros: .coverage.<machine-name>.<pid>.<id> – Podemos subir los ficheros a un repositorio remoto como Amazon S3 – Descargarlos a una sóla máquina y combinarlos. – Generar el informe de resultados en html. – Analizamos fichero a fichero las líneas en rojo. Este código no ha sido utilizado por ningún usuario en ninguna de las ejecuciones de los servidores. Málaga Python Meetup – Noviembre 2016 Detección código no usado por usuarios en Python ● Aplicación web Pen-Pineapple-Apple-Pen: APPLE PINEAPPLE PEN MEMBRILLO Vídeo introducción Málaga Python Meetup – Noviembre 2016 Detección código no usado por usuarios en Python Málaga Python Meetup – Noviembre 2016 Detección código no usado por usuarios en Python Málaga Python Meetup – Noviembre 2016 Detección código no usado por usuarios en Python Málaga Python Meetup – Noviembre 2016 Detección código no usado por usuarios en Python Málaga Python Meetup – Noviembre 2016 Detección código no usado por usuarios en Python $ coverage html Málaga Python Meetup – Noviembre 2016 Detección código no usado por usuarios en Python Coverage in Django Templates: django_coverage_plugin # requirements.txt coverage django_coverage_plugin # .coveragerc [run] plugins = django_coverage_plugin #settings.py TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', ], 'debug': True }, }, ] Málaga Python Meetup – Noviembre 2016 Detección código no usado por usuarios en Python Málaga Python Meetup – Noviembre 2016 Detección código no usado por usuarios en Python ● ● Referencias: – Coverage.py: https://coverage.readthedocs.io/en/coverage-4.2/ – Problema de coverage.py con celery: – http://stackoverflow.com/questions/3044580/multiprocessing-vs-threading-python – https://chrisarndt.de/projects/threadpool/ – Coverage for django templates: django_coverage_plugin https://pypi.python.org/pypi/django_coverage_plugin – Librería vulture: https://pypi.python.org/pypi/vulture – Video PPAP: https://www.youtube.com/watch?v=d9TpRfDdyU0 Créditos: – Imagen Fondo diseñado por Kjpargeter – Freepik.com – Algunos ejemplos extraídos de la documentación de coverage.py Málaga Python Meetup – Noviembre 2016 Detección código no usado por usuarios en Python Gracias por vuestra atención Málaga Python Meetup – Noviembre 2016