Spring系列学习之SpringCloudContract测试消息传递
⽬录
概述
Spring Cloud Contract是⼀个总体项⽬,其中包含帮助⽤户成功实施⽅法的解决⽅案。⽬前,Spring Cloud Contract包含Spring Cloud Contract Verifier项⽬。
Spring Cloud Contract Verifier是⼀个⽀持基于JVM的应⽤程序的消费者驱动合同(CDC)开发的⼯具。它附带了⽤Groovy或YAML编写的合同定义语⾔(DSL)。合同定义⽤于⽣成以下资源:
默认情况下,在对客户端代码(客户端测试)进⾏集成测试时,(HTTP Server Stub)将使⽤JSON存根定义。测试代码仍然必须⼿⼯编写,测试数据由Spring Cloud Contract Verifier⽣成。
如果你使⽤消息路由消息路由。我们正在与Spring Integration,Spring Cloud Stream和Apache Camel集成。但是,如果您愿意,可以设置⾃⼰的集成。
验证测试(默认情况下,在JUnit或Spock中)⽤于验证API的服务器端实现是否符合合同(服务器测试)。 Spring Cloud Contract Verifier⽣成完整测试。
Spring Cloud Contract Verifier将TDD提升到软件架构的⽔平。
要了解Spring Cloud Contract如何⽀持其他语⾔,请查看此。
特性
在尝试测试与其他服务通信的应⽤程序时,我们可以执⾏以下两项操作之⼀:
部署所有微服务并执⾏端到端测试
模拟单元/集成测试中的其他微服务
两者都有其优点,但也有很多缺点。让我们关注后者。
部署所有微服务并执⾏端到端测试
好处:
模拟⽣产
测试服务之间的真实通信
缺点:
为了测试⼀个微服务,我们必须部署6个微服务,⼏个数据库等。
将进⾏测试的环境将被锁定⽤于单个测试套件(即,在此期间没有其他⼈能够运⾏测试)。
很长时间跑
很晚的反馈
⾮常难以调试
在单元/集成测试中模拟其他微服务
好处:
⾮常快速的反馈
⽆基础设施要求
缺点:
服务的实现者创建存根,因此他们可能与现实⽆关
你可以通过测试和⽣产失败去⽣产
为了解决上述问题,创建了带有Stub Runner的Spring Cloud Contract Verifier。他们的主要想法是给你⾮常快速的反馈,⽽不需要建⽴整个微服务世界。
Spring Cloud Contract Verifier功能:
确保HTTP / Messaging存根(在开发客户端时使⽤)正在执⾏实际的服务器端实现
促进验收测试驱动开发⽅法和微服务架构风格
提供⼀种⽅法来发布在通信双⽅⽴即可见的合同中的更改
⽣成服务器端使⽤的样板测试代码
Spring Boot配置
。 您可以在下⾯到简化版本。
Server / Producer⽅⾯
ample;
// imports
public class MvcTest {
@Before
public void setup() {
RestAssuredMockMvc.standaloneSetup(new FraudDetectionController());
}
}
在src/test/resources/contracts中添加⼀个Contract定义。 例如名为vy
org.act.spec.Contract.make {springcloud难学吗
request {
method 'PUT'
url '/fraudcheck'
body("""
{
"clientId":"1234567890",
"loanAmount":99999
}
""")
headers {
header('Content-Type', 'application/vnd.fraud.v1+json')
}
}
response {
status 200
body("""
{
"fraudCheckStatus": "FRAUD",
"rejectionReason": "Amount too high"
}
""")
headers {
header('Content-Type': 'application/vnd.fraud.v1+json')
}
}
}
如果你必须添加⼀个插件,将为你⽣成测试和存根。
Maven
<build>
<plugins>
<plugin>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-contract-maven-plugin</artifactId>
<version>${spring-cloud-contract.version}</version>
<extensions>true</extensions>
<configuration>
<baseClassForTests&le.MvcTest</baseClassForTests> </configuration>
</plugin>
</plugins>
</build>
Gradle
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath "org.springframework.boot:spring-boot-gradle-plugin:${springBootPluginVersion}"
classpath "org.springframework.cloud:spring-cloud-contract-gradle-plugin:${springCloudContractVersion}"
}
}
apply plugin: 'spring-boot'
apply plugin: 'spring-cloud-contract'
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-contract-dependencies:${springCloudDependencies}"
}
}
dependencies {
testCompile "org.springframework.cloud:spring-cloud-starter-contract-verifier"
}
contracts {
baseClassForTests = 'ample.MvcTest'
}
⼀旦您尝试从合同构建应⽤程序,将在/generated-test-sources/contracts下的输出⽂件夹中⽣成测试。
package org.sts;
// imports
public class ContractVerifierTest extends MvcTest {
@Test
public void validate_shouldMarkClientAsFraud() throws Exception {
// given:
MockMvcRequestSpecification request = given()
.header("Content-Type", "application/vnd.fraud.v1+json")
.body("{\"clientId\":\"1234567890\",\"loanAmount\":99999}");
// when:
ResponseOptions response = given().spec(request)
.put("/fraudcheck");
// then:
assertThat(response.statusCode()).isEqualTo(200);
assertThat(response.header("Content-Type")).isEqualTo("application/vnd.fraud.v1+json");
// and:
DocumentContext parsedJson = JsonPath.Body().asString());
assertThatJson(parsedJson).field("fraudCheckStatus").isEqualTo("FRAUD");
assertThatJson(parsedJson).field("rejectionReason").isEqualTo("Amount too high");
}
}
⼀旦您通过并重新运⾏⼯件的构建和安装,Spring Cloud Contract Verifier就会将合同转换为HTTP服务器存根定义。 ⽬前我们正在⽀持。 存根将出现在stubs/mappings/下的输出⽂件夹中,如下所⽰:
{
"uuid" : "6c509a40-18f3-498c-a19c-c9f8b56957de",
"request" : {
"url" : "/fraudcheck",
"method" : "PUT",
"headers" : {
"Content-Type" : {
"equalTo" : "application/vnd.fraud.v1+json"
}
},
"bodyPatterns" : [ {
"matchesJsonPath" : "$[?(@.loanAmount == 99999)]"
}, {
"matchesJsonPath" : "$[?(@.clientId == '1234567890')]"
} ]
},
"response" : {
"status" : 200,
"body" : "{\"fraudCheckStatus\":\"FRAUD\",\"rejectionReason\":\"Amount too high\"}",
"headers" : {
"Content-Type" : "application/vnd.fraud.v1+json"
}
}
}
CDC(消费者驱动合同)背后的想法是分享通信双⽅之间的合同。 Gradle和Maven插件通过使⽤存根分类器⽣成带有存根和合约定义的jar 来帮助您实现这⼀点。 只需将其上传到某个中央存储库,其他⼈可以将其重新⽤于集成测试。
Client / Consumer⽅⾯
在客户端(HTTP)/使⽤者(消息传递)⽅⾯,它⾜以为正确的Spring Cloud Contract Stub Runner实现提供依赖性。 在这种情况下,因为我们的⽰例包含与WireMock的HTTP通信作为HTTP Server Stub。 我们将选择以下依赖项:
Maven
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论