在不泄露私有凭据的情况下在 PHPUNIT 中测试 API 的最佳方法


Best Way to Test an API in PHPUNIT Without Revealing Private Credentials

我创建了一个使用AskGeo的API的PHP类。(http://askgeo.com(

我想用 PHP 对其进行测试,并将这些测试包含在我发布的 PSR 包中,但我不想泄露测试 API 所需的帐户 ID 和 API 密钥。

最好的方法是什么?

我想我可以包含一个配置文件,可以在运行测试之前使用这些凭据填充。

这是最好的方法吗?

好的单元测试必须是快速且可重复的。如果使测试使用远程 API,则会违反以下规则:

  • HTTP 请求太长而无法执行 - 永远不知道多长时间,好的测试工作几毫秒
  • 一旦客户互联网不稳定,测试结果可能会有所不同。没有互联网,测试根本无法进行。

你可以做的是将代码与逻辑和一些传输层分开。您应该将传输注入逻辑代码,以便能够使用真实传输(如 cUrl(进行生产,并使用模拟传输来测试 env。模拟传输应从您提供的灯具返回答案。这将使测试非常快,并且始终产生相同的结果。

传输层可能如下所示:

  • 使用方法request($url, $params, $method, ...) TransportInterface
  • StubTransport implements TransportInterface __construct($fixtures) - 如果在灯具中找到$url+$params+$method,则返回结果。
  • CurlTransport implements TransportInterface - cUrl 实现。
  • VoodooMagicTransport implements TransportInterface - 使用一些黑魔法获得结果。

你逻辑编码:FantasticLogic类与__construct(TransportInterface $transport).不要在参数类型中使用实现的类名,只使用接口。

在我看来,如果你真的想在每次测试运行时针对实时生产API进行测试,这是最好的方法 - 要求使用你的类的开发人员输入他们自己的凭据。但是,如果没有一组适当的凭据可用,则应考虑使用存根(呼叫的静态预设应答(。