我有两个应用程序,比如 A 和 B,通过 API 相互通信,现在我正在为 A 编写黄瓜测试,我有两个选择:
只需测试 API 是否发送到 B 并存根来自 B 的响应
从A(因为我正在测试A)在B上设置测试数据,并向B发送真实请求,并用VCR记录请求/响应
我更喜欢选项 #1,但我的同事说它至少需要一个真实的请求才能确保系统(包括 A 和 B)正常工作。
我担心的是:
如何从 A 的测试中为 B 准备测试数据?
将它们混合在一起很脆弱,B上的任何更改都可能导致A上的失败
任何意见?
我有两个应用程序,比如 A 和 B,通过 API 相互通信,现在我正在为 A 编写黄瓜测试,我有两个选择:
只需测试 API 是否发送到 B 并存根来自 B 的响应
从A(因为我正在测试A)在B上设置测试数据,并向B发送真实请求,并用VCR记录请求/响应
我更喜欢选项 #1,但我的同事说它至少需要一个真实的请求才能确保系统(包括 A 和 B)正常工作。
我担心的是:
如何从 A 的测试中为 B 准备测试数据?
将它们混合在一起很脆弱,B上的任何更改都可能导致A上的失败
任何意见?
您正在编写黄瓜测试,意味着它是一个集成测试。对于集成测试,最好不要模拟任何东西,它是保存应用程序的最后一道安全门。
所以你最好最后发送一次真实的请求,以确保你的请求是正确的,而且你可以随时重复这个真实的请求。
解决方案1的问题:
所以我建议为 B 创建一个沙盒应用程序,提出真正的请求
对于您的大多数测试,将请求/响应存根,这样测试将在离线时通过,或者不通过。
对于一个测试,做一个简单的测试,外部服务的行为就像你的存根和模拟所说的那样。
EG 执行 get 请求仍会返回带有您希望确保模拟有效的属性的 JSON。
在大多数情况下,您的测试套件不应监控外部服务的“正常运行时间”。只是它的行为与您期望的一样。
对于正常运行时间问题,您应该使用 Nagios、Pingdom、Pagerduty 或其他什么来查看系统管理员方面。