使用 RAML 测试通用 REST API

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

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 63w+ 字,讲解图 2808+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2200+ 小伙伴加入学习 ,欢迎点击围观

之前的一篇文章 中,我向您展示了如何使用 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 中唯一的选择。

相关文章