4. 本地测试
往往在开发过程中业务代码非常复杂且频繁启动服务器测试,非常麻烦!这个时候使用本地测试就是一个很好的解决方案,springboot也提供了本地测试解决方案!
在使用本地测试之前每次测试都得先启动springboot应用,然后再在地址栏输入方法地址,但是使用本地测试后可以直接在idea运行测试方法,不用事先启动springboot工厂,其本质是类在实例化的过程中会自动启动工厂,然后调用方法。
# spring中本地测试
1. 启动工厂
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
2. 从工厂中获取对象
UserDAO userDAO = context.getBean("userDAO");
3. 调用方法
userDAO.xxx(参数);
# springboot框架中完成本地测试
springboot = spring + springmvc
1. 引入结合junit和springboot依赖
2. 启动springboot应用 spring工厂才能启动 注入测试对象
@SpringBootTest
修饰范围:用在类上
作用: 在这个类实例化的过程中启动springboot应用
- 在pom.xml中引入测试依赖
<!--spring-boot-starter-test junit 单元-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<!--指定本地测试只能在src/test包下可用-->
<scope>test</scope>
</dependency>
- 编写测试类
测试类应该写在src/test及其子包下
@SpringBootTest
- 修饰范围: 用在类上
- 作用: 用来启动本地Spring环境
@SpringBootTest
public class UserServiceTest {
@Autowired
private UserService userService;
// 测试查询所有
@Test
public void testFindAll(){
userService.findAll().forEach(user -> System.out.println(user.getName()));
}
}
补充
如果不想使用@SpringBootTest也能在实例化类的时候启动工厂,可以创建一个基类,让该基类使用@SpringBootTest注解,然后创建测试类的时候让测试类继承基类,这样在要想实例化测试类,需要先实例化作为父类的基类,基类一旦实例化则工厂就启动了。
基类BasicTests
@SpringBootTest
public class BasicTests {
}
测试类
测试Service
// 让测试类继承基类
public class UserServiceTest extends BasicTests{
@Autowired
private UserService userService; // 测试谁就注入谁
// 测试查询所有
@Test
public void testFindAll(){
userService.findAll().forEach(user -> System.out.println(user.getName()));
}
}
测试DAO
public class UserDAOTests extends BasicTests{
@Autowired
private UserDAO userDAO;
@Test
public void testFindAll(){
userDAO.findAll().forEach(user -> System.out.println(user.getName()));
}
}
5. 热部署工具
热部署:不需要重启应用的情况下使修改生效
为了进一步提高开发效率,springboot为我们提供了全局项目热部署,日后在开发过程中修改了部分代码以及相关配置文件后,不需要每次重启使修改生效,在项目中开启了springboot全局热部署之后只需要在修改之后等待几秒即可使修改生效。
- 项目中引入依赖(关于热部署的依赖)
<!--热部署依赖 devtools-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<!--optional:该依赖是否可以传递 默认是false,代表可以传递,true代表不可传递只能当前项目可用-->
<optional>true</optional>
</dependency>
- 设置idea中支持自动编译(只需要设置一次)
- 开启允许在运行过程中修改文件
下面的是2021版的idea中的设置
- 启动SpringBoot应用
注意:日志出现restartedMain代表已经生效,在使用热部署时如果遇到修改之后不能生效,请重试重启项目再试
6. 日志配置和使用
6.1 引言
springboot框架 集成logback日志
Logback日志是由log4j创始人设计的又一个开源日志组件。目前,logback分为三个模块:logback-core、logback-classic、 logback-access。是对log4j日志展示进一步改进!
总结:logback 也是一个开源日志组件 和 log4j作用一致 都是用来生成日志 logback更加轻量
6.2 日志的级别
All > Trace >
DEBUG > INFO > WARN > ERROR
> Fatal > OFF
- OFF | 关闭:最低级别,不打印日志。
- FATAL | 致命:指明非常严重的可能会导致应用终止执行错误事件。
- ERROR | 错误:指明错误事件,但应用可能还能继续运行。
- WARN | 警告:指明可能潜在的危险状况。
- INFO | 信息:指明描述信息,从粗粒度上描述了应用运行过程。
- DEBUG | 调试:指明细致的事件信息,对调试应用最有用。
- TRACE | 跟踪:指明程序运行轨迹,比DEBUG级别的粒度更细。
- ALL | 所有:所有日志级别,包括定制级别。
我们自己写的代码用的最多的是 DEBUG、INFO、WARN、ERROR这几个级别。如果需要做一些调试,就用DEBUG;如果想做一些基本的信息输出,就用INFO;如果觉得自己写的代码存在潜在风险,就用WARN;如果自己写的代码日后可能会出现错误,就用ERROR级别。
日志级别由低到高:
日志级别越高输出的日志信息越多
6.3 项目中日志分类
# 日志分类
- 一种是rootLogger(根全局日志) : 用来监听项目中所有的运行日志 包括引入依赖jar中的日志
- 一种是logger(指定包级别日志) : 用来监听项目中指定包中的日志信息
6.4 配置日志
注意:SpringBoot框架中默认根日志为INFO
当我们想要修改根日志的级别和子日志的级别时我们可以在application.yml配置文件中配置,如下
# 配置日志 根日志是唯一的,只能写一个。但子日志可以写多个,可以监测任何包
logging:
level:
root: info # 调整根(全局)日志展示为debug
com.baizhi.dao: debug # 设置指定包的日志级别
com.baizhi.service: debug
有时候我们不仅想使日志在控制台输出,还想使它打印成文件,我们可以这样配置
6.5 项目中使用日志
package com.baizhi.service;
import com.baizhi.dao.UserDAO;
import com.baizhi.eneity.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
@Transactional
public class UserServiceImpl implements UserService{
// 声明一个日志对象
private static final Logger log = LoggerFactory.getLogger(UserService.class);
private UserDAO userDAO;
@Autowired
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
@Override
public List<User> findAll() {
return userDAO.findAll();
}
@Override
public void save(User user) {
log.debug("姓名:" + user.getName()); // log.debug("姓名:{}, {}, {}",user.getName(),"参数2","参数3");
log.debug("工资:" + user.getSalary()); // log.debug("姓名:{}==>{}==>{}",user.getSalary(),"参数2","参数3");
log.debug("生日:" + user.getBirthday());
userDAO.save(user);
}
}
注意点1:
注意点2:
日志对象不仅可以用在service,还可以用在dao、controller层等等。
补充:使用插件使我们想要使用日志对象进行调试时不用声明日志对象
使用插件可以使我们不用每次都得声明日志对象,那怎么配置呢,我们往下看
插件使用