微服务架构下的契约测试:Pact工具的使用

随着微服务架构的普及,服务提供者(WebApi)与消费者之间的依赖关系变得愈发复杂。在这种架构下,服务提供者和消费者之间的契约变得至关重要。如果服务提供者在未通知消费者的情况下修改了契约,那么消费者的应用程序可能会因此而崩溃。通常情况下,消费者应用程序和服务提供者应用程序由不同的团队拥有,这使得测试契约变得困难重重。为了解决这个问题,需要让两个团队(消费者团队和服务团队)参与到集成测试中来。但这个过程成本高昂,依赖于其他团队,并且耗时较长。

为了解决上述问题,可以使用Pact工具来进行契约测试。Pact是一个用于契约测试的工具。对于.NET环境,可以使用“PactNet”。

Pact工具的工作原理

Pact的工作流程分为两个步骤。更多详细信息,请访问。

在消费者端,通过Pact设置一个假的服务:

// 设置假服务 var provider = new MockProvider("MyProvider"); var client = new ConsumerClient(); // 模拟API调用的请求和响应 provider .Given("There is an active account") .UponReceiving("a request for account information") .With(new ProviderState() .SetParameter("accountId", "123456")) .WithRequest(Method.GET, "/v1/accounts/123456") .WillRespondWith(new ProviderResponse() .WithStatus(200) .WithHeader("Content-Type", "application/json") .WithBody("{\"id\": \"123456\", \"name\": \"John Doe\"}")); // 调用客户端方法 var result = client.GetAccount("123456"); // 生成包含请求和响应详细信息的json文件 var pactFile = provider.WritePactFile(); pactFile.SaveAs("path/to/pact.json"); // 将json文件共享给服务提供者

客户端调用假服务,它将返回假的响应。这将生成一个包含请求和响应详细信息的json文件,并将其共享给服务提供者。

在服务提供者端,读取json文件中的请求和响应,并使用Pact测试重放所有请求,Pact将验证所有响应。

// 读取json文件 var pactFile = PactFile.Read("path/to/pact.json"); // 使用Pact测试重放所有请求 var provider = new Provider("MyProvider", pactFile); provider.Verify();

以上代码读取json文件,并重放所有场景,通过调用实际的服务。

Pact的实现

可以从GitHub下载Pact应用程序:。解决方案概述:它包含三个项目:

  • Provider.Test:服务提供者测试
  • Test.Pact.App:消费者测试
  • WebApi2:服务

在消费者端设置假服务:

// 创建一个名为"clientname-providername.json"的json文件 var pactFile = provider.WritePactFile("clientname", "providername"); pactFile.SaveAs("path/to/pact.json");

在消费者端进行Pact测试场景。运行这些测试后,它将生成一个json文件。Json文件的结构如下:

{ "provider": "MyProvider", "consumer": "MyConsumer", "interactions": [ { "description": "a request for account information", "providerState": "There is an active account", "request": { "method": "GET", "path": "/v1/accounts/123456" }, "response": { "status": 200, "headers": { "Content-Type": "application/json" }, "body": "{\"id\": \"123456\", \"name\": \"John Doe\"}" } } ] }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485