1 单元测试
1.1 Junit概述
- Junit是Java语言编写的第三方单元测试框架。
1.2 Junit的特点
-
① Junit是一个开放源代码的测试工具。
-
② Junit提供注解来识别测试方法。
-
③ Junit测试可以让我们编写代码更快,并且能提高代码质量。
-
④ Junit优雅简洁。
-
⑤ Junit在一个条中显示进度,如果
运行良好
显示绿色
;如果运行失败
显示红色
。
1.3 单元测试概念
-
单元:在Java中,一个类就是一个单元。
-
单元测试:程序员编写一小段代码,用来对某个类中的某个方法进行功能测试或业务逻辑测试。
1.4 Junit的使用步骤
-
① 将Junit的jar包导入到工程中。
-
② 编写测试方法(测试方法必须是public的,且没有参数,没有返回值的非静态方法)。
-
③ 在测试方法上使用
@Test
注解标注该方法是一个测试方法。 -
④ 选中测试方法右键通过junit运行该方法。
1.5 Junit的常用注解
1.5.1 Junit 4.x
-
@Before
:用来修饰方法,该方法会在每一个测试方法之前执行一次。 -
@After
:用来修饰方法,该方法会在每一个测试方法之前之后执行一次。 -
@BeforeClass
:用来修饰静态方法,该方法会在所有测试方法之前执行一次。 -
@AfterClass
:用来修饰静态方法,该方法会在所有测试方法之后执行一次。
1.5.2 Junit 5.x
-
@BeforeEach
:用来修饰方法,该方法会在每一个测试方法之前执行一次。 -
@AfterEach
:用来修饰方法,该方法会在每一个测试方法之前之后执行一次。 -
@BeforeAll
:用来修饰静态方法,该方法会在所有测试方法之前执行一次。 -
@AfterAll
:用来修饰静态方法,该方法会在所有测试方法之后执行一次。
1.6 应用示例
- 示例:
package com.github.demo;
/**
* @author open1024
* @version 1.0
* @since 2021-10-08 12:15
*/
public class Calculate {
public int sum(int a, int b) {
return a + b;
}
public int sub(int a, int b) {
return a - b;
}
}
package com.github.demo;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
/**
* @author open1024
* @version 1.0
* @since 2021-10-08 12:15
*/
public class CalculateTest {
private Calculate c;
@Before
public void init() {
this.c = new Calculate();
}
@Test
public void testSum() {
Assert.assertEquals(3, this.c.sum(1, 2));
}
@Test
public void testSub() {
Assert.assertEquals(-1, this.c.sub(1, 2));
}
}
2 日志技术
2.1 日志技术和输出语句的区别
2.1.1 输出语句的弊端
-
① 想要取消记录的信息,需要修改代码才能完成。
-
② 信息只能展示在控制台,不能将其记录到其他的位置(文件、数据库等)。
2.1.2 日志
-
生活中的日志:生活中的日志就好比日记,可以记录生活中的点点滴滴。
-
程序中的日志:程序中的日志可以记录程序在运行的时候的点点滴滴,并可以进行永久存储。
2.1.3 区别
输出语句 | 日志技术 | |
---|---|---|
取消日志 | 需要修改代码,灵活性较差 | 不需要修改代码,灵活性较好 |
输出位置 | 只能是控制台 | 可以将日志信息写入到文件或数据库中 |
多线程 | 和业务代码处于一个线程中 | 多线程方式记录日志,不影响业务代码的性能 |
2.2 日志技术的体系结构
2.3 Log4j
-
Log4j是Apache的一个开源项目。
-
通过使用Log4j,我们可以控制日志信息输出的
目的地是控制台、文件
等位置。 -
通过使用Log4j,我们可以
控制
每一条日志
的输出格式
。 -
通过使用Log4j,我们可以
定义
每一条日志
信息的级别
,能够更加细致的控制日志的生成过程。 -
上述的功能都可以通过一个
配置文件
来灵活的配置,而不需要修改应用的代码。
2.4 Log4j的入门
-
Log4j的开发流程:
-
① 导入Log4j相关的jar包📎Log4J相关jar包.zip。
-
② 编写Log4j的配置文件📎Log4J配置文件.zip。
-
③ 在代码中获取日志的对象。
-
④ 按照级别设置记录日志信息。
-
示例:
-
log4j.properties
log4j.rootLogger=debug,my,fileAppender
### direct log messages to my ###
log4j.appender.my=org.apache.log4j.ConsoleAppender
log4j.appender.my.ImmediateFlush=true
log4j.appender.my.Target=System.out
log4j.appender.my.layout=org.apache.log4j.PatternLayout
log4j.appender.my.layout.ConversionPattern=%d %t %5p %c{1}:%L - %m%n
# fileAppender演示ʾ
log4j.appender.fileAppender=org.apache.log4j.FileAppender
log4j.appender.fileAppender.ImmediateFlush=true
log4j.appender.fileAppender.Append=true
log4j.appender.fileAppender.File=D:/log4j-log.log
log4j.appender.fileAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.fileAppender.layout.ConversionPattern=%d %5p %c{1}:%L - %m%n
- Log4jTest01.java
package top.open1024.demo2;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author open1024
* @version 1.0
* @since 2021-10-08 13:36
*/
public class Log4jTest01 {
// 使用Slf4j中的API来获取日志的对象
// 好处:如果以后我们需要更换日志的实现,那么下面的代码不需要随之修改
// 推荐使用
private static Logger LOGGER = LoggerFactory.getLogger(Log4jTest01.class);
public static void main(String[] args) {
LOGGER.debug("debug级别的日志");
LOGGER.info("info级别的日志");
LOGGER.warn("warn级别的日志");
LOGGER.error("error级别的日志");
}
}
2.5 Log4j的组成
-
Loggers:记录器,日志的级别。
-
- Loggers组件在系统中常见的5个级别:debug、info、warn、error、fatal。
-
- debug < info < warn < error < fatal。
-
- Log4j有一个规则:
只输出级别不低于设定级别的日志信息
。换言之,如果设置的日志级别是info,那么只能输出info、warn、error和fatal级别的日志信息。
- Log4j有一个规则:
-
Appenders:输出源,日志要输出的地方,比如控制台(console)、文件(files)等。
-
- org.apache.log4j.ConsoleAppender:控制台。
-
- org.apache.log4j.FileAppender:文件。
log4j.appender.ca=org.apache.log4j.ConsoleAppender
log4j.appender.ca.设置1=值1
log4j.appender.ca.设置2=值2
log4j.appender.ca.设置3=设置3
log4j.appender.ca.设置4=设置4
...
log4j.appender.ca.设置n=设置n
-
Layouts:布局,可以根据自己的洗好规定日志输出的格式
-
- 常见的布局管理器:
-
-
- org.apache.log4j.PatternLayout(可以灵活地指定布局模式),常用。
-
-
-
- org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
-
-
-
- org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等信息)
-
log4j.appender.ca.layout=org.apache.log4j.PatternLayout
log4j.appender.ca.layout.设置1=值1
log4j.appender.ca.layout.设置2=值2
log4j.appender.ca.layout.设置3=设置3
log4j.appender.ca.layout.设置4=设置4
...
log4j.appender.ca.layout.设置n=设置n
2.6 Log4j的配置文件
2.6.1 配置文件示例
log4j.rootLogger=debug,ca,fileAppender # 根Logger
log4j.appender.ca=org.apache.log4j.ConsoleAppender
log4j.appender.ca.ImmediateFlush=true
log4j.appender.ca.Target=System.out
log4j.appender.ca.layout=org.apache.log4j.PatternLayout
log4j.appender.ca.layout.ConversionPattern=%d %t %5p %c{1}:%L - %m%n
2.6.2 配置根Logger
- 格式:
log4j.rootLogger=-日志级别,appenderName1,appenderName2,appenderName3,...
-
日志级别:
-
- off、
debug
、info
、warn
、error
、fatal、all或者自定义的级别。
- off、
-
appenderName1:就是指定日志信息要输出到哪里。可以同时指定多个输出目的地,用逗号隔开。如:
log4j.rootLogger=INFO,ca,fa
。
2.6.3 配置appender
log4j.appender.ca=org.apache.log4j.ConsoleAppender
log4j.appender.ca.ImmediateFlush=true
log4j.appender.ca.Target=System.out
-
log4j.appender.ca:
-
- org.apache.log4j.ConsoleAppender:向控制台输出。
-
- org.apache.log4j.FileAppender:向文件输出。
-
ConsoleAppender的常用选项:
-
- ImmediateFlush=true:表示所有的消息被立即输出,设置为false则不输出,默认值为true。
-
- Target=System.err:默认是System.out。
-
FileAppender的常用选项:
-
- ImmediateFlush=true:表示所有的消息被立即输出,设置为false则不输出,默认值为true。
-
- Append=true:true表示将消息添加到指定文件中,原来的消息不覆盖;false则将消息覆盖指定的文件内容,默认值为true。
-
- File=D:/log4j-log.log:指定消息输出到log4j-log.log文件中。
2.6.4 配置layout
log4j.appender.ca.layout=org.apache.log4j.PatternLayout
log4j.appender.ca.layout.ConversionPattern=%d %t %5p %c{1}:%L - %m%n
-
log4j.appender.ca.layout:
-
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),常用
。
-
- org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)。
-
- org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等信息)。
-
PatternLayout的常见选项:
-
- ConversionPattern=%d %t %5p %c{1}:%L - %m%n,设定以怎么样的格式显示消息。
评论区