log4j&Junit

  • 单元测试
  • 正则表达式
  • 日志技术
  • MySQL介绍

第一章 单元测试

第01节 基础理论
单元测试的目的:
以后做项目的过程当中,可能会存在大量的代码,很多的方法,为了快速的验证方法的正确性,我们会采用单元测试。
去测试方法是否正确无误,可以达到预期的效果。

使用步骤:
	1、导入 junit的jar包
	2、写一个测试类,定义测试方法。public 无参数,无返回值方法
	3、需要添加 @Test 注解

搜索jar包的位置:直接去 maven 公网仓库当中找寻

https://www.mvnrepository.com/

第02节 快速入门

在这里插入图片描述

基础代码

//计算器的类
public class Calculate {

    //加法运算
    public int add(int x,int y){
        return x+y;
    }

    //除法运算
    public int div(int x,int y){
        return x/y;
    }
}

测试代码

import org.junit.Assert;
import org.junit.Test;

//测试类
public class Demo01 {
    //定义一个公共的方法,这个方法,没有参数,没有返回值类型
    @Test
    public void testAdd(){
        //可以去创建对象
        Calculate calc = new Calculate();
        //调用方法
        int add = calc.add(10, 20);
        //添加断言(预言预测的意思)
        //调用断言的API
        //参数1: 预期的结果
        //参数2: 真实的结果
        Assert.assertEquals(40,add);
    }
}
第03节 两个注解

说明

@Before  他的执行是在 @Test 方法执行之前
@After   他的执行是在 @Test 方法执行之后

案例代码

//测试两个注解的使用方式
@SuppressWarnings("all")
public class Demo02 {

    //@Before他会在 @Test 方法执行之前使用
    @Before
    public void start(){
        System.out.println("start...");
    }

    @Test
    public void middle(){
        System.out.println("middle...");
    }


    //@After 他会在 @Test 方法执行之后使用
    @After
    public void end(){
        System.out.println("end...");
    }
}

说明:注意如果是 @Before@Test 方法当中出现异常了, @After 也要执行。

第04节 测试IO方法
//练习:采用单元测试,去测试IO流的API
@SuppressWarnings("all")
public class Demo03 {

    FileWriter fw = null;

    //@Before他会在 @Test 方法执行之前使用.一般在这里初始化数据
    @Before
    public void start() throws IOException {
        String path = "C:\\develop\\workspace\\java210712\\JavaSEDay23\\dir\\a.txt";
        fw = new FileWriter(path);
    }

    @Test
    public void testWriteInt() throws IOException{
        fw.write(65);
    }

    @Test
    public void testWriteStr() throws IOException{
        fw.write("hello");
    }

    //@After 他会在 @Test 方法执行之后使用
    @After
    public void end(){
        if (fw!=null){
            try {
                fw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

第二章 正则表达式

第01节 基础理论

正则表达式是什么?有什么作用呢?

我们的正则表达式,主要可以用来过滤信息,可以对数据进行合法性校验。

例如: 验证是否是正确的手机号码,验证是否是正确的邮箱地址。用户名的长度是否符合要求等。

校验手机号码

//目标:采用正则表达式去实现手机号码的校验工作
@SuppressWarnings("all")
public class Test02 {

    //手机号码是如何的?
    //11位数字组成
    //第一个字符必须是 1
    //第二个字符可以是 3、5、7、8、9
    public static void main(String[] args) {
        String number = "12812345678";
        boolean flag = checkPhoneNumber(number);
        System.out.println("flag = " + flag);
    }

    //去校验手机号码的操作
    public static boolean checkPhoneNumber(String number){
        String reg = "[1][35789]\\d{9}";
        return number.matches(reg);
    }
}
第02节 字符测试
@Test
public void test02(){
    String str="abcabcabcabc";
    //只要上面的字符串当中,有a或者b都表示找到了
    String regx = "[ab]";
    //定义正则的匹配规则
    Pattern p = Pattern.compile(regx);
    //通过规则去匹配字符串
    Matcher m = p.matcher(str);
    //循环的去查找上面的字符串,有没有找到
    if (m.find()){
        System.out.println(true);
    }else{
        System.out.println(false);
    }
}


@Test
public void test03(){
    String str="ababababc";
    //只要上面的字符串当中,除了ab之外,还存在其他的字符,则找到
    String regx = "[^ab]";
    //定义正则的匹配规则
    Pattern p = Pattern.compile(regx);
    //通过规则去匹配字符串
    Matcher m = p.matcher(str);
    //循环的去查找上面的字符串,有没有找到
    if (m.find()){
        System.out.println(true);
    }else{
        System.out.println(false);
    }
}
第03节 获取时间

文本数据:

亚朵酒店多次谋求上市未果
今年2021-8-11亚朵酒店曾披露招股书,拟在纳斯达克上市,但是在上市前夕突然“搁浅”。
此前,亚朵酒店曾两度计划登陆A股,但都未能成行。
招股书显示,亚朵酒店联合创始人及CEO王海军持股31.3%,为大股东。
截至2021-03-31,亚朵酒店网络覆盖中国131个城市,有608家酒店。
天眼查数据显示,此前,亚朵酒店完成了多轮融资,
投资方包括君联资本、德晖资本、携程(去哪儿)以及阿里巴巴前CEO陆兆禧个人。
需求:在上面文字当中,找到所有时间数据

案例代码

//如果采用正则表达式,直接使用字符串如何操作呢?
//获取到时间数据
@SuppressWarnings("all")
public class Test08 {

    public static void main(String[] args) throws IOException{
        String path = "JavaSEDay23\\dir\\a.txt";
        String str = readData(path);
        System.out.println(str);
        System.out.println("================");
        //查找到数字,进行展示
        //通过正则表达式去匹配数据
        String regx = "(\\d+)-(\\d+)-(\\d+)";
        //定义正则的规则
        Pattern p = Pattern.compile(regx);
        //匹配字符串
        Matcher m = p.matcher(str);
        //查找。循环查找
        while(m.find()){
            System.out.println(m.group(0)); //完整的数据
            System.out.println("第一段:"+m.group(1)); //第一段
            System.out.println("第二段:"+m.group(2)); //第二段
            System.out.println("第三段:"+m.group(3)); //第三段
            //System.out.println("第四段:"+m.group(4)); //第四段(报错)
            System.out.println("-----");
        }
    }

    public static String readData(String path) throws IOException {
        StringBuilder sb = new StringBuilder();
        BufferedReader br = new BufferedReader(new FileReader(path));
        String line;
        while ((line = br.readLine())!=null){
            sb.append(line).append("\r\n");
        }
        br.close();
        return sb.toString();
    }
}

第三章 日志技术

第01节 基础理论

为什么需要使用日志技术?

因为打印输出语句存在缺陷。
	(1)只能输出在控制台当中,不能输出到其他地方(文件当中、数据库里面)
	(2)当项目上线的时候,需要屏蔽掉所有的打印输出语句,不能在控制台当中展示了。
	
引出了我们的日志技术。
	解决问题1:可以根据你的需求去定义输出的位置。(控制台、文本文件、数据库里)
	解决问题2:可以去设置日志的等级,根据等级启动日志,屏蔽掉低等级的日志信息

操作步骤:

1. 需要导入三个 jar 包
	A. log4j-1.2.14.jar
	B. slf4j-api-1.7.30.jar
	C. slf4j-log4j12-1.7.25.jar
2. 在 src 文件夹下面定义 log4j.properties
3. 创建LOGGER的对象
4. 使用日志
第02节 快速入门

准备 log4j.properties 在 src 文件夹下面

### 配置根 Logger
# warn 设置最低显示级别。显示级别的大小顺序:DEBUG < INFO < WARN < ERROR < FATAL
# myself 自定义的设置方案
# myFile 自定义的设置方案
log4j.rootLogger=INFO,myself,myFile

################

### 设置自定义的日志信息:myself ###
# org.apache.log4j.ConsoleAppender 当前的日志信息,会展示在控制台当中
# log4j.appender.myself.ImmediateFlush = true 如果为true,只要有日志立即写入,日志少,使用true
# log4j.appender.myself.Target=System.out 作为打印输出使用,如果是 System.error 出现红色日志
# log4j.appender.myself.layout=org.apache.log4j.PatternLayout 设置灵活布局
# log4j.appender.myself.layout=org.apache.log4j.SimpleLayout 可以设置简单布局
# log4j.appender.myself.layout.ConversionPattern=%d %t %5p %c{1}:%L - %m%n  灵活定义输出格式

log4j.appender.myself=org.apache.log4j.ConsoleAppender
log4j.appender.myself.ImmediateFlush = true
log4j.appender.myself.Target=System.out
log4j.appender.myself.layout=org.apache.log4j.PatternLayout
log4j.appender.myself.layout.ConversionPattern=%d %t %5p %c{1}:%L - %m%n

################

### 设置自定义的日志信息:myFile
# log4j.appender.myFile=org.apache.log4j.FileAppender  当前的日志输出在文件当中。
# log4j.appender.myFile.ImmediateFlush = true 如果为true,只要有日志立即写入,日志少,使用true
# log4j.appender.myFile.File=C:/log4j-log.log 设置日志出现的文件路径
# log4j.appender.myFile.layout=org.apache.log4j.PatternLayout 设置灵活布局
# log4j.appender.myFile.layout.ConversionPattern=%d %5p %c{1}:%L - %m%n 灵活定义输出格式


log4j.appender.myFile=org.apache.log4j.FileAppender
log4j.appender.myFile.ImmediateFlush = true
log4j.appender.myFile.Append=true
log4j.appender.myFile.Threshold=info
log4j.appender.myFile.File=C:\\Users\\chenhaochuan\\Desktop\\aaa.log
log4j.appender.myFile.layout=org.apache.log4j.PatternLayout
log4j.appender.myFile.layout.ConversionPattern=%d %5p %c{1}:%L - %m%n

入门案例

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

//目标:日志技术 Log4j的快速入门
@SuppressWarnings("all")
public class Demo01 {

    //创建对象,说明:导包的过程都是 org.slf4j
    public static final Logger LOGGER = LoggerFactory.getLogger(Demo01.class);

    public static void main(String[] args) {

        try {
            //键盘录入一个字符串,将其解析成为Date对象
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入时间字符串: yyyy年MM月dd日");
            String str = sc.nextLine();

            //将时间字符串,格式化成为我们想要的Date对象
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
            Date dd = sdf.parse(str);
            //采用日志技术进行打印输出
            LOGGER.info(dd.toString());
        } catch (ParseException e) {
            //如果出现异常,则采用LOGGER进行输出
            LOGGER.error(e.toString());
        }
    }
}
第03节 日志详解

log4j主要有三个重要的组件:

1、Loggers(记录器):日志类别和级别;
2、Appenders(输出源):日志要输出的地方;
3、Layout(布局):日志以何种形式输出。

1、Loggers

Loggers组件在此系统中被分为五个级别:DEBUG、INFO、WARN、ERROR和FATAL。

这五个级别是有顺序的,DEBUG < INFO < WARN < ERROR < FATAL,分别用来指定这条日志信息的重要程度

Log4j有一个规则:只输出级别不低于设定级别的日志信息,

假设Loggers级别设定为INFO,则INFO、WARN、ERROR和FATAL级别的日志信息都会输出,

而级别比INFO低的DEBUG则不会输出。

2、Appenders

禁用和使用日志请求只是Log4j的基本功能,Log4j日志系统还提供许多强大的功能,

比如允许把日志输出到不同的地方,如控制台(Console)、文件(Files)等,

可以根据天数或者文件大小产生新的文件,可以以流的形式发送到其它地方等等。

常使用的类如下:

- org.apache.log4j.ConsoleAppender(控制台)
- org.apache.log4j.FileAppender(文件)
- org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
- org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
- org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

3、Layouts

Log4j可以在Appenders的后面附加Layouts来完成这个功能。
Layouts提供四种日志输出样式,

如根据HTML样式、自由指定样式、包含日志级别与信息的样式和包含日志时间、线程、类别等信息的样式。

常使用的类如下:

- org.apache.log4j.HTMLLayout(以HTML表格形式布局)
- org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
- org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
- org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等信息)

PatternLayout选项

ConversionPattern=%m%n:设定以怎样的格式显示消息。
格式化符号说明:

%p:输出日志信息的优先级,即DEBUG,INFO,WARN,ERROR,FATAL。
%d:输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,
如:%d{yyyy/MM/dd HH:mm:ss,SSS}。
%r:输出自应用程序启动到输出该log信息耗费的毫秒数。
%t:输出产生该日志事件的线程名。
%l:输出日志事件的发生位置,相当于%c.%M(%F:%L)的组合,包括类全名、方法、文件名以及在代码中的行数。例如:test.TestLog4j.main(TestLog4j.java:10)。
%c:输出日志信息所属的类目,通常就是所在类的全名。
%M:输出产生日志信息的方法名。
%F:输出日志消息产生时所在的文件名称。
%L::输出代码中的行号。
%m::输出代码中指定的具体日志信息。
%n:输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"。
%x:输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
%%:输出一个"%"字符。

另外,还可以在%与格式字符之间加上修饰符来控制其最小长度、最大长度、和文本的对齐方式。如:
1)c:指定输出category的名称,最小的长度是20,如果category的名称长度小于20的话,默认的情况下右对齐。
2)%-20c:"-"号表示左对齐。
3)%.30c:指定输出category的名称,最大的长度是30,如果category的名称长度大于30的话,就会将左边多出的字符截掉,但小于30的话也不会补空格。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值