1 概述
python能做的事情很多,我这边今天来介绍的是配合Shell命令来实现andorid的自动化测试。
今天的小目标是自动化打开camera。
要求:
- 1.测试次数可以设定
- 2.测试设备可以设定
系统要求:
linux:要求有adb,可以使用shell。
直接使用shell的也是同理的。
python本质上是调用shell。使用python的优点是可以更好的搭建和分类管理,并且可以分拣出相关的关键内容,即数据清洗。
话不多说。
2 ADB
adb 调用起相机的本质原理是调用起Activity。
我们可以根据实际需要调用起的相机,更换项目和相机都可以用此命令检查对应的activity以便唤起对应的apk。其他非camera的apk同理.
使用以下的命令可以看到目前focus窗口的activity。如果我们需要压测camera,需要打开camera的同时输入以下的命令。
adb shell dumpsys window | findstr mCurrentFocus #windows 命令
adb shell dumpsys window | grep mCurrentFocus #linux 命令
然后配合上述dump出来的内容调用camera,调用命令格式如下:
adb shell am start -W apkName/启动页的actvity
拍照和返回home相关的命令也是通过android中 keycode下发的。
adb shell input keyevent 3 #返回home
adb shell input keyevent 27 #photo
如果使用Shell我们可以通过下面的内容来获取到相关的device,即测试设备。为了可继承性,可以自己手动输入相关的测试设备。
adb devices
3 测试准备
设定写入的第一个参数为测试设备。
awk命令见我之前写的内容即可。AWK命令入门
if [ ! -n "$1" ]
then
echo "没有参数输入走默认设备"
devices=$(adb devices|awk '{print $1}'|sed -n '2p') #获取adb device信息第一个设备
else
echo "有参数输入,参数为"$1
devices=$1
fi
echo "adb设备为"$devices
另外是需要准备测试次数。
当然也可以写个死循环,什么时候不想测就给停了也行。
设定写入的第二个参数为测试次数。
# 判断参数是否为空
# 测试次数
if [ ! -n "$2" ]
then
echo "无参数输入测试次数为10"
testCount=10 #测试次数设定为10
else
echo "有参数输入,参数为"$2
testCount=$2
fi
echo "测试次数为"$2
相关的测试脚本内容如下:
test(){
while ((count<testCount));do
{
let count++
echo "测试次数 = "$count
adb -s $devices shell input keyevent 82 #设备解锁
adb -s $devices shell am start -WapkName/启动页的actvity #打开camera apk 这个根据自己设备的系统camera apk来定
sleep 2 #延时2s
adb -s $devices shell input keyevent 3 #回到home
sleep 2 #延时2s
}
done
}
上述内容整理保存成一个.sh尾缀 然后chmod +x 添加权限运行。整个运行的格式如下:
./测试脚本.sh 测试设备 测试次数
4 拓展
至此已经可以自动化打开camera,但是实际应用的场景往往会更复杂。我们做自动化的同时也需要记录自动化过程中的某个状态和信息。而且上述的方法 是需要一定的shell基础。
所以我后面把一些内容封装了,保留了一些暴露给非研发人员的内容。
我们可以这么操作。
做一个config.txt文件,里面配置我们需要测试的apk和测试的次数,以及测试的设备。
为什么我一直在强调测试设备。往往我们一台机器上需要插很多设备的,同时进行各项的工作。
如果不管控好测试的设备往往会影响到其他设备的。
其config.txt内容如下,注意(#)用作注释,我读取文件解析是通过(#)来判断当前行是否为解释行,解释行则跳过去读下一行,然后再去找其中的关键字,之后筛选出关键字对应的内容即解析成功。(空格无所谓,我会出手的,我是有做删空格的操作)
#adb shell dumpsys window | findstr mCurrentFocus #windows 命令
#adb shell dumpsys window | grep mCurrentFocus #linux 命令
#mtk:
#通过以上的命令获取到你要测试的camera apk。需要先打开对应的camera
apk: com.mediatek.camera/com.mediatek.camera.CameraLauncher
#测试次数
testCount: 1000
#测试设备
deviceSN: 测试设备
然后写一个read.py文件去读取config.txt的文件内容并解析出来
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
@File : main.py
@Author : 没有手牌
@Time : 2022/12/30 16:32
"""
import os
import argparse
import fileinput
import re
import matplotlib.pyplot as plt
from scipy.signal import find_peaks
import sys
import time
filename = "config.txt"
def readConfig():
count = 0
for line in fileinput.input(filename):
count +=1
if line.find("#") == 0:
continue
elif line.find("apk") == 0:
apk = line.split('apk:')[1]
apk = apk.strip() #去掉空格
apk = apk.replace("\r","") #去掉换行符
elif line.find("testCount") == 0:
testCount = line.split('testCount:')[1]
testCount = testCount.strip() #去掉空格
testCount = testCount.replace("\r","") #去掉换行符号
elif line.find("deviceSN") == 0:
deviceSN = line.split('deviceSN:')[1]
deviceSN = deviceSN.strip() #去掉空格
deviceSN = deviceSN.replace("\r","") #去掉换行符号
print("调用apk名字为 \t",apk)
print("测试次数\t",testCount)
print("测试设备为\t",deviceSN)
return apk,testCount,deviceSN
def main():
readConfig()
#主函数入口
if __name__ == '__main__':
main()
然后我们需要在python中使用shell相关的命令
详细看这个文章内容
python有很多操作shell的方式。需要先import 的包
import os
第一种方式是直接用os.system(“command”),其中返回0,表示执行命令成功,明显的缺点是无法将返回的值保存下来
devices = os.system("adb devices")
第二种方式是用os.popen(“command”)
os.popen() 返回的是 file read 的对象,对其进行读取 read() 的操作可以看到执行的输出。
devices = os.popen("adb devices")
print("deviecs = ",devices.read())
打印输出的结果为
deviecs = List of devices attached
L7Z5AABQAILZPBTO device
配合下将其修改成如下的内容,就可以把对应的adb设备获取出来,当前只能获取到最上面的那个,可以自己根据逻辑来完善
devices = os.popen("adb devices|awk '{print $1}'|sed -n '2p'")
print("deviecs = ",devices.read())
注意:popen中主要涉及到文件上的操作,但是一些shell中的sleep和拍照等操作不需要返回值还是用system来操作。
我实际操作拍照的时候,发现存在的这个问题。popen不生效,只有system的才生效。