Android自动化基础—简单例子(启动相机拍照-重复执行1000次)

一个简单的测试需求如下:
    测试相机的过程中发现一极低概率性问题,在进入相机拍照后退出的过程中相机可能会crash,概率大概为千分之一。
相机的使用场景相当的平凡,所以千分之一(0.001)的概率看似很小,但对于相机拍照的场景,相对而言,这个概率就很高了。
所以我们需要在未抓取到有效的log信息时,想办法将这个问题进行复现,抓取有效的log信息供开发人员快速地解决问题,另外在开发解决问题之后,如何回归验证该bug,也是我们需要考虑的。
    业务流程很简单,启动相机应用>点击拍照按钮拍照>按返回键退出相机应用。
    如果脱离自动化,那就只能人工的拿着手机使用相机执行该拍照流程1000次,想想就觉得可怕!
    因此我们需要用到自动化,使用脚本去重现或者回归验证这个问题。如何选择脚本语言?个人觉得,使用自己最擅长的语言就行,只要能拿到自己想要的测试结果。但在测试团队里面,为了方便脚本的维护,一般会要求固定的使用某种语言。我自己一般采用python,当然也会视脚本的复杂程度而选择shell或者java,甚至直接使用批处理脚本。
    对于此处的这个简单的业务,我想分别使用shell、python、java语言和monkeyrunner脚本去完成这个脚本(脚本很简单!)
    相机拍照界面Activity:com.android.camera.CameraLauncher //可以使用“adb shell dumpsys window w | grep \/ | grep name=”,windows系统可将grep换为findstr
    拍照按钮的坐标:(550,1760) //可以使用sdk tools目录下的hierarchyviewer工具获取按钮的坐标值,也可以在设备的开发者选项中开启“指针位置”,手指触摸拍照按钮时会在设备的屏幕顶部显示出触摸位置的坐标值

    下面使用脚本实现该业务流程:

shell脚本:

#!/bin/sh

for times in $(seq 1000)
do
	#启动相机
	`adb shell am start com.android.camera/.CameraLauncher`
	#延时2s
	sleep 2s

	#点击拍照按钮
	`adb shell input tap 550 1760`
	sleep 5s

	#点击Back键退出相机
	`adb shell input keyevent KEYCODE_BACK` #或者使用4代替KEYCODE_BAC
	sleep 1s

	echo $times
done 

python:

#!/usr/bin/python
#coding=utf-8

import os
from time import sleep

def photo():
	#注释省略
	os.system('adb shell am start com.android.camera/.CameraLauncher')
	sleep(2)

	os.system('adb shell input tap 550 1760')
	sleep(5)

	os.system('adb shell input keyevent 4')
	sleep(2)

if __name__ == '__main__':
	total_times = 1000
	times = 1

	while (times <= total_times):
		photo()
		print times
		times += 1

java:

package demo;

import java.io.IOException;

public class Photo {

	public static void main(String[] args) {
		int totalTimes = 1000;
		int times = 1;
		
		while (times <= totalTimes) {
			photograph();
			System.out.println(times);
			times++;
		}
	}

	private static void photograph() {
		shell("am start com.android.camera/.CameraLauncher");
		sleep(2000);
		
		shell("input tap 550 1760");
		sleep(5000);
		
		shell("input keyevent 4");
		sleep(2000);
		
	}

	private static void sleep(long millis) {
		try {	
			Thread.sleep(millis);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	private static void shell(String command) {
		try {
			Runtime.getRuntime().exec("adb shell " + command);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

使用monkeyrunner脚本:

#!/usr/bin/python
#coding=utf-8

from com.android.monkeyrunner import MonkeyRunner as mr
from com.android.monkeyrunner import MonkeyDevice as md

device=mr.waitForConnection() 

def photo():
	#注释省略
	device.startActivity(component='com.android.camera/.CameraLauncher')
	mr.sleep(2)

	device.touch(550, 1760, md.DOWN_AND_UP)
	mr.sleep(5)

	device.press('KEYCODE_BACK',md.DOWN_AND_UP)
	mr.sleep(2)

if __name__ == '__main__':
	total_times = 1000
	times = 1

	while (times <= total_times):
		photo()
		print times
		times += 1

实现自动化,可选择的方法有很多,很多时候并不需要只局限于一些框架,例如monkeyrunner,脱离框架,单纯的调用adb命令就可以实现我们的需求。
以上的脚本只是很简单的实现业务流程,缺陷是无法自动地在相机出错的情况下获取log信息,而只能在执行脚本的适合,单独开启logcat命令,将运行脚本时产生的log信息重定向到一个log文件中,在脚本执行完成后分析log文件。
因此要将该脚本完善,可以增加自动判断是否出错并且自动获取log的功能。

  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值