正确测试调用API的SDK 我有一个API,我已经写了,现在我正准备为第三方编写SDK,以便更容易地与我的API交互。

正确测试调用API的SDK 我有一个API,我已经写了,现在我正准备为第三方编写SDK,以便更容易地与我的API交互。,api,unit-testing,sdk,mocking,phpunit,Api,Unit Testing,Sdk,Mocking,Phpunit,在为我的SDK编写测试时,我的理解是,最好不要简单地调用所有API端点,因为: API中的测试将负责确保API正常工作 如果SDK测试直接调用API,那么我的测试会非常慢 例如,假设我的API有以下端点: /account 在我的API测试套件中,我实际上调用了这个端点来验证它是否返回了正确的数据 我应该采取什么方法在SDK中测试它?我是否应该模拟对/account的请求?我还需要做些什么才能使我的SDK覆盖良好 我已经向其他SDK了解了它们是如何处理这个问题的(Stripe、Algolia、

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

  • API中的测试将负责确保API正常工作
  • 如果SDK测试直接调用API,那么我的测试会非常慢
  • 例如,假设我的API有以下端点:

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

    我应该采取什么方法在SDK中测试它?我是否应该模拟对
    /account
    的请求?我还需要做些什么才能使我的SDK覆盖良好

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


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

    在为SDK编写测试时,您假设您的api确实可以正常工作(并且您为您的api编写测试以确保这一点)


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

    我建议您使用wiremock之类的东西来模拟api,然后围绕该模拟api编写单元测试,以确保一切都按预期运行


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

    我最终采用了这种方法:

    我有单元测试和集成测试

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

    我的单元测试(我经常运行)只是确保代码的响应是我期望的样子。我相信第三方API会给我提供好的数据(我还有集成测试来支持)

    我通过使用反射替换SDK代码中的客户机实例,然后使用模拟我期望的实际响应来实现这一点

    下面是一个例子:

    /**@测试*/
    公共函数it\u检索\u帐户()
    {
    $account=$this->mockClient()->retrieve();
    $this->assertEquals(json_解码('{“id”:“9876543210”}'),$account);
    }
    受保护的函数mockClient()
    {
    $stream=Psr7\stream_for(“{”id:“9876543210”}”);
    $mock=newmockhandler([new Response(
    200,
    ['Content-Type'=>'application/json'],
    Psr7\stream\u用于($stream)
    )]);
    $handler=HandlerStack::create($mock);
    $mockClient=新客户端(['handler'=>$handler]);
    $account=新SparkyApps账户(新SparkyApps('0123456789');
    $reflection=new\ReflectionClass($account);
    $reflection_property=$reflection->getProperty('client');
    $reflection_property->setAccessible(true);
    $reflection_property->setValue($account,$mockClient);
    返回美元帐户;
    }