首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用akka-http-testkit测试route

Akka HTTP

这里我们将使用 Akka HTTP来开发一个很简单的业务应用:组织管理。它只有一个数据模型,Org。组织支持树型结构,所有每个 org 里面都可以有一个可选 属性来指向父组织,若没有则代表此 org 是个一级组织。Org 的数据模型如下:

业务流程上,对一个 Org 模型的操作我们设计如下的简单流程:

是一个使用Akka HTTP Routing DSL来定义实现的路由(从MVC架构术语来说,就是控制器(Controller))。从这个简单的示例来说,它拥有如下接口:

createRoute:创建 Org

getRoute:根据id或code获取 Org

pageRoute:分页查询

updateRoute:更新 Org

removeRoute:根据id删除 Org

现在,我们已经设计好了我们需要的5个接口(名字),接下来需要定义具体的接口和实现。这里,我们先从测试开始。

akka-http-testkit

Akka HTTP 提供了一个测试套件来简化对 Akka HTTP 和 Akka HTTP Routing DSL的测试,我们需要在 sbt 配置里加上对应的库依赖:

定义一个 Akka HTTP Routing DSL 的测试类,需要混入 特质,它提供了对 Route DSL 的一系列测试辅助函数来支持Scalatest。

OrgRouteTest

现在,我们从OrgRouteTest开始,通过红-绿-红-绿这样的测试循环来验证并一步一步实现对 Org 的各项接口功能。

首先,让我们来看看这个 OrgRouteTest 类:

完整代码请见:https://github.com/yangbajing/scala-web-development/blob/master/scala-web/test/src/test/scala/scalaweb/test/route/OrgRouteTest.scala。

这里的OrgRouteTest测试类继续了多个接口:

WordSpec:使用了Word风格的测试,必需要混入这样的一个测试规范接口。类似的有:FutureSpec、FlatSpec等

BeforeAndAfterAll:提供了所有测试用例执行前或完成后的钩子函数

ScalatestRouteTest:Akka HTTP Routing 测试的辅助函数

MustMatchers:用户友好的断言DSL

OptionValues:Option类型的辅助函数

ScalaFutures:Future类型的辅助函数

这里可以看到定义了5个测试样例,其中create测试样例已经实现,其它4个暂未实现,使用 函数占位。

在测试开始,定义了3个变量:

:数据库连接管理

:测试生成的组织ID列表,待测试完成后可用来进行数据清除

:要测试的路由

routing test dsl

在create测试用例中,使用 函数连接了 (请求)、(路由)、(检测函数)三个部分。定义了我们要发起的测试请求,通过 符号(函数)连接(发送)到(路由),然后再用 将响应连接到 函数来做检测(断言)。实际是调用了 RequestBuilder,有多个重载函数,这里使用了需要一个隐式转换的函数,它可以将我们提交的请求(case class)转换成合适的HTTP数据并设置匹配的请求头:

我们使用来导入Akka HTTP的JSON支持来将请求转换成类型的HTTP请求数据发送到。Akka HTTP JSON支持见:JSON

check

响应的结果将通过 check 函数来进行测试断言,通过提供了多个辅助函数来完成测试,而对Akka HTTP routing的各类处理细节被隐藏在了函数的调用内部。常用的辅助函数有:

:获取响应的HTTP状态码

:获取响应数据

:将响应数据(body)转换成T类型

:类似responseAs,但是将转换成T类型

:获取响应的Conent-Type

`mediaType:获取响应的MediaType

:获取响应的所有header头

:查找指定类型的响应header头,返回结果为

run test

在sbt console中执行命令运行测试:,结果如下:

可以看到,这里执行通过了一个测试用例,有4个测试用例为pending(代表还未实现)。

总结

使用 akka-http-testkit 可以在不启动Server的情况下对定义的route进行测试,可以显著的提高测试效率。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180824G0NNXJ00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券