2

質問は次のシナリオから来ています。

pytest に基づいて、プロジェクトのノースバウンド API をテストするためのフレームワークを構築しました。そして今、私たちが持っているテスト スクリプトを実行することによって、いくつの API がテストされた (基本的には呼び出された) かについてのカバレッジ レポートが必要です。

すべての API を Python メソッドとして作成する、明確に定義されたクライアント マネージャーが既にあります。たとえば、API があるとすると、実際のリクエストをサーバーに送信GET /userするメソッドがあります。get_user

現在、コード カバレッジのレポートを提供する python-coverage (実際には pytest-cov ですが、同じものです) を使用しています。これに基づいて、呼び出された API の数について何らかの概念が得られます。しかし、それは正確でも明確でもありません。

したがって、重要な問題は、実行時に呼び出されるバインドされたメソッドのリストを取得する方法があるかどうかです。

質問を説明するために例を挙げたいと思います。

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

2 つのテストを実行した後、最後の実行時に呼び出され、呼び出されなかったことget_userを示すレポートを取得するにはどうすればよいですか。post_userdelete_user

考えられる解決策の 1 つは、coverage.py を使用してテストを実行すると、実行中の行番号とファイルに関する十分な情報が得られるため、そこから必要なものを分析できるかもしれません。

Client別の考えられる解決策は、 I definedでどのメソッドが呼び出されたかを追跡することです。実際、すべてのAPIメソッドが共通のメソッドを呼び出す特定のケースで質問を解決しましたcall_api. 私はinspectin methodを使用しcall_api、 sayget_userは常に の呼び出し元であるため、メソッド名を取得できcall_apiます。ただし、この解決策はこの特殊なケースでのみ機能し、一般的な解決策ではありません。

module も見ましたtrace。これは私が望むものに近いように見えますが、残念ながら、tracer(Trace instance)コマンドまたは関数を実行するには使用する必要があります。

最終的に達成したいことは次のとおりです。

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

2 に答える 2