Springboot2.X测试应用

.Springboot2.X测试应用
需求分析->设计->开发->测试->上线

1.测试里面的种类
1.1 单元测试
完成最小的软件设计单元的验证工作,目标是确保模块被正确的编码
1.2 黑盒测试
不考虑内部结构,主要测试功能十分满足需求
1.3 白盒测试
针对代码级别,测试开发工程师一般具备白盒测试能力,针对程序内部的逻辑结构进行代码级别的测试
1.4 回归测试
对原先提出的缺陷进行二次验证,开发人员修复后进行二次的验证
1.5 集成测试
测试模块和模块之间的整合,且测试主要的业务功能
1.6 系统测试
针对整个产品系统进行的测试,验证系统是否满足产品业务需求

2.SpringBoot2.x的单元测试

引入相关依赖
	
	 
		org.springframework.boot
		spring-boot-starter-test
		test
	

	
		junit
		junit
		4.12
		test
	

配置相关注解
@RunWith(SpringRunner.class):底层用junit SpringJUnit4ClassRunner
Test测试类要使用注入的类,比如@Autowired注入的类,有了@RunWith(SpringRunner.class)这些类才能实例化到spring容器中,自动注入才能生效,
不然直接一个NullPointerExecption

@SpringBootTest(classes={DemoProjactApplication.class})//启动整个springboot工程
	public class TestVideo {
			
		@Before
		public void testOne(){
			System.out.println("这是测试 before ");
		}

		@Test
		public void testTwo1(){
			System.out.println("这是测试 test1 ");
			//断言
			TestCase.assertEquals(1,3);
		}

		@Test
		public void testTwo2(){
			System.out.println("这是测试 test2 ");
		}

		@After
		public void testThree(){
			System.out.println("这是测试 after ");
		}

	}

常用单元测试的注解:@before、@Test、@After
断言:判断程序结果是否符合预期 TestCase.assertXXX

3.springboot的MockMvc调用api层接口
增加类注解 @AutoConfigureMockMvc、 注入一个MockMvc类
3.1 MockMvc是什么
MockMvc是Spring Test提供的功能,可是实现对Controller层(API)做测试,也就是不必启动工程就能测试Controller接口。
MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,这样可以使得测试速度快、不依赖网络环境。而且提供了一套验证的工具,
这样可以使得请求的验证统一而且很方便。
3.2 引入起步依赖


org.springframework.boot
spring-boot-starter-web

	
	
	
		org.springframework.boot
		spring-boot-starter-test
		
			
				org.junit.vintage
				junit-vintage-engine
			
		
	

	
	
		org.mockito
		mockito-all
		2.0.2-beta
		test
	

不能引入spring-boot-starter-security起步依赖,否则运行测试时会报错Full authentication is required to access this resource

3.3 实例
@RunWith(SpringRunner.class)  //底层用junit  SpringJUnit4ClassRunner
	@SpringBootTest(classes={DemoProjactApplication.class})//启动整个springboot工程
	@AutoConfigureMockMvc
	public class TestApi {

		@Autowired
		private MockMvc mockMvc;

		@Test
		public void testVideoListApi() throws Exception {
			//MockMvcRequestBuilders 模拟http请求的构建器
			//MockMvcRequestBuilders.get  请求方式
			MvcResult mvcResult =  mockMvc.perform(MockMvcRequestBuilders.get("/api/v1/pub/video/list"))
                .andExpect(MockMvcResultMatchers.status().isOk()).andReturn();
		   int status = mvcResult.getResponse().getStatus();
		   System.out.println(status);
			//会乱码
			//String result = mvcResult.getResponse().getContentAsString();

			// 使用下面这个,增加 编码 说明,就不会乱码打印
			String result = mvcResult.getResponse().getContentAsString(Charset.forName("utf-8"));

		   System.out.println(result);
		}
	}

3.4 注解解释
@SpringBootTest注解:是SpringBoot自1.4.0版本开始引入的一个用于测试的注解,来提供SpringBoot单元测试环境支持。
SpringBoot单元测试环境支持 就是说 可以取到spring中的容器的实例,如果配置了@Autowired那么就自动将对象注入。如果你使用的JUnit版本如果是JUnit4
不要忘记在测试类上添加@RunWith(SpringJUnit4ClassRunner.class),JUnit 5就不需要了。
注:这是SpringBoot Test的功能 import org.springframework.boot.test.context.SpringBootTest;

@RunWith(SpringJUnit4ClassRunner.class),让测试运行于Spring测试环境,以便在测试开始的时候自动创建Spring的应用上下文
	import org.junit.runner.RunWith;
	import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
	Spring Boot 2.2之后 ,也就是junit5中 启动Spring Boot 测试环境 需要@SpringBootTest 一个注解就好。
	Spring Boot 2.2之前 ,也就是junit4中 启动 @RunWith(SpringJUnit4ClassRunner.class) 和 @SpringBootTest 两个注解一块使用。否则@Autowired注入的会是null 参考解决SpringBoot单元测试@Autowired不生效问题
	
	@EnableWebMvc注解:为该应用添加SpringMVC的功能,即添加之后可以在项目中,可以使用@RequestMapping等注解来定义请求处理与请求uri的映射和其他SpringMvc提供的功能
	注:这是spring web的功能 import org.springframework.web.servlet.config.annotation.EnableWebMvc;
	
	@AutoConfigureMockMvc注解 :表示 MockMvc交给Spring容器管理,开启自动配置MockMvc 。我们需要使用时 只要注入就可以了。如果没有这个注解,需要自己根据应用上下文创建 管理MockMvc对象。有了这个注解,只要注入MockMvc就可以使用了。
	注:这是Spring test的功能 import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
	
	@Test注解 在junit5中 是 import org.junit.jupiter.api.Test  而不是import org.junit.Test;
	
	3.5 MockMvc解释: 执行请求 并返回ResultActions实例,添加断言等
	mockMvc.perform执行一个请求,会自动执行SpringMVC的流程并映射到相应的控制器执行处理,返回一个ResultActions实例
	MockMvcRequestBuilders.get("/student/findAll") 根据uri模板和uri变量值 构造一个GET,PUT,POST,DELETE等请求,Post请求就用.post方法
	contentType(MediaType.APPLICATION_JSON_UTF8)代表发送端发送的数据格式是application/json;charset=UTF-8
	accept(MediaType.APPLICATION_JSON_UTF8)代表客户端希望接受的数据类型为application/json;charset=UTF-8
	ResultActions.andExpect添加执行完成后的断言
	ResultActions.andExpect(MockMvcResultMatchers.status().isOk())方法看请求的状态响应码是否为200如果不是则抛异常,测试不通过
	ResultActions.andExpect(MockMvcResultMatchers.jsonPath(“$.author”).value(“嘟嘟MD独立博客”))这里jsonPath用来获取author字段比对是否为嘟嘟MD独立博客,不是就测试不通过
	ResultActions.andDo添加一个结果处理器,表示要对结果做点什么事情,比如此处使用MockMvcResultHandlers.print()输出整个响应结果信息

  1. Springboot2.X全局异常处理
    统一的错误页面或者错误码、对用户更友好
    Springboot2.X怎么在项目中配置全局异常
    4.1 类添加注解
    @ControllerAdvice,如果需要返回json数据,则方法需要加@ResponseBody
    @RestControllerAdvice, 默认返回json数据,方法不需要加@ResponseBody

4.2方法添加处理器
捕获全局异常,处理所有不可知的异常
@ExceptionHandler(value=Exception.class)

4.3 实例

package com.funi.demoprojact.handler;

import com.funi.demoprojact.utils.JsonData;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;

@RestControllerAdvice
public class CustomExtHandler {

   @ExceptionHandler(Exception.class)
    JsonData handlerException(Exception e, HttpServletRequest request){
        return JsonData.buildError(-2,"服务器异常");
   }
}
package com.funi.demoprojact.utils;

/**
 * 接口返回工具类
 */
public class JsonData {
    private int code;
    private Object data;
    private String msg;

    public JsonData(){}
    public JsonData(int code,Object data){
        this.code = code;
        this.data = data;
    }
    public JsonData(int code,Object data,String msg){
        this.code = code;
        this.data = data;
        this.msg = msg;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public static JsonData buildSuccess(int code, Object data){
        return new JsonData(code,data);
    }
    public static JsonData buildError(int code,String msg){
        return new JsonData(code,"",msg);
    }

    @Override
    public String toString() {
        return "JsonData{" +
                "code=" + code +
                ", data=" + data +
                ", msg='" + msg + '\'' +
                '}';
    }
}

4.4 SpringBoot自定义异常和错误页面跳转实战
返回自定义异常界面,需要引入thymeleaf依赖(非必须,如果是简单的html界面则不用)

		   org.springframework.boot
		   spring-boot-starter-thymeleaf
	

package com.funi.demoprojact.handler;

import com.funi.demoprojact.utils.JsonData;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;

@ControllerAdvice
public class CustomExtHandler {
    @ExceptionHandler(Exception.class)
    ModelAndView handlerException(Exception e, HttpServletRequest request){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("error.html");
        modelAndView.addObject("msgExt", e.getMessage());
        modelAndView.addObject("msg", "服务器异常");
        return modelAndView;
    }
}

在src\main\resources\templates\创建 error.html



    
    Title


SpringBoot学习开始   自定义模板

默认配置文件中加 classpath:/templates/ spring.web.resources.static-locations= classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,classpath:/templates/


你可能感兴趣的:(SpringBoot,spring,boot)