A Three-second Tour
此非常简短的教程介绍了如何使用 Spring Cloud Contract。它包括以下主题:
您可在 here 中找到更详尽的教程。 以下 UML 图显示了 Spring Cloud Contract 中各部分之间的关系:
"API Producer"->"API Producer": add Spring Cloud \nContract (SCC) plugin "API Producer"->"API Producer": add SCC Verifier dependency "API Producer"->"API Producer": define contracts "API Producer"->"Build": run build "Build"->"SCC Plugin": generate \ntests, stubs and stubs \nartifact (e.g. stubs-jar) "Build"->"Stub Storage": upload contracts \nand stubs and the project arifact "Build"->"API Producer": Build successful "API Consumer"->"API Consumer": add SCC Stub Runner \ndependency "API Consumer"->"API Consumer": write a SCC Stub Runner \nbased contract test "SCC Stub Runner"->"Stub Storage": test asks for [API Producer] stubs "Stub Storage"->"SCC Stub Runner": fetch the [API Producer] stubs "SCC Stub Runner"->"SCC Stub Runner": run in memory\n HTTP server stubs "API Consumer"->"SCC Stub Runner": send a request \nto the HTTP server stub "SCC Stub Runner"->"API Consumer": communication is correct
On the Producer Side
要开始使用 Spring Cloud Contract,您可以将用 Groovy DSL 或 YAML 表示的 REST 或消息契约文件添加到契约目录中,该目录由 contractsDslDir
属性设置。默认情况下,它是 $rootDir/src/test/resources/contracts
。
然后您可以将 Spring Cloud Contract Verifier 依赖项和插件添加到您的构建文件中,如下例所示:
Unresolved directive in three-second-tour.adoc - include::{samples_path}/standalone/dsl/http-server/pom.xml[]
以下清单显示了如何添加插件,该插件应位于文件的 build/plugin 部分:
<plugin>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-contract-maven-plugin</artifactId>
<version>${spring-cloud-contract.version}</version>
<extensions>true</extensions>
</plugin>
运行 ./mvnw clean install
将自动生成测试,以验证应用程序是否符合添加的合同。默认情况下,测试会生成在 org.springframework.cloud.contract.verifier.tests.
下。
由于尚未实现由合同描述的功能,因此测试失败。
要通过它们,必须添加正确实现的 HTTP 请求或消息处理。此外,必须为自动生成的测试向项目添加一个基本测试类。这个类由所有自动生成的测试扩展,它应包含运行它们所需的所有设置信息(例如 RestAssuredMockMvc
控制器设置或消息测试设置)。
以下示例来自 pom.xml
,展示了如何指定基本测试类:
<build>
<plugins>
<plugin>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-contract-maven-plugin</artifactId>
<version>2.1.2.RELEASE</version>
<extensions>true</extensions>
<configuration>
<baseClassForTests>com.example.contractTest.BaseTestClass</baseClassForTests> 1
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
1 | baseClassForTests 元素让你可以选择你的基本测试类。它必须是 spring-cloud-contract-maven-plugin 内 configuration 元素的一个子元素。 |
一旦实现和测试基类就位,则测试通过,并且应用程序和存根工件在本地 Maven 存储库中构建并安装。您现在可以合并更改,并且可以将应用程序和存根工件发布到在线存储库中。
On the Consumer Side
您可以在集成测试中使用 Spring Cloud Contract Stub Runner
获得正在运行的 WireMock 实例或模拟实际服务的邮件路由。
若要执行此操作,添加对 Spring Cloud Contract Stub Runner
的依赖项,如下例所示:
Unresolved directive in three-second-tour.adoc - include::{samples_path}/standalone/dsl/http-client/pom.xml[]
您可以采用两种方式之一在您的 Maven 存储库中安装 Producer 端存根:
-
通过签出 Producer 侧存储库并通过运行以下命令添加契约和生成存根:[source, bash]
$ cd local-http-server-repo $ ./mvnw clean install -DskipTests
测试被跳过,因为生产者端合约实现尚未到位,因此导致自动生成的合约测试失败。 |
-
从远程存储库获取已经存在的 producer 服务存根。为此,传递存根工件 ID 和工件存储库 URL 作为
Spring Cloud Contract Stub Runner
属性,如下例所示:[source, yaml]
Unresolved directive in three-second-tour.adoc - include::{samples_path}/standalone/dsl/http-client/src/test/resources/application-test-repo.yaml[]
现在您可以使用 @AutoConfigureStubRunner
批注您的测试类。在批注中,提供 Spring Cloud Contract Stub Runner
的 group-id
和 artifact-id
值,以便为您运行协作者的存根,如下例所示:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment=WebEnvironment.NONE)
@AutoConfigureStubRunner(ids = {"com.example:http-server-dsl:+:stubs:6565"},
stubsMode = StubRunnerProperties.StubsMode.LOCAL)
public class LoanApplicationServiceTests {
. . .
}
在线储存库中下载存根时,请使用 |
现在,在您的集成测试中,您可以收到预期由协作服务发出的 HTTP 响应或消息的存根版本。