2008-09-20 4 views
41

Grundsätzlich Growl Benachrichtigungen (oder andere Rückrufe), wenn Tests brechen oder bestehen. Gibt es so etwas?Gibt es etwas wie "Autotest" für Python-Unittests?

Wenn nicht, sollte es ziemlich einfach zu schreiben .. Der einfachste Weg python-autotest myfile1.py myfile2.py etc.py

  • Überprüfen ..

    1. laufen würde, wenn Dateien-zu-sein-überwacht modifiziert wurden (möglicherweise nur, wenn sie gespeichert wurden).
    2. Führen Sie alle Tests in diesen Dateien aus.
    3. Wenn ein Test fehlschlägt, aber im vorherigen Durchlauf bestanden wurde, generieren Sie einen Growl-Alarm. Gleiches gilt für Tests, die fehlschlagen und dann bestanden werden.
    4. Warten Sie, und wiederholen Sie die Schritte 2-5.

Das Problem, das ich sehen kann, gibt es, wenn die Tests in einer anderen Datei sind. Die einfache Lösung wäre, alle Tests nach jedem Speichern auszuführen, aber mit langsameren Tests könnte dies länger als die Zeit zwischen den Speicherungen dauern und/oder könnte viel CPU-Leistung usw. verbrauchen.

Der beste Weg zu tun wäre es zu sehen, welche Bits des Codes sich geändert haben, wenn sich die Funktion abc() geändert hat, nur Tests laufen lassen, die damit interagieren. Das wäre zwar großartig, aber ich denke, es wäre extrem komplex zu implementieren?

Fassen wir zusammen:

  • Gibt es so etwas wie die Ruby-Tool autotest (Teil des ZenTest package), aber für Python-Code?
  • Wie überprüfen Sie, welche Funktionen zwischen zwei Revisionen eines Skripts geändert haben?
  • Ist es möglich zu bestimmen, welche Funktionen ein Befehl aufrufen wird? (Etwas wie ein umgekehrtes Traceback)
+0

Ich glaube nicht, dass es möglich ist, richtig zu testen, wenn Sie nur Tests ausführen, die direkt auf die geänderte Funktion verweisen. Sie werden dann nicht testen, wie die Funktion mit dem Rest des Codes interagiert. Zum Beispiel könnte es den Test bestehen, aber in der Praxis scheitern, weil sein Verhalten auf subtile Weise geändert – freespace

+0

Hmm, guter Punkt .. – dbr

Antwort

24

Ich fand autonose ziemlich unzuverlässig sein, aber sniffer scheint sehr gut zu funktionieren.

$ pip install sniffer 
$ cd myproject 

Dann statt laufen "nosetests" Sie laufen:

$ sniffer 

Oder statt nosetests --verbose --with-doctest, Sie laufen:

$ sniffer -x--verbose -x--with-doctest 

Wie in der readme beschrieben, es ist eine gute Idee um eine der plattformspezifischen Dateisystemüberwachungsbibliotheken zu installieren, , pywin32 oder MacFSEvents (alle Installa ble über pip usw.)

+0

Ja, 'Schnüffler' ist der Weg zu gehen. – hiwaylon

2

Vielleicht würde buildbot http://buildbot.net/trac

+0

Das könnte funktionieren, aber es ist extrem kompliziert, für das, was ich will, einzurichten. Autotest wird von "cd pfad/zu/my/scripts & autotest" gestartet, buildbot erfordert das Einrichten eines Build-Slave, Einrichten eines Build-Masters (eine ziemlich komplizierte Konfiguration) – dbr

2

Für Ihre dritte Frage nützlich sein, vielleicht das trace Modul ist das, was Sie brauchen:

>>> def y(a): return a*a 
>>> def x(a): return y(a) 
>>> import trace 
>>> tracer = trace.Trace(countfuncs = 1) 
>>> tracer.runfunc(x, 2) 
4 
>>> res = tracer.results() 
>>> res.calledfuncs 
{('<stdin>', '<stdin>', 'y'): 1, ('<stdin>', '<stdin>', 'x'): 1} 

res.calledfuncs die Funktionen enthält, die waren namens. Wenn Sie beim Erstellen des Tracers countcallers = 1 angeben, können Sie Anrufer/Angerufene Beziehungen erhalten. Weitere Informationen finden Sie unter docs of the trace module.

Sie können auch versuchen, die Aufrufe über statische Analyse zu erhalten, aber dies kann aufgrund der dynamischen Natur von Python gefährlich sein.

+0

Das ist genau das, was benötigt wird - Danke! – dbr

2

Djangos Entwicklungsserver verfügt über einen Dateiänderungsmonitor, der nach Änderungen Ausschau hält und sich automatisch neu lädt. Sie können diesen Code erneut verwenden, um Komponententests für Dateiänderungen zu starten.

2
+0

[nose-watch] (https://github.com/lukaszb/nose-watch) ist ein großartiges Plugin. Sie können Ihre Tests wie folgt testen: 'nosetests --with-watch'. Works great – toast38coza

+0

@ toast38coza 'Nase-Uhr' funktioniert nicht auf Windows (tm) –

16

autonose erstellt von gfxmonk:

Autonose ist ein Autotest artiges Werkzeug für Python, die hervorragende nosetest Bibliothek.

autotest verfolgt Dateisystemänderungen und führt automatisch alle geänderten Tests oder Abhängigkeiten erneut aus, wenn eine Datei hinzugefügt, entfernt oder aktualisiert wird. Eine Datei wird als geändert betrachtet, wenn sie selbst geändert wurde, oder wenn sich eine Datei geändert hat import s.

...

Autonose verfügt derzeit über eine native GUI für OSX und GTK. Wenn Ihnen keines davon zur Verfügung steht, können Sie stattdessen die Konsolenversion (mit der Option --console) ausführen.

+0

Gehen Sie mit [Sniffer] (https://github.com/jeffh/sniffer/) nicht autonose, wie @jkp sagte. – hiwaylon

+0

'autonose' scheint nicht mit' virtualenv' zu funktionieren! – exhuma

+0

Nachdem ich eine Weile mit 'autonose' herumgespielt hatte, fiel auch ich wieder auf' Schnüffler'. Es ist nicht so glänzend wie "autonose", aber es funktioniert wie angekündigt. Sogar in einem virtualenv. – exhuma

3

Ich habe gerade dies: http://www.metareal.org/p/modipyd/

ich zur Zeit mit thumb.py, aber als mein aktuellen Projekt geht von einem kleinen Projekt zu einem Medium, das eine Größe, ich habe etwas gesucht, das kann mach ein bisschen gründlichere Analyse der Abhängigkeiten, und mit ein paar Optimierungen, ich habe modipyd up und läuft ziemlich schnell.

2

Guard ist ein ausgezeichnetes Werkzeug, das für Dateiänderungen überwacht und Aufgaben automatisch auslöst. Es ist in Ruby geschrieben, aber es kann als eigenständiges Tool für jede Aufgabe wie diese verwendet werden. Es gibt ein guard-nosetests Plugin, um Python-Tests über nose auszuführen.

Guard unterstützt plattformübergreifende Benachrichtigungen (Linux, OSX, Windows), einschließlich Growl, sowie viele andere großartige Funktionen. Einer meiner kann nicht leben ohne Dev-Tools.

1

Ein sehr nützliches Werkzeug, das dein Leben einfacher machen kann, ist entr. Geschrieben in C, und verwendet kqueue oder inotify unter der Haube.

Der folgende Befehl führt Ihre Testsuite aus, wenn eine *.py Datei in Ihrem Projekt geändert wird.

ls */**.py | entr python -m unittest discover -s test 

Funktioniert für BSD, Mac OS und Linux. Sie können entr von Homebrew bekommen.