2017-09-03 56 views
3

我在服务类中创建了几个方法,通过使用API​​ POST请求通过Guzzle连接到外部服务/提供程序。phpunit - 假的API响应或真正的响应连接到服务?

我喜欢使用phpunit进行测试 - 我应该使用假的HTTP Json响应而不连接到服务,或者它应该连接到服务以获得服务的真实响应?

+0

模拟服务允许您返回各种回复,特别是难以测试的回复(如错误)。 –

+0

@NigelRen你应该回答更多的细节和如何模拟服务 –

+0

如果你有一些代码,它可能会有所帮助,不知道该回答什么。尝试浏览http://guzzle3.readthedocs.io/testing/unit-testing.html。 –

回答

2

测试的一个共同信条是“不要嘲笑你不拥有的东西”。嘲笑这些API调用使得你的测试不太可靠,并且会给你一种错误的安全感,因为你可能会得到误报

例如,当API意外地引入了重大更改时,您的测试将变为绿色,并且一旦部署到生产中,您将最终注意到有问题。这可能是你想要测试的结果。

当您测试真正的API时,您会感受到可靠性。由于服务中断或超时,您的测试经常失败吗?如果是这样,你可以引入措施,如重试机制,断路器或将API调用与应用程序的其他部分解耦。

当你模拟API时,你可以告诉的是你的代码根据服务的规范(可能是过时的)来运行。没关系,但不像依靠实际的服务那么有用。

你可以做的是使用组来分别运行这些测试。这样可以很容易地包含/排除这些可能很慢并且有时会在剩余测试中出现片状的测试。这也有助于限制速率,例如只需在关键分支上运行这些测试。

+0

您对真实API的测试做了很好的说明。在生产过程中 - 是否有办法自动每x小时运行一次测试 - 这将确保真正的API服务仍在运行? –

+1

是的,除了进行基于分支的测试之外,我知道他们在间隔期间针对生产系统运行测试的地方。您必须小心以某种方式标记数据,以便能够从真实数据中辨别出它们,特别是在进行电子商务时。例如,您可以使用Jenkins设置计划作业,然后在请求中使用特殊的X-TEST标头,该标头由应用程序识别。 – dbrumann

+1

如果您的CI/CD服务器不支持预定作业,您也可以使用运行测试套件的cron作业来执行此操作。再次,如果你这样做,要小心,例如操作会改变数据库状态(或者更糟的是清理数据库)。我建议有一个单独的测试套件,以减少有害副作用的风险。 – dbrumann