This is a continuation of the article, ‘Using Log4j Part 1’ and hence, I suggest that you read part 1 before proceeding any further to get a grip on what’s happening.
Scenario
- Configure Log4j.properties file,
- Log level – DEBUG
- Loggers – rootLogger and SeleniumTestLogger
- Appender – RollingFileAppender
- Layout – PatternLayout
- Write a JUnit4 test case, ‘Log4jTest.java’,
- Open Chrome browser.
- Navigate to the demo site
- Create an instance for the Logger class
- Log “opening selenium-practice-site” to test.log
- Locate ‘Bicycle’ checkbox by name and click on it
- Log “Bicycle checkbox selected”
- Locate ‘Magazines’ radio button using cssSelector and select it
- Log “Magazines radio button clicked”
- Log “Log4jTest executed successfully”
- Verify,
- Eclipse IDE console output screen
- JUnit pane for success result
- log and test.log files and check if logs are updated as expected
Now that our plan for the day is out of our way, let’s get coding.
Step 1: Configuring the property file
Let’s first see what code goes into the Log4j’s configuration file, Log4j.properites file.
#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
Is it looking all Greek and Latin to you right now? No worries, let us look at it one line at a time.
We are going to have two loggers,
- rootLogger – deals with system generated logs and outputs them to system.log file and
- SeleniumTestLogger – deals with the logs generated as a result of the commands manually inserted in code by the user and are outputted to test.log file
Both these loggers will have a RollingFileAppender and PatterLayout.
log4j.rootLogger=debug,file
– Log level is specified as debug
and file
is used as an identifier to refer to this particular logger.
log4j.appender.file=org.apache.log4j.RollingFileAppender
– RollingFileAppender
is the type of appender used and it appends the specified file to a maximum size.
log4j.appender.file.File=E:\\Selenium\\resources\\system.log
– File
is used to specify the location of the file where the logs are to be saved, i.e. the destination.
log4j.appender.file.maxFileSize=900KB
– one file can store data up to a maximum of 900KB, after which a new file with the same name is created. The older file will be added as an index to the latest one.
log4j.appender.file.maxBackupIndex=3
– a maximum of three files will be saved as backup.
log4j.appender.file.layout=org.apache.log4j.PatternLayout
– Pattern layout
is used for formatting the generated logs.
log4j.appender.dest.layout.ConversionPattern=%d{dd/MM/yyyy HH:mm:ss} %c %m%n
– this is the conversion pattern used to generate the layout.
Sample test log generated is as follows (snippet),
16/05/2019 22:18:17 SeleniumTestLogger Log4jTest executed successfully
dd/MM/yyyy
– dateHH:mm:ss
– time of execution%c
– name passed as an argument to the Logger instance is printed%m%n
– Log message
log4j.appender.file.Append=false
– Setting this property to false will create a new file instead of updating the existing one.
log4j.logger.SeleniumTestLogger=DEBUG, dest
– Log level is debug
and dest
is the identifier used here.
log4j.appender.dest.File=E:\\Selenium\\resources\\test.log
– dest
identifier’s file location is specified with the help of ‘File
’.
Other properties are similar to what we already discussed and hence are self-explanatory.
Step 2: Writing the test case
Below is the test case, ‘Log4jTest.java
’, covering all the requirements as set out in the scenario discussed in the beginning.
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;
– Logger package is imported.
log = Logger.getLogger("SeleniumTestLogger");
– Create an instance named, log for the Logger class and pass “SeleniumTestLogger” as the argument.
log.debug("opening selenium-practice-site");
– This statement will log the message given in double quotes in DEBUG
level.
Clear comments are given for every line of code making it easy to follow. As you can see, log statements in debug level are inserted at various points of the test case.
Step 3: Verification
Eclipse IDE output screen shows,
- ‘Console’ without any errors and
- ‘JUnit’ pane with a green bar showing successful execution of the test case
- Both system.log and test.log files are updated as expected with system logs and user coded logs with timestamp as specified in the properties file layout.
Code files, log files, and related JARs are placed in the GitHub repo as always. I hope you have now understood how to take advantage of one of the popular loggers in our test cases automated with Selenium WebDriver.
Have a nice day!