测试基础 从 0 构建自动化测试平台 (五) 兼容性测试实现

K米测试 · 2017年05月17日 · 最后由 K米测试 回复于 2017年09月24日 · 4912 次阅读

从 0 构建自动化测试平台 (五) 兼容性测试实现

## 往期文章

从 0 构建自动化测试平台 (一) 之技术选型

从 0 构建自动化测试平台 (二) WEB 服务器构建

从 0 构建自动化测试平台 (三) 前端页面拉取

从 0 构建自动化测试平台 (四) 文件上传与任务提交

前言

写到这里,还是非常想进行一个说明,实际项目过程中的顺序其实和我梳理的顺不一样,为了让读者更容易理解,笔者重新梳理了顺序,目的是为了让读者更好的理解这个项目;实际过程是先实现了后端的功能,例如兼容性测试、稳定性测试、功能测试之后,根据需要才有的前端。之前的文章都是前端相关的内容,今天好不容易到了后端的实现,此时的我还是非常激动的,接下来将和大家聊聊后端的具体实现。

接上篇文章

之前我们聊到了文件上传,并将参数传递给了后端 python 代码:

python vendor/comptest/devices.py --app-path=/home/K米4.6.6.apk --email=xiongjinfei@star-net.cn --test-type=compatibility

这里有一个关键词:compatibility 兼容性测试。

我对兼容性测试的理解

兼容性测试,我的理解有 2 个阶段:

第一个阶段:早期的时候听的最多的应该是浏览器兼容,百度百科对兼容性测试的解释:

兼容测试(Compatibility Test Suite )简称 CTS

指对所设计程序与硬件、软件之间的兼容性的测试。

测试分类:

一、浏览器兼容测试

二、分辨率兼容测试

一般来说,兼容性指能同时容纳多个方面,在计算机术语上兼容是指几个硬件之间、几个软件之间或是软硬件之间的相互配合程度。

兼容性测试是指测试软件在特定的硬件平台上、不同的应用软件之间、不同的操作系统平台上、不同的网络等环境中是否能够很友好的运行的测试。

简单说就是我们的网页在不同的浏览器上可以正常显示,页面元素没有出现:偏离、移位、遮挡、按钮无法点击、输入框无法输入等问题,以及在不同分辨率的电脑可以正常显示,功能可以正常使用。

在这个阶段的理解如果放在 APP 上,那就是要实现 APP 在不同设备 (硬件平台、分辨率) 能够正常使用,在这个阶段,我其实是陷入困境的,因为要能正常使用,那不是功能测试吗?

第二个阶段:经过一段时间的了解,找到了 APP 兼容性测试和浏览器兼容测试的区别,这里分为 2 个层面:

基础层面:APP 兼容性测试主要实现在不同的设备上可以正常:安装 (覆盖安装)、启动、运行、卸载

进阶层面:运行过程中捕获异常日志信息、启动时间、CPU、内存、流量、截图

所有这里我总结一个兼容性测试的公式:

兼容性测试=(安装 + 启动 + 运行 + 卸载 + 异常日志 + 启动时间 +CPU+ 内存 + 流量 + 截图)* N 台手机

兼容性测试基础

以上我们描述了兼容性测试所需要实现的功能,这些功能的实现有 2 种方式,第一种是 adb,第二种就是使用第三方开源软件,接下来我先介绍 adb 的一些基础方法:

设备获取:adb devices

安装 APP:adb -s 设备 ID install -r APK 包

adb -s 5276e0a3 install -r K 米_4.6.6.apk

启动:adb -s 设备 ID shell am start -W -n launchable-activity

运行:adb -s 5276e0a3 shell monkey -p com.evideo.MobileKTV --pct-touch 45 --pct-motion 20 --pct-trackball 5 --pct-nav 1 --pct-appswitch 20 --pct-flip 6 --throttle 50 -s 10 -v 3000

卸载:adb -s 设备 ID uninstall APP 包名

日志:adb -s 设备 ID logcat

启动时间:APP 在启动的时候有对应的启动时间

截图:adb -s 5276e0a3 shell /system/bin/screencap -p 设备保存位置

CPU、内存、流量,我使用的是腾讯开源的 GT,官网 (http://gt.tencent.com) 有详细的说明,这里不展开。

以上是要进行兼容性测试的基础知识,如果你想继续往下走,这些基础你必须先掌握。
** 兼容性测试详细过 ** 程

我先详细说明兼容性测试的详细过程,然后再描述每个过程的实现方法:

  1. 屏幕解锁;
  2. 设备连接;
  3. 安装 APK;
  4. 启动 APP;
  5. 启动 logcat;
  6. 启动 GT 抓取性能数据;
  7. 运行 APP;
  8. 控件遍历;
  9. 停止 GT;
  10. 停止 logcat;
  11. 卸载 APP;

1、屏幕解锁实现

笔者使用的是 APPium 官方开源的 unlock_apk(https://github.com/appium/unlock_apk\)

调用方法:

adb shell am start -n io.appium.unlock/.Unlock

说明:屏幕解锁其实可以换一种方式,那就是在设置中配置为不锁屏

2、设备连接

$ adb devices

说明:在安装前先确认下设备的连接情况

3、安装 APK

$ adb -s 设备ID  install -r APK包

说明:

-s 指定设备,在多设备的情况下是非常有用的;

-r 强制安装

4、启动 APP

$ adb -s 设备ID  shell am start -W -n  launchable-activity

说明:

launchable-activity 的获取,通过aapt* d badging APK 包,通过 aapt 还可以获取:*

packagename

versionCode

versionName

platformBuildVersionName

install-location

sdkVersion

targetSdkVersion

5、启动 logcat

$ adb -s 设备ID logcat -v time -f logcat保存路径

说明:启动 logcat 有 4 个过程

a、删除 logcat 的保存路径:adb -s 设备 ID shell rm logcat 保存路径

b、清理已经存在的日志:adb logcat -c

c、将日志输出到文件:adb logcat -f 文件名

d、获取返回的进程 id:通过执行 cmd 命令返回

6、启动 GT 抓取性能数据

说明:这个有 6 个过程

a、启动 GT:

adb -s 设备 ID shell am start -W -n com.tencent.wstt.gt/.activity.GTMainActivity

b、运行被测应用:

adb -s 设备ID shell am broadcast -a  com.tencent.wstt.gt.baseCommand.startTest --es pkgName 被测应用程序包名

c、勾选 CPU:

adb -s 设备ID shell am broadcast -a  com.tencent.wstt.gt.baseCommand.
sampleData --ei cpu 1

d、勾选内存:

adb -s 设备ID shell am broadcast -a  com.tencent.wstt.gt.baseCommand.
sampleData --ei pss 1

e、勾选流量:

adb -s 设备ID shell am broadcast -a  com.tencent.wstt.gt.baseCommand.
sampleData --ei net 1

f、电量采集:

adb -s 设备ID shell am broadcast -a  com.tencent.wstt.gt
plugin.battery.startTest --ei refreshRate 250 --ei brightness 100 --ez T true

7、运行 APP

monkey 进行随机点击;

8、控件遍历

运行 APP 部分和控件遍历部分,笔者使用了 3 中方式:

monkeyrunner 进行控件遍历;

UiAutomator 进行控件遍历;

上面的每一种方式都值得深入的研究,后面会细致的讲解这 3 个模块。

9、停止 GT

adb -s 设备ID shell am broadcast -a  com.tencent.wstt.gt.baseCommand.
endTest --es saveFolderName 报告保存路径
10、停止logcat
*说明:*
a、根据获取的PID,执行kill操作
b、拉取设备上的日志文件:adb -s 设备ID pull /sdcard/GT/GW/com.tencent.mobileqq/7.0.0/temp report/9f2f8b26-35d4-4a3e-b944-83da8b1552d5/OPPO_R7c/GT_Report

11、卸载 APP

$ adb -s 设备ID uninstall APP包名

以上就是一个完整的兼容性测试过程,该过程所有的操作都是通过 python 调用实现,今天就先写到这里,后续将持续输出更加精彩的内容。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 18 条回复 时间 点赞

讲的很详细

—— 来自 TesterHome 官方 安卓客户端

既然是兼容性测试有考虑过国内生态设备的差异么,比如小米系列手机要弹框手工确认什么的,OPPO 第一次运行有 GPS 权限的也会弹框要手工,很多都不是一把 adb 就能搞定的怎么办

AppetizerIO 回复

赞同,不同的厂商诧异真的挺大的。

adb 命令总结挺详细的👍 👍

AppetizerIO 回复

以下是我对小米手机安装的提示的处理方案,你参考下。

if cmd.find('install') >= 0:  # 小米手机安装提示未知的PC工具
    if os.system(oscmd) == 0:
        root_logger.info('发现安装提示,执行命令'+'adb -s %s shell uiautomator runtest TestDemo.jar -c Install > nul' % str(serialname[0]))
        create_process('adb -s %s shell uiautomator runtest TestDemo.jar -c Install ' % str(serialname[0]))

AppetizerIO 回复

我用的是 UiAutomator 进行处理的,有一个思路你参考下:不要尝试用一个工具,例如 adb 处理所有的问题,可以借助其他工具协助,让每个工具发挥最大的价值。

遍历测试过程中 gt 被系统杀掉,楼主遇到过吗? 然后是怎么处理的?

logcat -v 抓取到的 logcat 只有部分内容,这个楼主遇到过吗?

其实我也是在开发平台的,你这里写的我觉得还有些补充。
1.手机初始化操作,比如检查手机环境
2.安装 apk,不同的手机会有不同的安装点击事件,比如 oppo 这个坑爹的手机,要输帐号密码😂 😂
3.开关 wifi
4.日志过滤规则
5.最后还原环境的时候需要做一些删除缓存,还有关 wifi
PS:最近想做遍历测试,估计一堆坑,我还不敢往里面踩,如楼主有更好的方法可以再写个分享么?

0x88 回复

感谢提出一些建设性的建议:
1、oppo 手机没有碰见你说的问题,我的思路是:不要让自动化去做这些复杂的操作,如果能通过哪些开关能关闭不就是最好的解决方案?
2、没有太理解你说的检查手机环境

关注:K 米测试 公众号,遍历测试会在接下来的几期中进行分享。

K米测试 回复

1、oppo 只是举个例子,国内还有各大恶心厂商的各种定制,让你我欲仙欲死。我不知道你的平台手机有多大规模,我这边已经有 150 台左右的机器,整得我生不如死。
2、那个手机初始化环境是,你可能会安装一些测试用的 APK,需要检测 APK 的安装情况,或者 wifi,又或者是有没有 monkey 脚本/自动化脚本在执行,由于我代码能不太行,所以程序经常会挂掉,所以我还做了结束所有测试任务的初台化😂

请问 还有继续的更新吗?不知是否会开源在 github 上?谢谢

—— 来自 TesterHome 官方 安卓客户端

这个性能数据的详细程度有多少?还没使用过 GT

K米测试 回复

请教一下,cmd.find('install') 这个是用到哪个第三方工具么?

rockyrock 回复

会继续更新

小弥勒 回复

建议自己先了解下

不知道楼主是否方便回答。本人没有撘 stf 的经验。就想问下,adb 这些是命令行操作吧?是用 node.js 来调用吗

蓝畔湖光 回复

是用 python 来调用的,node.js 也可以调用,stf 就是直接用 node.js 调用的,原理是一样的。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册