Tests unitaires continus avec Pydev (Python et Eclipse)
-
06-07-2019 - |
Question
Existe-t-il un moyen d'intégrer les tests unitaires en arrière-plan à l'environnement Pydev Eclipse?
Mes tests unitaires fonctionnent bien, mais je voudrais les intégrer pour qu'ils fonctionnent en arrière-plan en fonction des modifications du fichier source (par exemple avec le nez) et pour intégrer le résultat dans Eclipse (je pense à un grand X rouge lorsque les tests échouent avec une console et un journal de trace).
Non, une invite de commande qui coule sur le côté ne compte pas.
J'ai eu cette intégration Eclipse lors du développement de produits RoR.
Merci,
Tal.
MODIFIER: Découvrez le nouveau fichier Pydev (1.6.4) http: // pydev .org / manual_adv_pyunit.html
La solution
Cette fonctionnalité a été ajoutée à PyDev 2.0.1 avec une option permettant de relancer les tests lors du dernier test exécuté chaque fois qu'un fichier python est modifié, avec une option supplémentaire permettant de réexécuter uniquement les erreurs - bien que le test complet soit exécuté. suite si aucune erreur n’a été trouvée, car l’idée est que vous travailliez sur vos erreurs et que, lorsque tous réussissaient, le lancement final de la suite était terminé (vous pouvez alors passer à une autre tâche).
Cette fonctionnalité nocturne est intégrée à la version nocturne actuelle.
Autres conseils
Pydev a une certaine intégration de test unitaire, mais ce n'est qu'une configuration d'exécution ... donc ...
Ce n’est pas très élégant, mais si vous:
- Activer le projet - > Construire automatiquement
- Dans les propriétés de votre projet, ajoutez un nouveau générateur de type programme .
- Configurez-le pour exécuter vos tests et sélectionnez "lors de la génération automatique"
Au moins, vous obtiendrez quelque chose qui affiche les résultats du test sur la console lors de la sauvegarde des ressources.
Je viens de me rendre compte que PyDev dispose d'un support de script assez puissant. Malheureusement, je n'ai pas le temps de tout faire pour vous (mais si vous complétez ceci, merci de le poster ici:)
Si vous créez un fichier nommé pyedit_nose.py
, qui ressemble à ceci dans un dossier vide par ailleurs:
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)
et configurez Préférences- > PyDev- > Scripting Pydev pour qu'il pointe vers ce répertoire, tous les projets de votre espace de travail seront marqués d'une erreur chaque fois qu'un fichier est enregistré.
En exécutant un script qui renvoie les résultats du test dans un format facile à analyser plutôt que ls
, et en analysant le résultat, vous devriez pouvoir placer vos marqueurs aux bons endroits.
Voir ceci pour quelques points de départ:
- Script Jython dans Pydev
- IMarker est ce qui représente un marqueur.
- IResource est ce à quoi vous attachez vos marqueurs. Cela peut être des espaces de travail, des projets, des fichiers, des répertoires, etc.
resource.createMarker (IMarker.PROBLEM)
crée un marqueur de problème. - IProject est un type de
IResource
qui représente un projet. Utilisez la méthodemembers ()
pour obtenir le contenu.
Je lance le test à la main pour la première fois ( Exécuter> Exécuter en tant que> Test d'unité Python ). Après cela, j'utilise
Ctrl + Maj + F9
pour que les fichiers et les tests soient exécutés, au lieu de sauvegarder avec Ctrl + S
et d'attendre un peu de magie.
La combinaison de touches Ctrl + Maj + F9
relance la dernière configuration exécutée.
Clause de non-responsabilité : Eclipse et PyDev sont nouveaux, je peux donc suggérer quelque chose de stupide / évident / faux
J'ai amélioré le " nosy " script pour construire automatiquement la documentation et exécuter des tests en continu. Rien d'étonnant, mais fait le travail. Le poster ici parce que l'original lien est tombé. Contrairement au script curieux original, celui-ci scanne le répertoire de manière récursive et permet de rechercher plusieurs modèles.
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)
J'espère que cela vous aidera.
=)
J'utilise Nosy (disponible sur pypi):
Exécutez l'outil de découverte et d'exécution du test de nez chaque fois qu'un fichier source est changé.