单元测试系列[v1.0.0][Log4j]

Log4j是个开源项目,可以控制日志信息的输出目的地,例如控制台、文件、GUI组件等,其配置文件用来设置日志的级别,文件格式只能是XML、json、yaml或properties

配置依赖

    <!-- https://mvnrepository.com/artifact/log4j/log4j -->
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency>

Log4j配置文件properties

log4j.rootLogger=info, toConsole, toFile
log4j.appender.file.encoding=UTF-8
log4j.appender.toConsole=org.apache.log4j.ConsoleAppender
log4j.appender.toConsole.Target=System.out
log4j.appender.toConsole.layout=org.apache.log4j.PatternLayout
log4j.appender.toConsole.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] [%p] %m%n
log4j.appender.toFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.toFile.file=result/log/testlog.log
log4j.appender.toFile.append=false
log4j.appender.toFile.Threshold=info
log4j.appender.toFile.layout=org.apache.log4j.PatternLayout
log4j.appender.toFile.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] [%p] %m%n

Log4j引用

package com.davieyang.springboot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;


@SpringBootApplication
//@SpringBootApplication 代表将程序作为SpringBoot应用来运行
public class Application {
    static Logger logger = Logger.getLogger(Application.class.getName());
    public static void main(String[] args){
        PropertyConfigurator.configure("log4j.properties");
        // DOMConfigurator.configure("D:\\SpringBootDemo\\result\\log4j.xml");
        SpringApplication.run(Application.class, args);
        logger.debug("debug message");
        logger.info("info message");
        logger.error("error message");
        //调用run方法并传入当前Class作为参数来运行程序,同时传入main方法的args参数
    }
}

Log4j配置文件XML

<?xml version="1.0" encoding = "GB2312" ?>
<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true">
<appender name="fileAppender" class="org.apache.log4j.FileAppender">
<param name="Threshold" value="INFO" />
<param name="File" value="Automation.log" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p [%c{1}] %m %n" />
</layout>
</appender>
<root>
<level value="INFO"/>
<appender-ref ref="fileAppender"/>
</root>
</log4j:configuration>

二次封装

package util;
import org.apache.log4j.Logger;

import java.io.IOException;

public class LogUtil {
    private static Logger Log = Logger.getLogger(LogUtil.class.getName());
    //定义测试用例开始执行的打印方法,在日志中打印开始执行测试用例的信息
    public static void startTestCases(String testCaseName){
        Log.info("------------------    \"" + testCaseName + "\"开始执行   -----------------");
    }
    //定义测试用例执行完毕的打印方法,在日志中打印测试用例执行完毕的心
    public static void endTestCases(String testCaseName){
        Log.info("------------------    \"" + testCaseName + "\"执行结束   -----------------");
    }
    //定义打印info级别日志的方法
    public static void info(String message){
        Log.info(message);
    }
    //定义打印error级别日志的方法
    public static void error(String message, IOException e){
        Log.error(message);
    }
    //定义打印debug级别日志的方法
    public static void debug(String message){
        Log.debug(message);
    }
}

引用Log4j

package util;
import org.apache.log4j.xml.DOMConfigurator;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.support.ui.Select;
import org.testng.Assert;
import org.testng.Reporter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import static constants.Constants.MainPageandNavigation_Property;
import static constants.Constants.Path_BrowserDrivers;
import static util.LogUtil.info;

public class KeyActionsUtil {
    //声明静态的Webdriver对象,用于在此类中相关Driver的操作
    public static WebDriver driver;
    //声明存储定位表达式配置文件的ObjectMap对象
    private static GetElementUtil getElementUtil = new GetElementUtil(MainPageandNavigation_Property);
    static {
        //指定log4j配置文件为log4j.xml
        DOMConfigurator.configure("log4j.xml");
        }

    /**
     * 定义函数initBrowser
     * @param browser:字符串参数chrome/ie/xx
     * @return 并返回驱动
     */
    public static WebDriver initBrowser(String browser) {
        if(browser.equalsIgnoreCase("firefox")) {
            System.setProperty("webdriver.gecko.driver", Path_BrowserDrivers+"geckodriver.exe");
            driver = new FirefoxDriver();
            driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
            info("启动Firefox浏览器");

        }else if (browser.equalsIgnoreCase("ie")){
            System.setProperty("webdriver.ie.driver",Path_BrowserDrivers+"IEDriverServer.exe");
            driver = new InternetExplorerDriver();
            driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
            info("启动IE浏览器");
        }else {
            System.setProperty("webdriver.chrome.driver",Path_BrowserDrivers+"chromedriver.exe");
            driver = new ChromeDriver();
            driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
            info("启动Chrome浏览器");
        }
        driver.manage().window().maximize();
        info("最大化浏览器");
        return driver;
    }

    /**
     * 进入页面url
     * @param url:驱动浏览器,打开的页面url
     * @param browser:字符串参数chrome/ie/xx
     * @param timeOutInSeconds:等待时常
     */
    public static void openBrowser(String url, String browser, int timeOutInSeconds) {
        driver = initBrowser(browser);
        driver.manage().timeouts().implicitlyWait(timeOutInSeconds, TimeUnit.SECONDS);
        driver.get(url);
    }
    //定义函数navigate,用于获取浏览器要访问的链接
    public static void navigate(String url){
        driver.get(url);
        info("访问地址为"+url);
    }


    //通过从剪切板黏贴的方式,在文件上传框体的文件名输入框中输入要上传文件的路径和名称"uploadpathandname"
    public static void uploadFileName(String uploadpathandname){
        try{
            KeyBoardUtil.setAndctrlVClipboardData(uploadpathandname);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    //页面上不止一个相同功能并且xpath相同的元素,此种情况处理是将他们存储到List中,然后用索引的方式用其一
    public static void twoWay(String ElementNameInproFile){
        try {
            List<WebElement> elements = driver.findElements(getElementUtil.getLocator(ElementNameInproFile));
            elements.get(0).click();
            System.out.println("按钮被成功点击");
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    /**
     * 断言文字内容
     * @param driver:浏览器驱动
     * @param assertstring:要断言的字符串
     */
    public static void assertString(WebDriver driver,String assertstring){
        try{
            Assert.assertTrue(driver.getPageSource().contains(assertstring));
            Reporter.log("成功断言关键字“"+ assertstring +"”");
        }catch (AssertionError e){
            Reporter.log("断言失败,具体失败信息为:" + e.getMessage());
            System.out.println("断言失败");
            throw e;
        }
    }
    //断言文字不存在
    public static void assertNoString(WebDriver driver, String assertstring){
        try{
            Assert.assertFalse(driver.getPageSource().contains(assertstring)); 
            info("成功断言关键字“"+ assertstring +"” + “不存在”");
        }catch (AssertionError e){
            info("断言失败,具体信息为:" + e.getMessage());
            System.out.println("断言失败");
        }
    }
}

此处除了用到了封装好的info方法,还用到了TestNG的Reporter.log("断言失败,具体失败信息为:" + e.getMessage());

配置文件详解

Appenders配置项 描述
ConsoleAppender 控制台,输出结果到system.out或system.err
FileAppender 输出结果到指定文件,同时可以指定输出数据的格式appender=true指定追加到文件末尾
DailyRollingFileAppender 每天产生一个日志文件
RollingFileAppender 文件大小到达指定数值后生成新的文件
WriterAppender 将日志信息以流格式发送到任意指定的地方

Level值 描述
OFF 关闭所有日志
FATAL 致命错误
ERROR 严重错误
WARN 警告信息
INFO 通知类一般类状态类普通信息
DEBUG 调试信息
TRACE 追踪信息
ALL 输出所有日志

Layout配置项 描述
HTMLLayout 以HTML表格形式布局
PatternLayout 可以灵活的指定布局模式
SimpleLayout 包含日志信息的级别和信息字符串
TTCCLayout 包含日志产生的时间线程类别等信息

ConversionPatter配置项 描述
%m 输出代码中指定的信息
%p 输出优先级 DEBUG、INFO、WARN、ERROR、FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类,通常为类的全名
%t 输出产生日志事件的线程名
%n 输出一个回车换行符,Windows平台中为“rn”, UNIX平台为“n”
%d 输入日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,例如%d{yyyy MMM dd HH:mm:ss,SSS}, 输出类似于2020年8月20日3:39:00 921
%l 输出日志事件的发生位置,包含类名线程以及代码中的行数

猜你喜欢

转载自blog.csdn.net/dawei_yang000000/article/details/108114997