Eine Liste aller Module im aktuellen Paket erhalten

Hier ist was ich tun möchte: Ich möchte eine Test-Suite bauen, die in Pakete wie tests.ui, tests.text, tests.fileio, etc. organisiert ist. In jedem __ init __ .py in diesen Paketen möchte ich einen Test machen Suite bestehend aus allen Tests in allen Modulen in diesem Paket. Natürlich können alle Tests mit unittest.TestLoader durchgeführt werden, aber es scheint, dass ich jedes Modul einzeln hinzufügen muss. Angenommen, dass test.ui hat Editor _ Fenster _ test.py und Vorschau _ Fenster _ test.py, ich möchte die __ init __ .py, um diese beiden Dateien zu importieren und erhalten eine Liste der beiden Modulobjekte. Die Idee ist, dass ich die Test-Suiten automatisieren möchte, damit ich nicht vergessen kann, etwas in die Test-Suite aufzunehmen.

Was ist der beste Weg, dies zu tun? Es scheint, als wäre es eine einfache Sache zu tun, aber ich finde nichts.

Ich benutze Python 2.5 btw.

3 Solutions collect form web for “Eine Liste aller Module im aktuellen Paket erhalten”

Gute Antworten hier, aber das Beste, was zu tun wäre, um eine Drittanbieter-Test-Entdeckung und Läufer wie zu verwenden:

  • Nase (mein Liebling)
  • Trial (ziemlich nett, vor allem beim Testen von asynchronen Sachen)
  • Py.test (weniger gut, meiner Meinung nach)

Sie sind alle kompatibel mit plain unittest.TestCase und Sie müssen nicht Ihre Tests in irgendeiner Weise zu ändern, auch nicht, müssen Sie die erweiterten Funktionen in jedem von ihnen verwenden. Verwenden Sie einfach als Suite Entdeckung.

Gibt es einen bestimmten Grund, warum du das böse Zeug in diesen libs neu erfinden willst?

Lösung für genau dieses Problem aus unserem django Projekt:

 """Test loader for all module tests """ import unittest import re, os, imp, sys def find_modules(package): files = [re.sub('\.py$', '', f) for f in os.listdir(os.path.dirname(package.__file__)) if f.endswith(".py")] return [imp.load_module(file, *imp.find_module(file, package.__path__)) for file in files] def suite(package=None): """Assemble test suite for Django default test loader""" if not package: package = myapp.tests # Default argument required for Django test runner return unittest.TestSuite([unittest.TestLoader().loadTestsFromModule(m) for m in find_modules(package)]) if __name__ == '__main__': unittest.TextTestRunner().run(suite(myapp.tests)) 

EDIT: Der Vorteil im Vergleich zu bialix's Lösung ist, dass man diesen Loader irgendwo in den Projektbaum platzieren kann, gibt es keine Notwendigkeit, init .py in jedem Testverzeichnis zu modifizieren.

Sie können os.listdir verwenden, um alle Dateien im Test zu finden. * Verzeichnis und dann herausfiltern .py Dateien:

 # Place this code to your __init__.py in test.* directory import os modules = [] for name in os.listdir(os.path.dirname(os.path.abspath(__file__))): m, ext = os.path.splitext() if ext == '.py': modules.append(__import__(m)) __all__ = modules 

Die magische Variable __file__ enthält den Dateipfad des aktuellen Moduls. Versuchen

 print __file__ 

überprüfen.

  • Wie kann man die Verbosität in python unittest erhöhen?
  • Tkinter's event_generate Befehl ignoriert
  • Wie überschreibt man ein Zeitstempelfeld für Unit-Testzwecke?
  • Wie man Firefox-Profil mit Selen umschaltet - ohne einen neuen Treiber zu benennen?
  • Wie kann ich verhindern, dass Unit-Tests beim Aufruf von webbrowser.open () beenden?
  • Wie behaupte ich, dass ein Funktionsaufruf keinen Fehler mit unittest zurückgibt?
  • Speziell benannte Verzeichnisse mit Nosetests
  • Verwalten von Protokollen / Warnungen in Python-Erweiterungen
  • Erhalten der End-Speicher-Adresse eines Speicherbereichs über Python / Ctypes
  • Unbekannter Tkinter File Dialog
  • Mit selbst in python @ patch dekorateur
  • Python ist die beste Programmiersprache der Welt.