移动APP测试

首先搭建android-sdk环境

1.搭建安卓环境,首先确保java环境ok。

2.下载android sdk

文件后,解压 android sdk,进入到文件里面,可以看到如下的截图:

 

 

 3.打开SDK Manage.exe,点击Tools下拉框,选择Options,设置代理,要不无法下载API,见如下的截图:

 

 

 

4.在环境中,新创建

ANDROID_HOME,放sdk的目录,见截图:

 

 

 5.设置好ANDROID_HOME好后,在path环境变量中加入:%ANDROID_HOME%\platform-tools 、%ANDROID_HOME%\tools打开新的cmd,输入android -h,见到如下截图,说明android环境设置成功。

一.兼容性测试【原生APP】

1.WEB

需要考虑WEB产品在不同浏览器上的⻚⾯兼容以及前端样式的展示

WEB:EDGE,Chrome,Firefox,苹果浏览器

移动互联网:UC浏览器,QQ浏览器

2.APP

2.1操作系统

需要考虑APP在主流平台上的页面展示和样式的加载,目前考虑的主流平台主要是Android和IOS的平台

2.2分辨率

不管是什么平台,都会存在不同的分辨率的展示,比如就拿苹果手机来说,它存在iphone7至到iphone14,当然这仅仅是IOS的平台,还需要考虑Android平台的兼容性的测试,主流的分辨率主要可以总结为如下部分: android 800x480, 960x640,1280720(720p),1920*1080(1080p),25601440(2k) 在实际的企业里面,具体根据用户使用的手机来测试应用程序在不同分辨率下的展示情况,总之主流的核心手机分辨率都是需要来进行测试的。

2.3不同厂家

国内很多的厂商都对Android进行了二次改造,形成了各种不同的手机操作系统,其实本质上还是在Android的基础上进行二次的改造和开发,核心的东西还是属于Android,只不过在人家的基础上新增了一层自己的应用程序,这些不同主流的平台都需要来进行测试,核心主流的平台主要总结为如下: 小米 华为 vivo/opp 阿里云os

2.4网络类型

移动互联网产品相比PC互联网产品,有一个特点是前者使用的网络比较多样,除了Wif之外,很多时候是在移动网络下使用的,移动网络遇到的情况又比较复杂,比如地铁、隧道、体育场等。所以网络不稳定的情况是比较容易发生的,很多情况下App的一些问题是在复杂的网络情况下才会暴露,与其让用户发现和投诉这些问题,不如我们在测试阶段尽量模拟这样的网络情况,及早发现和修复这些问题。 ​ 因为移动产品已经是非常普遍的,所以就需要测试一个APP在不同网络下资源的加载情况,这些不同的网络主要可以总结为如下的几点: wifi 2G(2G基本已经使用的非常少了) 3G 4G 5G 需要将网络连接不上、无网络、企业服务器错误等各种情况予以考虑并进行细化的测试。建议: 网络不稳定,没有的到服务器的反馈-->提示“网络不稳定,请稍后再试”。 网络没有连接-->提示“网络目前没有连接,请重新连接网络之后再尝试”。 企业服务器或者第三方服务因未知原因出错-->提示“目前无法接收相关数据,我们正在调查,请稍后再试”。

(1)h5小程序类型:

如何测试APP在不同手机的情况

1.以h5都是小程序,网址:m.taobao.com、m.baidu.com...

2.在浏览器打开勾选手机标识,选择机型、分辨率,可以自主增加机型测试。

 

 

如何测试弱网络

为了看不同网络情况下的加载响应时间

(2).小程序

打开微信小程序/支付宝小程序 点

二.功能测试点

1.用户使用习惯
2.权限问题
3.硬件问题

比如双卡双待、摄像头、GPU等。 操作习惯 用户常用的有菜单键、Home键、返回键、Home键长按(显示当前进程列表)、调整音量、待机等。相应的作为测试工程师我们需要考虑的项就变成了:

应用中的Back键的事件是否重写了?在各个功能界面中点击Back键会有什么反馈?

用户在应用各个界面点击Home键之后,再次打开应用的反馈:应用是默认处于后台的状态还是有结束生命周期。

应用是否使用到菜单键,切不可遗漏这个按键和应用的交互。

应用在任何状态下,系统进入待机或者关机。当系统被重新唤醒后,应用处于什么状态,是否有正确的反馈。

应用进程被用户手动关闭之后,是否可以再次正确启动。

4.数据移动

用户会在软件没有响应或者出现重大缺陷时,点击强制停止按钮。或者在手机变卡后选择清空数据来是否自己机器的空间。

5.安装、卸载测试

用户安装方式主要有:

使用adb install <package name>进行安装;

使用第三方软件(比如豌豆荚、91助手等)安装;

将应用先下载到SD卡中再进行安装;

一部分数据量大的Android应用(一般是游戏)会采用小体积的应用安装,之后通过在线下载数据的方式使用。

应用安装之后,还要重点查看以下几点

不联网的情况下是否能正常运行,会不会崩溃

在线下载数据不完整,能否再次启动 是否支持断点续传(主要指的数据上传)

下载完整之后,再次启动。 安装成功后,检查版本号以及相关数据。

6.升级测试

升级应用必要条件:旧版本应用和新版本应用拥有相同的签名、包名,有一个标示符(比如版本号)来区分。

4.6.1 增量升级

增量升级也叫做差分升级(Smart APP update)。 优点:用户不必再下载一个完整的Apk进行安装。 缺点:不需对发布的所有旧版本和最新版本做差分,很麻烦;如果一部分系统没有拿到内置应用的权限,那么就没有办法进行增量升级。

4.6.2 内置应用升级

注意每次升级之后的应用是否与内置在系统中的.os文件匹配,如不匹配则会直接导致应用崩溃。 升级测试场景还有很多,以后再做补充。应用升级并非仅仅检查新功能或做冒烟测试,更多的是去了解升级的原理,升级到底更改了哪些文件,而这些文件又影响力哪些功能和数据库,找到这些问题的答案才能有针对性的进行全面的测试。

(另外)发布的测试android/IOS:

1.android:

开发打包(.apk)的文件,上传到应用商店(主流的应用商店),发布

2.IOS:

1、把自己手机的唯一序列号告诉开发 2、在自己的手机上安装testflight 3、开发把被测试的APP发布后,然后测试就可以在testflight中下载开发发布的被测试的app

三.APP稳定性测试

在保证基本功能正确基础之上,App的稳定性就显得非常重要,如果一个App经常出现闪退或者卡死,那么用户体验就会受到很大伤害,在有其他竞争产品的情况下很容易造成用户的流失。

稳定性测试的概念有2种

一, 稳定性测试,对应于异常性测试,即发生异常情况时,系统如何反应的测试。包含:   

1 交互性测试,被打扰的情况,如来电,短信,低电量等。这些其实在上章的功能测试中有提到。   

2 异常性测试,断网,断电,服务器异常等情况

二,稳定性测试指的是性能测试,压力测试   

1 基准性能测试,通过压服务器端口及客户端在不同网络环境下响应速度   

2 大数据测试,在特定环境下,客户端一次性更新大量数据及人员列表

四.性能测试

普遍的apk性能测试,主要是以下七类

1、响应

2、内存

3、cpu

4、FPS (app使用的流畅度)

5、GPU过度渲染

6、耗电

7、耗流

五.adb命令

adb,即 Android Debug Bridge,它是 Android 开发/测试人员的强大工具。它是一种可以用来操作手机设备或模拟器的命令行工具。它存在于 sdk/platform-tools 目录下。虽然现在 Android Studio 已经将大部分 adb 命令以图形化的形式实现了。

操作:

1.数据线连接手机和电脑

2.打开开发者权限

打开设置,搜索关于手机,在关于手机中点击7次,系统管理里边到开发者选项,开启开发者选项中的USB调试,然后再到cmd中输入adbdevices,显示如下表示连接成功

3.安装从开发给的apk文件到手机

安装命令:adb install weibo.apk

下载apk文件到桌面,在cmd里边进入桌面(cd ....),输入安装命令:adb install weibo.apk

手机上安装成功。

4.查看安装的程序包名(package):(以weibo为例)

查看包命令:adb shell am monitor

第一种方式:在cmd输入命令:adb shell am monitor

再在手机上打开微博

第二种方式:打开手机上安装好的weibo,在cmd输入命令:adb shell dumpsys window | findstr mCurrentFocus

 

5.查看安装的所有手机安装包名:

查看所有命令:pm list packages

打开cmd,输入命令:adb shell ,继续输入命令:pm list packages

6.删除安装的程序

删除命令:adb uninstall 包名(package)

打开cmd输入命令:adb uninstall 包名(package) (以weibo为例:adb logcat | findstr com.sina.weibo)

  

7.查看日志(所有的)

命令:adb logcat

在cmd输入命令:adb logcat

8.查看某个app的日志

查看某个app命令:adb logcat | findstr package

在cmd输入命令:adb logcat | findstr package (以weibo为例:adb logcat | findstr com.sina.weibo)

【面试:如果一个app出现奔溃,如何反馈给开发呢?】

答:打开cmd 执行命令:adb logcat | findstr package,过滤出这个app的日志,再次操作app会出现奔溃情况,同时也会有错误日志,截图提交给开发。

9.查看分辨率

在cmd上输入命令:adb shell wm size

10.显示设备的cpu和内存信息

adb shell cat /proc/cpuinfo # 显示设备的CPU信息 adb shell cat /proc/meminfo # 显示设备的内存使用情况

11.获取应用程序PID

先查看应用程序包名:adb shell am monitor

第一种:adb shell ps | findstr pakcage (adb shell ps | findstr com.singa.weibo)

打开cmd输入adb shell ,继续输入adb shell ps | findstr pakcage (adb shell ps | findstr com.sina.weibo)

第二种:adb shell top

 

第三种:先进入adb shell ,继续输入logcat ps | grep com.taobao.taobao(包名)

adb shell

logcat ps | grep com.sina.weibo(包名)

12.安卓端文件到Pc端

adb pull [android端文件名] [PC本地路径]

adb shell 进入环境(Linux),ls 查看文件夹,比如进入etc文件夹(cd etc),pwd查看当前路径。然后比如上传hosts文件到自己本地的G:\:adb pull /etc/hosts G:\

 

13.pc端文件到安卓端

adb push [PC端文件名] [android 端路径]

把电脑的文件上传到手机里边:adb push 路径/文件 /var/

 

14.把测试过程中的日志文件写到记事本中

adb shell logcat -v time >log.txt

adb的命令汇总如下:

adb devices # 显示当前连接的 adb 设备,会打印设备的序列号及其对应的状态

adb shell # 进⼊ Android 系统的 shell 模式(Linux的命令环境,excit是退出)

adb -s [系列号] shell # 指定机器进⼊它的 shell 模式,*在 PC 连接多台 Android 设备时常会⽤到

adb root # 切换到 root ⽤户 adb remount # 重新挂载,需要在 root 后执⾏,执⾏后可写 system 分区

adb logcat -c # 清除 log 缓存

adb logcat # 打印机器 log ⽇志

adb logcat > [PC本地⽂件名] # 读取机器的 log 并将 log 保存到指定的 PC ⽂件中

adb install [APK路径]: adb install -r [APK路径]:

adb uninstall [应⽤包名]: adb pull [android端⽂件名] [PC本地路径]

adb push [PC端⽂件名] [android 端路径]

adb shell wm size # 查看屏幕分辨率

adb shell am start -n [包名]/[Activity名] # 启动指定的 Activity,这⾥ Activity名是包括包名在内的

adb shell am startservice [包名]/[Service名] # 启动指定的 Service,这⾥ Service也包括包名

adb shell am broadcast -a [⼴播action] # 发送指定 action 的⼴播

adb shell pm list packages # 显示设备⾥⾯所有应⽤的包名

adb shell service list # 显示当前运⾏的系统服务

adb shell dumpsys activity top # 显示当前最前端的 Activity

adb shell cat /proc/cpuinfo # 显示设备的CPU信息

adb shell cat /proc/meminfo # 显示设备的内存使⽤情况

五.常用错误日志信息

查看日志(所有的)

在cmd输入命令:adb logcat

查看某个app的日志

在cmd输入命令:adb logcat | findstr package (以weibo为例:adb logcat | findstr com.sina.weibo)

错误日志:

空指针:nullpointException

数组越界:ArrayIndexoutof boundsException

多次启动线程:illegalThreadstateException

数字格式化问题 :java.lang.NumberFormatException

内存溢出:java.lang.OutOfMemoryError

Crash > AndroidRuntime > Exception>Error 的顺序逐个搜索。

crash崩溃 crash,即崩溃,anr是crash的⼀种。在程序中可能会出现你未捕获到的异常,这就造成了崩溃。

六.monkey

(一)monkey启动

monkey启动方式相对而言是非常简单的,手机连接到电脑上,就可以开始启动操作。

启动的命令是:adb shell monkey

查询monkey的pid,获取应用程序的pid

adb shell ps | findstr monkey

杀死进程

adb shell kill pid

简单的monkey命令:

adb shell monkey -v 10 ---->10条随机事件

(二)monkey对app做测试

第1步,运行程序

针对app进行各种操作批处理,执行命令

adb shell monkey -p com.sina.weibo(更改包名) --pct-touch 40 --pct-motion 25 --pct-appswitch 10 --pct-rotation 5 -s 12358 --throttle 200 --ignore-crashes --ignore-timeouts -v 80000(可以更改测试的次数)>D:\ר (自己建的log.txt的路径)\log.txt

打开monkey的以下文件即可查看修改这行命令

 

第2步分析查看日志:

运行代码写入monkey.bat里边,分析日志里边的错误

代码写到monkey.bat里边,如果有变动需要更改log.txt和result.txt的路径

编辑代码方式和代码

@echo off&setlocal enabledelayedexpansion
set ff=F:\tools\monkey\log.txt
set str=CRASH crash ANR anr 
set fileName=F:\tools\monkey\Result.txt
echo 正在统计 &echo;
echo %date% %time% >%fileName%
echo .>>%fileName%
echo ------------------------------------------------------->>%fileName%
(for %%a in (%str%)do (
 set n%%a=0&set/p=   %%a :  <null>con
 for /f "delims=" %%b in ('findstr  "%%a"  "%ff%" ')do (
  set h=%%b
  call :yky %%a)
 echo !n%%a!>con
 echo 关键字 %%a 共有 !n%%a! 处
))>>%fileName%
echo .>>%fileName%
echo 崩溃日志: >>%fileName%
findstr "%str%" "%ff%">>%fileName%
echo /&pause&exit 
:yky 
set /a n%1+=1
set h=!h:*%1=!
if defined h if not "!h:*%1=!"=="!h!" goto :yky

(三)monkey测试范围

app专项测试(常规的稳定性测试)

更多命令

1.获取内存信息

adb shell dumpsys meminfo 进程ID

2.获取cpu消耗信息

adb shell top -n 1 | findstr 进程ID

3.获取电量信息

adb shell dumpsys battery

4.获取GPU信息

adb shell dumpsys gfixinfo 进程ID

5.怎么获取uid:

adb shell ps | grep 包名 ——获取进程ID 先输入adb shell 之后继续输入cat /proc/pid/status ——获取UID

6.获取流量信息

第一种方式:adb shell cat/proc/uid-stat/<uid>/tcp_rcv (不好用) 第二种方式:adb shell cat /proc/pid/net/dev

七.面试

【1:web与app测试的区别?】

1、APP兼容性测试(不同平台,不同分辨率,不同厂商) 2、弱网络以及不同网络情况下APP的资源加载和异常处理 3、安装以及卸载,和增量更新这部分 4、APP专项方面的测试,比如:占用电量,流量,CPU和内存的资源 5、需要测试APP的CRASH与ANR(崩溃,卡死,闪退)

【2:如果一个app出现奔溃,如何反馈给开发呢?】

答:打开cmd 执行命令:adb logcat | findstr package,过滤出这个app的日志,再次操作app会出现奔溃情况,同时也会有错误日志,截图提交给开发。

【3:APP的稳定性测试你是怎么测试的?】

答复:APP的稳定性从两个维度考虑: 1、它作为客户端,能够很快速的从服务端获取数据,那么前提是服务端是稳定性的 2、客户端本身的稳定性,比如不会出现崩溃,卡死,闪退,以及其他异常的信息,还有它的流畅度 那么使用monkey的测试工具来针对APP做各种随机性的操作,来验证是否会出现CRASH和ANR的情况

crash崩溃 crash,即崩溃,anr是crash的⼀种。在程序中可能会出现你未捕获到的异常,这就造成了崩溃。

【4:你之前是怎么部署环境的?】

答:我们之前部署环境都是由开发来部署的,但是我可以说一下我理解的部署环境的过程

第一种,比如说是java环境,通过maven把SpringBoot 构建成war包,然后通过scp把它上传到linux服务器,部署到tomcat的webapps目录下,启动tomcat,部署成功,然后在浏览器访问,jenkins就是用这样的方式启动的。

第二种,还是java环境,但是它是个服务,通过maven把 SpringBoot程序构建成war/jar包之后,然后linux服务器通过命令启动,具体命令是: java -jar .war/java -jar .jar

第三种,通过docker来部署环境,把开发编写好的程序通过dockerfile构建成image的镜像,通过启动这个镜像后就是一个容器,那么环境就部署好了。

如果贵司是测试来部署环境的,这点您放心,我加入公司后,能够很快速的掌握这部分并且承担起这部分的任务

【5:你是怎么来保障质量的?】

答:通过这几个维度保障产品质量的,

第一个是对需求的熟悉度,我会梳理清楚需求文档中存在的所有业务逻辑以及找产品和开发把自己理解的不是很透彻的有歧义的需求,都会和他们讨论,通过这样的方式让需求理解上开发和产品都理解一致因为它是设计测试用例以及逻辑过程中的唯一依据。

第二个是测试用例的覆盖度,首先是产品的正常业务逻辑流程以及正常流程的测试点设计,第二个会考虑异常逻辑产品的容错性以及脏数据程序对这一部分的容错性处理,第三个本次迭代关联之前的业务模块和其他业务团队关联的模块测试点都会考虑进去。第四个第会考虑产品的兼容性易用性稳定性以及性能方面的测试点都会考虑进去

第三个评审测试用例的时候会让多个人参与产品开发等,看看测试用例是否考虑的足够全面。

第四个我们会采用交叉测试、验收测试来保证测试的质量。

第五个会通过技术手段主要用到ui测试和自动化测试的方式,这样会有更多的时间去看一下自动化测试没有考虑到的点,再次对产品的质量做一个审视。

【6:你之前会写测试计划和测试报告吗】

答:会,之前是2周一个迭代,每个迭代都会编写测试计划和测试报告。测试计划会写到迭代中需要做的工作内容以及工作内容的起止时间,比如说一个迭代中测试要做的是参与需求的评审、编写测试用例以及评审测试用例、本次迭代产品功能的测试。接下来是产品报告的梳理以及上线,我们通过测试计划可以明确看到这个产品什么时候可以上线。测试报告里边主要会写1.本次迭代所有功能的测试结果2.系统已有功能的测试结果3.系统核心功能的测试结果(核心功能是每个用户需要用到的需要单独测)4.系统本次迭代对所有的bug解决的情况5.本次迭代如果有性能测试,那么在报告里边会附加上性能测试的结果6.本次迭代的测试结论,级到底可不可以上线。

【7:如果让你独立负责一个产品的测试,你怎么做?】你对于如何单独负责一个产品是如何看待的

答:由于刚加入公司,会先融入到团队尽快熟悉公司的业务,然后梳理清楚测试的业务流程,把控关键点,比如什么时候转测、什么时候上线等各个时间节点,如果过程中出现了风险,会及时和我的pm以及leader及时沟通解决风险,第三个是对产品质量的把控,参考面试5.

【8:你是怎么评估每个测试的迭代时间点的?】

答:维度:1.根据本次迭代产品的难易度2.以往的工作经验3根据这两点评估出来可能有不合理的地方,会和pm或者leader再次核对一下。

比如评估了4天,他们觉得是2天,怎么办?我会根据这个迭代每个功能点把时间再次划分一下,划分看看结果如果还是需要三天多的时间,我会跟他们阐述我的理由。因为评估出来是三天半,我要四天,主要考虑的是再做一下探索性测试。我相信不管是站在你的立场还是Pm的立场上,不可能是牺牲测试的时间追求上线的效率,这样相当于牺牲了产品的质量,对客户是不负责的。

【9:你在工作里边和同事发生了冲突,怎么处理?】

答:发生冲突肯定是双方的问题,我会向同事道歉,把事情说清楚,下次遇到这样的事情会尽量克制一下自己的情绪。

【10:你们公司开发测试多少人】

测试4人,开发十几个,其中有一半会对接到,包括了前端、后端和后端负责底层服务的开发。

【11:用什么样的监控工具】

针对Java程序,使用的监控工具是jvisualvm;针对系统的资源是cpu、内存、平均负载,使用的工具是普罗米修斯;针对jmeter性能测试过程中的数据(响应时间,吞吐量),那么会把数据写到influxdb里面,最后展示在grafana的平台中

【12:为什么你的接口测试运用到了那么多的工具】

答:charles主要使用它来抓取网络请求 在工作里面,和开发这边的联调以及验证一般的API,使用的是postman 接口自动化测试最初开始使用的是jmerer的测试工具,后面我的直属领导要求使用代码级别来做接口自动化测试,也就使用了requests

【13:如何做多接口的测试?】

答:接口之间的参数关联问题。postman、JMenter、代码之间的参数关联。

【14:公司架构】

答:我们公司的组织架构研发部下边会分为开发、产品和测试部门。技术上,我们公司产品使用的是微服务架构,根据业务形态拆分成微小的服务,每个微服务都有自己独立的数据库,微服务中,服务与服务之间的通信会采用轻量级的REST API和gRPC的协议来进行通信

【15:你印象中最深的bug是什么】

答:内存泄露,支付回调,多支付请求

【16:liinux怎么部署环境的】

【17:命名函数】

答:lambda

【18:测试中出现了不可复现的Bug 如何处理】

答:比如测试的时候时间是10点,但是后边怎么测都没有再出现,此时我会到服务的日志查看10点的日志,看是否有错误日志。如果有日志,我会把找到的日志和错误的现象发给开发,让开发排查定位看具体情况。如果找不到错误的日志,会提交这个问题到bug管理器,并且提交给自己时刻关注,后期持续观察,如果有问题会把交互图的日志反馈给开发

编程思维题

【19:你是怎么理解水仙花数的】

 

 

【20:你是怎么理解冒泡排序的】

1、列表每两个相邻的数,如果前面比后面大,则交互这两个数 2、一趟排序完成后,则无序区减少一个数,有序区增加一个数

import  random
​
def bubble_sort(li):
    '''时间复杂度:O(n*n)'''
    for i in range(len(li)-1):
        #标记位
        exchange=False
        for j in range(len(li)-i-1):
            #如果是降序,那么就是>修改为<if li[j]>li[j+1]:
                li[j],li[j+1]=li[j+1],li[j]
                exchange=True
        #能够详细的展示出排序的过程
        # print(li)
        if not exchange:break
    return li
​
if __name__ == '__main__':
    li=[random.randint(0,1000) for i in range(10)]
    print(bubble_sort(li=li))