17 Stimmen

Wie kann ich Python-Tests so organisieren, dass ich alle Tests mit einem einzigen Befehl ausführen kann?

Derzeit ist mein Code in der folgenden Baumstruktur organisiert:

src/
    module1.py
    module2.py
    test_module1.py
    test_module2.py
    subpackage1/
        __init__.py
        moduleA.py
        moduleB.py
        test_moduleA.py
        test_moduleB.py

Wo die module*.py Dateien enthalten den Quellcode und die test_module*.py enthält die TestCase s für das betreffende Modul.

Mit den folgenden Befehlen kann ich zum Beispiel die in einer einzigen Datei enthaltenen Tests ausführen:

$ cd src
$ nosetests test_filesystem.py
..................
----------------------------------------------------------------------
Ran 18 tests in 0.390s

OK

Wie kann ich alle Tests durchführen? Ich habe es versucht mit nosetests -m 'test_.*' aber es funktioniert nicht.

$cd src
$ nosetests -m 'test_.*'

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK

Gracias

16voto

Torsten Marek Punkte 78610

Ob man Tests und Module trennt oder mischt, ist wahrscheinlich Geschmackssache, obwohl ich stark dafür plädieren würde, sie getrennt zu halten (aus Gründen der Einrichtung, Codestatistiken usw.).

Wenn Sie nosetests verwenden, stellen Sie sicher, dass alle Verzeichnisse mit Tests echte Pakete sind:

src/
    module1.py
    module2.py
    subpackage1/
        __init__.py
        moduleA.py
        moduleB.py
tests/
    __init__.py
    test_module1.py
    test_module2.py
    subpackage1/
        __init__.py
        test_moduleA.py
        test_moduleB.py

Auf diese Weise können Sie einfach nosetests im Toplevel-Verzeichnis und alle Tests werden gefunden. Sie müssen sicherstellen, dass src/ ist auf der PYTHONPATH Allerdings müssen alle Tests aufgrund von fehlenden Importen fehlschlagen.

8voto

Singletoned Punkte 5027

Wenn sie alle mit test dann einfach nosetest sollte funktionieren. Nose sucht automatisch nach allen Dateien, die mit "test" beginnen.

6voto

Mapad Punkte 8044

Ich weiß nicht, wie es mit Nosetests aussieht, aber das kann man mit dem Standard-Unittest-Modul erreichen. Sie müssen nur eine test_all.py Datei in Ihrem Root-Verzeichnis und importieren Sie dann alle Ihre Testmodule. In Ihrem Fall:

import unittest
import test_module1
import test_module2
import subpackage1
if __name__ == "__main__":
    allsuites = unittest.TestSuite([test_module1.suite(), \
                                test_module2.suite(), \
                                subpackage1.test_moduleA.suite(), \
                                subpackage1.test_moduleB.suite()])

jedes Modul sollte die folgende Funktion bereitstellen (Beispiel mit einem Modul mit zwei Unit-Tests: Class1 y Class2 ):

def suite():
    """ This defines all the tests of a module"""
    suite = unittest.TestSuite()
    suite.addTest(unittest.makeSuite(Class1))
    suite.addTest(unittest.makeSuite(Class2))
    return suite
if __name__ == '__main__':
   unittest.TextTestRunner(verbosity=2).run(suite())

2voto

Tom Punkte 10491

Dies ist wahrscheinlich ein heiß umstrittenes Thema, aber ich würde vorschlagen, dass Sie Ihre Tests von Ihren Modulen trennen. Richten Sie etwas wie dieses ein...

Utilisez setup.py um diese in den Systempfad zu installieren (oder Sie können Umgebungsvariablen ändern, um den Schritt "Installieren" zu vermeiden).

foo/
    module1.py
    module2.py
    subpackage1/
        __init__.py
        moduleA.py
        moduleB.py

Jetzt kann jedes Python-Skript überall auf diese Module zugreifen, anstatt sie im lokalen Verzeichnis zu suchen. Legen Sie Ihre Tests alle auf die Seite wie folgt:

tests/
    test_module1.py
    test_module2.py
    test_subpackage1_moduleA,py
    test_subpackage2_moduleB.py

Ich bin mir nicht sicher über Ihre nosetests aber jetzt, da sich Ihre Tests alle im selben Verzeichnis befinden, ist es viel einfacher, ein Wrapper-Skript zu schreiben, das einfach alle anderen Tests im selben Verzeichnis importiert. Wenn das nicht möglich ist, können Sie zumindest mit einem einfachen bash Schleife, die Ihre Testdateien nacheinander abruft:

#!/bin/bash
cd tests/
for TEST_SCRIPT in test_*.py ; do
    nosetests -m $TEST_SCRIPT
done

0voto

orip Punkte 69138

Ich gebe eine Testoob Antwort.

Die Durchführung von Tests in einer einzigen Datei ist wie Nose:

testoob test_foo.py

Um Tests in vielen Dateien durchzuführen, können Sie mit den Testoob-Kollektoren (in jedem Unterpaket) Suiten erstellen

# src/subpackage?/__init__.py
def suite():
  import testoob
  return testoob.collecting.collect_from_files("test_*.py")

und

# src/alltests.py
test_modules = [
    'subpackage1.suite',
    'subpackage2.suite',
]

def suite():
    import unittest
    return unittest.TestLoader().loadTestsFromNames(test_modules)

if __name__ == "__main__":
    import testoob
    testoob.main(defaultTest="suite")

Ich habe Ihr spezielles Szenario nicht ausprobiert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X