43 votes

Une unité de test continu avec Pydev (Python et Eclipse)

Est-il un moyen d'intégrer arrière-plan de tests unitaires avec le Pydev environnement Eclipse?

Mes tests unitaires fonctionnent bien, mais je voudrais intégrer les exécuter en arrière-plan basé sur les modifications apportées au fichier source (par exemple, avec le nez) et d'intégrer les résultats de l'Éclipse (je pense à gros X rouge lorsque les tests échouent avec une console et un journal de trace de vue).

Non, une invite de commande en nez sur le côté ne compte pas.

J'ai eu cette Éclipse de l'intégration lors de l'élaboration de RoR choses.

Merci,

Tal.

EDIT: découvrez la nouvelle Pydev (1.6.4) http://pydev.org/manual_adv_pyunit.html

36voto

Fabio Zadrozny Points 11951

Cette fonctionnalité a été ajoutée à PyDev 2.0.1 avec une option de relancer les tests de la dernière épreuve exécutée chaque fois qu'un fichier python changement, avec une option supplémentaire de relancer uniquement les erreurs -- bien qu'il va exécuter la suite de tests complète si aucune erreur n'a été trouvée, l'idée est que vous travaillez à travers vos erreurs, et quand tous passer un lancement pour l'ensemble de la suite (et puis vous pouvez passer à une autre tâche).

L'actuel nightly build a cette fonction incorporée.

Picture with new action

9voto

Henrik Gustafsson Points 11755

Pydev ne avoir une certaine unité de test d'intégration, mais ce n'est pas comme une course de configuration...donc...

Ce n'est pas un moyen très élégant, mais si vous:

  1. Activer Project->Build Automatiquement
  2. Dans les propriétés de votre projet, ajouter un nouveau générateur de type de Programme
  3. Le configurer pour exécuter vos tests et sélectionnez "pendant l'auto construit'

Puis au moins, vous obtiendrez quelque chose de que les résultats les résultats du test de la console sur les ressources sauve.

5voto

Henrik Gustafsson Points 11755

Je viens de réaliser que PyDev a plutôt un langage de script puissant soutien. Malheureusement je n'ai pas le temps de tout faire pour vous (mais si vous accomplissez cela, s'il vous plaît poster ici :)

Si vous créez un fichier nommé pyedit_nose.py qui ressemble à ce qui est normalement un dossier vide :

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 configurer les Préférences->PyDev->Script Pydev pour pointer vers ce répertoire, vous obtiendrez tous les projets dans votre espace de travail marqué avec un message d'erreur à chaque fois qu'un fichier est enregistré.

Par l'exécution d'un script qui retourne les résultats de test dans certains facile à analyser format plutôt que d' ls et l'analyse de la sortie, vous devriez être en mesure de mettre vos marqueurs dans les bons endroits.

Voir ce pour certains points de départ:

  • Python Scripting dans Pydev
  • IMarker est ce qui représente un marqueur.
  • IResource est ce que vous attachez vos marqueurs pour. Peut être des espaces de travail, des projets, des fichiers, des répertoires, etc. resource.createMarker(IMarker.PROBLEM) crée un problème de marqueur.
  • IProject est un type d' IResource que représente un projet. Utiliser l' members() méthode pour obtenir le contenu.

0voto

leo Points 141

J'utilise de Nosy be (disponible sur pypi):

Exécutez le nez test de la découverte et de l'exécution de l'outil à chaque fois qu'un fichier source est changé.

0voto

GoraKhargosh Points 571

J'ai amélioré le "fouineur" script pour générer automatiquement la documentation et exécute les tests en permanence. Rien stellaire, mais fait le travail. Le poster ici parce que l'original lien est allé vers le bas. Contrairement à l'original nosy script, celui-ci scanne le répertoire de façon récursive et permet la recherche de 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)

Espérons que cette aide.

=)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X