目录:
- app测试体系
- app项目测试流程
- app结构讲解
- app测试设计思路
- app常见bug解析
- 常用模拟器使用
- android开发者选项
- 安装mumu模拟器
- adb命令介绍
- adb环境搭建与配置
- adb与设备交互
- adb安装卸载应用
- adb命令启动页面
- adb命令清缓存
- adb文件传输
- adb日志操作
- adb命令操作Android设备
- 安装配置adb
- adb模拟按键操作
- adb性能分析
- app压力测试
- app压力测试示例
1.app测试体系
App 测试概念:
- App 测试是软件测试的一部分
- 是针对 App 应用的一类测试
App 测试的价值:
- 避免漏洞
- 保障性能
- 保障用户体验
App 产品架构:
App 测试的学习路线:
@startmindmap
skin rose
* App 测试方法与技术
** App 项目测试流程
** App 结构讲解
** App 测试设计思路
** App 常见 Bug 解析
** 常用模拟器使用
** Android 开发者选项
** adb 常用命令
*** adb 命令介绍
*** adb 环境搭建与配置
*** adb 与设备交互
*** adb 安装卸载应用
*** adb 文件传输
*** adb 日志操作
*** adb 模拟按键操作
*** adb 性能分析
** app 压力测试
@endmindmap
2.app项目测试流程
需求分析:这一步涉及对项目需求进行仔细的分析和理解。这包括了解项目的目标、功能需求、非功能需求以及项目背景等。这个阶段的目标是确定测试范围、测试环境、测试策略以及测试数据。
测试计划编写:在这个阶段,测试团队将制定一个详细的测试计划。测试计划应该包括测试的目标、范围、进度、预算、风险和测试策略。
测试用例设计:在这个阶段,测试人员将根据需求文档和产品代码设计测试用例。测试用例包括测试步骤、预期结果和回归标准。通常使用测试用例管理工具(如Jira、TestRail等)来管理测试用例。
测试用例评审:对测试用例进行审查和评估的过程。测试用例评审通常由测试团队进行,也可以邀请开发团队、产品经理等相关人员参与。通过测试用例评审,可以确保测试用例的质量和可靠性,从而提高测试效率和准确性。
用例执行:测试人员根据测试计划和测试用例执行测试。这通常包括功能测试、性能测试、安全测试、兼容性测试等。
回归测试:回归测试是确保新的代码没有破坏已有的功能。在每个代码提交或代码变更之后,测试团队都会执行回归测试,以确保新的代码没有影响到已有的功能。
非功能测试:除了功能测试,还可以进行性能测试、安全测试、可用性测试、可靠性测试等。这些测试可以帮助确保应用程序在各个方面都符合要求。
走查验收(UI、产品):在所有测试都通过后,测试团队会对应用程序进行走查,以确保没有遗漏的测试,并且应用程序符合需求。
测试总结报告:在测试结束后,测试团队会编写一个详细的测试总结报告,其中包括测试结果、测试总结、问题和建议。
灰度发布:灰度发布是指将新版本的应用程序部署到部分用户环境中,进行真实的用户测试,以便收集反馈和改进应用程序。
上线:当所有测试都通过后,应用程序可以上线到公共环境中,让更多的用户使用它。
3.app结构讲解
apk 包结构:
什么是 apk?
- 全称:Android application package(Android应用程序包)
- 安装在安卓设备上的软件
- APK 文件基于ZIP文件格式. 后缀名被修改为apk
apk 包结构:
- lib/ :这个目录包含了应用程序的共享库文件,也称为动态链接库(Dynamic Link Library,DLL)。这些库是应用程序的核心组件,可以与其他应用程序共享,以提高性能和资源利用率。
- res/:这个目录包含了应用程序的资源文件,包括图像、音频、布局文件等。应用程序可以使用这些资源来展示内容、响应用户事件等。
- assets/:这个目录包含了应用程序的静态资源文件,通常是一些二进制文件(如图片、音频、视频等)。这些资源文件可以在应用程序运行时被读取,但不会在应用程序安装时被复制到应用程序的包中。
- classes(n).dex:这个文件是应用程序的字节码文件,通常是一个.dex文件,它是Android虚拟机(Dalvik或ART)可以执行的二进制文件。应用程序的Java源代码会被编译成.dex文件,以便在运行时被虚拟机执行。
- resources.arsc:这个文件包含了应用程序的资源文件,包括字符串、颜色、布局等。这些资源文件可以被读取和修改,以便应用程序可以根据需要进行定制和个性化。
- AndroidManifest.xml:这个文件是应用程序的清单文件,包含了应用程序的元数据信息,如应用程序的名称、版本号、权限等。此外,它还描述了应用程序的组件(如活动、服务、广播接收器等)及其之间的关系,以便应用程序可以正确地启动和运行。
app 分类:
- Native App:原生 app 手机应用程序:Native App是指使用本机开发语言(如Java或C++)开发的手机应用程序,直接运行在操作系统层面,具有完整的系统级功能和性能。原生应用程序通常具有完整的用户界面,与操作系统紧密集成,并可以使用系统提供的各种API和功能。
- Hybrid App:混合型 app 手机应用程序:Hybrid App是指使用Web技术(如HTML5、CSS3和JavaScript)开发的手机应用程序,通过浏览器引擎来渲染页面,并使用JavaScript框架(如React Native、Flutter等)来控制应用程序的逻辑和交互。混合型应用程序可以在一定程度上利用浏览器的性能和功能,同时提供类似于原生应用程序的用户界面和体验。
- Web App:基于 Web 的 app 手机应用程序:Web App是指使用Web技术开发的手机应用程序,通常是通过在移动浏览器中运行网页来实现功能。Web应用程序可以通过JavaScript框架(如React Native、Flutter等)来增强性能和交互性,同时可以利用Web技术的成熟和易用性。
app 页面结构:
Native App
- Activity
- Window
- View
- ViewGroup
查看界面元素:
- 工具
- uiautomatorviewer
- weditor
- appium
元素属性:
4.app测试设计思路
5.app常见bug解析
略~
6.常用模拟器使用
略~
7.android开发者选项
- 开启开发者选项
- 不锁定屏幕
- USB 调试
- 选择模拟位置信息应用
- 显示触摸操作
- 指针位置
- 调试 GPU 过渡绘制
- 显示所有“应用程序无响应”
8.安装mumu模拟器
略~
9.adb命令介绍
ADB(Android Debug Bridge)是Android平台上的调试工具,它是一个命令行工具,用于与运行Android操作系统的设备进行通信和交互。通过ADB,开发人员可以在计算机上与Android设备进行调试、安装、更新应用程序、执行命令等操作。
adb 简介:
- Android Debug Bridge(Android 调试桥)简称 adb
- Android sdk 中提供的用于管理模拟器或真机状态的工具
- 命令行工具
adb 操作手机设备:
- 打开应用
adb shell am start -n com.tencent.wework/.launch.LaunchSplashActivity
- 传输文件
- 点击,输入,滑动等
- 硬件操作 返回,回到首页
- 性能指标
adb 工作原理:
- 采用了客户端-服务器(C/S)模型,包括三个部分:
- 客户端 client
- 服务端 server
- 守护进程 daemon
10.adb环境搭建与配置
略~
11.adb与设备交互
连接模拟器(mumu 为例):
- windows:
adb connect 127.0.0.1:7555
adb devices
- mac:
adb kill-server
adb devices
连接真机(android 手机)设备
- 手机端:让手机处于一个调试模式
- 电脑端安装手机驱动(安装豌豆荚)
查看手机状态
adb devices
adb get-state
设备状态种类
- device 正常
- offline 连接出现异常,设备无响应
- unauthorized 未授权
12.adb安装卸载应用
adb 命令格式:
- 格式 :
adb [-d|-e|-s <serialNumber>]<command>
- -d 指定当前唯一通过 Usb 连接的 android 设备为命令目标
- -e 指定当前唯一运行的模拟器为命令目标
- -s 指定相应的设备为命令目标
安装:
- 普通安装
adb install <apk路径>
- 覆盖安装/替代安装
adb install -r <apk路径>
卸载:
- 卸载应用
adb uninstall 包名
- 卸载应用(不删除配置文件,保存数据缓存信息)
adb uninstall -k 包名
13.adb命令启动页面
包和 Activity(活动页)的概念:
- package 包:是 Android 应用的唯一标志
- Activity 活动页: Android 应用页面,一个页面就是一个 Activity
获取当前的页面名:
- 1、打开手机 app 应用的某个页面
- 2、打开命令行工具
- 执行命令:
adb shell "dumpsys window | grep mCurrentFocus"
- 执行命令:
获取启动页面的 activity:
- 命令:
- mac:
adb logcat ActivityManager:I | grep "cmp"
- win:
adb logcat ActivityManager:I | findstr "cmp"
- mac:
启动页面:
- 命令:
adb shell am start -n <包名>/<avticity名>
14.adb命令清缓存
adb shell 应用 1
- 查看目录结构:
adb shell ls
- 查看系统当前日期:
adb shell date
- 查看系统 CPU 使用情况:
adb shell cat /proc/cpuinfo
- 查看系统内存使用情况:
adb shell cat /proc/meminfo
adb shell 应用 2 - 查看应用列表
- 显示所有应用:
adb shell pm list packages
- 显示系统自带应用:
adb shell pm list packages -s
- 显示第 3 方应用:
adb shell pm list packages -3
adb shell 应用 3 - 查看当前的页面名
adb shell "dumpsys window |grep mCurrentFocus"
清除应用数据及缓存
adb shell pm clear <包名>
15.adb文件传输:
adb push 电脑路径 设备路径
adb pull 设备路径 电脑路径
16.adb日志操作:
日志的级别:
- V — 明细 verbose(最低优先级)
- D — 调试 debug
- I — 信息 info
- W — 警告 warn
- E — 错误 error
- F — 严重错误 fatal
- S — 无记载 silent(最高优先级,绝不会输出任何内容)
adb 命令查看日志:
- adb logcat
查看日志常用的参数:
- adb logcat --help
- adb logcat [TAG:LEVEL ] [TAG:LEVEL ] ...
- adb logcat 打印默认日志数据
- adb logcat -v time 打印时间
- adb logcat -v color 使用不同的颜色来显示每个优先级
- adb logcat -f <filename> 将日志输出到文件
- adb logcat > log.log 保存日志到PC上
- adb logcat -c 清理已存在的日志
根据条件过滤日志:
- adb logcat -v time "*:W" 打印 Warning 及以上级别的日志
- adb logcat ActivityManager:D '*:S' 过滤tag 为ActivityManager,level为Debug及以上级别的日志
17.adb命令操作Android设备:
略~
18.安装配置adb
略~
19.adb模拟按键操作
adb 模拟手机按键:
- 1、打开【指针位置】设置(看坐标)
- 2、执行
adb shell input
命令
模拟点击事件
adb shell input tap x坐标 y坐标
模拟输入事件
adb shell input text <输入内容>
模拟滑动事件
adb shell swipe <起点x> <起点y> <终点x> <终点y> <滑动时长>
模拟手机按键
- 返回键:
adb shell input keyevent 4
- Home 键:
adb shell input keyevent 3
(置应用于后台运行) - 音量放大:
adb shell input keyevent 24
- 音量缩小:
adb shell input keyevent 25
https://developer.android.com/reference/android/view/KeyEvent
20.adb性能分析
专项测试:(用户维度)
- 崩溃(Crash,弱网)
- 卡顿(掉帧、gc、cpu)
- 响应慢(启动时间、交互响应、H5加载)
- 发热(cpu,mem、ioi network、gps等硬件使用)
- 掉电快(硬件占用)
- 兼容性问题(机型覆盖、回归)
专项测试:(技术维度):
- 崩溃:自动遍历、monkey测试、横竖屏切换、快速进退。
- 卡顿(掉帧、gc、cpu):卡顿测试、内存泄漏测试、method profile。
- 响应慢(启动时间、交互响应、H5加载):冷热启动、界面切换、h5性能测试
- 发热(cpu,mem、io、network、gps等硬件使用): method profile、gc统计、io统计、流量统计、硬件使用统计、耗电量分析。
- 兼容性问题(机型覆盖、回归):兼容性测试、自动化测试、自动遍历、monkey测试
app启动性能指标:
- 冷启动:是指app在首次安装后,需要重新加载所有数据和功能。
- 暖启动:是指app在首次启动后,需要等待一段时间,加载部分数据和功能,以减少初始加载时间。
- 热启动:是指app在启动后,能够快速响应用户的操作,如点击按钮或加载数据等。
- 首屏启动:是指app在冷启动或暖启动后,能够快速响应用户的操作,并在第一时间内显示完整的内容和功能。
建议时间(没啥意义,看你的软件具体情况具体分析):
- 冷启动需要5秒或更长时间。
- 热启动需要2秒或更长时间。
- 热启动需要1.5秒或更长时间。
主要方法思路:
- adb logcat(不咋准确)
- 录屏+视频拆帧(常用)
- uiautomator等自动化工具200ms巡检界面变化
- traceview
- 硬埋点 (开发人员配合)
使用adb logcat
package=com.xueqiu.android(定义临时变量),清理缓存数据: adb shell pm clear $package
停止进程: adb shell am force-stop $package
启动app: adb shell am start -S-W $package/.view.WelcomeActivityAlias
获取数据: adb logcat l grep -i displayed
adb logcat结果
- startTime:记录刚准备调用startActivityAndWait()的时间点
- endTime:记录startA无识别结果IndWait()函数调用返回的时间点
- WaitTime: startActivityAndWait()调用耗时 (WaitTime = endTime - startTime。)
使用ffmpeg拆针:
- adb shell am force-stop $package
- adb shell screenrecord --bugreport --time-limit 30 /data/local/tmp/xueqiu.mp4 &
- adb shell am start -S-W $package/.view.WelcomeActivityAliaswait
- adb pull /data/local/tmp/xueqiu.mp4 .ffmpeg -i xueqiu.mp4 xueqiu.gif
- ffmpeg -i xueqiu.mp4 -r 10 frames_%03d.jpg
CPU 使用情况:
- 查看当前系统 CPU 使用情况:
adb shell dumpsys cpuinfo
内存使用情况:
- 查看当前系统的内存:
adb shell dumpsys meminfo
- 查看某个应用的内存:
adb shell dumpsys meminfo <应用名>
top 命令:
adb shell top
adb shell top |grep "包名"
查看某个包的一些性能指标adb shell top -d 1 |grep "包名"
电池电量:
- 命令:
adb shell dumpsys battery
性能相关的具体用法:
- 官网: https://developer.android.com/docs
21.app压力测试
- Monkey 是 Google 提供的一个用于稳定性与压力测试的命令行工具
- 可以运行在模拟器或者实际设备中
- 它向系统发送伪随机的用户事件对软件进行稳定性与压力测试
为什么要用 Monkey
- Monkey 就是像猴子一样上蹿下跳地乱点
- 为了测试软件的稳定性,健壮性
- 随机点击比顺序点击更容易发现问题
Monkey 基本用法
- 在命令提示符中输入
adb devices
查看有无连接的设备 - 确认有设备连接
- 获取 app 的包名
adb shell monkey [参数] {随机发送事件数}
- 最简单的 monkey 命令:
adb shell monkey 100
Monkey 常用选项
-v
:用于指定反馈信息级别,总共分 3 个级别adb shell monkey -v -v -v 10
-s <seednumber>
:用于指定伪随机数生成器的 seed(种子)值adb shell monkey -s 123 10
--throttle <milliseconds>
:每个事件结束后的间隔时间adb shell monkey --throttle 300 10
-p
: 用于约束限制,用此参数指定一个或多个包adb shell monkey -p com.android.browser 10
--ignore-crashes
:忽略崩溃--ignore-timeouts
:忽略超时--ignore-security-exceptions
:忽略安全异常--ignore-native-crashes
:忽略本地代码导致的崩溃异常--monitor-native-crashes
:跟踪本地方法的崩溃问题
Monkey 事件选项
--pct-touch
:触摸事件--pct-motion
:滑动事件--pct-appswitch
:activity 之间的切换--pct-pinchzoom
:缩放事件--pct-rotation
:屏幕旋转事件--pct-flip
:键盘事件--pct-anyevent
:任意事件- 注意:所有类型属性比例加起来不能超过 100
雪球 app 压力测试实战
- 确定测试 app 的包名:
adb shell dumpsys activity | findstr mFocusedActivity
- 执行 8 小时:
需要跑的时间/命令之间的时间间隔=要执行的次数 8*60*60*1000/300 = 96000
- 日志级别:3 个 v
- 确定雪球中常用的操作类型和比例:滑动、触摸、键盘、系统按键、activity切换
- 确定 seed 值:
-s 12345
- 确定调试选项:
--ignore-crashes --ignore-timeouts --ignore-security-exceptions
- 重定向日志到文件中
>
adb shell monkey -p com.xueqiu.android --pct-touch 30 --pct-motion 30
--pct-syskeys 10 --pct-appswitch 20 --pct-flip 5 --pct-anyevent 5
-s 12345 --throttle 300 --ignore-crashes --ignore-timeouts
--ignore-security-exceptions -v -v -v 200 > monkey_log.txt
22.app压力测试示例
略~