UiAutomator2.0日志输出本地化方案

利用过UiAutomator2.0或者Espresso(Espresso也是android近年新出的一款Android自动化测试框架)做Android自动化测试的同学应该肯定会遇到这样的一个问题:自动化测试执行完后,不知道在哪里查看执行的log以及结果报告,除非每次都连着USB,在Android Studio中查看,但那样也是临时性的log和报告输出,清除或关闭AS就没有了……那么我们想把自动化测试做的更“专业”,执行的log每个测试机上总得生成一份吧,没log的定位跟踪错误
那不是盲人摸象嘛。所以今天要分享的内容就是基于这个痛点来设置解决方案。

一、方案思路

既然Android提供的Log类没有输出到文件,那么我们为何不借助其他Log框架呢?比如Log4j啊,没错,思路就是用Log4j。

二、实现步骤

1、log4j相关依赖包
在android中使用log4j日志文件使用需要两个jar包,但是我们不再需要进行log4j.properties配置文件的配置,所有配置一切都在代码中完成。
log4j 包下载:
下载地址:http://logging.apache.org/log4j/1.2/download.html
android-logging-log4j包下载:
下载地址:https://code.google.com/archive/p/android-logging-log4j/downloads
下载完毕后放到Android Studio对应moudle的libs目录下。

2、log4j初始化配置
新建Log4jConfigure 类,初始化log文件夹及log4j的一些配置:

public class Log4jConfigure {
    private static final String DEFAULT_LOG_DIR =  
    Environment.getExternalStorageDirectory() + 
    File.separator + "U2AutoTest" + File.separator ;//HOME文件夹
    private static final String DEFAULT_LOG_FILE_NAME = "u2Test.log";
    private static final String TAG = BaseCase.testTag;

    public static void configure() {
        final LogConfigurator logConfigurator = new LogConfigurator();
        try {
            File logFile = new File(DEFAULT_LOG_DIR + DEFAULT_LOG_FILE_NAME);
            if(logFile.exists() && ! FileUtil.getIsLog4jConfigured(BaseCase.AD_CONFIG_FILE)){
                logFile.delete();
                FileUtil.updateConfigFile(BaseCase.AD_CONFIG_FILE,"isLog4jConfigured","true");
            }
            logConfigurator.setFileName(DEFAULT_LOG_DIR + DEFAULT_LOG_FILE_NAME);

            //以下为通用配置
            logConfigurator.setUseLogCatAppender(false);//不输出到logcat
            logConfigurator.setUseFileAppender(true);
            logConfigurator.setImmediateFlush(true);
            logConfigurator.setRootLevel(Level.DEBUG);
            logConfigurator.setFilePattern("%d\t%p/%c:\t%m%n");
            logConfigurator.configure();

            android.util.Log.i(TAG, "Log4j config finished");
        } catch (Throwable throwable) {
            logConfigurator.setResetConfiguration(true);
            android.util.Log.e(TAG, "Log4j config error, use default config. Error:" + throwable);
        }
    }
}

3、新建Log工具类
封装各种级别的日志输出方法:

public class LogUtil {
    private String tag;
    private String logPath = BaseCase.U2_HOME_PATH + File.separator + "screenshot" + File.separator;

    private Logger logger;

    public LogUtil(String tag) {
        this.tag = tag;
        logger = getLogger(tag);
        File logFile = new File(logPath);
        if (! logFile.exists()) {
            logFile.mkdir();
        }
    }

    public void i(Object msg){
        Log.i(this.tag, msg + "");
        logger.info(msg);
    }

    public void v(Object msg){
        Log.v(this.tag, msg + "");
        logger.info(msg);
    }

    public void d(Object msg){
        Log.d(this.tag, msg + "");
        logger.debug(msg);
    }

    public void w(Object msg){
        Log.w(this.tag, msg + "");
        logger.warn(msg);
    }

    public void e(Object msg){
        Log.e(this.tag, msg + "");
        logger.error(msg);
    }

    public void e(Object msg,String srceenshot){
        Log.e(this.tag, msg + "");
        logger.error(msg);
        takeScreenshot(srceenshot);
    }

    private Logger getLogger(String tag) {
        Log4jConfigure.configure();
      if ("".equals(tag)) {
            return Logger.getRootLogger();
      }
        return Logger.getLogger(tag);
   }
}

4、使用示例:

public static LogUtil log = new LogUtil(testTag);
log.i("退出应用(" + packageName + ")成功");
log.e("退出应用(" + packageName + ")失败");

三、总结

在测试用例方法中使用上面的Log工具类封装的方法打印log,即可在手机的SD卡指定路径生成测试执行的log文件,这样就再也不用担心手机没连USB数据线就看不到执行log的尴尬了。此外,在此基础上, 还可以进一步完善和扩展,比如写一个工具或者平台增加代码推送到指定手机池等功能,再将执行完后的log或数据传回平台,分析后生成一张漂亮的报告……

更多原创技术好文和资料,请关注公众号:测试开发栈
UiAutomator2.0日志输出本地化方案_第1张图片

你可能感兴趣的:(UiAutomator2.0日志输出本地化方案)