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

转载:http://blog.csdn.net/gb112211/article/details/42354671

一个简单的测试需求如下:
    测试相机的过程中发现一极低概率性问题,在进入相机拍照后退出的过程中相机可能会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脚本:

[plain]  view plain  copy
  1. #!/bin/sh  
  2.   
  3. for times in $(seq 1000)  
  4. do  
  5.     #启动相机  
  6.     `adb shell am start com.android.camera/.CameraLauncher`  
  7.     #延时2s  
  8.     sleep 2s  
  9.   
  10.     #点击拍照按钮  
  11.     `adb shell input tap 550 1760`  
  12.     sleep 5s  
  13.   
  14.     #点击Back键退出相机  
  15.     `adb shell input keyevent KEYCODE_BACK` #或者使用4代替KEYCODE_BAC  
  16.     sleep 1s  
  17.   
  18.     echo $times  
  19. done   

Python

[python]  view plain  copy
  1. #!/usr/bin/python  
  2. #coding=utf-8  
  3.   
  4. import os  
  5. from time import sleep  
  6.   
  7. def photo():  
  8.     #注释省略  
  9.     os.system('adb shell am start com.android.camera/.CameraLauncher')  
  10.     sleep(2)  
  11.   
  12.     os.system('adb shell input tap 550 1760')  
  13.     sleep(5)  
  14.   
  15.     os.system('adb shell input keyevent 4')  
  16.     sleep(2)  
  17.   
  18. if __name__ == '__main__':  
  19.     total_times = 1000  
  20.     times = 1  
  21.   
  22.     while (times <= total_times):  
  23.         photo()  
  24.         print times  
  25.         times += 1  

Java

[java]  view plain  copy
  1. package demo;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. public class Photo {  
  6.   
  7.     public static void main(String[] args) {  
  8.         int totalTimes = 1000;  
  9.         int times = 1;  
  10.           
  11.         while (times <= totalTimes) {  
  12.             photograph();  
  13.             System.out.println(times);  
  14.             times++;  
  15.         }  
  16.     }  
  17.   
  18.     private static void photograph() {  
  19.         shell("am start com.android.camera/.CameraLauncher");  
  20.         sleep(2000);  
  21.           
  22.         shell("input tap 550 1760");  
  23.         sleep(5000);  
  24.           
  25.         shell("input keyevent 4");  
  26.         sleep(2000);  
  27.           
  28.     }  
  29.   
  30.     private static void sleep(long millis) {  
  31.         try {     
  32.             Thread.sleep(millis);  
  33.         } catch (InterruptedException e) {  
  34.             e.printStackTrace();  
  35.         }  
  36.     }  
  37.   
  38.     private static void shell(String command) {  
  39.         try {  
  40.             Runtime.getRuntime().exec("adb shell " + command);  
  41.         } catch (IOException e) {  
  42.             e.printStackTrace();  
  43.         }  
  44.     }  
  45. }  

使用monkeyrunner脚本:

[python]  view plain  copy
  1. #!/usr/bin/python  
  2. #coding=utf-8  
  3.   
  4. from com.android.monkeyrunner import MonkeyRunner as mr  
  5. from com.android.monkeyrunner import MonkeyDevice as md  
  6.   
  7. device=mr.waitForConnection()   
  8.   
  9. def photo():  
  10.     #注释省略  
  11.     device.startActivity(component='com.android.camera/.CameraLauncher')  
  12.     mr.sleep(2)  
  13.   
  14.     device.touch(5501760, md.DOWN_AND_UP)  
  15.     mr.sleep(5)  
  16.   
  17.     device.press('KEYCODE_BACK',md.DOWN_AND_UP)  
  18.     mr.sleep(2)  
  19.   
  20. if __name__ == '__main__':  
  21.     total_times = 1000  
  22.     times = 1  
  23.   
  24.     while (times <= total_times):  
  25.         photo()  
  26.         print times  
  27.         times += 1  

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


补充:

因为我是在windows使用,所以写了以下Bat脚本:

@echo off

set times=0
adb devices
ping 127.0.0.1 -n 1 > null 

:teststart
		
    rem 点击后置相机  
    adb shell input tap 82 714
    
    ping 127.0.0.1 -n 3 > null 

		rem 开始拍照
		adb shell input tap 110 250
		
		ping 127.0.0.1 -n 3 > null 
  
  	rem 点击拍照
		adb shell input tap 352 1093
		
		ping 127.0.0.1 -n 5 > null 
		
		rem 点击Pass
		adb shell input tap 540 1122
  
  	set /a times+=1
    echo retry time = %times%  
    
    if %times%==1000 goto exit
    
    ping 127.0.0.1 -n 4 > null 
    
goto teststart

:exit

pause 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值