Prueba continua de unidades con Pydev (Python y Eclipse)
-
06-07-2019 - |
Pregunta
¿Hay alguna forma de integrar pruebas de unidad de fondo con el entorno Pydev Eclipse?
Las pruebas de mi unidad funcionan bien, pero me gustaría integrarlas para que se ejecuten en segundo plano según los cambios en el archivo de origen (por ejemplo, con nariz) e integrar el resultado de nuevo en Eclipse (estoy pensando en una gran X roja cuando las pruebas fallan con una consola y vista de registro de seguimiento).
No, un símbolo del sistema que se ejecuta en el lateral no cuenta.
He tenido esta integración de Eclipse al desarrollar material RoR.
Gracias,
Tal.
EDITAR: Vea el nuevo Pydev (1.6.4) http: // pydev .org / manual_adv_pyunit.html
Solución
Esta función se ha agregado a PyDev 2.0.1 con una opción para relanzar las pruebas en la última ejecución de prueba cada vez que cambia un archivo de Python, con una opción adicional para volver a ejecutar solo los errores, aunque ejecutará la prueba completa suite si no se encontraron errores, ya que la idea es que trabaje con sus errores y cuando todos pasen un lanzamiento final para toda la suite (entonces puede pasar a otra tarea).
La compilación nocturna actual tiene esta característica incorporada.
Otros consejos
Pydev tiene alguna integración de prueba unitaria, pero eso es solo como una configuración de ejecución ... así que ...
Esta no es una forma muy elegante, pero si usted:
- Habilitar proyecto- > Construir automáticamente
- En las propiedades de su proyecto, agregue un nuevo generador de tipo Programa
- Configúrelo para ejecutar sus pruebas y seleccione 'durante las compilaciones automáticas'
Entonces, al menos, obtendrá algo que arroje los resultados de la prueba a la consola al guardar los recursos.
Me acabo de dar cuenta de que PyDev tiene un soporte de script bastante poderoso. Lamentablemente, no tengo tiempo para hacerlo todo por usted (pero si completa esto, publíquelo aquí :)
Si crea un archivo llamado pyedit_nose.py
que se ve así en una carpeta vacía:
assert cmd is not None
assert editor is not None
if cmd == 'onSave':
from java.lang import Runtime
from java.io import BufferedReader
from java.io import InputStreamReader
from org.eclipse.core.resources import ResourcesPlugin
from org.eclipse.core.resources import IMarker
from org.eclipse.core.resources import IResource
proc = Runtime.getRuntime().exec('ls -al')
extra_message = BufferedReader(InputStreamReader(proc.inputStream)).readLine()
r = ResourcesPlugin.getWorkspace().getRoot()
for marker in r.findMarkers(IMarker.PROBLEM, False, IResource.DEPTH_INFINITE):
if marker.getAttribute(IMarker.MESSAGE).startsWith("Some test failed!"):
marker.delete()
for rr in r.getProjects():
marker = rr.createMarker(IMarker.PROBLEM)
marker.setAttribute(IMarker.MESSAGE, "Some test failed! " + extra_message)
marker.setAttribute(IMarker.PRIORITY, IMarker.PRIORITY_HIGH)
marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR)
y configure Preferencias- > PyDev- > Scripting Pydev para apuntar a este directorio obtendrá todos los proyectos en su espacio de trabajo marcados con un error cada vez que se guarde un archivo.
Al ejecutar un script que devuelve los resultados de la prueba en un formato fácil de analizar en lugar de ls
y analizar el resultado, debería poder colocar sus marcadores en los lugares correctos.
Vea esto para algunos puntos de partida:
- Scripting Jython en Pydev
- IMarker es lo que representa un marcador.
- IResource es a lo que adjunta sus marcadores. Pueden ser espacios de trabajo, proyectos, archivos, directorios, etc.
resource.createMarker (IMarker.PROBLEM)
crea un marcador de problema. - IProject es un tipo de
IResource
que representa un proyecto. Use el métodomembers ()
para obtener el contenido.
Ejecuto la prueba a mano la primera vez ( Ejecutar > Ejecutar como > Prueba de unidad de Python ). Después de eso, yo uso
Ctrl + Shift + F9
para guardar los archivos y ejecutar las pruebas, en lugar de guardar con Ctrl + S
y esperar que ocurra algo de magia.
La combinación de teclas Ctrl + Shift + F9
relanza la última configuración de ejecución.
Descargo de responsabilidad : Soy nuevo en Eclipse y PyDev, por lo que puedo estar sugiriendo algo tonto / obvio / incorrecto
Mejoré el "curioso" script para construir automáticamente documentación y ejecutar pruebas continuamente. Nada estelar, pero hace el trabajo. Publicarlo aquí porque el original El enlace se cayó. A diferencia del script curioso original, este escanea el directorio de forma recursiva y permite buscar múltiples patrones.
import os
import os.path
import sys
import stat
import time
import subprocess
from fnmatch import fnmatch
def match_patterns(pathname, patterns):
"""Returns True if the pathname matches any of the given patterns."""
for pattern in patterns:
if fnmatch(pathname, pattern):
return True
return False
def filter_paths(pathnames, patterns=["*"], ignore_patterns=[]):
"""Filters from a set of paths based on acceptable patterns and
ignorable patterns."""
result = []
if patterns is None:
patterns = []
if ignore_patterns is None:
ignore_patterns = []
for path in pathnames:
if match_patterns(path, patterns) and not match_patterns(path, ignore_patterns):
result.append(path)
return result
def absolute_walker(path, recursive):
if recursive:
walk = os.walk
else:
def walk(path):
return os.walk(path).next()
for root, directories, filenames in walk(path):
yield root
for directory in directories:
yield os.path.abspath(os.path.join(root, directory))
for filename in filenames:
yield os.path.abspath(os.path.join(root, filename))
def glob_recursive(path, patterns=["*"], ignore_patterns=[]):
full_paths = []
for root, directories, filenames in os.walk(path):
for filename in filenames:
full_path = os.path.abspath(os.path.join(root, filename))
full_paths.append(full_path)
filepaths = filter_paths(full_paths, patterns, ignore_patterns)
return filepaths
def check_sum(path='.', patterns=["*"], ignore_patterns=[]):
sum = 0
for f in glob_recursive(path, patterns, ignore_patterns):
stats = os.stat(f)
sum += stats[stat.ST_SIZE] + stats[stat.ST_MTIME]
return sum
if __name__ == "__main__":
if len(sys.argv) > 1:
path = sys.argv[1]
else:
path = '.'
if len(sys.argv) > 2:
command = sys.argv[2]
else:
command = "make -C docs html; bin/python tests/run_tests.py"
previous_checksum = 0
while True:
calculated_checksum = check_sum(path, patterns=['*.py', '*.rst', '*.rst.inc'])
if calculated_checksum != previous_checksum:
previous_checksum = calculated_checksum
subprocess.Popen(command, shell=True)
time.sleep(2)
Espero que esto ayude.
=)
Uso Nosy (disponible en pypi):
Ejecute la herramienta de detección y ejecución de prueba de nariz cada vez que un archivo fuente ha cambiado.