1. 程式人生 > >Java+Selenium3框架設計準備篇12-純JAVA方法實現日誌輸出

Java+Selenium3框架設計準備篇12-純JAVA方法實現日誌輸出

       前面一篇介紹如何通過開源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前面寫死了日誌名稱,每次執行都會覆蓋之前的日誌。但是本篇的方法就不會發生這樣情況,每次自動化執行都有日誌儲存,方便追溯錯誤。