43. 使用 Log4j

现在让我来解释一下使用 Apache Log4j 记录 Selenium 的过程!

为什么我们需要日志?

作为自动化测试人员,我们负责故障排除,调试等。 记录使整个过程变得非常容易! 它带给我们这些神奇的“眼睛”,让我们看到许多事物,例如,

  1. 测试用例实际上在做什么
  2. 应用如何响应我们的代码
  3. 使用自定义错误消息正确记录时,可以将异常,问题,失败,错误等追溯到其根源
  4. 可以作为以后成功执行的证明,因为它们可以轻松地保存到数据库或带有时间戳的外部文件中
  5. 所有这些日志都可以在无需人工干预的情况下生成

现在我们了解了将日志语句插入测试用例的重要性,让我们解读一下 Log4j 的全部含义。

什么是 Log4j

  1. 1996 年开发的基于 Java 的流行日志记录包
  2. 根据 Apache Software License 分发,因此它是开源的
  3. 具有各种级别的日志记录 – 允许我们控制日志输出的数量
  4. 一切都可以通过编辑简单的配置文件来控制-无需理会应用二进制文件

Log4j 日志级别

以下是 Log4j 附带的内置日志级别。

  1. OFF – 关闭登录
  2. FATAL – 严重错误导致应用终止
  3. ERROR – 意外情况和运行时错误
  4. WARN – 警告消息
  5. INFO – 提供有关一些有趣的运行时事件的信息
  6. DEBUG – 最常用的日志级别,提供有关系统流程的详细信息
  7. TRACE - 信息的详细程度最高

Log4j 组件

主要包括三个部分:

  1. 记录器:应用中用唯一名称标识的记录器可以有多个。 可以将每个记录器配置为特定级别-调试,信息,错误等。要求我们创建记录器类的实例并指定日志级别。
  2. 附加器:创建记录器实例后,我们必须知道在哪里查看生成的日志。 这就是附加器出现的地方。 它们指定消息要记录到的目的地或输出,例如文件,标准输出或另一台计算机等。一些可用的附加器是FileAppenderRollingFileAppenderConsoleAppenderSocketAppender等。 可以将同一信息记录到多个输出中,即一个记录器可以有多个附加器。
  3. 布局:既然我们知道如何生成日志并将其保存到特定的目的地,那么我们可能需要将它们呈现为不同的格式。 每个附加器必须映射到特定布局。 一些常用的布局是:
    1. PatternLayout – 使用模式字符串的一次一行日志文件
    2. HTMLLayout – 以 HTML 格式呈现日志
    3. XMLLayout – 生成 XML 格式

Log4j 配置

可以在 XML,JSON,YAML 或属性文件格式的配置文件中配置这三个组件。 在本文中,我们将看到如何使用属性文件格式定义所有组件和记录消息。

环境设定

在 Eclipse IDE 中创建一个 Java 项目,在本例中为“Selenium”。

步骤 1:下载 Log4j

第一步(也是第一步)是从此处下载 Apache Log4j JAR。 单击镜像的 zip 文件格式将导航到一个新页面,其中包含实际的镜像站点详细信息,可从该位置将 JAR 下载到本地计算机。

download Apache Log4j

将下载文件夹的内容提取到特定位置。

步骤 2:配置 Java 构建路径

Log4j JAR 作为外部库添加到项目的构建路径。让我们导航到本地计算机中提取下载的 JAR 的路径,并将其添加为外部 JAR。

JAR selection window]

之前,我们已经多次看到此过程,因此,我不再重复(请参阅文章的步骤 3)。

步骤 3:建立必要的档案

我们将创建 3 个文件。Log4j.properties

  • 右键单击“src文件夹->新建->其他->常规->文件->下一页”
  • 提供“文件名”作为“Log4j.properties”,然后点击“完成”

结果看起来像这样:

Log4j.properties file creation

我现在已经忽略了三个额外的包,因为我出于编码目的创建了它们。

日志文件

  • 右键单击“src文件夹->新建->其他->常规->文件夹->下一页”
  • 提供“文件夹名称”作为“resource
  • 右键点击“resource”文件夹并创建两个文件
  • 将这些文件命名为“system.log”和“test.log
  1. system.log – 将具有系统生成的所有日志
  2. test.log – 将包含由于用户提供的手动命令而生成的所有日志

Log files created

现在,所有环境都已准备就绪,我们可以使用 Log4j 进行一些实验并生成日志。 与往常一样,将 JAR 放置在 GitHub 仓库中。

  1. 配置Log4j.properties文件,
    • 日志级别 – 调试
    • 记录器 – rootLoggerSeleniumTestLogger
    • 附加器 – RollingFileAppender
    • 布局 – PatternLayout
  2. 编写一个 JUnit4 测试用例“Log4jTest.java”,
    • 开启 Chrome 浏览器。
    • 导航到演示站点
    • Logger类创建一个实例
    • 将“打开 Selenium 实践网站”登录到test.log
    • 按名称找到“自行车”复选框,然后单击它
    • 记录“选择了自行车复选框”
    • 使用cssSelector找到“杂志”单选按钮并选择它
    • 记录“单击了杂志单选按钮”
    • 日志“Log4jTest 成功执行”
  3. 校验,
    • Eclipse IDE 控制台输出屏幕
    • JUnit 窗格可显示成功结果
    • 日志和test.log文件,并检查日志是否按预期更新

现在,我们今天的计划已成问题,让我们开始编写代码。

步骤 1:配置属性文件

首先,让我们看看 Log4j 的配置文件Log4j.properites文件中包含什么代码。

#Root logger options
log4j.rootLogger=debug,file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=E:\\Selenium\\resources\\system.log
log4j.appender.file.maxFileSize=900KB
log4j.appender.file.maxBackupIndex=3
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L \u2013 %m%n
log4j.appender.file.Append=false
#Application Logs
log4j.logger.SeleniumTestLogger=DEBUG, dest
log4j.appender.dest.File=E:\\Selenium\\resources\\test.log
log4j.appender.dest=org.apache.log4j.RollingFileAppender
log4j.appender.dest.maxFileSize=500KB
log4j.appender.dest.maxBackupIndex=6
log4j.appender.dest.layout=org.apache.log4j.PatternLayout
log4j.appender.dest.layout.ConversionPattern=%d{dd/MM/yyyy HH:mm:ss} %c %m%n
log4j.appender.dest.Append=false

您现在正在寻找所有希腊语和拉丁语吗? 不用担心,让我们一次看看它。我们将有两个记录器:

  1. rootLogger – 处理系统生成的日志,并将它们输出到system.log文件,然后
  2. SeleniumTestLogger – 处理由于用户手动插入代码而生成的日志,并输出到test.log文件

这两个记录器都将具有RollingFileAppenderPatterLayout

  • log4j.rootLogger=debug,file – 日志级别指定为debugfile用作引用此特定记录器的标识符。
  • log4j.appender.file=org.apache.log4j.RollingFileAppenderRollingFileAppender是使用的附加程序类型,它将指定的文件附加到最大大小。
  • log4j.appender.file.File=E:\\Selenium\\resources\\system.logFile用于指定要保存日志的文件的位置,即目的地。
  • log4j.appender.file.maxFileSize=900KB – 一个文件最多可以存储 900KB 的数据,然后创建一个具有相同名称的新文件。 较旧的文件将作为索引添加到最新的文件。
  • log4j.appender.file.maxBackupIndex=3 – 最多将保存三个文件作为备份。
  • log4j.appender.file.layout=org.apache.log4j.PatternLayoutPattern layout用于格式化生成的日志。
  • log4j.appender.dest.layout.ConversionPattern=%d{dd/MM/yyyy HH:mm:ss} %c %m%n – 这是用于生成布局的转换模式。

生成的示例测试日志如下(片段): 16/05/2019 22:18:17 SeleniumTestLogger Log4jTest executed successfully

  • dd/MM/yyyy – 日期
  • HH:mm:ss – 执行时间
  • %c – 打印作为参数传递给Logger实例的名称
  • %m%n – 日志消息
  • log4j.appender.file.Append=false – 将此属性设置为false将创建一个新文件,而不是更新现有文件。
  • log4j.logger.SeleniumTestLogger=DEBUG, dest – 日志级别为debugdest是此处使用的标识符。
  • log4j.appender.dest.File=E:\\Selenium\\resources\\test.log – 借助File来指定dest标识符的文件位置。

其他属性与我们已经讨论过的相似,因此不言自明。

步骤 2:编写测试用例

下面是测试用例“Log4jTest.java”,涵盖了开头讨论的场景中列出的所有要求。

package com.blog.junitTests;
import java.util.concurrent.TimeUnit;
import org.apache.log4j.Logger;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
public class Log4jTest {
    // Declaring variables
    private WebDriver driver;
    private String baseUrl;
    private Logger log;
    @Before
    public void setUp() throws Exception {
        // System property set up for Chrome driver
        System.setProperty("webdriver.chrome.driver", "browser-drivers\\chromedriver.exe");
        // Create a new instance for the class ChromeDriver
        // that implements WebDriver interface
        driver = new ChromeDriver();
        // Implicit wait for 5 seconds
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
        // Assign the URL to be invoked to a String variable
        baseUrl = "https://chandanachaitanya.github.io/selenium-practice-site/";
        // Create a logger instance and pass Class name which is Log4jTest in this case
        log = Logger.getLogger("SeleniumTestLogger");
    }
    @Test
    public void testElementsWithLogging() throws Exception {
        // Open baseUrl in Chrome browser window
        driver.get(baseUrl);
        log.debug("opening selenium-practice-site");
        // Locate 'Bicycle' checkbox using name
        WebElement bicycle = driver.findElement(By.name("vehicle1"));
        // Click the checkbox
        bicycle.click();
        log.debug("Bicycle checkbox selected");
        // Locate 'Magazines' radio button using cssSelector
        WebElement magazinesRadioBtn = driver.findElement(By
            .cssSelector("input[value='Magazines']"));
        // Click the radio button
        magazinesRadioBtn.click();
        log.debug("Magazines radio button clicked");
        log.debug("Log4jTest executed successfully");
    } // End of @Test
    @After
    public void tearDown() throws Exception {
        // Close the Firefox browser
        //driver.close();
        System.out.println("Closing the driver");
    }
}
  • import org.apache.log4j.Logger; – 记录包已导入。
  • log = Logger.getLogger("SeleniumTestLogger"); – 创建一个名为的实例,记录Logger类并传递“SeleniumTestLogger”作为参数。
  • log.debug("opening selenium-practice-site"); – 此语句将记录在DEBUG级别中用双引号引起的消息。

每行代码都给出了清晰的注释,使其易于遵循。 如您所见,调试级别的日志语句插入到测试用例的各个位置。

步骤 3:验证

Eclipse IDE 输出屏幕显示:

  • “控制台”没有任何错误,并且
  • “JUnit”窗格,带有绿色栏,显示成功执行测试用例

JUnit Output]

system.log 和 test.log 文件都将按预期方式通过属性文件布局中指定的系统日志和带有时间戳的用户编码日志进行更新。

Generated Test.log file

代码文件,日志文件和相关的 JAR 一如既往地放置在 GitHub 仓库中。 我希望您现在已经了解了如何在 Selenium WebDriver 自动化的测试用例中利用流行的记录器之一。

下一节:Google 为其 Chrome 浏览器(从 59 版开始)引入了陷式选项! Firefox 紧随其后。 它也可以在陷式模式下运行!! 让我们在没有 Firefox 的情况下在 Firefox 中执行一些自动化的 Selenium 测试! 😉换句话说,测试在后台运行,并且没有显示(即,浏览器 UI 不显示给用户)。 该代码还将提供给 Chrome 浏览器。