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

简介: 【7月更文挑战第13天】这篇文章介绍了如何在Java中创建一个简单的自定义日志系统,以替代Log4j或logback。

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

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 + "\r\n";

       System.out.print(logEntry);

       // 定义一个开关,为True就输出日志,如果你不想输出,改成False

       if (LogFlag)

           WriteLog(logEntry);

       }

}

(2)LogType.java

package framework;


/**

* @author 北京-宏哥

*

* @公众号:北京宏哥

*

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

*

* 2022年4月01日

*/


public class LogType {

   

   public LogType(){

       

   }

   

   public enum LogTypeName{

       

       //

       INFO,

       //

       ERROR,

       //

       WARNING,

       //

       DEBUG;

   }

}

(3)TestBaidu.java

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.运行代码后电脑端的浏览器的动作,如下小视频所示:

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

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

3.小结

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

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


每天学习一点,今后必成大神-

往期推荐(由于跳转参数丢失了,所有建议选中要访问的右键,在新标签页中打开链接即可访问):


Appium自动化系列,耗时80天打造的从搭建环境到实际应用精品教程测试

Python接口自动化测试教程,熬夜87天整理出这一份上万字的超全学习指南

Python+Selenium自动化系列,通宵700天从无到有搭建一个自动化测试框架

Java+Selenium自动化系列,仿照Python趁热打铁呕心沥血317天搭建价值好几K的自动化测试框架

Jmeter工具从基础->进阶->高级,费时2年多整理出这一份全网超详细的入门到精通教程

Fiddler工具从基础->进阶->高级,费时100多天吐血整理出这一份全网超详细的入门到精通教程

Pycharm工具基础使用教程

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
10月前
|
算法 IDE Java
Java 项目实战之实际代码实现与测试调试全过程详解
本文详细讲解了Java项目的实战开发流程,涵盖项目创建、代码实现(如计算器与汉诺塔问题)、单元测试(使用JUnit)及调试技巧(如断点调试与异常排查),帮助开发者掌握从编码到测试调试的完整技能,提升Java开发实战能力。
893 0
|
缓存 监控 负载均衡
如何提升 API 性能:来自 Java 和测试开发者的优化建议
本文探讨了如何优化API响应时间,提升用户体验。通过缓存(如Redis/Memcached)、减少数据负载(REST过滤字段或GraphQL精确请求)、负载均衡(Nginx/AWS等工具)、数据压缩(Gzip/Brotli)、限流节流、监控性能(Apipost/New Relic等工具)、升级基础设施、减少第三方依赖、优化数据库查询及采用异步处理等方式,可显著提高API速度。快速响应的API不仅让用户满意,还能增强应用整体性能。
|
9月前
|
监控 测试技术 API
n8n自动化测试教程 (1):环境搭建与初识n8n
n8n是一款开源、可视化的工作流自动化工具,测试工程师可通过拖拽节点快速构建API测试流程,实现测试编排、数据管理、自动化监控与告警等功能,提升测试效率与覆盖率。
|
11月前
|
安全 Java 测试技术
Java 项目实战中现代技术栈下代码实现与测试调试的完整流程
本文介绍基于Java 17和Spring技术栈的现代化项目开发实践。项目采用Gradle构建工具,实现模块化DDD分层架构,结合Spring WebFlux开发响应式API,并应用Record、Sealed Class等新特性。测试策略涵盖JUnit单元测试和Testcontainers集成测试,通过JFR和OpenTelemetry实现性能监控。部署阶段采用Docker容器化和Kubernetes编排,同时展示异步处理和反应式编程的性能优化。整套方案体现了现代Java开发的最佳实践,包括代码实现、测试调试
371 0
|
11月前
|
人工智能 Java 测试技术
Java or Python?测试开发工程师如何选择合适的编程语言?
测试工程师如何选择编程语言?Java 还是 Python?多位资深专家分享建议:Python 入门简单、开发效率高,适合新手及自动化测试;Java 生态成熟,适合大型项目和平台开发。建议结合公司技术栈、个人基础及发展方向选择。长远来看,两者兼通更佳,同时关注 Go 等新兴语言。快速学习与实践才是关键。
|
数据采集 运维 监控
数据采集监控与告警:错误重试、日志分析与自动化运维
本文探讨了数据采集技术从“简单采集”到自动化运维的演进。传统方式因反爬策略和网络波动常导致数据丢失,而引入错误重试、日志分析与自动化告警机制可显著提升系统稳定性与时效性。正方强调健全监控体系的重要性,反方则担忧复杂化带来的成本与安全风险。未来,结合AI与大数据技术,数据采集将向智能化、全自动方向发展,实现动态调整与智能识别反爬策略,降低人工干预需求。附带的Python示例展示了如何通过代理IP、重试策略及日志记录实现高效的数据采集程序。
647 7
数据采集监控与告警:错误重试、日志分析与自动化运维
|
人工智能 Java 定位技术
Java 开发玩转 MCP:从 Claude 自动化到 Spring AI Alibaba 生态整合
本文详细讲解了Java开发者如何基于Spring AI Alibaba框架玩转MCP(Model Context Protocol),涵盖基础概念、快速体验、服务发布与调用等内容。重点包括将Spring应用发布为MCP Server(支持stdio与SSE模式)、开发MCP Client调用服务,以及在Spring AI Alibaba的OpenManus中使用MCP增强工具能力。通过实际示例,如天气查询与百度地图路线规划,展示了MCP在AI应用中的强大作用。最后总结了MCP对AI开发的意义及其在Spring AI中的实现价值。
3132 9
|
Java 测试技术 C#
自动化测试之美:从Selenium到Appium
【10月更文挑战第3天】在软件开发的海洋中,自动化测试如同一艘航船,引领着质量保证的方向。本文将带你领略自动化测试的魅力,从Web端的Selenium到移动端的Appium,我们将一探究竟,看看这些工具如何帮助我们高效地进行软件测试。你将了解到,自动化测试不仅仅是技术的展示,更是一种提升开发效率和产品质量的智慧选择。让我们一起启航,探索自动化测试的世界!