2016-06-22 4 views
2

中に呼び出されバウンドメソッドのリストを取得するにはどのようにオブジェクトを、与えられました。 これで、私たちが持っているテストスクリプトを実行することによって、いくつのapiがテストされているか(基本的には呼ばれているか)に関するカバレッジレポートを作成したいと考えています。質問は、このシナリオから来て、ランタイム

我々はすでにPythonの方法として、すべてのAPIを作る明確に定義されたクライアントマネージャを、持っています。 たとえば、api GET /userがあるとしたら、get_userという方法でサーバーに実際のリクエストを送信します。

Pythonカバレッジ(実際にはpytest-covですが、これは同じことです)を使用してコードカバレッジのレポートを作成し、それに基づいてapiの数。しかし、それは正確ではなく、十分にはっきりしていません。

だから重要な問題は、実行時に呼ばれている束縛メソッドのリストを取得する方法があり、あります。

質問の例を示したいと思います。 2つのテストを実行した後

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

、どのように私はget_userpost_userが呼び出されたとdelete_userは、前回の実行中に呼び出されていなかったというレポートを取得することができます。 coverage.pyで実行中のテストは、多分私はそこから必要なものを分析することができ、実行されている私たちの行番号とファイルに関する十分な情報が得られますので、

一つの可能​​な解決策は、あります。

別の可能な解決策は、私が定義されClientに呼び出されるメソッドを追跡することです。実際には、すべてのapisメソッドが私の場合は普通のメソッド、call_apiを呼び出す私の特定のケースで私の質問を解決しました。私は方法call_apiinspectを使用しています。get_userが常にcall_apiの呼び出し元であると言うので、メソッド名を取得できます。ただし、このソリューションはこの特殊なケースでのみ機能し、一般的な解決策ではありません。

私もモジュールtraceを見ましたが、私が望むものに近いと思われますが、残念ながらtracer(Trace instance)を使用してコマンドまたは機能を実行する必要があります。私は最終的に達成したい何

は次のとおりです。

tracer = Trace(obj_to_trace) 
tracer.start_trace() 
# using obj_to_trace 
tracer.end_trace() 
tracer.get_called_methods() 

答えて

0

あなたはカバレッジライブラリ自体からこれを取得することができるかどうかは分かりませんが、あなたは間違いなくファイルを自分で処理することによって、この情報を得ることができます。

ASTモジュールを見てください。これにより、カバレッジによって報告されたすべてのファイルを解析し、各関数の行範囲を生成することができます。そこから、どの関数がどの行を実行したかを調べるだけです。

しかし、カバレッジは同様のことを行う必要があるため、カバレッジを変更して代わりにローカル関数を報告する方が簡単かもしれません。

0

Coverage.pyにはこの機能はありません。 traceモジュールを使用するか、カバレッジ結果を後処理してメソッド名を取得する必要があります。

+0

私は 'trace'と' inspect'モジュールについて深く掘り下げています。 –

関連する問題