bash shell脚本实现android自动化测试部署与运行

我的配置是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

,在handler里直接System.exit(0)才行。

转载请注明出处:http://blog.csdn.net/hursing

时间: 2024-09-30 04:52:54

bash shell脚本实现android自动化测试部署与运行的相关文章

实现android自动化测试部署与运行Shell脚本分享_linux 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是是

如何在Bash Shell脚本中显示对话框

这个教程给出几个如何使用类似zenity和whiptail的工具在Bash Shell 脚本中提供消息/对话框的例子.使用这些工具,你的脚本能够告知用户当前程序运行的状态并能与用户进行交互.这两个工具的不同之处在于显示消息框或者对话框的方式.Zenity用GTK工具包创建图形用户界面,而whiptail则在终端窗口内创建消息框. Zenity 工具 在Ubuntu中安装zenity,运行: sudo apt-get install zenity 用zenity创建消息框或者对话框的命令是不言自明

Linux Shell脚本之远程自动化部署java maven项目

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dgd2010.blog.51cto.com/1539422/1771555 脚本功能: 检查运行环境(包括运行权限.网络.DNS解析等),自动从git上获取java maven项目工程源码,在机器A上build,build完成后,备份机器B上原有的配置文件(如果存在),将Class.Lib文件和备份的配置文件等上传到机器B,重新启动机器B上的服务以便变更生效. 脚本特点: 1.

写出健壮Bash Shell脚本的一些技巧总结_linux shell

许多人用Shell脚本完成一些简单任务,而且变成了他们生命的一部分.不幸的是,shell脚本在运行异常时会受到非常大的影响.在写脚本时将这类问题最小化是十分必要的.本文中我将介绍一些让bash脚本变得健壮的技术. 使用set -u 你因为没有对变量初始化而使脚本崩溃过多少次?对于我来说,很多次. 复制代码 代码如下: chroot=$1 ... rm -rf $chroot/usr/share/doc 如果上面的代码你没有给参数就运行,你不会仅仅删除掉chroot中的文档,而是将系统的所有文档都

如何编写一个shell脚本查看某个进程是否在运行

问题描述 我需要做一个shell脚本,运行在Linux上,检查某个进程是否在运行,如果在运行则返回1,不在运行则返回0,在下对shell脚本不是很熟,请大家帮忙解决一下,谢谢啦-- ps:进程名称不能写死,应该是执行命令是传入的参数 解决方案 #!/bin/bashPROC_NAME=$1ProcNumber=`ps -ef |grep $PROC_NAME|grep -v grep|wc -l`if [ $ProcNumber -le 0 ];then result=0else result=

Shell脚本实现检测进程是否正在运行_linux shell

这里简单介绍一个自己写的检测某个进程是否存在的bash小脚本.直接上代码. 复制代码 代码如下: #!/bin/bash ps_out=`ps -ef | grep $1 | grep -v 'grep' | grep -v $0` result=$(echo $ps_out | grep "$1") if [[ "$result" != "" ]];then     echo "Running" else     echo

Bash Shell脚本学习小结_linux shell

1.字符截断: 如果是一般路径的字符截断可以用basename和dirname这两个工具:basename可以从一个文件路径中截一个文件名 例如: 复制代码 代码如下: $ basename /home/file.tarfile.tar dirname可以从一个文件路径中截到一个目录路径例如: 复制代码 代码如下: $ dirname /home/file.tar/home 不使用外部工具进行字符截断bash有自带的功能来对变量进行字符截断,一般使用"##", "#"

Linux进程自动监控bash shell脚本

该脚本的用途: 主要用于监控 linux VPS服务器负载及内存占用,如 MySQl.php-fpm,当负载或内存占用达到设置值后,便自动重启该进程以避免宕机. 代码如下: # 设置最大内存占用百分比 PID_MEM_MAX="85" # 设置最大系统负载 SYS_LOAD_MAX="3" # 设置需要监控的服务名称 NAME_LIST="php-fpm mysql" for NAME in $NAME_LIST do # 初始化内存统计 PID

linux搭建FTP服务器的bash shell脚本

各种知识点都写在注释里. 只需要 sudo $PATH/ftpsetup.sh即可,默认以test/test为用户名密码登录,登录后的根目录只读,子目录writable可写. Ubuntu 13和Linux Mint 15上测试ok. #!/bin/bash # by liuhx 2013-Nov-04. # 设置ftp环境的脚本.ftp的根目录为只读,其下的writable目录为可写 # 可自定义以下四项 # ftp用户名 userName="test" # ftp密码 passwo