「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Python テスト シナリオで HTTP リクエストとレスポンスをモックする方法は?

Python テスト シナリオで HTTP リクエストとレスポンスをモックする方法は?

2024 年 11 月 2 日に公開
ブラウズ:376

How to Mock HTTP Requests and Responses in Python Testing Scenarios?

Python テストのリクエストとレスポンスのモック

Python テストでは、実行フローを制御するためにモジュールとその機能をモックすることが必要になります。そして特定のシナリオを検証します。このうち、requests モジュールのモックは、HTTP リクエストに依存する関数やメソッドをテストするためによく使用されます。

次のコードを含む views.py ファイルについて考えてみましょう。

def myview(request):
    res1 = requests.get('aurl')
    res2 = request.get('burl')
    res3 = request.get('curl')

この動作を模擬するには、Python 模擬パッケージを使用できます。これを段階的に実現する方法は次のとおりです:

ステップ 1: モック動作を定義する

requests モジュールをモックするには、requests.get を置き換える関数を定義します。 ()。この関数では、URL ごとに必要な応答を指定できます。

def mocked_requests_get(*args, **kwargs):
    class MockResponse:
        def __init__(self, json_data, status_code):
            self.json_data = json_data
            self.status_code = status_code

        def json(self):
            return self.json_data

    if args[0] == 'aurl':
        return MockResponse({'a': 'a'}, 200)
    elif args[0] == 'burl':
        return MockResponse({'b': 'b'}, 200)
    elif args[0] == 'curl':
        return MockResponse({'c': 'c'}, 200)

    return MockResponse(None, 404)

ステップ 2: リクエスト モジュールにパッチを適用する

テスト ケースで、mock.patch() デコレータを使用して実際のリクエストを置き換えますモック関数を含むモジュール。

@mock.patch('requests.get', side_effect=mocked_requests_get)
def test_myview(self, mock_get):
    # Call the function you want to test
    myview(None)
    # Assertions for expected responses
    ...

ステップ 3: アサーションを検証する

テスト関数内でアサーションを使用して、予期した応答が返されることを検証できます。

self.assertEqual(mock_get.call_args_list[0][0][0], 'aurl')
self.assertEqual(mock_get.call_args_list[1][0][0], 'burl')
self.assertEqual(mock_get.call_args_list[2][0][0], 'curl')

これらの手順に従うことで、HTTP リクエストを効果的にモックし、Python テスト シナリオでの応答を制御できます。これにより、外部の依存関係が結果に干渉しないようにしながら、特定の機能を分離してテストできます。

リリースステートメント この記事は次の場所に転載されています: 1729424478 権利侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3