Spring Boot 入门之路(7)--- 单元测试与日志管理

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Geffin/article/details/100025088

1 Spring Boot 的单元测试

Spring Boot 提供了@SpringBootTest 注解来辅助我们进行测试。

示例

首先我们先引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

然后创建一个 service 并将其实现

public interface HelloService {

	void hello();
}
@Service
public class HelloServiceImpl implements HelloService{

	@Override
	public void hello() {
		System.out.println("HELLO");
	}

}

然后我们实现一个测试类

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {TestApplication.class})
public class MyTest {

	@Autowired
	HelloService helloService;
	
	@Test
	public void test() {
		helloService.hello();
		System.out.println("my first test");
	}
	
}

结果如下
在这里插入图片描述

使用 mock 方式进行 controller 单元测试

实际上,使用 @SpringBootTest 不会真正启动 web 服务,那我们应该如何测试 controller 单元呢?其实 Spring 已经提供了MockMvc 以供我们测试 controller 单元,快来体验一下吧!

我们有一个 controller

@RestController
public class HelloController {

	@RequestMapping("/hello")
	public String hello() {
		return "hello everybody!";
	}
}

实现测试类

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {TestApplication.class})
@AutoConfigureMockMvc
public class MyTest {

	@Autowired
	private MockMvc mvc;
	
	@Test
	public void test() throws Exception {
		this.mvc.perform(get("/hello")).andExpect(status().isOk())
        .andDo(MockMvcResultHandlers.print());
	}
	
}

在这里插入图片描述
发现该请求成功通过

2 Spring Boot 中的日志管理

Spring Boot 的默认配置提供了对常用日志的支持。在默认情况下,Spring Boot 会用 SLF4J + Logback来记录日志,并用 INFO 级别输出到控制台。

SLF4J 是一个日志门面,也可以看作一个接口框架,并不提供具体的实现,具体的实现由类似于 Log4j,Log4j2,Logback 等等这样的日志框架去完成。

日志管理是有依赖的

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
</dependency>

根据我们之前的经验,是不是要把这个依赖加入 pom.xml 中呢?其实是不用的,因为 spring-boot-starter 已经包括了spring-boot-starter-logging。

下面我们通过代码进行示例:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {TestApplication.class})
public class MyTest {

	private final Logger logger = LoggerFactory.getLogger(this.getClass());
	
	@Test
	public void test(){
		logger.info("my first time");
	}
	
}

运行可得结果
在这里插入图片描述
证明日志已经成功运行。

日志相关属性

文件输出

默认情况下,Spring Boot 将日志输出到控制台,不会写到日志文件。如果要编写除控制台输出之外的日志文件,则需在 application.properties 中设置 logging.file 或 logging.path 属性。

logging.file 属性用于设置文件,可以是绝对路径或者相对路径。例如:

# 日志配置
logging.file = log/test.log

在这里插入图片描述
在这里插入图片描述
可以发现当前目录下确实生成了日志文件。

logging.path 属性用于设置目录,会在该目录下创建 spring.log 文件,并写入日志内容,例如:

# 日志配置
logging.path = log/test-01

在这里插入图片描述
易发现在 /log/test-01 文件夹中生成一个日志文件为 spring.log。

注意,二者不能同时使用,如若同时使用,则只有 logging.file 生效。

级别控制

我们知道日志级别为 TARCE < DEBUG < INFO < WARN < ERROR < FATAL,举个例子,如果我们的日志级别设置为 INFO ,那么 TARCE 和 DEBUG 的日志我们都是看不到的。

Spring Boot 的默认级别是 INFO,如果我们想改为 WARN ,添加下面一行代码即可:

logging.level.root = warn

我这里用的是 root 级别,表示项目下的所有日志,当然我们也可以使用 package 级别,即在指定包下使用相应的日志级别。

运行一看,怎么空空如也?
在这里插入图片描述
实际上,这是由于打印的日志级别设置为 WARN,所以 INFO 级别的日志都不显示了。

那好,我现在有一个需求,需要 edu.szu.test.MyTest 下的日志级别设置为 INFO,应该如何实现?其实,在 application.properties 中加入一行代码即可。

logging.level.root = warn
logging.level.edu.szu.test.MyTest = info

现在我们运行一下,发现内容如下
在这里插入图片描述
表明 edu.szu.test.MyTest 下的日志级别成功改为 INFO。

日志格式

定制日志在控制台的输出格式

logging.pattern.console = %d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n 

定制日志在文件的输出格式

logging.pattern.file = %d{yyyy/MM/dd-HH:mm} [%thread] %-5level %logger- %msg%n

猜你喜欢

转载自blog.csdn.net/Geffin/article/details/100025088