Java+Selenium3框架設計準備篇12-純JAVA方法實現日誌輸出
阿新 • • 發佈:2019-01-28
前面一篇介紹如何通過開源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前面寫死了日誌名稱,每次執行都會覆蓋之前的日誌。但是本篇的方法就不會發生這樣情況,每次自動化執行都有日誌儲存,方便追溯錯誤。