我有一个应用程序,使用spring-mvc框架,基本上我们有一个演示层(控制器),服务层(业务单元,助手),集成层和数据访问层(jdbc / jpa存储库)。我们想要确保在未来对代码的任何添加都不会破坏先前正常工作的内容,为此我们正在使用单元测试(mockito)和集成测试(spring-test,spring-test-mvc)。
单元测试是针对每个类/组件进行的,基本上我们尝试为传入的输入和这些组件内可能的流程提供良好的覆盖,并且这个动作效果很好,在这里没有疑问,因为单元测试是关于确保单元按预期工作的。
集成测试则是另一回事,也是非常有争议的,因为目前我们有时会使用与设计单元测试相同的场景,但是使用真实平台和整个系统,但是我对最佳实践存在疑虑。
由于我们有控制器、服务和数据层,可以采用每层一个IT的方法,例如我们有UserService类,我们将拥有UserServiceTest作为单元测试和UserServiceIT,但是可维护性并不理想,有时候觉得我们重复使用相同的测试场景,但是现在使用真实系统。这种做法真的有意义吗?在哪种情况下有意义?如果我们已经通过单元测试覆盖了类的100%,为什么还需要IT呢?似乎我们只需要确保真正的组件将启动,这样才需要IT?是否所有相同的场景都是必要的,或者有哪些好的标准可以用来决定?
另一种方法是仅从控制器层调用最重要的测试用例进行集成测试,这意味着调用REST服务并验证JSON输出。这就足够了吗?我们不需要在其他层中验证更多内容吗?我知道调用真实的REST API将在底层使用所有层(控制器、服务、DAO),但这足够了吗?你会有一些考虑吗?
如果我们有一个助手类,我认为没有必要进行单元和IT测试,因为大多数方法只有一个目的,我认为在这里进行单元测试就足够了,您是否也这样认为?
数据层中的某些类可以使用Criteria API、QueryDSL等技术,在某些情况下进行单元测试非常困难,那么这是一个有效的理由吗?
我试图找到确保系统完整性的最佳方法、技巧和实践,同时考虑到这些内容的可维护性。