• 在测试框架中使用Log4J 2


    之前的测试框架: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

  • 相关阅读:
    Solidworks草图或者特征无法删除怎么办
    Solidworks如何为装配体绘制剖面视图
    Solidworks如何在装配图中保存单独的一个零件
    [Algorithm] Check if a binary tree is binary search tree or not
    [PureScript] Break up Expressions into Cases in PureScript using Simple Pattern Matching
    [Docker] Hooking a Volume to Node.js Source Code
    [PureScript] Basic Data Constructors in PureScript
    [Algorithm] Check for balanced parentheses using stack
    [PureScript] Introduce to PureScript Specify Function Arguments
    [Node.js] process.nextTick for converting sync to async
  • 原文地址:https://www.cnblogs.com/tobecrazy/p/4557592.html
Copyright © 2020-2023  润新知