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

18 篇文章 0 订阅
3 篇文章 0 订阅

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
安卓系统下的bash shell,ssh服务器,gcc编译器以及vim文本编辑器等 使用vim编辑多个文件 vim file1 file2 file3 ... :next查看或编辑后一个文档的内容 :prev查看或编辑前一个文档的内容 :first查看或编辑第一个文档的内容 :last查看或编辑最后一个文档的内容 vim -o|-O file1 file2 file3 -o:水平显示多个文件 -O:垂直显示多个文件 Ctrl+w arrow(箭头) 光标移动 Ctrl+w,s讲一个文件水平分屏显示 Ctrl+w,v将一个文件垂直分屏显示 :qa 全部退出 :wa 全部保存 将其他文件中的内容填充到当前文件中 :r (/PATH/TO/SOMEFILE)这是解释 跟shell交互 :!命令(command) 部分另存为 :w(全部保存) :m,nw(从第m行到第n行) :m,+n :.,$w 默认系统中所支持的shell cat /etc/shells bash特性 命令别名:自定义命令 alias:可以用来定义和设置命令的别名 注意:使用alias命令定义的别名其生命周期仅限于当前shell的生命期;如果修改.bashrc配置文件,其中保存的别名并不会立即生效,只有在重新加载该文件内容之后才会生效且永久生效;为了能够保证设置别名有效,通常两种操作都做 撤销别名:unalias . .bashrc:将.bashrc的命令读取 命令历史: bash进程会保存其会话中用户曾经执行的命令,以方便用户重复执行某个命令通过bash提供的历史命令文件来持久保存此前执行过的命令,用户由私有历史文件 登陆shell的时候,bash会自动读取~/.bash_history文件中所记录的所有命令 history命令: -c:清空历史缓冲区中的历史命令; -d OFFSET:删除特定历史命令条目; 重复执行前一个命令的方法: 使用上方向箭头,回车执行 Ctrl+p !-1 !! 重复执行历史缓冲区的命令 !#(#=数字):重复执行历史命令中的编号为#的命令 !(string)字符串:从历史缓冲区中查找最近一次执行过的以string开头的命令并执行 !?string:从历史缓冲区中查找最近一次包含string的命令并执行 !- number:执行历史缓冲区中倒数第number个命令 Ctrl+r:在历史缓冲区中实施搜索,回车执行即可: 重复使用历史命令中的一部分: !$ 、ESC .、ALT+:表示最后一次命令中最后一个参数; !^:第一个位置的参数 !:number:最后一次命令中第number个位置的参数 !number1:number2在历史缓冲区中第number1个命令的第number2个参数 快捷键 C-->Ctrl M-->Alt E-->Esc DEL-->Backspace C-l:clear 清屏 C-a:将光标跳至命令行行首 C-e:将光标跳至命令行行尾 C-k:删除光标所在位置至行尾的命令行信息 C-u:删除光标所在位置至行首的命令行信息 C-c:结束前台进程。取消命令的运行 命令补全机制: 命令本身字符串的补全 参数的补全 使用TAB键可以完成命令补全: 如果给出的字符串不能作为唯一标识,则bash不予补全;再次敲击TAB键,bash会给出参考列表;如果参考列表中的内容过多,bash会询问是否显示该列表;根据提供的参数路径来进行补全,如果参数没有任何提示信息,则默认从工作目录进行查找; 命令行展开: ~:bash会自动将其展开为当前登陆用户的家目录 ~STRING:bash会自动将其展开为以STRING为用户名为用户的家目录 ~+:调用shell变量pwd的值 ~-:调用shell变量oldpwd的值 {}:在花括号中可以填充一个以","分隔的路径列表,bash会将其展开为多个独立的路径; 命令的执行结果 任何以个Linux命令都有两种执行结果: 命令的正常输出结果:跟用户需求相关的返回内容: ``:反向单引号,反引号 $():标准的命令引用格式 wc:统计一个文件中的行数、字数及字节数 -c:只显示字节数 -l:只显示行数 -w:只显示字数 命令的执行状态返回值;跟命令执行成与否相关的返回命令 引用功能: '':强引用 凡是被单引号引用的内容,bash一律将其视为普通字符,即便本身有特殊功能和作用也是如此,但是单引号本身是个例外 "":弱引用 被双引号引用的内容有一些特殊字符仍然会保留器特殊含义 比如:$、\、"" 转义功能:

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hursing

来一个五羊香芋甜筒~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值