【开源自动化测试疑难FAQ】【WebDriver】RemoteWebDriver日志问题处理过程

来源:互联网 发布:网络言论法律 编辑:程序博客网 时间:2024/05/17 04:26

        公司在用Jenkins做开源自动化测试脚本的统一执行调度和管理,涉及Selenium RC、WebDriver、Sahi、WatiJ等工具的脚本。随着JOB和执行的脚本越来越多,最近出现了下面的这种错误(详见微博http://weibo.com/1764147817/z1cLiCgjK):

        

        据说这是Jenkins的一个BUG,研读代码发现是commons-io.jar在用整型返回一个文件的字节数,按理说应该是单个文件过大才会诱发这种问题,但是很明显这是文件集合在一起造成了该问题,所以说应该是一个ISSUE,需要被FIX的。

        我没有兴趣和能力去研究或修改Jenkins的问题,所以暂且抛开这个问题,我们知道是因为我们在console上打印了过多日志导致的这个问题,所以先从build的console output入手。使用JUnit的case可以在build.xml中使用showoutput参数,设置为false即可屏蔽大量的工具运行日志。而使用TestNG的case……惭愧的很,实在没搞明白如何解决这个问题,至于setVerbose()或者在suite.xml/build.xml中的verbose=”0”的设置其实都是无法生效的,具体原因不清楚,也没有深入去读TestNG的代码。

        既然框架解决不了,那就从工具配置想法子吧,由于我是用的RemoteWebDriver,所以去看了一下RemoteWebDriver.java的代码,发现excute方法里面有几个log记录的方法,所以前后分别修改工具类,在工具包中加了LogManager.getLogManager().reset()和logger.setUseParentHanlder(false),无果。在实验的过程中,意外发现这两种方法在最直接运行的class中可以生效,而在父类中是不行的,这就意味着需要一个全局的变量设置。为此,我们是否需要在每个case中都去写一段下面的代码呢?

    static {         logger.setUseParentHandlers(false);    }

        当然不能如此,这让写测试的同志们情何以堪呢!那么怎么办呢?很简单,只要Java运行时通过ant去build,它的全局变量都可以通过sysproperty key去设置,xml代码如下:

<targetname="runtask"description="运行构建">                                

         <echomessage="……开始测试执行……"/>

         <taskdefname="testng"classpathref="compile.cp"classname="com.beust.testng.TestNGAntTask"/>

         <testngclasspathref="runtask.cp"

                  ……

                  <sysproperty key= "java.util.logging.config.file" value="./config/logger.properties"/>

         </testng>

</target>

        这样,只要在工程下指定目录放置配置文件即可(/config/logger.properties),而这个logger.properties的配置也非常简单,可以参见如下配置,至于FileHanlder的配置也可以同类似的方法去配置。

        handlers=java.util.logging.ConsoleHandler

        java.util.logging.ConsoleHandler.level= SEVERE

        java.util.logging.ConsoleHandler.formatter= java.util.logging.SimpleFormatter

        为什么要这么设置呢,因为remotewebdriver的日志生成是依赖于httpclient,而httpclient则使用了commons-logging,JCL为RemoteWebDriver日志记录实现的时候使用的是java.util.logging。至于commons-logging和log4j、java.util.logging之间的关系和使用方法,大家可以去google或者stackoverflow上面去查找,应该很容易理解。这两天为了这三者之间的关系和使用实在是死了不少脑细胞,没有一定的java开发经验做起相关的测试脚本开发和问题解决总是显得力不从心啊。