Test unitari continui con Pydev (Python ed Eclipse)
-
06-07-2019 - |
Domanda
Esiste un modo per integrare i test delle unità in background con l'ambiente Pydev Eclipse?
I miei test unitari funzionano bene, ma vorrei integrarli per l'esecuzione in background in base alle modifiche del file di origine (ad es. con nose) e per integrare il risultato in Eclipse (sto pensando a una grande X rossa quando i test falliscono con una console e una vista del registro di traccia).
No, un prompt dei comandi che esegue il naso sul lato non conta.
Ho avuto questa integrazione Eclipse durante lo sviluppo di roR.
Grazie,
Tal.
MODIFICA: Scopri il nuovo Pydev (1.6.4) http: // pydev .org / manual_adv_pyunit.html
Soluzione
Questa funzione è stata aggiunta a PyDev 2.0.1 con un'opzione per riavviare i test nell'ultima esecuzione di test ogni volta che cambia un file python, con un'opzione aggiuntiva per rieseguire solo gli errori, anche se eseguirà il test completo suite se non sono stati rilevati errori, poiché l'idea è quella di elaborare gli errori e quando tutti eseguono un avvio finale per l'intera suite (è possibile passare a un'altra attività).
L'attuale build notturna include questa funzione.
Altri suggerimenti
Pydev ha un'integrazione unit-test, ma è solo una configurazione di esecuzione ... quindi ...
Questo non è un modo molto elegante, ma se tu:
- Abilita Project- > Build automaticamente
- Nelle proprietà del progetto, aggiungi un nuovo builder di tipo Programma
- Configuralo per eseguire i test e seleziona "durante i build automatici"
Quindi almeno otterrai qualcosa che trasmette i risultati del test alla console durante il salvataggio delle risorse.
Ho appena realizzato che PyDev ha un supporto di scripting piuttosto potente. Purtroppo non ho il tempo di fare tutto per te (ma se lo completi, per favore pubblicalo qui :)
Se crei un file chiamato pyedit_nose.py
che assomiglia a questo in una cartella altrimenti vuota:
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)
e imposta Preferenze- > PyDev- > Scripting Pydev per puntare a questa directory otterrai tutti i progetti nell'area di lavoro contrassegnati con un errore ogni volta che un file viene salvato.
Eseguendo uno script che restituisce i risultati del test in un formato facile da analizzare anziché ls
e analizzando l'output dovresti essere in grado di posizionare i tuoi marker nei posti giusti.
Vedi questo per alcuni punti di partenza:
- Jython Scripting in Pydev
- IMarker è ciò che rappresenta un marcatore.
- IResource è ciò a cui colleghi i tuoi marker. Possono essere aree di lavoro, progetti, file, directory ecc.
resource.createMarker (IMarker.PROBLEM)
crea un marker di problemi. - IProject è un tipo di
IResource
che rappresenta un progetto. Utilizzare il metodomembers ()
per ottenere i contenuti.
Eseguo il test a mano per la prima volta ( Esegui > Esegui come > Python unit test ). Dopo quello, io uso
Ctrl + Maiusc + F9
per salvare i file e eseguire i test, invece di salvare con Ctrl + S
e aspettarsi che avvenga un po 'di magia.
La combinazione di tasti Ctrl + Shift + F9
riavvia l'ultima configurazione della corsa.
Disclaimer : sono nuovo su Eclipse e PyDev, quindi potrei suggerire qualcosa di sciocco / ovvio / sbagliato
Ho migliorato " nosy " script per compilare automaticamente la documentazione ed eseguire test continuamente. Niente di eccezionale, ma ottiene il lavoro fatto. Pubblicandolo qui perché l'originale il link è andato giù. A differenza dello script originale ficcanaso, questo analizza ricorsivamente la directory e consente di cercare più pattern.
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)
Spero che questo aiuti.
=)
Uso Nosy (disponibile su pypi):
Esegui lo strumento di individuazione ed esecuzione del test del naso ogni volta che un file di origine è cambiato.