9

人気のあるAPIのクライアントライブラリに取り組んでいます。現在、上記のクライアントのすべての単体テストは、テストアカウントに対して実際のAPI呼び出しを行っています。

次に例を示します。

def test_get_foo_settings(self):
    client = MyCustomClient(token, account)
    results = client.get_foo_settings()

    assert_is(type(results), list)

テストアカウントに対して実際のAPI呼び出しを行うのをやめたいのですが。

これにどのように取り組むべきですか?Mockを使用して、クライアントへの呼び出しと応答をモックする必要がありますか?

また、このクライアントライブラリで何をテストするかという哲学についても混乱しています。実際のAPIのテストには興味がありませんが、呼び出されるメソッド、返される可能性のある結果の順列など、さまざまな要因が関係している場合、何をテストする必要があるのか​​、いつ安全にテストできるのかわかりません。仮定を立てる(模擬応答など)。

私のタイプのシナリオでモックを使用する方法の方向性および/またはサンプルをいただければ幸いです。

4

2 に答える 2

10

私は個人的に、ライブラリが実際にサービスに接続するために使用する単一のインターフェイスまたは関数呼び出しを作成し、次にテスト中にそのためのカスタムモックを作成することによってそれを行います。

たとえば、サービスがHTTPを使用していて、リクエストを使用してサービスに接続している場合は、次のようになります。

class MyClient(…):
    def do_stuff(self):
         result = requests.get(self.service_url + "/stuff")
         return result.json()

まず、リクエストの周りに小さなラッパーを作成します。

class MyClient(…):
    def _do_get(self, suffix):
         return requests.get(self.service_url + "/" + suffix).json()

    def do_stuff(self):
         return self._do_get("stuff")

次に、テストのために、関連する機能をモックアウトします。

 class MyClientWithMocks(MyClient):
     def _do_get(self, suffix):
          self.request_log.append(suffix)
          return self.send_result

そして、次のようなテストで使用します。

def test_stuff(self):
    client = MyClientWithMocks(send_result="bar")
    assert_equal(client.do_stuff(), "bar")
    assert_contains(client.request_log, "stuff")

さらに、モックと実際のサービスの両方に対してテストを実行できるようにテストを作成すると、問題が発生した場合に誰が原因であるかをすばやく特定できるため、テストを作成すると有利な場合があります。

于 2013-02-05T22:04:59.433 に答える
0

私はHTTmockを使用していて、かなり満足しています:https ://github.com/patrys/httmock

于 2016-05-03T17:51:48.533 に答える