Python-Test-Entdeckung mit Doctests, Coverage und Parallelität

… und ein pony! Nein im Ernst. Ich suche nach einer Möglichkeit, Tests zu organisieren, die "nur funktioniert". Die meisten Dinge funktionieren, aber nicht alle Stücke passen zusammen. Also hier ist was ich will

  • Die Tests wurden automatisch erkannt. Dazu gehören Dokthe. Beachten Sie, dass die Summe der Doctests nicht als Einzeltest erscheinen darf. (Dh nicht was py.test –doctest-modules tut)
  • Gleichzeitige Tests durchführen können. (Etwas wie py.test -n aus xdist)
  • Erstellung eines Berichts.
  • Machen Sie python setup.py test nur Arbeit.

Mein aktueller Ansatz beinhaltet ein Testverzeichnis und das load_tests Protokoll . Alle Dateien enthalten sind wie test_*.py . Dies macht python -m unittest discover nur Arbeit, wenn ich eine Datei test_doctests.py mit dem folgenden Inhalt erstellen.

 import doctest import mymodule1, mymodule2 def load_tests(loader, tests, ignore): tests.addTests(doctest.DocTestSuite(mymodule1)) tests.addTests(doctest.DocTestSuite(mymodule2)) return tests 

Dieser Ansatz hat auch die Oberseite, dass man setuptools verwenden und liefern setup(test_suite="unittest2.collector") .

Doch dieser Ansatz hat ein paar Probleme.

  • Coverage.py erwartet ein Skript. So kann ich hier keine entdeckungen entdecken.
  • Py.test führt keine load_tests-Funktionen aus, so dass es nicht die doctests findet und die --doctest-modules option ist crap.
  • Nosetests führt die load_tests Funktionen aus, liefert aber keine Parameter. Das scheint völlig auf der Seite der Nase gebrochen.

Wie kann ich die Dinge besser machen als dies oder beheben einige der oben genannten Probleme?

2 Solutions collect form web for “Python-Test-Entdeckung mit Doctests, Coverage und Parallelität”

Ich benutze Nase und fand deine Frage, als ich das gleiche Problem erlebt habe.

Was ich am Ende gegangen bin, ist nicht hübsch, aber es läuft die Tests.

 import doctest import mymodule1, mymodule2 def test_mymodule1(): assert doctest.testmod(mymodule1, raise_on_error=True) def test_mymodule2(): assert doctest.testmod(mymodule2, raise_on_error=True) 

Leider läuft es alle Dokthe in einem Modul als Einzeltest. Aber wenn die Dinge schief gehen, zumindest weiß ich, wo ich anfangen zu suchen. Ein Fehler führt zu einem DocTestFailure mit einer nützlichen Meldung:

 DocTestFailure: <DocTest mymodule1.myfunc from /path/to/mymodule1.py:63 (4 examples)> 

Das ist eine alte Frage, aber das Problem bleibt noch für einige von uns! Ich habe gerade daran gearbeitet und fand eine Lösung ähnlich wie kaapstorm, aber mit viel schöner Ausgabe. Ich benutze py.test , um es zu laufen, aber ich denke, es sollte kompatibel über Test-Läufer sein:

 import doctest from mypackage import mymodule def test_doctest(): results = doctest.testmod(mymodule) if results.failed: raise Exception(results) 

Was ich am Ende in einem Ausfall Fall ist die gedruckte Stdout-Ausgabe, die Sie aus laufen Doktest manuell bekommen würde, mit einer zusätzlichen Ausnahme, die wie folgt aussieht:

 Exception: TestResults(failed=1, attempted=21) 

Wie kaapstrom erwähnt, zählt es nicht ordnungsgemäß (es sei denn, es gibt Ausfälle), aber ich finde das ist nicht eine ganze Menge wert, da die Abdeckungszahlen wieder hoch sind 🙂

  • Unit Testing Schnittstellen in Python
  • Python Unit Testing mit zwei Mock-Objekten, wie man die Call-Order verifiziert?
  • Wie teste ich eine Python-Funktion, die PDF-Grafiken zeichnet?
  • Commit in git nur, wenn Tests passieren
  • Wie passierst du Ausnahme-Argumente an python unittest mock side effect?
  • Python unerträglich und entdeckung
  • Wie kann ich mein GUI-Programm mit Python und PyQt testen?
  • Unit Testing File Modifikationen
  • Einheit und Funktionsprüfung einer PySide-basierten Anwendung?
  • Wie man Code nur bei Testfehlern mit python unittest2 ausführt?
  • Python Mocking eine Funktion aus einem importierten Modul
  • Python ist die beste Programmiersprache der Welt.