Spring Boot REST 应用测试方法
Posted
技术标签:
【中文标题】Spring Boot REST 应用测试方法【英文标题】:Spring boot REST application testing approach 【发布时间】:2016-11-06 11:37:51 【问题描述】:我有一个 Spring Boot + REST 应用程序。当我需要编写单元测试时,我应该直接调用服务bean还是调用rest控制器?如果我直接调用rest控制器,我必须使用RestTemplate并作为客户端调用rest api,对吗?
什么是最佳和必需的做法?
如果我直接调用服务 bean,它将导致更少的代码覆盖,因为控制器方法代码不会被覆盖。这可以接受吗?
【问题讨论】:
【参考方案1】:嗯,这是一个复杂的问题,但我会尽力回答。这在很大程度上取决于您/您的组织的风险承受能力以及他们希望在测试上投入多少时间。我相信很多测试,但有太多的东西。
单元测试测试代码单元。很好,但什么是单位?这篇文章是一个很好的讨论:http://martinfowler.com/bliki/UnitTest.html 但是单元基本上是应用程序中最小的可测试部分。
许多文献(例如https://www.amazon.ca/Continuous-Delivery-Reliable-Deployment-Automation/dp/0321601912/)描述了测试的多个阶段,包括非常低级的单元测试和模拟外部性,例如数据库或文件系统或远程系统,以及“api 验收测试”(有时称为集成测试,尽管这是一个模糊的术语,可能意味着其他东西)。后一种类型会启动您的应用程序的测试实例,调用 API 并对响应进行断言。
简短的回答如下:对于单元测试,关注单元(可能是服务或更细化),但是您描述的另一组测试,其中测试的行为类似于客户端并调用您的 api,也是值得的.我的建议:两者都做,但不要同时调用这两个单元测试。
【讨论】:
我认为如果您进行集成测试,它也涵盖单元测试。所以不用再写单元测试用例也知道了 值得商榷。单元测试通常是作为 TDD 的一部分创建的,因此它们的用途略有不同。它们推动设计,确保划分和单一职责,并揭示开发人员编写代码的意图,以及开发人员如何使用他们构建的单元进行设想。 API 级验收测试更多是为了确保您满足(而不是退回到预先存在的)验收标准。【参考方案2】:最好的方法是测试威盛控制器。在此处输入 Web 服务并返回值。所以Controller在这方面发挥了相当不错的作用。也可以有小逻辑,你可能会错过
您可以尝试使用MockMvc 方法来测试控制器。
参考:Reference-1,Reference-2
或者使用你在问题Reference-3中提到的RestTemplate
【讨论】:
【参考方案3】:它基于您要测试的内容,您可以分离您的测试,特别是如果您有开发团队,制作测试用例来测试您的业务“服务”,另一个测试用例作为集成测试使用 REST 模板,在这种情况下,您可以更快、更轻松地找出错误。
【讨论】:
【参考方案4】:这取决于你想做什么。
一种方法是对工作单元进行单元测试,例如服务和 MVC 控制器。这些测试将仅测试在此类中找到的最终逻辑,并尝试达到较高的分支覆盖率(如果适用)。 除此之外,您还可以编写一个集成测试,发出 HTTP 请求,进入真正的服务 bean,只模拟最终的资源访问。
对于集成测试,您可以使用 Spring 的支持,请参见此处:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/integration-testing.html#spring-mvc-test-framework
【讨论】:
以上是关于Spring Boot REST 应用测试方法的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot实现RESTful接口架构实战(包括REST的讲解定义REST服务测试)
使用 restAssured 测试 Spring Boot Rest 应用程序