使用 RAML 测试通用 REST API

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

之前的一篇文章 中,我向您展示了如何使用 RAML 作为规范框架来创建契约驱动的 REST 服务。然而,RAML 测试器库并不局限于能够测试 Spring MVC 控制器。您还可以使用它来测试任何 REST API 并检查它是否符合 RAML 规范。

CheckingWebTarget 类

raml-tester 库有一个实用程序类,用于检查 REST 调用和该调用的结果是否符合给定的规范:CheckingWebTarget。为此,您需要一个 JAX-RS 客户端 API 实现,这是一个用于 REST 服务的通用客户端 API。在我的示例中,我使用的是 Jersey,它是参考实现,但您可以自由选择其他实现。这是测试:


 public class RestApiTests {
private static final RamlDefinition raml = RamlLoaders.fromClasspath(RestApiTests.class).load("helloworld.raml")
    .assumingBaseUri("http://localhost/");
private JerseyClient client = new JerseyClientBuilder().build();

private CheckingWebTarget checking;

@Before
public void createTarget() {
    checking = raml.createWebTarget(client.target("http://localhost"));
}

@Test
public void testHelloEndpoint() {
    checking.path("/hello").request().get();
    Assert.assertThat(checking.getLastReport(), RamlMatchers.hasNoViolations());
}

}

例如,如果您想使用 RestEASY,只需将客户端声明替换为:


 public class RestApiTests {
private static final RamlDefinition raml = RamlLoaders.fromClasspath(RestApiTests.class).load("helloworld.raml")
    .assumingBaseUri("http://localhost/");
private JerseyClient client = new JerseyClientBuilder().build();

private CheckingWebTarget checking;

@Before
public void createTarget() {
    checking = raml.createWebTarget(client.target("http://localhost"));
}

@Test
public void testHelloEndpoint() {
    checking.path("/hello").request().get();
    Assert.assertThat(checking.getLastReport(), RamlMatchers.hasNoViolations());
}

}

此服务的基本规范是:


 public class RestApiTests {
private static final RamlDefinition raml = RamlLoaders.fromClasspath(RestApiTests.class).load("helloworld.raml")
    .assumingBaseUri("http://localhost/");
private JerseyClient client = new JerseyClientBuilder().build();

private CheckingWebTarget checking;

@Before
public void createTarget() {
    checking = raml.createWebTarget(client.target("http://localhost"));
}

@Test
public void testHelloEndpoint() {
    checking.path("/hello").request().get();
    Assert.assertThat(checking.getLastReport(), RamlMatchers.hasNoViolations());
}

}

此测试将调用 http://localhost/hello 并根据 RAML 规范检查调用是否有效。它还将检查结果是否有效,例如,如果结果不是 JSON 文档,或者当服务返回 HTTP 状态代码 200 以外的其他内容时,测试将在这种情况下失败。如果您想要更广泛的例如,我建议尝试我在本文开头提到的文章,并尝试使用 Spring MVC 或 JAX-RS 以这种方式实现它。或者,如果您想快速尝试一些不同的东西,请尝试使用 Spark 来完成。

该系统允许您使用 RAML 规范测试几乎每个 REST API,而与您用于实现该 REST API 的机制无关。如果您正在考虑使用 API Blueprint 或 Swagger 做同样的事情,您将需要做更多的工作。 API Blueprint 没有像样的 Java 支持(snowcrash 不是像样的支持)并且 Swagger 仍然真正支持设计优先的方法。目前,如果你想要测试契约驱动的开发,RAML 目前是 Javaland 中唯一的选择。