Java+Selenium3框架设计准备篇12-纯JAVA方法实现日志输出
2017-07-25 23:14
741 查看
前面一篇介绍如何通过开源jar包Log4j.jar实现日志文件输出,Log4j确实很强大,能生成三种日志文件,一种是保存到磁盘的日志文件,一种是控制台输出的日志,还有一种是HTML格式的日志文件。有时候,我们不一定都需要这些文件,在我们自动化测试框架里,我们只需要把日志文件保存到磁盘文件中,所以,这里介绍一种不用Log4j来实现日志文件写入和保存。
通过分析前面一篇生成的log,核心其实就是不断往xx.log文件里输入一行一行的String,对不对。只是我们可以控制输出的格式和效果。每一行log的由三部分组成“当前系统日期和时间”+“日志类型”+“动作描述”。Java中有关向文件输入的方法有outputStreamWriter,在Java IO包中,它是Writer的一个子类,将输出的字符流变成字节流。
文件结构
先看看Logger.java的内容代码
package framework;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
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 + "\r\n";
System.out.print(logEntry);
// 定义一个开关,为True就输出日志,如果你不想输出,改成False
if (LogFlag)
WriteLog(logEntry);
}
}
还有LogType.java的代码
package framework;
public class LogType {
public LogType(){
}
public enum LogTypeName{
//
INFO,
//
ERROR,
//
WARNING,
//
DEBUG;
}
}
定义枚举类型,一般主要用到INFO和ERROR两种日志类型
我们新建一个测试类,调用Logger中静态方法输出日志,检查日志文件保存路径和内容。
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;
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.findElement(By.id("kw")).sendKeys("Selenium");
Logger.Output(LogType.LogTypeName.INFO, "搜索输入框输入关键字selenium");
}
}
查看日志文件
2017-07-25 22:50:40.491 INFO: 启动chrome浏览器
2017-07-25 22:50:40.512 INFO: 设置隐式时间10秒
2017-07-25 22:50:41.899 INFO: 打开百度首页
2017-07-25 22:50:42.295 INFO: 搜索输入框输入关键字selenium
这里需要注意,我的eclipse设置编码是utf-8,如果你设置是GBK,可能会出现日志文件乱码的情况,你需要在菜单导航栏上Window-->Preferences 打开"首选项"对话框,左侧导航树,导航到 General-->Workspace,把编码从GBK改成utf-8.
在我们接下来的自动化测试框架设计中,我们就采用这种日志输出方法,如果你想丰富的日志输出,你就用Log4j,Lo4j有一个小问题就是,不太方便设置日志文件名称是当前系统的时间,所以,log4j前面写死了日志名称,每次执行都会覆盖之前的日志。但是本篇的方法就不会发生这样情况,每次自动化运行都有日志保存,方便追溯错误。
通过分析前面一篇生成的log,核心其实就是不断往xx.log文件里输入一行一行的String,对不对。只是我们可以控制输出的格式和效果。每一行log的由三部分组成“当前系统日期和时间”+“日志类型”+“动作描述”。Java中有关向文件输入的方法有outputStreamWriter,在Java IO包中,它是Writer的一个子类,将输出的字符流变成字节流。
文件结构
先看看Logger.java的内容代码
package framework;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
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 + "\r\n";
System.out.print(logEntry);
// 定义一个开关,为True就输出日志,如果你不想输出,改成False
if (LogFlag)
WriteLog(logEntry);
}
}
还有LogType.java的代码
package framework;
public class LogType {
public LogType(){
}
public enum LogTypeName{
//
INFO,
//
ERROR,
//
WARNING,
//
DEBUG;
}
}
定义枚举类型,一般主要用到INFO和ERROR两种日志类型
我们新建一个测试类,调用Logger中静态方法输出日志,检查日志文件保存路径和内容。
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;
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.findElement(By.id("kw")).sendKeys("Selenium");
Logger.Output(LogType.LogTypeName.INFO, "搜索输入框输入关键字selenium");
}
}
查看日志文件
2017-07-25 22:50:40.491 INFO: 启动chrome浏览器
2017-07-25 22:50:40.512 INFO: 设置隐式时间10秒
2017-07-25 22:50:41.899 INFO: 打开百度首页
2017-07-25 22:50:42.295 INFO: 搜索输入框输入关键字selenium
这里需要注意,我的eclipse设置编码是utf-8,如果你设置是GBK,可能会出现日志文件乱码的情况,你需要在菜单导航栏上Window-->Preferences 打开"首选项"对话框,左侧导航树,导航到 General-->Workspace,把编码从GBK改成utf-8.
在我们接下来的自动化测试框架设计中,我们就采用这种日志输出方法,如果你想丰富的日志输出,你就用Log4j,Lo4j有一个小问题就是,不太方便设置日志文件名称是当前系统的时间,所以,log4j前面写死了日志名称,每次执行都会覆盖之前的日志。但是本篇的方法就不会发生这样情况,每次自动化运行都有日志保存,方便追溯错误。
相关文章推荐
- Java+Selenium3框架设计准备篇11-用Log4j实现日志输出
- Java+Selenium3框架设计准备篇5-TestNG实现日志输出
- Java+Selenium3框架设计准备篇6-TestNG执行测试方法依赖关系
- Java日志系统框架的设计与实现
- Java+Selenium3框架设计篇5-如何实现邮件发送测试报告
- 一种Java日志系统框架的设计与实现
- Java+Selenium3框架设计准备篇2-TestNG通过变量实现启动不同浏览器测试
- Java+Selenium3框架设计准备篇9-用PageFactory实现POM
- Selenium框架所有用例打开一次浏览器方法实现(Java)
- 一种Java日志系统框架的设计与实现(转)
- 设计模式之—简单工厂方法(StaticFactory )-Java实现
- 马士兵 Java 第5章(1) 分别使用面向对象和面向结构(数组)的设计方法来实现“数三退一”
- java平台统一异常框架的设计与实现
- Log4J输出日志到WEB工程目录的实现方法
- java中,父类是抽象类不能通过工厂输出时,如何通过其他类实现输出的示例代码(工厂方法种类(1))
- Tomcat7在Idea12的控制台中输出日志时中文乱码的解决方法。
- 两步实现Log4j记录java控制台输出的系统所有异常信息和自定义记录日志---->非常实用,强烈推荐阅读
- JAVA设计模式——单例(Singleton)模式 多种实现方法
- Log4J输出日志到WEB工程目录的实现方法
- 基于IOC的Java事件框架的设计与实现 Ⅱ