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

K米测试 · May 17, 2017 · Last by K米测试 replied at September 24, 2017 · 2971 hits

从 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:最近想做遍历测试,估计一堆坑,我还不敢往里面踩,如楼主有更好的方法可以再写个分享么?

K米测试 #10 · June 21, 2017 Author
0x88 回复

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

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

K米测试 回复

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

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

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

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

K米测试 回复

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

K米测试 #15 · July 19, 2017 Author
rockyrock 回复

会继续更新

K米测试 #16 · July 19, 2017 Author
小弥勒 回复

建议自己先了解下

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

蓝畔湖光 回复

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

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up