Spring Boot集成Spring Cloud Contract进行契约测试
大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!
契约测试的重要性
在微服务架构中,服务之间通过API进行通信。随着服务的独立开发和部署,确保各个服务之间能够正确交互变得尤为重要。契约测试是一种专注于验证服务间交互的测试方法,它可以帮助我们确保服务提供者和消费者之间的契约得到遵守。
Spring Cloud Contract简介
Spring Cloud Contract是Pivotal团队提供的一个用于契约测试的工具,它允许我们定义服务间的交互契约,并生成测试代码来验证这些契约。
集成Spring Cloud Contract
1. 添加依赖
首先,在服务提供者的pom.xml
文件中添加Spring Cloud Contract的依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-contract-verifier</artifactId>
</dependency>
2. 编写契约
使用Spring Cloud Contract DSL(领域特定语言)编写契约。以下是一个简单的契约示例:
package cn.juwatech.contract
import org.springframework.cloud.contract.spec.Contract
Contract.make {
request {
method 'GET'
url('/user') {
queryParameters {
parameter('id': '$(id)') // 使用SpEL表达式
}
}
}
response {
status 200
body(
id: value(consumer('$(id)'), producer(123)),
name: 'John Doe'
)
headers {
contentType(applicationJson())
}
}
}
3. 生成测试代码
使用generateTests
目标来生成测试代码:
./mvnw clean install -DskipTests
./mvnw spring-cloud-contract:generateTests
这将在src/test/resources/contracts
目录下生成测试代码。
4. 编写测试
使用生成的测试代码编写测试用例:
package cn.juwatech;
import cn.juwatech.contract.UserContract;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.json.AutoConfigureJsonTesters;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cloud.contract.verifier.messaging.boot.AutoConfigureMessageVerifier;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
@AutoConfigureJsonTesters
@AutoConfigureMessageVerifier
public class UserContractTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testGetUserById() throws Exception {
mockMvc.perform(get("/user?id=123")
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().json("{'id': 123, 'name': 'John Doe'}"));
}
}
与Spring Cloud Contract Stub Runner结合使用
1. 添加Stub Runner依赖
在消费者项目的pom.xml
文件中添加Stub Runner依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-contract-stub-runner</artifactId>
</dependency>
2. 编写消费者测试
使用Stub Runner来模拟服务提供者:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureStubRunner(ids = "cn.juwatech:service-provider:+:stubs")
public class UserServiceConsumerTest {
@Autowired
private TestRestTemplate template;
@Test
public void contextLoads() {
ResponseEntity<String> response = template.getForEntity("http://localhost:8080/user?id=123", String.class);
assertThat(response.getBody()).isEqualTo("{\"id\": 123, \"name\": \"John Doe\"}");
}
}
总结
通过使用Spring Cloud Contract,我们可以在Spring Boot应用中轻松地进行契约测试。它提供了一种标准化的方式来定义和验证服务间的交互,确保了微服务架构中的服务能够可靠地协同工作。
本文著作权归聚娃科技微赚淘客系统开发者团队,转载请注明出处!