在测试框架中使用Log4J 2

时间:2022-11-01 19:36:01

之前的测试框架:http://www.cnblogs.com/tobecrazy/p/4553444.html

配合Jenkins可持续集成:http://www.cnblogs.com/tobecrazy/p/4529399.html

这次demo的代码已经放到github:https://github.com/tobecrazy/Demo

打log是一个测试框架必备的功能之一,trace测试执行的内容,使测试分析更容易和有规律可循。进而进一步处理测试log,实现自动分析测试结果。

现在java项目写日志一般使用Log4j 2

log4j 2是一个开源的记录log的框架,比log4j 效率更高

更多内容:http://logging.apache.org/log4j/2.x/manual/index.html

首先下载相应的jar包,放到工程:

在测试框架中使用Log4J 2

接下来创建Log类,使用

clazz.getCanonicalName() 获取类名字,为将来case执行获取case名和page名和action名
package com.log;


import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Log {
private final Class<?> clazz;
private Logger logger;

/**
*
*
@param clazz
*/
Log(Class
<?> clazz) {
this.clazz = clazz;
this.logger = LogManager.getLogger(this.clazz);
}

/**
*
@author Young
*
@param message
*
*/
public void info(String message) {
logger.info(clazz.getCanonicalName()
+ ": " + message);
}

/**
*
@author Young
*
@param message
*/
public void debug(String message) {
logger.debug(clazz.getCanonicalName()
+ ": " + message);
}

/**
*
@author Young
*
@param message
*/
public void error(String message) {
logger.error(clazz.getCanonicalName()
+ ": " + message);
}

/**
*
@author Young
*
@param message
*/
public void trace(String message) {
logger.trace(clazz.getCanonicalName()
+ ": " + message);
}

/**
*
@author Young
*
@param message
*/
public void warn(String message) {
logger.warn(clazz.getCanonicalName()
+ ": " + message);
}

/**
*
@author Young
*
@param message
*/
public void fatal(String message) {
logger.fatal(clazz.getCanonicalName()
+ ": " + message);
}
}

 

接下来就可以直接调用这个类:

package com.log;

public class test {

public static void main(String[] args) {
// TODO Auto-generated method stub
Log log=new Log(test.class);
log.info("this is my test");
log.debug("this is a debug");
log.error("this is an error ");
log.fatal("this is a fatal");
log.trace("this is a trace");
}

}

  然后, run as application 吧

结果如下: holy shit,damn it 居然报错

ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
23:52:47.679 [main] ERROR com.log.test - com.log.test: this is an error
23:52:47.680 [main] FATAL com.log.test - com.log.test: this is a fatal

原来是缺少config

于是乎准备一份log4j2.xml文件,放在该package下:

在测试框架中使用Log4J 2在测试框架中使用Log4J 2
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<File name="log" fileName="logs/test.log" append="false">
<PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>
</Appenders>
<Loggers>
<Logger name="com.dbyl.libarary.utils.Log" level="all">
<AppenderRef ref="Console"/>
<AppenderRef ref="log"/>
</Logger>
<Root level="trace">
<AppenderRef ref="Console"/>
<AppenderRef ref="log"/>
</Root>
</Loggers>
</Configuration>
View Code

但是依然不行,没法加参数

加上:

File config=new File("C:/Users/Young/workspace/Log4j/src/com/log/log4j2.xml");  
ConfigurationSource source = new ConfigurationSource(new FileInputStream(config),config);
Configurator.initialize(null, source);

  妥妥的 , 运行结果如下:

2015-06-07 00:06:31 [main] INFO com.log.test - com.log.test: this is my test
2015-06-07 00:06:31 [main] DEBUG com.log.test - com.log.test: this is a debug
2015-06-07 00:06:31 [main] ERROR com.log.test - com.log.test: this is an error
2015-06-07 00:06:31 [main] FATAL com.log.test - com.log.test: this is a fatal
2015-06-07 00:06:31 [main] TRACE com.log.test - com.log.test: this is a trace

并且logs目录下生城相应的log文件

当然,这并不完美,log4j可以放在src目录下,这要就不需要指定位置

接下来把这个log类放在测试框架里:

在测试框架中使用Log4J 2

在basePage加入相应的代码,如下:

package com.dbyl.libarary.utils;

import java.io.IOException;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;

public class BasePage {

protected WebDriver driver;
protected String[][] locatorMap;
protected Log log= new Log(this.getClass());

protected BasePage(WebDriver driver) throws IOException {
this.driver = driver;
locatorMap = ReadExcelUtil.getLocatorMap();
}

protected void type(Locator locator, String values) throws Exception {
WebElement e = findElement(driver, locator);
log.info("type value is: "+ values);
e.sendKeys(values);
}

protected void click(Locator locator) throws Exception {
WebElement e = findElement(driver, locator);
log.info("click button");
e.click();
}

protected void clickAndHold(Locator locator) throws IOException {
WebElement e = findElement(driver, locator);
Actions actions = new Actions(driver);
actions.clickAndHold(e).perform();
}

public WebDriver getDriver() {
return driver;
}

public void setDriver(WebDriver driver) {
this.driver = driver;
}

public WebElement getElement(Locator locator) throws IOException {
return getElement(this.getDriver(), locator);
}

/**
* get by parameter
*
* @author Young
* @param driver
* @param locator
* @return
* @throws IOException
*/
public WebElement getElement(WebDriver driver, Locator locator)
throws IOException {
locator = getLocator(locator.getElement());
WebElement e;
switch (locator.getBy()) {
case xpath:
log.debug("find element By xpath");
e = driver.findElement(By.xpath(locator.getElement()));
break;
case id:
log.debug("find element By id");
e = driver.findElement(By.id(locator.getElement()));
break;
case name:
log.debug("find element By name");
e = driver.findElement(By.name(locator.getElement()));
break;
case cssSelector:
log.debug("find element By cssSelector");
e = driver.findElement(By.cssSelector(locator.getElement()));
break;
case className:
log.debug("find element By className");
e = driver.findElement(By.className(locator.getElement()));
break;
case tagName:
log.debug("find element By tagName");
e = driver.findElement(By.tagName(locator.getElement()));
break;
case linkText:
log.debug("find element By linkText");
e = driver.findElement(By.linkText(locator.getElement()));
break;
case partialLinkText:
log.debug("find element By partialLinkText");
e = driver.findElement(By.partialLinkText(locator.getElement()));
break;
default:
e = driver.findElement(By.id(locator.getElement()));
}
return e;
}

public boolean isElementPresent(WebDriver driver, Locator myLocator,
int timeOut) throws IOException {
final Locator locator = getLocator(myLocator.getElement());
boolean isPresent = false;
WebDriverWait wait = new WebDriverWait(driver, 60);
isPresent = wait.until(new ExpectedCondition<WebElement>() {
@Override
public WebElement apply(WebDriver d) {
return findElement(d, locator);
}
}).isDisplayed();
return isPresent;
}

/**
* This Method for check isPresent Locator
*
* @param locator
* @param timeOut
* @return
* @throws IOException
*/
public boolean isElementPresent(Locator locator, int timeOut)
throws IOException {
return isElementPresent(driver,locator, timeOut);
}

/**
*
* @param driver
* @param locator
* @return
*/
public WebElement findElement(WebDriver driver, final Locator locator) {
WebElement element = (new WebDriverWait(driver, locator.getWaitSec()))
.until(new ExpectedCondition<WebElement>() {

@Override
public WebElement apply(WebDriver driver) {
try {
return getElement(driver, locator);
} catch (IOException e) {
// TODO Auto-generated catch block
log.error("can't find element "+locator.getElement());
return null;
}

}

});
return element;

}

public Locator getLocator(String locatorName) throws IOException {

Locator locator;
for (int i = 0; i < locatorMap.length; i++) {
if (locatorMap[i][0].endsWith(locatorName)) {
return locator = new Locator(locatorMap[i][1]);
}
}

return locator = new Locator(locatorName);

}
}

  在UITest类也加入相应的代码:

在测试框架中使用Log4J 2在测试框架中使用Log4J 2
/**
*
*/
package com.dbyl.libarary.utils;

import org.openqa.selenium.WebDriver;

/**
*
@author Young
*
*/
public class UITest {
WebDriver driver;
Log log
=new Log(this.getClass());

public WebDriver getDriver() {
return driver;
}

/**
* init test case
*
*
@param driver
*/
public void setDriver(WebDriver driver) {
this.driver = driver;
}

public void init(WebDriver driver) {
log.info(
"Start WebDriver");
setDriver(driver);
}

/**
* stop webdriver
*
*
@param driver
*/
public void stop() {
log.info(
"Stop WebDriver");
driver.quit();

}

}
View Code

接下来就是见证奇迹的时候:

运行一下:log能够清晰记录测试时所做的内容

在测试框架中使用Log4J 2

也有相应的file log

今天的工程下载地址:http://pan.baidu.com/s/1kTqvzZx