单元测试最佳实战:单元测试和集成测试

发表于:2022-2-24 09:50

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:luzhouxiaoshuai    来源:博客园

  1、单位测试中测试的是类中的方法,对每个类中的方法进行单独测试,测试方法与测试方法之间是独立的不相互依赖的,并且测试方法不能依赖外部的环境。
  例如service中依赖dao,这个dao不是真实的,而是通过mock对象产生的,这就是单元测试
  2.集成测试,就是模块与模块之间相互依赖,如果测试service的时候,如果依赖dao,这个dao不是mock产生的,在容器中真实产生的,依赖真实的dao,那么这就是集成测试。
  3.spring Test框架中的spring MVC框架,是在web容器外进行单元测试,spring mvc 会模拟用户的请求,模拟用户的httpRequest session等对象完成对web应用的测试。
  4、如果在测试的时候,不运行在真实的容器中进行测试,那么在测试所有的类的时候,类中依赖的对象都必须全部是通过mock对象产生。如果是集成测试,运行在容器中,通过spring对对象进行管理,我们就能够引入真实的对象,完成集成测试。
  所以一般对于业务层和web我们都进行集成测试,让测试环境运行在容器之中,在web进行集成测试的时候,需要模拟用户的请求访问,这个时候spring mockMVC框架就是模拟用户的请求访问,产生HttpReques等对象,完成web框架的集成测试。
  这里强调容器:并不是指tomcat,而是指的是Spring 容器,在单元测试的时候,不应该依赖Spring 容器,换句话说就是用户不应该通过在单元测试的时候启动ApplicationContext容器,在容器中获得真实的bean对象,bean对象应该通过mock对象产生使用junit测试spring框架应用的时候存在下面的问题。
  传统的使用junit测试spring框架的程序,都是在setUp方法中 new FileSysytemXMl,来获得Spring容器的上下文,在Spring 容器中手动获得对应的对象,这个对象不是通过mock产生的所以这是集成测试。
  上面问题存在一个很严重的问题,按照junit框架的设计原理,在junit中调用一次测试方法,每调用一次测试方法都会重新生成一个测试类实例,上面如果调用3个测试方法,就会生成三个测试类实例。会调用三次setup方法,导致spring容器被初始化多次。如果解决这个问题了,spring TestContext框架已经解决了该问题,提供了Spring 容器的上下文,不会导致Spring 容器被初始化多次。
  按照上面的测试代码,如果要实现数据库事务的操作,需要手动编写很多复杂的代码,相当的麻烦,但是使用Spring TestContext框架,能够让我们很好的使用事务管理。
  1. 为Controller编写测试,不需要应用服务器环境。
  2. 为Service编写测试,不需要应用服务器环境。
  Spring为我们提供了一个测试套件Spring-test,与JUnit结合,可以在运行测试时启动IoC容器测试Service,数据库,也可以在脱离web容器的环境下模拟http请求测试Controller,甚是给力。
  测试Controller
  当我们编写完一个Controller后,常规的测试方式就是部署运行应用,然后观察运行效果。如果想要编写测试,也要用Mock对象模拟请求参数,模拟HttpSession,特别麻烦。现在spring-test为我们提供了一个更加优雅的测试方式。例如,要测试下面的Controller:
  @RequestMapping(value = {"/", "/shop"}, method = RequestMethod.GET)
  public String home() {
  return "index";
  } 

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号