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进行测试,可以显著的提高测试效率。
领取专属 10元无门槛券
私享最新 技术干货