JUnit单元测试
概述
实际开发中,单元测试⼀般是由我们Java程序员来完成。我们要对我们⾃⼰写的每⼀个业务⽅法负责任,要保证每个业务⽅法在进⾏测试的时候都能通过
- 期望值 ( 执行了这个业务方法之后,你期望的执行结果是多少 )
- 实际值( 被测试的业务方法的真正执行结果 )
- 期望值和实际值相同表示测试通过,期望值和实际值不同则单元测试执⾏时会报错
- JUnit是一个专⻔做单元测试的组件 , 不仅仅是为了代替main⽅法 , 单元测试方法可以写多个(一般是一个业务方法对应一个测试方法)
测试类的类名以及每个测试方法的方法名定义规范
- 测试方法的规范: public void testXxxx(){} , 测试方法的方法名以 test 开始
- 测试类的类名规范:public class XxxTest{ } , 测试类的类名以Test 结尾
测试业务类的时候可以在测试类上测试,也可以在测试方法上测试
- 在测试类上执⾏@Test注解,该测试类中所有的测试⽅法都会执⾏
- 在测试⽅法上执⾏@Test注解,只执⾏当前的测试⽅法 , 测试方法可以写多个(一般是一个业务方法对应一个测试方法)
使用步骤
第⼀步:引⼊依赖
<!-- junit依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
第⼆步:编写单元测试类【测试⽤例】,测试⽤例中每⼀个测试⽅法上使⽤@Test注解进⾏标注
测试业务类
//数学业务类
public class MathService {
//求和的业务方法
public int sum(int a, int b){
return a * 10 + b * 10;
}
//相减的业务方法
public int sub(int a, int b){
return a - b;
}
}
测试用例
// 测试⽤例名字规范:你要测试的类名+Test
public class MathServiceTest {
// @Test注解非常重要,被这个注解标注的方法就是一个单元测试方法
@Test
public void testSum(){
MathService mathService = new MathService();
// 获取实际值
int actual = mathService.sum(1, 2);
// 期望值
int expected = 30;
// 加断言进行测试
Assert.assertEquals(expected, actual);
}
@Test
public void testSub(){
MathService mathService = new MathService();
// 实际值
int actual = mathService.sub(10, 5);
// 期望值
int expected = 5;
// 添加断言机制
Assert.assertEquals(expected, actual);
}
}
关于MyBatis集成日志组件
引⼊⽇志框架的⽬的是为了看清楚MyBatis执⾏的具体SQL
常见的集成的日志组件
SLF4J(沙拉风):沙拉风是一个日志标准
- 其中有一个框架叫做 logback实现了 slf4j 标准 , 实现了沙拉风规范
LOG4J , LOG4J2 , STDOUT_LOGGING …
- 注意:log4j , log4j2, logback都是同一个作者开发的
启用STDOUT_LOGGING标准日志
启⽤MyBatis实现的标准⽇志组件,只需要在mybatis-config.xml核心配置⽂件中添加settings配置可参考mybatis中文手册
- 该日志组件可以看到连接对象什么时候创建和关闭以及具体的sql语句信息, 但没有详细的日期,线程名字等,此时需要集成第三方的log组件丰富信息
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--这个标签应该出现在environments标签之前 ,只要参考dtd约束即可-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
集成第三方logback日志框架的步骤
第一步:引入logback的依赖
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
</dependency>
第二步:引入 logback 所必须的 xml 配置文件logback.xml 或者 logback-test.xml
- 配置文件主要配置日志输出相关的级别以及日志具体的格式 , 配置文件的名字固定且必须放到类的根路径下
- root 标签的 level 属性指定日志级别,从低到高的优先级:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF (级别越低输出的信息越多 , 级别越高输出的信息越少 , 级别低的输出信息一定包含级别高的输出信息)
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义⽇志⽂件的存储地址-->
<property name="LOG_HOME" value="/home"/>
<!-- 输出日志信息到控制台 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示⽇期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:⽇志消息,%n是换⾏符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 按照每天⽣成⽇志⽂件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--⽇志⽂件输出的⽂件名-->
<FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--⽇志⽂件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示⽇期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:⽇志消息,%n是换⾏符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--⽇志⽂件最⼤的⼤⼩-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>100MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!--mybatis log configure-->
<logger name="com.apache.ibatis" level="TRACE"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<!-- ⽇志输出级别,logback⽇志级别包括五个:TRACE < DEBUG < INFO < WARN < ERROR -->
<root level="DEBUG">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
Spring6 启用 Log4j2 日志框架
从Spring5之后,Spring框架支持集成的日志框架是Log4j2
启用日志框架步骤
第一步:引入Log4j2的依赖
<!--log4j2的依赖-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.19.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j2-impl</artifactId>
<version>2.19.0</version>
</dependency>
第二步:引入Log4j2所必须的 xml 配置文件log4j2.xml
- 配置文件主要配置日志输出相关的级别以及日志具体的格式 , 配置文件的名字固定且必须放到类的根路径下
- root 标签的 level 属性指定日志级别,从低到高的优先级:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF (级别越低输出的信息越多 , 级别越高输出的信息越少)
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<loggers>
<!--level指定日志级别,从低到高的优先级:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF-->
<root level="DEBUG">
<appender-ref ref="spring6log"/>
</root>
</loggers>
<appenders>
<!--输出日志信息到控制台-->
<console name="spring6log" target="SYSTEM_OUT">
<!--控制日志输出的格式-->
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss SSS} [%t] %-3level %logger{1024} - %msg%n"/>
</console>
</appenders>
</configuration>
自己使用日志框架记录日志信息
// 第一步:获取FirstSpringTest类的日志记录器对象,也就是说只要是FirstSpringTest类中的代码执行记录日志的话,就输出相关的日志信息
Logger logger = LoggerFactory.getLogger(FirstSpringTest.class);
// 第二步:记录日志,根据不同的级别来输出日志,级别低的包含级别高的
logger.info("我是一条消息");
logger.debug("我是一条调试信息");
logger.error("我是一条错误信息");