2012-11-13 3 views
5

Ich verwende Tox, um zu überprüfen, dass das System, das ich entwickle, verhält sich gut, wenn in einer frischen Umgebung installiert (Überprüfung der setup.py Datei). Allerdings verwendet das System einen memcached Server, und idealerweise möchte ich einen neuen für jeden Tox Lauf spawnen.Python/tox, starten Sie einen Prozess vor den Tests, herunterfahren, wenn fertig

Gibt es einen bevorzugten Weg, Programme zu starten, bevor Tests ausgeführt werden (und sie anschließend herunterfahren), oder muss ich einen benutzerdefinierten Runner schreiben?

Edit: Die Testläufer ist py.test

+1

Sie sollten dies wahrscheinlich in _setup_ functions/methods des eigentlichen Unit-Test-Frameworks (_py.test_, _nose_, _unittests_, ...) tun, das Sie mit _tox_ verwenden. –

+0

Gute Idee! Die Implementierung war ein Kinderspiel mit "Subprozess". Mach es eine Antwort und ich werde es akzeptieren. –

+0

Implementierungshinweis: 'pytest_configure' und' pytest_unconfigure' in 'conftest.py' waren ein guter Ort um zu spawnen/zu beenden. –

Antwort

2

Dies ist nicht wirklich eine Aufgabe für tox. Meine Empfehlung ist, dass Sie dies in den setup Funktionen/Methoden des tatsächlichen Unit-Test-Framework (py.test, nose, unittests, ...) tun, die Sie mit tox verwenden.

Originalplakat Kommentar:

pytest_configure und pytest_unconfigure in conftest.py war ein guter Platz zum Laichen/zu beenden.

+0

pytest_configure/unconfigure sind nicht die besten für diese, da sie mit verteilten Tests (pytest-xdist plugin) nicht gut funktionieren werden. Die py.test 2.3-Version führte die erweiterte Fixtures-API ein, um dieses Problem zu lösen. Markieren Sie das Fixture mit @ pytest.fixture (scope = 'session'), um ein session-scoped Fixture zu erstellen. – flub

1

Ich empfehle Ihnen, paver verwenden - http://paver.github.com/paver/ - für das Laichen und Abfahren des memcached Server oder zusätzliche „verschiedene Systemverwaltungsaufgaben“, die Sie brauchen, um tun während der Ausführung von setup.py von tox.

+0

, aber dann können Sie die Tests nicht mehr ohne weiteres leicht durchführen. Doing it mit dem zugrunde liegenden Test Runner passt besser, denke ich. – hpk42

6

Um Flub's Kommentar über die beste Möglichkeit, es mit py.test zu tun, mit seiner fixture mechanism. Erstellen Sie eine conftest.py Datei mit folgendem Inhalt:

# content of conftest.py 

import pytest, subprocess 

@pytest.fixture(scope="session", autouse=True) 
def startmemcache(request): 
    proc = subprocess.Popen(...) 
    request.addfinalizer(proc.kill) 

Die „autouse“ Flag bedeutet, dass diese Leuchte für jeden Testlauf aktiviert wird, ohne irgendwelche Referenzen von Tests zu erfordern. In der Praxis sollten Sie jedoch die Verbindungsdetails zu dem für Ihre Tests verfügbaren Subprozess einrichten, damit Sie nicht mit magischen Portnummern arbeiten müssen. Sie würden dann nicht "autouse" verwenden, sondern stattdessen ein Fixture-Objekt zum Verbinden mit Memcache zurückgeben, das die Testkonfiguration an einer Stelle gut einkapselt (die Fixture-Funktion). Weitere Beispiele finden Sie in der Dokumentation.

+0

Viel schöner als meine ursprüngliche Implementierung. Ich werde dafür gehen. –

Verwandte Themen