【问题标题】:Spring boot REST application testing approachSpring Boot REST 应用测试方法
【发布时间】:2016-11-06 11:37:51
【问题描述】:

我有一个 Spring Boot + REST 应用程序。当我需要编写单元测试时,我应该直接调用服务bean还是调用rest控制器?如果我直接调用rest控制器,我必须使用RestTemplate并作为客户端调用rest api,对吗?

什么是最佳和必需的做法?

如果我直接调用服务 bean,它将导致更少的代码覆盖,因为控制器方法代码不会被覆盖。这可以接受吗?

【问题讨论】:

    标签: java spring rest junit spring-boot


    【解决方案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-1Reference-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

        【讨论】:

          猜你喜欢
          • 2017-11-02
          • 2023-03-25
          • 2017-04-01
          • 2017-04-23
          • 1970-01-01
          • 2020-07-25
          • 2016-11-30
          • 2016-06-06
          • 2018-02-09
          相关资源
          最近更新 更多