2016-06-22 8 views
2

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() 

Antwort

0

Ich weiß nicht, ob Sie diese von der Deckung Bibliothek bekommen kann sich, aber man kann auf jeden Fall diese Informationen erhalten, indem Dateien selbst zu verarbeiten.

Schauen Sie sich das Modul AST an. Es ermöglicht Ihnen, alle von der Berichterstattung berichteten Dateien zu analysieren und Zeilenbereiche für jede Funktion zu generieren. Von dort müssen Sie nur überprüfen, welche Funktionen überhaupt Linien ausgeführt haben.

Aber ... da die Abdeckung etwas Ähnliches tun muss, kann es einfacher sein, die Abdeckung zu ändern, um stattdessen die lokale Funktion zu melden.

0

Coverage.py verfügt nicht über diese Funktion. Sie müssen das trace-Modul verwenden oder die Coverage-Ergebnisse nachbearbeiten, um die Methodennamen zu erhalten.

+0

Zustimmen, ich grub tiefer in "Trace" und "inspect" Modul. –

Verwandte Themen