Die Frage aus diesem Szenario kommt genannt werden:ein Objekt gegeben, wie eine Liste von gebundenen Methoden zu erhalten, die während der Laufzeit
Wir haben gebaut, einen Rahmen zu testen, in Richtung Norden apis unser Projekt, basierend auf pytest. Und jetzt wollen wir einen Bericht darüber haben, wie viele Apis getestet werden (im Grunde genommen werden sie genannt), indem wir die Testskripte ausführen, die wir haben.
Wir haben bereits einen gut definierten Client-Manager, der jede API als Python-Methode macht. Zum Beispiel, wir haben eine api GET /user
, dann haben wir eine Methode get_user
, die die eigentliche Anfrage an den Server sendet.
Wir verwenden jetzt Python-Coverage (eigentlich pytest-cov, aber es ist das gleiche), das uns einen Bericht über die Codeabdeckung geben wird, und basierend darauf werden wir eine Art Konzept darüber haben, wie viele Apis aufgerufen werden . Es ist jedoch nicht genau und klar genug.
Die Schlüsselfrage ist also, gibt es eine Möglichkeit, eine Liste der gebundenen Methoden zu erhalten, die zur Laufzeit aufgerufen werden.
Ich würde gerne ein Beispiel geben, um die Frage zu veranschaulichen.
class Client(object):
def __init__(self):
pass
def get_user(self, user):
pass
def post_user(self, user):
pass
def delete_user(self, user):
pass
def test_get_user():
Client().get_user("user")
def test_post_user():
Client().post_user("user")
Nach den beiden Tests ausgeführt wird, wie kann ich einen Bericht erhalten, dass get_user
und post_user
genannt wurde und delete_user
wurde während letzten Lauf genannt.
Eine mögliche Lösung ist, da Tests mit coverage.py genügend Informationen über Zeilennummern und Dateien liefern, die ausgeführt werden. Vielleicht kann ich dann analysieren, was ich brauche.
Eine andere mögliche Lösung ist zu verfolgen, welche Methode in Client
ich definiert definiert ist. Tatsächlich habe ich meine Frage in meinem speziellen Fall gelöst, wo alle apis-Methode eine gemeinsame Methode aufrufen wird, in meinem Fall call_api
. Ich benutze inspect
in Methode call_api
, und ich bin in der Lage, den Namen der Methode zu erhalten, weil sagen, get_user
ist immer der Aufrufer von call_api
. Diese Lösung funktioniert jedoch nur für diesen speziellen Fall und ist keine allgemeine Lösung.
Ich schaute auch auf Modul trace
, es sieht in der Nähe, was ich will, aber leider müssen Sie verwenden, um Befehl oder Funktion auszuführen.
Was will ich schließlich erreichen ist:
tracer = Trace(obj_to_trace)
tracer.start_trace()
# using obj_to_trace
tracer.end_trace()
tracer.get_called_methods()
Zustimmen, ich grub tiefer in "Trace" und "inspect" Modul. –