一、单元测试
任何应用程序,在正式发布之前,都需要经过测试,确定应用程序的功能能够满足程序设计的要求。
每个应用程序的都有很多功能,代码也会有很多,少则几万行,多则数十万行。如果等所有的功能都开发完毕,再进行测试,一旦出了bug,由于代码错综复杂,很难排查问题。
所以,实际开发中,需要以功能为单位,设计测试。每写完一个功能,就对这个功能的完整性进行测试,如果所有的功能测试都没有问题,那么整个应用程序就没有问题
测试分类:
黑盒测试: 不需要写测试代码
白盒测试: 需要测试代码
junit测试框架:
由apache提供的一种测试框架,可以简化测试代码的编写
使用:
1.导入junit 的 jar包
2.定义测试类
类名规范:被测试类名+Test
3.定义测试方法
权限修饰符:public
返回值类型:void
方法名:test+被测试方法名
参数列表:空
4.在测试方法上添加@Test注解
5.运行测试方法
@Before注解:
添加该注解的方法,在所有测试方法执行之前执行,一般用来初始化资源(加载配置文件)
@After注解:
添加该注解的方法,在所有测试方法执行之后执行,一般用来释放资源
二、动态代理
设计模式:
计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
常见设计模式(23种):
适配器模式(Adapter Pattern)
桥接模式(Bridge Pattern)
过滤器模式(Filter、Criteria Pattern)
装饰器模式(Decorator Pattern)
模板模式(Template Pattern)
代理模式(Proxy Pattern)
......
代理模式:
解决的问题:
在不修改源码的基础上,对功能(方法)进行增强
三要素:
共用接口:为了规定代理对象和被代理对象有共同的行为(方法)
被代理对象:背后真正做事情的对象
代理对象:与用户打交道的对象,会调用被代理对象完成功能
实现:
1.定义接口
2.创建被代理对象
3.创建代理对象
4.用户调用代理对象的方法完成功能
1,问题导入
public class Demo {
public static void main(String[] args) {
System.out.println("程序开始运行");
//求1-10之和
int sum = 0;
for(int i = 1; i <= 10; i++) {
System.out.println("第" + i + "次循环");
sum += i;
}
System.out.println("1-10之和为:" + sum);
System.out.println("程序结束运行");
}
}
上面代码在运行过程中为了看到程序执行的流程及循环的次数,我们通过输出语句进行了输出,这样就可以一目了然的看到。但是当项目上线时这些输出语句我们是不需要的,所以需要将这些测试的输出语句全部删除。项目中如果类特别多,我们删除起来就会发现特别麻烦,如果解决这个问题呢?可以使用logback
2,logback体验
2.1 导入依赖包
logback相关jar包如下:

操作步骤:
-
在模块下创建lib目录
-
将需要的jar包拷贝到lib目录下
-
将这些jar包添加为库

点击
Add as Library就会弹出如下界面
2.2 编写配置文件
在src目录下创建名为 logback.xml 的配置文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="/home" />
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%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>
<!--格式化输出:%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>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 日志输出级别 -->
<root level="info">
<appender-ref ref="STDOUT" />
</root>
</configuration>
2.3 修改代码
package com.itheima;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogbackDemo {
private static final Logger LOG = LoggerFactory.getLogger(LogbackDemo.class);
public static void main(String[] args) {
//System.out.println("程序开始运行");
LOG.debug("程序开始运行");
//求1-10之和
int sum = 0;
for (int i = 1; i <= 10; i++) {
//System.out.println("第" + i + "次循环");
LOG.debug("第" + i + "次循环");
sum += i;
}
System.out.println("1-10之和为:" + sum);
//System.out.println("程序结束运行");
LOG.debug("程序结束运行");
}
}
结果如下:

修改配置文件:
将配置文件(logback.xml)root 标签的 level 属性修改为 info 如下:

重新运行上面的代码,结果如下:

通过上面的例子可以看到不需要修改代码,动态的选择输出或者不输出一些内容。
3,logback
3.1 概述
logback是一种专门用于Java程序记录日志的工具,是目前主流的开发日志技术。
3.2 日志记录与System.out区别
System.out记录的信息无法进行删除,一旦写入,必须运行。日志记录的信息可以根据使用需要,设置是否显示日志,设置记录日志的级别,并且记录相关所有信息。
3.3 logback的组件
3.3.1 Logger(记录器)
logger组件在此系统中被分为五个级别:
ERROR(错误) WARN(警告) INFO(信息) DEBUG(调试) TRACE(跟踪)
这五个级别是有顺序的,TRACE < DEBUG < INFO <WARN < ERROR,分别用来指定这条日志信息的重要程度。
logback有一个规则:只输出级别不低于设定级别的日志信息。假设Loggers级别设定为INFO,则INFO、WARN、ERROR级别的日志信息都会输出,而级别比INFO低的DEBUG则不会输出。
3.3.2 Appenders (输出源)
logback日志系统还提供许多强大的功能,比如允许把日志输出到不同的地方,如控制台(Console)、文件(Files)等,可以根据天数或者文件大小产生新的文件等等。
常用的类如下:
ch.qos.logback.core.ConsoleAppender(控制台) ch.qos.logback.core.FileAppender(文件) ch.qos.logback.core.rolling.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
3.3.3 Layouts(布局)
有时用户希望根据自己的喜好格式化自己的日志输出,logback可以在Appenders的后面附加Layouts来完成这个功能。Layouts提供好几种日志输出样式,如根据HTML样式、自由指定样式等信息的样式。
常使用的类如下:
ch.qos.logback.classic.html.HTMLLayout(以HTML表格形式布局) ch.qos.logback.classic.PatternLayout(可以灵活地指定布局模式)
3.4 PatternLayout布局模式
格式化符号说明:
| 转换符 | 作用 |
|---|---|
| c {length } lo {length } logger {length } | 输出日志的logger名,可有一个整形参数,功能是缩短logger名,设置为0表示只输入logger最右边点符号之后的字符串。 |
| C {length } class {length } | 输出执行记录请求的调用者的全限定名。参数与上面的一样。尽量避免使用,除非执行速度不造成任何问题。 |
| d {pattern } date {pattern } | 输出日志的打印日志,模式语法与java.text.SimpleDateFormat 兼容。 |
| L / line | 输出执行日志请求的行号。尽量避免使用,除非执行速度不造成任何问题。 |
| m / msg / message | 输出应用程序提供的信息。 |
| M / method | 输出执行日志请求的方法名。尽量避免使用,除非执行速度不造成任何问题。 |
| n | 输出平台相关的分行符“\n”或者“\r\n”。 |
| p / le / level | 输出日志级别。 |
| t / thread | 输出产生日志的线程名。 |
4,SLF4J
4.1 概述
SLF4J :Simple logging Facade for Java
意思为简单日志门面,它是把不同的日志系统的实现进行了具体的抽象化,只提供了统一的日志使用接口,使用时只需要按照其提供的接口方法进行调用即可,由于它只是一个接口,并不是一个具体的可以直接单独使用的日志框架,所以最终日志的格式、记录级别、输出方式等都要通过接口绑定的具体的日志系统来实现,这些具体的日志系统就有log4j,logback等,它们才实现了具体的日志系统的功能。
获取记录器使用如下方式:
private static final Logger logger = LoggerFactory.getLogger(Tester.class);
4.2 好处
==在不修改代码的情况下将 logback 日志系统替换成 log4j。==
代码演示:
将依赖的jar包替换为 log4j 的jar包

将logback的配置文件替换为 log4j的配置文件(log4j.properties)
log4j.rootLogger=debug,A2 log4j.appender.A2=org.apache.log4j.ConsoleAppender log4j.appender.A2.layout=org.apache.log4j.PatternLayout log4j.appender.A2.layout.ConversionPattern=%d [%t] %-5p %l - %m%n #for file log4j.appender.files.layout=org.apache.log4j.PatternLayout log4j.appender.files.layout.ConversionPattern=%d [%t] %-5p %l - %m%n log4j.appender.files=org.apache.log4j.RollingFileAppender log4j.appender.files.File=D:/example.log log4j.appender.files.MaxFileSize=1KB
运行程序,也能看到输出的日志信息。
本文介绍了如何利用logback进行日志管理,避免测试时的输出语句影响线上代码。首先讲解了单元测试的重要性,然后详细阐述了动态代理在日志记录中的应用,包括导入依赖、编写配置文件和修改代码。接着,深入讨论了logback的组件,如Logger的级别管理、Appenders的输出源和Layouts的布局模式。最后,提到了SLF4J作为日志接口的优势,允许在不修改代码的情况下切换日志系统。
5万+

被折叠的 条评论
为什么被折叠?



