如何使用Spring Cloud Contract进行测试

本文介绍了如何利用Spring Cloud Contract进行微服务API测试,解决了在测试中遇到的挑战,通过模拟调用来减少对其他服务的依赖。详细讲解了提供者验证程序设置和消费者设置的步骤,包括添加依赖、编写合同、生成存根和运行测试。

通过优锐课核心java学习笔记中,我们可以看到如何使用Spring Cloud Contract进行测试,码了很多专业的相关知识, 分享给大家参考学习。

在使用Spring Cloud Contract进行测试

了解有关消费者/提供商关系的更多信息以及如何使用Spring Cloud合同进行测试; 测试和验证API通信。

1、了解如何使用Spring Cloud进行测试。

随着许多行业转变为微服务架构,测试这些微服务是一个挑战。 不同的团队拥有不同的服务,因此测试和验证这些微服务之间的API通信非常重要。
使用Test API框架的主要缺点是所有微服务都必须启动并运行。
例如,如果你的项目具有四个服务A,B,C和D。

测试服务A中的方法,先调用服务B,然后再调用服务C,最后调用服务D。如果这些服务(B,C和D)中的任何一个出现故障或无法正常工作,则你的测试方法(用于服务A)将失败。 尽管此方案对你的端到端测试很有用,但对于服务A的功能测试可能不是理想的选择。

如何克服呢? 是的,你是对的! 模拟从服务A到服务B的呼叫。
在此博客中,我们假设你的微服务是用Spring Boot 2编写的。让我们考虑使用“ Spring Cloud Contract”来模拟该服务。
在这里插入图片描述
要执行用例,我们有两个主要步骤:
1.提供者验证程序设置(服务B)。
2.消费者(服务A)设置。

2、提供商验证程序设置

在继续执行Spring Cloud Contract之前,我们需要标记依赖项。 在Gradle中,将以下类路径条目添加到build.gradle的构建脚本部分(在项目中全局引用)中。

buildscript{
  dependencies{
    classpath "org.springframework.cloud:spring-cloud
    "-contract-gradle-plugin:2.1.3.RELEASE"
classpath "io.rest-assured:rest-assured:3.0.2"
classpath "io.rest-assured:spring-mock-mvc:3.0.2"
  }
}

下一步是应用插件。 在这里使用了maven-publish,因此我可以生成工件并根据你的项目将其发布到本地或远程存储库。下一步是应用插件。 在这里使用了maven-publish,因此我可以生成工件并根据你的项目发布到本地或远程的存储库。

apply plugin: 'spring-cloud-contract'
apply plugin: 'maven-publish'

接下来,添加你的项目依赖项

dependencyManagement {
   imports {
      mavenBom "org.springframework.cloud:spring-cloud-contract-dependencies:2.1.3.RELEASE"
   }
}

你可以覆盖默认的spring contract设置,这里我修改了Java类的基本路径,需要为我们的测试创建它。

contracts {
    packageWithBaseClasses = 'com.mypackage.naveen.serviceB'
    generatedTestSourcesDir = project.file('src/generatedContract')
}

最后,添加testCompile依赖项。

testCompile 'org.springframework.cloud:spring-cloud-starter-contract-verifier'

进行Gradle清理和构建,并确保下载了所有依赖项,并成功构建了项目。
是时候写我们的第一份合同了。 你可以使用YAML或groovy定义合同。
我们的目的是什么? 我们必须嘲笑。
在src / test / resources / contracts下创建一个名为

Contract.make {
   request {
       method 'POST'
       url '/testservice'
    body(file("request.json"))
    headers {
      contentType(applicationJson())
    }
   }
   response {
       status OK()
      body(file("response.json"))
       headers {
         contentType(applicationJson())
    }
   }
}

你可以在同一目录中创建两个文件“ request.json”和“ response.json”。 这些JSON文件包括匹配你要模拟的服务的请求和响应。
此后,运行Gradle测试任务-这将自动生成’ContractVerfierTest’类并运行你的测试(前提是已实现要测试的端点)。
在这里插入图片描述
现在,创建一个基础验证程序抽象测试类。 这是你的“ spring-cloud-contract”插件生成自动测试实现类所必需的。 在你在上面的build.gradle中提到的基本软件包下创建。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public abstract class ContractVerifierBase {
@Autowired
private WebApplicationContext context;
@Before
public void setUp() throws Exception {
RestAssuredMockMvc.webAppContextSetup(context);
} 
}

现在运行Gradle-> VerificationVerification ::检查任务以确保一切正常。 如果任务成功,你将在项目的build / libs目录中看到创建的存根jar。
在这里插入图片描述
运行你的Gradle-> PublishStubPublicationtoMavenLocal。 这会将你的jar部署到本地Maven存储库(.m2文件夹)。你现在已经完成了第一步。 休息一下!

3、消费者设置

现在,要使用服务A中服务B的存根(模拟),我们将使用存根运行器。
与往常一样,向服务A的build.gradle添加一个依赖项。

testCompile("org.springframework.cloud:
            "spring-cloud-starter-contract-stub-runner:2.0.1.RELEASE")

在服务A中创建测试方法,该服务将调用服务B方法并作为Junit Test运行。

@RunWith(SpringRunner.class)
@SpringBootTest
public class ServiceBContractVerifierTest {
    private String PAC_RESPONSE = "{\"traceId\":null,\"dbLatency\":0,\"transactionStatus\":null,\"transactionCategory\":null,\"iXMLResponse\":null,\"status\":false}";
    private String ENDPOINT_URL = "http://localhost:8081/testservice";
    @Autowired
    RestTemplate restTemplate = new RestTemplate();
  @Test
  public void verifyServiceBTestEndpoint(){
    ServiceBRequestBO request = new ServiceBRequestBO ();
       // Given:
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.add("X-xxx-traceId", request.getTraceId());
        HttpEntity<String> entity = new HttpEntity(request, headers);
        //When:
        ResponseEntity<String> response = restTemplate.exchange(ENDPOINT_URL, HttpMethod.POST, entity, String.class);
        // then:
        Assertions.assertThat(response).isNotNull();
        Assertions.assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
        Assertions.assertThat(response.getBody()).isEqualTo(PAC_RESPONSE);
    }

这会使你的测试用例失败。 由于尚未配置存根。
POST请求“ http:// localhost:8081 / testservice”时发生I / O错误:连接被拒绝:connect; 嵌套的异常是java.net.ConnectException。
配置你的存根运行器。

@AutoConfigureStubRunner(
    ids = "com.mypackage.naveen.serviceB:serviceB:+:stubs:8081", 
    stubsMode = StubsMode.LOCAL)

再次运行测试,测试通过。 哇! 一切都成功结束。

喜欢这篇文章的可以点个赞,欢迎大家留言评论,记得关注我,每天持续更新技术干货、职场趣事、海量面试资料等等
如果你对java技术很感兴趣也可以加入我的java学习群 V–(ddmsiqi)来交流学习,里面都是同行,验证【优快云2】有资源共享。
不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值