21 Stimmen

Optimale Organisation der Dateistruktur von Python-Modul-Unittests?

Leider musste ich feststellen, dass es zu viele Möglichkeiten gibt, einen Unittest in Python durchzuführen, und dass diese in der Regel nicht gut dokumentiert sind.

Ich bin auf der Suche nach einer "ultimativen" Struktur, die die meisten der unten genannten Anforderungen erfüllt:

  • durch Test-Frameworks auffindbar sein, einschließlich:
    • pytest
    • nosetests
    • tox
  • die Tests sollten sein außerhalb der Moduldateien und in einem anderen Verzeichnis als dem des Moduls selbst (Wartung), wahrscheinlich in einem tests/ Verzeichnis auf Paketebene.
  • es sollte möglich sein, einfach eine Testdatei auszuführen (der Test muss wissen, wo sich das zu testende Modul befindet)

Bitte stellen Sie eine Beispieldatei zur Verfügung, die einen Fake-Test durchführt, und geben Sie den Dateinamen und das Verzeichnis an.

19voto

FMc Punkte 40706

Hier ist der Ansatz, den ich verwendet habe:

Struktur des Verzeichnisses

# All __init__.py files are empty in this example.
app
    package_a
        __init__.py
        module_a.py
    package_b
        __init__.py
        module_b.py
    test
        __init__.py
        test_app.py
    __init__.py
main.py

main.py

# This is the application's front-end.
#
# The import will succeed if Python can find the `app` package, which
# will occur if the parent directory of app/ is in sys.path, either 
# because the user is running the script from within that parect directory
# or because the user has included the parent directory in the PYTHONPATH
# environment variable.

from app.package_a.module_a import aaa
print aaa(123, 456)

modul_a.py

# We can import a sibling module like this.
from app.package_b.module_b import bbb
def aaa(s, t):
    return '{0} {1}'.format(s, bbb(t))

# We can also run module_a.py directly, using Python's -m option, which
# allows you to run a module like a script.
#
#    python -m app.package_a.module_a
if __name__ == '__main__':
    print aaa(111, 222)
    print bbb(333)

modul_b.py

def bbb(s):
    return s + 1

test_app.py

import unittest

# From the point of view of testing code, our working modules
# are siblings. Imports work accordingly, as seen in module_a.
from app.package_a.module_a import aaa
from app.package_a.module_a import bbb

class TestApp(unittest.TestCase):

    def test_aaa(self):
        self.assertEqual(aaa(77, 88), '77 89')

    def test_bbb(self):
        self.assertEqual(bbb(99), 100)

# Simiarly, we can run our test modules directly as scripts using the -m option,
# or using nose.
#
#    python -m app.test.test_app
#    nosetests app/test/test_app.py

if __name__ == '__main__':
    unittest.main()

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