编写shell脚本自动测试手机应用并存储logcat到脚本的当前目录

2 篇文章 0 订阅
2 篇文章 0 订阅

前言

今天学了一下shell脚本,感觉挺有意思的,刚好工作有个需求,用到了shell做一些测试,所以把今天学的东西总结一下。
安卓测试中,我们在android studio上肯定会知道它内置了一个logcat控件,可以打印、分类、筛选你手机应用打印的logcat,还可以筛选自己应用的logcat,确实很方便,但是当我们需要自动地去取出logcat然后处理就很麻烦了,只能手动的筛选然后复制出来到txt里面,实在太麻烦了。
而一个很简单的方法就是自己编写自动脚本从手机中取出logcat并存储下来然后调用python等解释性语言去处理,这样就快的多,而且也不依赖任何的编译器,可以当作一个通用的脚本大家一起用。
下次想要测试的时候,直接点击这个sh文件,自己就把数据跑出来了,就很方便。

程序过程解释

1、获取shell脚本运行目录

这一步主要的目的是为了执行此sh文件目录下的py脚本,并保存log文件到当前脚本运行的目录下,而不是仅仅只能在本机上运行,保证在所有的机器上,运行的效果都是一样的。

basepath=$(pwd)

2、获取参数

如果存在参数,可以在shell脚本中的$#获取到当前的参数数量,即$#等于几就代表有几个变量,而通过$1、$2等就可以获取不同的参数,而使用方式就是简单的在执行sh文件的时候,在后方加上参数即可,例如:

./test.sh  hello 10

第一个参数为hello,那我们就可以知道$1代表的值就是"hello"。其他的以此类比,自己可以编写不同的操作。

3、异步存储手机的logcat到本地

adb logcat -s tag名 > basepath/allLog.txt&   #最后的&代表异步执行,因为`adb logcat`会阻塞进程

通过简单的adb logcat命令即可获取当前手机的logcat,然后通过-s tag参数只取出自己tag下的log日志,然后通过>filename的方式直接保存到本地,而path就是我们前面获取到的当前目录。
要注意logcat是阻塞执行的,所以加上&保证后面的代码能够正常运行。记得logcat是保存启动时一段范围时间内的日志,所以越早执行越好。

4、自动运行应用和结束应用

要运行一个应用,我们就需要知道安卓如何执行一个应用的,简单来说,安卓通过你编写的manifest文件这个配置文件去解析你的应用,而其中标注了LAUNCHERActivity表示了执行这个应用时第一个被startActivity函数打开的Activity,即那个Activity就是安卓系统启动你的应用将会打开的那个Activity,找到它的名字,然后和其地址一起填上去就可以了
当然,要是应用不是你自己写的的话,也很简单:

adb.exe shell pm list packages

这个命令可以获取手机中所有的应用的列表,找到你想要的即可,而找到应用的MainActivity是哪一个就要看你自己的手段了,因为我测试的应用能看到代码,所以这里不说怎么找了。
找到包名和主Activity名,然后写下如下代码,就可以控制开启和关闭应用:

    # 启动应用
    adb shell am start -n 包名(如com.example.XX)/activity名(如mainActivity)
    # 这里写你自己的操作
    # 关闭应用
    adb shell am force-stop 包名

然后控制什么点击、触摸这些操作就太简单了就不说了,还是接着处理logcat。

5、获取到log后,运行自己编写的py脚本执行log数据的处理工作

这里就可以简单地通过py语言去做数据的汇总处理和报表生成之类的操作了,可有可无,如果只是想保存也可以:
获取当前目录下的py脚本路径
pythonFilePath="$basepath/test.py"
执行python脚本

echo "开始执行python脚本自动分析allLog.txt"
python "$pythonFilePath"

完整代码

# 在手机上自动安装apk,需要指定apk,否则将自动执行原本的apk,
# 自动跑测试并读取logcat存入本地交给python脚本执行log数据的分析操作

# 获取当前shell脚本运行的目录地址
basepath=$(pwd)
if [ $# == 1  ]
then
  # 有参数,开始自动安装此版本的apk
  installApkPath=$1
  echo "正在安装 "$installApkPath" 地址对应的的 apk."
  adb install $installApkPath
fi
runCount=50
if [ $# == 2  ]
then
  # 有安装包路径参数,开始自动安装此版本的apk
  installApkPath=$1
  echo "正在安装 "$installApkPath" 地址对应的的 apk.'"
  adb install $installApkPath
  #传入的参数存在执行次数
  runCount=$2
fi
# 异步保存当前手机的logcat到当前目录下的allLog.txt文件中
adb logcat -s tag名 > path/allLog.txt&# 最后的&代表异步执行,因为adb logcat会阻塞进程
echo "开始生成获取手机中logcat文件,并生成allLog.txt,log记录中..."
while (( $runCount>0 ))
do
    echo -e "现在还剩余 $runCount 次测试未执行"
    # 启动应用
    adb shell am start -n 包名(如com.example.XX)/activity名(如mainActivity)
    # 这里写你自己的操作
    # 关闭应用
    adb shell am force-stop 包名
    let "runCount--"
done

# 获取当前目录下的py脚本路径
pythonFilePath="$basepath/test.py"
# 执行python脚本
echo "开始执行python脚本自动分析allLog.txt"
python "$pythonFilePath"
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值