一个简单的测试需求如下:
测试相机的过程中发现一极低概率性问题,在进入相机拍照后退出的过程中相机可能会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工具获取按钮的坐标值,也可以在设备的开发者选项中开启“指针位置”,手指触摸拍照按钮时会在设备的屏幕顶部显示出触摸位置的坐标值
使用monkeyrunner脚本:
实现自动化,可选择的方法有很多,很多时候并不需要只局限于一些框架,例如monkeyrunner,脱离框架,单纯的调用adb命令就可以实现我们的需求。
以上的脚本只是很简单的实现业务流程,缺陷是无法自动地在相机出错的情况下获取log信息,而只能在执行脚本的适合,单独开启logcat命令,将运行脚本时产生的log信息重定向到一个log文件中,在脚本执行完成后分析log文件。
因此要将该脚本完善,可以增加自动判断是否出错并且自动获取log的功能。
测试相机的过程中发现一极低概率性问题,在进入相机拍照后退出的过程中相机可能会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的功能。