实现android自动化测试部署与运行Shell脚本分享
我的配置是linux 64, android4.2.2的sdk。 实现的细节都在代码注释里了,变量名以及echo的内容也是说明的一部分。
主流程为:
1.检测是否指定端口的模拟器已经运行,若有则关闭
2.创建模拟器
3.启动模拟器
4.用ant build包,通过检查bin目录下有没有apk来确定是否成功
5.检查指定端口的模拟器是否已正常运行
6.用adb安装apk
7.启动apk的activity,让程序自己跑
8.用shell ps循环检测程序是否已退出,若已退出,检查是否sdcard是是否已成功生成报告文件
9.若报告文件不完整,即程序被中止/崩溃,重启activity
10.检测是否超时
#!/bin/bash
# by hursing 2013-10-28
# 指定port,可以不干扰其它正在运行的模拟器。根据sdk文档,port可以在5554至5584之间,最好是偶数
portNumber=5578
emulatorPID=`ps -ef | grep "emulator" | grep "port $portNumber" | awk '{print $2;}'`
if [ -n "$emulatorPID" ]; then
echo "close emulator window"
kill -9 $emulatorPID
fi
# 创建模拟器,force选项能覆盖已存在的模拟器,即sdcard内容也抹掉。echo no是回答不需要自定义硬件配置
echo "create avd"
emulatorName="Test"
echo no | android create avd --name $emulatorName --force --target android-17 --sdcard 300M --abi armeabi-v7a
# 启动模拟器,port选项指定tcp端口。&是另起进程执行
echo "start avd"
emulator -avd $emulatorName -port $portNumber &
# 没有证书签名,所以是debug
echo "build apk"
android update project -p .
ant debug
if [ $? -ne 0 ]; then
echo "build failed, try again now..."
ant clean
ant debug
if [ $? -ne 0 ]; then
echo "can NOT build apk!"
exit 5
fi
fi
apkFile=`find ./bin/*.apk | grep -v "unaligned"`
if [ -z "$apkFile" ]; then
echo "no apk file generated!"
exit 7
fi
# wait-for-device能block住脚本直到不显示offline
echo "check emulator ready..."
emulatorSerialNumber="emulator-$portNumber"
ready=`adb devices | grep "$emulatorSerialNumber"`
if [ -z "$ready" ]; then
echo "emulator can NOT launch."
exit 3
else
ready=`adb devices | grep "$emulatorSerialNumber.*offline"`
if [ -n "$ready" ]; then
echo "wait-for-device"
adb -s $emulatorSerialNumber wait-for-device
sleep 10
fi
fi
# 当adb可以安装时,模拟器未必已经初始化完成,还是会失败的,所以要检测error,试3遍。
echo "install apk"
let maxTryTimes=3
while [ $maxTryTimes -gt 0 ]; do
result=`adb -s $emulatorSerialNumber install $apkFile` # 'ant installd' can NOT specify device
check=`echo "$result" | grep -o "Error"`
if [ -z "$check" ]; then
echo "successfully install apk"
break;
else
echo "$result"
echo "install failed, try again after sleeping 10 seconds"
sleep 10
let maxTryTimes-=1
fi
done
if [ $maxTryTimes -eq 0 ]; then
echo "can NOT install apk to emulator."
exit 4
fi
echo "start MainActivity"
activityName="com.hursing.MainActivity"
packageName=`cat AndroidManifest.xml | grep -o "package=\".*\"" | sed 's/package="//;s/"//'`
adb -s $emulatorSerialNumber shell am start -W -n "$packageName/$activityName"
heartBeat=10
echo "waiting for test finished.check every $heartBeat seconds."
resultFile="/sdcard/result.txt"
successFlag="End at "
sleep $heartBeat
let maxTimeLimit=60*10
while [ $maxTimeLimit -gt 0 ]; do
running=`adb -s $emulatorSerialNumber shell ps | grep $packageName`
if [ -n "$running" ]; then
let maxTimeLimit-=$heartBeat
echo "waiting, sleep another $heartBeat seconds..."
sleep $heartBeat
else
report=`adb -s $emulatorSerialNumber shell cat "$resultFile"`
check=`echo "$report" | grep -o "$successFlag"`
if [ -z "$check" ]; then
echo "app crash, run activity again..."
adb -s $emulatorSerialNumber shell am start -W -n "$packageName/$activityName"
else
echo "app exit normally"
break
fi
fi
done
echo "close emulator window."
kill -9 `ps -ef | grep "emulator" | grep "port $portNumber" | awk '{print $2;}'`
if [ $maxTimeLimit -eq 0 ]; then
echo "Test timeout!"
echo "$report"
exit 9
else
echo "Test Finished!"
echo
echo "$report"
fi
java代码里有一点要注意,如果程序崩溃,弹出了"has stopped”对话框,那么ps还是能查到的,要自己调用
Thread.setDefaultUncaughtExceptionHandler
实现android自动化测试部署与运行Shell脚本分享的更多相关文章
- 《自拍教程52》Python_adb运行Shell脚本
Android作为一款Linux终端,肯定是支持.sh后缀的Shell脚本的运行的, 有时候测试环境准备或者长时间截取复杂的日志等,开发会给到一些Shell脚本. Shell脚本的执行的优势: 快捷高 ...
- 运维与自动化系列③自动化部署基础与shell脚本实现
自动化部署基础与shell脚本实现 关于自动化的基础知识: 1.1:当前代码部署的实现方式: 运维纯手工scp到web服务器纯手工登录git服务器执行git pull或svn服务器执行svn upda ...
- mac终端下运行shell脚本
最近公司要弄关于IOS下自动化打包的东西,研究了用命令行的形式来代替手工的方式来处理.即: 用xcodebuild 和xcrun 语法来进行脚本实现. 但由于语法的结构够了,另一个问题产生了, ...
- 运行shell脚本时报错"[[ : not found"解决方法
问题描述 在运行shell脚本时报错,命令为: sh test.sh 报错如图: 脚本代码如下: #!/bin/bash # file:test.sh # author:13 # date:2017- ...
- linux服务器批量部署应用系统shell脚本(Tomcat/jetty)
linux服务器批量部署应用系统shell脚本: 1.请更换代码内的服务器地址(Tomcat或jetty服务器) serverRoot=/home/undoner/java_tool/apache-t ...
- Android应用程序如何调用shell脚本(一)
转自: Android应用程序如何调用shell脚本(一) 一般来说, Android 下的应用程序可以“直接”得到的最大的权限为 system ,但是如果我们需要在程序中执行某些需要 root 权限 ...
- 单机部署tomcat的shell脚本
单机部署tomcat的shell脚本,来自网络,自己需要时要根据自己的需求改动. #!/bin/sh # ############################################### ...
- IDEA中编写脚本并运行shell脚本
IDEA中编写脚本并运行shell脚本 来自 <https://blog.csdn.net/u012443641/article/details/81295999>
- 在windows下使用shell,运行shell脚本
在Windows操作系统下运行Shell脚本,缺少的只是一个Git软件.其下载路径为Git - Downloading Package. 安装之后,将安装路径下的bin文件夹的路径作为环境变量.于是我 ...
随机推荐
- Fiddler抓包工具简介:(一)认识Fiddler
认识Fiddler Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的"进出"Fiddler的数据(指coo ...
- let that = this用法解析
这种情况就是在一个代码片段里this有可能代表不同的对象,而编码者希望this代表最初的对象
- PTA甲级1094 The Largest Generation (25分)
PTA甲级1094 The Largest Generation (25分) A family hierarchy is usually presented by a pedigree tree wh ...
- Spring @Component生成bean名称的规则(当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致
正确注入方式: @Autowired private TFeeMapper TFeeMapper; 错误注入方式 @Autowired private TFeeMapper tFeeMapper; 这 ...
- newInstance方法
1.new 是java中的关键字,是创建一个新对象的关键字.用new这个关键字的话,是调用new指令创建一个对象,然后调用构造方法来初始化这个对象,如果反编译class的话,会看到一个Object o ...
- [hdu7034]Array
令$f(a)_{i}=\min_{i<j\le n,a_{i}=a_{j}}j$(特别的,若不存在$j$则令$f(a)_{i}=n+1$),则有以下性质: 1.对于$b_{i}$ ...
- [atAGC013F]Two Faced Cards
先对$c_{i}$离散到$[0,n]$上,并令$a_{i},b_{i},d_{i},e_{i}$对应到第一个大于等于他的数 考虑若$a_{n+1}$和$b_{n+1}$也已经确定如何做: 有一个$o( ...
- Rainbond通过插件整合SkyWalking,实现APM即插即用
作者:张震 一. 简介 SkyWalking 是一个开源可观察性平台,用于收集.分析.聚合和可视化来自服务和云原生基础设施的数据.支持分布式追踪.性能指标分析.应用和服务依赖分析等:它是一种现代 AP ...
- 洛谷 P4088 [USACO18FEB] Slingshot P(线段树+二维数点)
题目链接 题意:有一个数轴,上面有 \(n\) 个传送门,使用第 \(i\) 个传送门,你可以从 \(x_i\) 走到 \(y_i\),花费的时间为 \(t_i\) 秒.你的速度为 \(1\) 格/秒 ...
- 洛谷 P6060 - [加油武汉]传染病研究(数论)
洛谷题面传送门 一道不算太难的题,题解稍微写写吧( 首先根据约数个数和公式,对于一个 \(n=p_1^{\alpha_1}·p_2^{\alpha_2}·\cdots·p_m^{\alpha_m}\) ...