在測試框架中使用Log4J 2

to be crazy發表於2015-06-07

之前的測試框架: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包,放到工程:

接下來建立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下:

<?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類放在測試框架裡:

在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類也加入相應的程式碼:

/**
 * 
 */
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能夠清晰記錄測試時所做的內容

也有相應的file log

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

 

相關文章