前言
今天学了一下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文件这个配置文件去解析你的应用,而其中标注了LAUNCHER
的Activity
表示了执行这个应用时第一个被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"