【Android】 andorid camera自动化测试入门【一】

8 篇文章 0 订阅
5 篇文章 0 订阅

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的才生效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

高启强不卖鱼

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值