与外部服务的测试隔离性是可靠自动化的必要条件。
问题历史: 早期的自动化系统常常受到外部 API 和数据库的影响,这些服务通常不可用或返回意外的数据。没有隔离的自动化测试结果无法重现:闪烁、因外部问题导致的崩溃以及随机故障。
问题:
解决方案:
使用“模拟”和“存根”——模拟外部 API 响应的本地占位符。常用的工具有 WireMock(Java)、httpmock(Python)、MockServer、TestContainers。
通过内存中的解决方案或在每个测试之前清除并重新填写的固定数据来模拟数据库。
将测试数据的 ID 提取到变量中,以便测试能够并行执行而不会“互相覆盖”。
import requests BASE_URL = "http://localhost:1080/api" def test_order_creation(): mock_response = {"orderId": 12345, "state": "created"} # 在实际测试中,响应将返回给模拟服务器 # 此处调用 requests.post 和 assert ...
关键特性:
在每次运行中,通过真实服务进行集成测试是否必要?
不是的。可以定期使用模拟/存根,而将集成测试单独运行,频率较低且有控制。
使用真实的外部 API 的测试是否总是提供更可靠的结果?
不是的。相反,它们的稳定性更差,可能因合作伙伴那一边的更改而崩溃。持续的闪烁测试会降低管道的质量。
可以使用相同的测试数据进行并行的外部服务自动测试吗?
不可以。这可能导致冲突、竞争和不稳定。标识符和状态必须在测试/流中是唯一的。
公司决定为了速度在真实的第三方 API(支付网关)上运行所有自动测试。多次测试被禁止,限制开始生效,必须恢复访问,数据“流入”真实报告中,出现虚假触发。
优点:
缺点:
设置了 MockServer 和虚拟的内存数据库。在每个测试之前,状态被重置,数据是唯一的。真实的集成测试单独且较少进行。
优点:
缺点: