質問は次のシナリオから来ています。
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_user
delete_user
考えられる解決策の 1 つは、coverage.py を使用してテストを実行すると、実行中の行番号とファイルに関する十分な情報が得られるため、そこから必要なものを分析できるかもしれません。
Client
別の考えられる解決策は、 I definedでどのメソッドが呼び出されたかを追跡することです。実際、すべてのAPIメソッドが共通のメソッドを呼び出す特定のケースで質問を解決しましたcall_api
. 私はinspect
in 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()