利用过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或数据传回平台,分析后生成一张漂亮的报告……
网友评论
logFile.delete();
FileUtil.updateConfigFile(BaseCase.AD_CONFIG_FILE,"isLog4jConfigured","true");
}
logConfigurator.setFileName(DEFAULT_LOG_DIR + DEFAULT_LOG_FILE_NAME);
这段代码中调用的方法,有源码吗?谢谢