Ciągłe testy jednostkowe z Pydev (Python i Eclipse)

Czy jest sposób na zintegrowanie testów jednostkowych w tle ze środowiskiem Pydev Eclipse?

Moje testy jednostkowe działają dobrze, ale chciałbym je zintegrować, aby uruchomić je w tle na podstawie zmian plików źródłowych (np. z nose) i zintegrować wynik z powrotem do Eclipse(myślę o big red x, gdy testy nie powiodą się z widokiem console i trace log).

Nie, nos wiersza polecenia z boku się nie liczy.

Miałem tę integrację Eclipse podczas tworzenia RoR rzeczy.

Dzięki,

Tal.

EDIT: Zobacz nowy Pydev (1.6.4) http://pydev.org/manual_adv_pyunit.html

Author: Tal Weiss, 2009-06-19

6 answers

Ta funkcja została dodana do PyDev 2.0.1 z opcją ponownego uruchomienia testów w ostatnim uruchomieniu testowym za każdym razem, gdy zmieni się plik Pythona, z dodatkową opcją ponownego uruchomienia tylko błędów-chociaż uruchomi pełny pakiet testowy, jeśli nie znaleziono błędów, ponieważ chodzi o to, że pracujesz nad swoimi błędami i kiedy wszystkie przechodzą ostateczne uruchomienie całego pakietu (możesz przejść do innego zadania).

Obecna wersja nightly posiada tę funkcję.

Obraz z nową akcją

 35
Author: Fabio Zadrozny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-13 14:09:41

Pydev ma jakąś integrację testów jednostkowych, ale to tylko jako run configuration...so...

To nie jest zbyt elegancki sposób, ale jeśli:

  1. Włącz Projekt - > Buduj Automatycznie
  2. we właściwościach projektu Dodaj nowy kreator typu Program
  3. skonfiguruj go tak, aby uruchamiał testy i wybierz "podczas automatycznych kompilacji"

Wtedy przynajmniej dostaniesz coś, co wyświetli wyniki testów w konsoli na zapisanych zasobach.

 9
Author: Henrik Gustafsson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-24 16:44:23

Właśnie zdałem sobie sprawę, że PyDev ma dość potężną obsługę skryptów. Niestety nie mam czasu, aby zrobić to wszystko za ciebie (ale jeśli to wypełnisz, zamieść to tutaj :)

Jeśli utworzysz plik o nazwie pyedit_nose.py, który wygląda tak w innym pustym folderze:

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)

I skonfiguruj Preferencje - > PyDev- > skrypt Pydev, aby wskazać ten katalog, wszystkie projekty w Twojej przestrzeni roboczej będą oznaczone błędem za każdym razem, gdy plik zostanie zapisany.

Wykonując skrypt, który zwraca wyniki testu w łatwym do przetworzenia formacie, a nie ls i analizując wynik powinieneś być w stanie umieścić swoje znaczniki w odpowiednich miejscach.

Zobacz to dla niektórych punktów wyjścia:

  • Jython Scripting in Pydev
  • IMarker jest tym, co reprezentuje marker.
  • IResource jest tym, do czego przywiązujesz swoje markery. Mogą to być przestrzenie robocze, Projekty, pliki, katalogi itp. resource.createMarker(IMarker.PROBLEM) tworzy problem marker.
  • IProject jest typem IResource, który reprezentuje projekt. Użyj metody members(), aby uzyskać zawartość.
 5
Author: Henrik Gustafsson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-24 19:29:25

Test wykonuję ręcznie za pierwszym razem (Run > Run As > Python unit test ). Potem używam Ctrl+Shift+F9 aby zapisać pliki i wykonać testy, zamiast zapisywać za pomocą {[1] } i oczekiwać, że wydarzy się jakaś magia.

Kombinacja klawiszy Ctrl+Shift+F9 uruchamia ponownie ostatnią konfigurację uruchomienia.

Jeśli chodzi o Eclipse 'a i PyDev' a, to może sugeruję coś głupiego / oczywistego / błędnego.]}

 1
Author: xverges,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-21 22:04:19

Ulepszyłem skrypt "wścibski", aby automatycznie budować dokumentację i uruchamiać testy ciągle. Nic wspaniałego, ale wykonuje swoją pracę. Zamieszczanie go tutaj, ponieważ oryginał link padł. W przeciwieństwie do oryginalnego skryptu nosy, ten skanuje katalog rekurencyjnie i pozwala na szukanie wielu wzorów.

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)
Mam nadzieję, że to pomoże.

=)

 0
Author: GoraKhargosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-02 18:29:34

Używam Nosy (dostępne na pypi):

Uruchom narzędzie do wykrywania i wykonywania testów nosa, gdy plik źródłowy zmienił się.

 0
Author: leo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-16 16:32:52