【问题标题】:Properly testing an SDK that calls an API正确测试调用 API 的 SDK
【发布时间】:2016-06-23 23:04:48
【问题描述】:

我已经编写了一个 API,现在我正在为第 3 方编写一个 SDK,以便更轻松地与我的 API 交互。

在为我的 SDK 编写测试时,我的理解是最好不要简单地调用所有 API 端点,因为:

  1. API 中的测试将负责确保 API 正常工作。
  2. 如果 SDK 测试直接调用 API,我的测试会很慢。

例如,假设我的 API 有这个端点:

/account

在我的 API 测试套件中,我实际上调用了这个端点来验证它是否返回了正确的数据。

我应该采用什么方法在我的 SDK 中对此进行测试?我应该嘲笑对/account 的请求吗?我还需要做什么才能让我的 SDK 获得良好的覆盖率?

我查看了其他 SDK 以了解他们如何处理此问题(Stripe、Algolia、AWS),但在某些情况下,它们看起来确实是在调用实际 API 的沙盒版本。

(我目前正在使用 PHPUnit,但我也会用其他语言编写 SDK。)

【问题讨论】:

    标签: api unit-testing sdk mocking phpunit


    【解决方案1】:

    我最终采用了这种方法:

    我有两个单元测试和集成测试。

    我的集成测试调用实际的 API。我通常不那么频繁地运行这个——就像在我将代码推送到遥控器之前一样。 (使用我的代码的任何人都必须提供自己的 API 凭据)

    我的单元测试——我经常运行——只是确保我的代码的响应是我期望它们的样子。我相信第 3 方 API 会给我很好的数据(而且我仍然有集成测试来支持它)。

    我已经通过mocking Guzzle 完成了这项工作,使用反射替换了我的 SDK 代码中的客户端实例,然后使用Mock Handlers 模拟了我期望的实际响应。

    这是一个例子:

    /** @test */
    public function it_retrieves_an_account()
    {
        $account = $this->mockClient()->retrieve();
    
        $this->assertEquals(json_decode('{"id": "9876543210"}'), $account);
    }
    
    protected function mockClient()
    {
        $stream = Psr7\stream_for('{"id": "9876543210"}');
        $mock = new MockHandler([new Response(
            200,
            ['Content-Type' => 'application/json'],
            Psr7\stream_for($stream)
        )]);
    
        $handler = HandlerStack::create($mock);
        $mockClient = new Client(['handler' => $handler]);
    
        $account = new SparklyAppsAccount(new SparklyApps('0123456789'));
        $reflection = new \ReflectionClass($account);
        $reflection_property = $reflection->getProperty('client');
        $reflection_property->setAccessible(true);
        $reflection_property->setValue($account, $mockClient);
    
        return $account;
    }
    

    【讨论】:

      【解决方案2】:

      在为 SDK 编写测试时,您假设您的 api 确实按照应有的方式工作(并且您为您的 api 编写测试以确保这一点)。

      因此,使用某种沙箱甚至是完整的 api 模拟就足够了。

      【讨论】:

        【解决方案3】:

        我建议您使用类似wiremock 的东西来模拟您的API,然后围绕该模拟API 编写您的单元测试,以确保一切都按预期工作。

        这样,当您的生产应用程序出现故障时,您至少可以确保(通过运行单元测试)您的应用程序端没有任何故障,但实际 API 可能存在问题(即响应格式被更改)。

        【讨论】:

          猜你喜欢
          • 2020-06-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-02
          • 1970-01-01
          • 1970-01-01
          • 2017-07-09
          相关资源
          最近更新 更多