Ich versuche, alle Funktionen in jedem gefundenen Modul aufzulisten, um das Schreiben von Testfällen zu erzwingen. Allerdings habe ich Probleme, dies nur mit dem vollständigen Pfad zur Datei als String zu tun und nicht zu importieren. Wenn ich inspect.getmembers(fullpath, inspect.isfunction)
verwende, wird ein leeres Array zurückgegeben. Gibt es einen Weg, dies zu erreichen? Hier ist mein Code so weit:Listet alle Funktionen in einem Modul mit vollem Pfad auf
import glob
import os
import inspect
def count_tests(moduletestdict):
for key,value in moduletestdict.items():
print("Key: {}".format(key))
print(inspect.getmembers(key, inspect.isfunction))
def find_functions(base_dir):
"""moduletestdict has key value pairs where the key is the module
to be tested and the value is the testing module"""
moduletestdict = {}
for roots, dirs, files in os.walk(base_dir):
for f in files:
if (".py" in f) and (".pyc" not in f) and ("test_" not in f) and (f != "__init__.py"):
if "test_{}".format(f) in files:
moduletestdict["{}/{}".format(roots,f)] = "{}/{}".format(roots, "test_{}".format(f))
else:
moduletestdict["{}/{}".format(roots,f)] = "NOTEST"
return moduletestdict
if __name__ == "__main__":
base_dir = "/Users/MyName/Documents/Work/MyWork/local-dev/sns"
moduletestdict = find_functions(base_dir)
count_tests(moduletestdict)
Nur um klar zu sein, erwartet 'package_dotted_path' den Namen des Moduls mit der' .py' Dateierweiterung, richtig? – asdf
Ich habe meine Antwort bearbeitet (und korrigiert), um das Problem zu beheben. Grundsätzlich muss der 'package_dotted_path', den Sie an die Funktion übergeben, der Paketname sein, der alle Ihre Module enthält. Zum Beispiel könnte es einfach "Paket" oder "Paket-Paket" oder sogar direkt ein Modul wie "Paket-Paket-Modul" sein. Die einzige Bedingung ist, dass ein solcher gepunkteter Pfad importiert werden muss. Dies wird hier sichergestellt, indem das übergeordnete Verzeichnis des Root-Pakets zu "sys.path" hinzugefügt wird. – ChristopherC