《手把手教你》系列基础篇(九十五)-java+ selenium自动化测试-框架之设计篇-java实现自定义日志输出(详解教程)

2022-04-27 19:00:09 浏览数 (1)

1.简介

前面宏哥一连几篇介绍如何通过开源jar包Log4j.jar、log4j2.jar和logback实现日志文件输出,Log4j和logback确实很强大,能生成三种日志文件,一种是保存到磁盘的日志文件,一种是控制台输出的日志,还有一种是HTML格式的日志文件。有时候,我们不一定都需要这些文件,在我们自动化测试框架里,我们只需要把日志文件保存到磁盘文件中,所以,这里介绍一种不用Log4j或者logback来实现日志文件写入和保存。

写着一篇文章的主要目的是后边测试框架设计就用宏哥这种自定义的来获取日志,前边那么多日志输出各有优势,但是那些知识细节需要开发了解,作为测试用宏哥这个自定义的就够了,当然了如果有的小伙伴或者童鞋们想用也是可以的。

2.项目实战

2.1准备环境

为了方便演示宏哥新配置一个测试环境,具体步骤如下:

1.新建一个java project命名为SeleniumFramework,如下图所示:

2.在根目录下新建三个包:framework、pageObject和testSuite,如下图所示:

3.新建一个日志文件夹Log用来存储日志文件,如下图所示:

4.新建一个Tools文件夹,里边存储浏览器驱动器,如下图所示:

5.把selenium需要的jar包添加到java project中,如下图所示:

2.2代码设计

1.在framework包中新建Logger和LogType两个类,如下图所示:

(1)Logger.java

(2)LogType.java  定义枚举类型,一般主要用到INFO和ERROR两种日志类型。

2.在testSuite包中新建测试类TestBaidu,调用Logger中静态方法输出日志,检查日志文件保存路径和内容。如下图所示:

2.3参考代码

(1)Logger.java

代码语言:javascript复制
package framework;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author 北京-宏哥
 * 
 * @公众号:北京宏哥
 * 
 * 《手把手教你》系列基础篇(九十五)-java  selenium自动化测试-框架设计基础-java实现自定义日志输出(详解教程) 
 *
 * 2022年4月01日
 */

public class Logger {
    
    public static String OutputFileName = getDateTimeByFormat(new Date(), "yyyyMMdd_HHmmss");
    private static OutputStreamWriter outputStreamWriter;
    private static String logFileName;
    public static boolean LogFlag = true;
 
    public Logger() {
 
    }
 
    private static void WriteLog(String logEntry) {
 
        try {
                
                    // 定义日志文件保存路径和日志文件名称
                logFileName = ".\Log"   "\"   OutputFileName   ".log";
                if (outputStreamWriter == null) {
                    File logFile = new File(logFileName);
                
                if (!logFile.exists())
                        logFile.createNewFile();
                //利用OutputStreamWriter往日志文件写内容,字符编码是unicode
                outputStreamWriter = new OutputStreamWriter(new FileOutputStream(logFileName), "utf-8");
            }
            outputStreamWriter.write(logEntry, 0, logEntry.length());
            outputStreamWriter.flush();
 
        } catch (Exception e) {
            System.out.println(LogType.LogTypeName.ERROR.toString()   ": Failed to write the file "   logFileName);
            e.printStackTrace();
 
        }
 
    }
 
    //获取当前系统时间,得到格式化时间字符串
    private static String getDateTimeByFormat(Date date, String format) {
 
        SimpleDateFormat df = new SimpleDateFormat(format);
 
        return df.format(date);
 
    }
    
    public static void Output(LogType.LogTypeName logTypeName, String logMessage) {
 
        Date date = new Date();
        String logTime = getDateTimeByFormat(date, "yyyy-MM-dd HH:mm:ss.SSS");
        String logEntry = logTime   " "   logTypeName.name()   ": "   logMessage   "rn";
        System.out.print(logEntry);
        // 定义一个开关,为True就输出日志,如果你不想输出,改成False
        if (LogFlag)
            WriteLog(logEntry);
        }
}

(2)LogType.java

代码语言:javascript复制
package framework;

/**
 * @author 北京-宏哥
 * 
 * @公众号:北京宏哥
 * 
 * 《手把手教你》系列基础篇(九十五)-java  selenium自动化测试-框架设计基础-java实现自定义日志输出(详解教程) 
 *
 * 2022年4月01日
 */

public class LogType {
    
    public LogType(){
        
    }
    
    public enum LogTypeName{
        
        //
        INFO,
        //
        ERROR,
        //
        WARNING,
        //
        DEBUG;
    }
}

(3)TestBaidu.java

代码语言:javascript复制
package testSuite;

import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
 
import framework.LogType;
import framework.Logger;

/**
 * @author 北京-宏哥
 * 
 * @公众号:北京宏哥
 * 
 * 《手把手教你》系列基础篇(九十五)-java  selenium自动化测试-框架设计基础-java实现自定义日志输出(详解教程) 
 *
 * 2022年4月01日
 */

public class TestBaidu {
    
    public static void main(String[] args) {
        
         System.setProperty("webdriver.chrome.driver", ".\Tools\chromedriver.exe");  
         WebDriver driver = new ChromeDriver(); 
         Logger.Output(LogType.LogTypeName.INFO, "启动chrome浏览器");
        
         driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
         Logger.Output(LogType.LogTypeName.INFO, "设置隐式时间10秒");
         
         driver.get("https://www.baidu.com");
         Logger.Output(LogType.LogTypeName.INFO, "打开百度首页");
         
         driver.manage().window().maximize();
         Logger.Output(LogType.LogTypeName.INFO, "最大化浏览器");
         
         driver.findElement(By.id("kw")).sendKeys("Selenium");
         Logger.Output(LogType.LogTypeName.INFO, "搜索输入框输入关键字selenium");
         
         driver.close();
         Logger.Output(LogType.LogTypeName.INFO, "退出浏览器");
    }
 
}
2.4运行代码

1.运行代码,右键Run AS->Java Appliance,控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作,如下小视频所示:

https://gorilla.cdnja.co/v/6k/6KXXy.mp4?token=qJYmPhBbbPKBS8iNMOEKIQ&expires=1651057726

3.运行完后,右键刷新Log文件夹,可以看到日志文件。如下图所示:

4.打开日志文件,如下图所示:

3.小结

1. Lo4j有一个小问题就是,不太方便设置日志文件名称是当前系统的时间,所以,log4j前面写死了日志名称,每次执行都会覆盖之前的日志。但是本篇的方法就不会发生这样情况,每次自动化运行都有日志保存,方便追溯定位错误。

2.出现日志文件乱码的情况,你需要在菜单导航栏上Window-->Preferences 打开"首选项"对话框,左侧导航树,导航到 General-->Workspace,把编码从GBK改成utf-8.

0 人点赞