【问题标题】:How to test external APIs?如何测试外部 API?
【发布时间】:2019-09-03 16:24:54
【问题描述】:

我很难开始测试与外部 API (Vimeo API) 的集成,例如(删除视频 - 上传视频 - 等等)。

  • 我应该在测试时访问真正的 Vimeo 的服务器吗?

这样做是不是一个坏主意:


use Tests\TestCase;
use Vimeo\Laravel\VimeoManager;

class VimeoApiTest extends TestCase
{
    protected function setUp() : void
    {
        parent::setUp();
        $this->vimeo = new VimeoManager();
    }

    /** @test */
    public function a_video_can_be_deleted()
    {
        $video = $this->vimeo->upload($fakeVideo);

        // make http request to delete the video
        $result = $this->vimeo->delete($video['id']);

        $this->assertEquals('success', $result['status']);
    }
}

【问题讨论】:

  • 你不测试,你嘲笑他们
  • 你可以通过themockapis.in模拟他们
  • 大多数其他答案/cmets 说您应该模拟响应。虽然这是真的,但拥有一个真正命中第 3 方服务器的真正端到端测试并没有什么坏处。这在使用 CI/CD 管道时很有帮助,其中 E2E 测试将通知停机时间和可能不正确的响应负载。

标签: laravel testing phpunit vimeo vimeo-api


【解决方案1】:

在我看来,测试一个包不应该是你的责任。测试你的包的实现是。您的示例直接测试包的VimeoManager。在我看来,这不是你应该做的。

向您的上传视频的 API 路由发出请求是您应该测试的。在此测试期间,您不想将其上传到真正的 Vimeo API,但您想模拟它。

Laravel 包含一个可以做到这一点的包,它被称为Mockery。您可以模拟类的方法以返回一个值,而无需执行初始逻辑。在这种情况下,您将模拟 VimeoManagerdelete 方法。

Laravel 还提供了所谓的Facades,它可以很容易地成为mocked。我可以看到这个包makes use of such facade。在这种情况下,您可以执行以下操作来测试您的删除请求的实现。

/** @test */
use Vimeo\Laravel\Facades\Vimeo;

public function your_test()
{
    Vimeo::shouldReceive('delete')
        ->once()
        ->with(...) // The parameters is should receive.
        ->andReturn(...); // The value it should return.

    // Make the delete request to your API.
}

【讨论】:

    【解决方案2】:

    好吧,您可以按照您认为合适的方式进行测试。我发现进行两种类型的测试很有用。

    与其他“事物”(服务、系统等)交互的测试称为集成测试。这些都很好,可以让人放心,但与您在线交互的系统相关联,但情况并非总是如此。

    第二种类型的测试可以有几个不同的名称,但这并不是重点。第二种类型的测试的要点是,您可以“模拟”外部/内部依赖项,确保您的代码所依赖的“事物”是在线的/行为方式如您所愿。嘲弄是指您操纵“事物”以某种方式做出反应。通常,这是通过一些框架或语言特性来完成的。这些类型的测试给你的代码带来了更大的负担,而且在我看来更多。

    【讨论】:

      【解决方案3】:

      我通常反对模拟我的测试应该连接到的服务器。 模拟服务器和使用模拟器的主要缺点是 API 的实现可能会发生变化(例如抛出异常/新状态代码或超时可能会更短),或者 2 个服务器版本之间的 API 之间可能不兼容。

      我应该在测试时访问真正的 Vimeo 的服务器吗?

      如果您有可能,请使用 docker 创建本地 Vimeo 的服务器 :) 您的测试将了解 API 将来是否会发生变化

      【讨论】:

        猜你喜欢
        • 2016-07-19
        • 1970-01-01
        • 1970-01-01
        • 2011-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-06
        • 1970-01-01
        相关资源
        最近更新 更多