前言
现在面试个测试岗位,都是要求全能的,web、接口、app啥都要会测,那么APP测试一般需要哪些技能呢?
面试app测试岗位会被问到哪些问题,怎样让面试管觉得你对APP测试很精通的样子?
本篇总结了app测试面试时候经常被问的10个相关问题
1.什么是activity?
2.Activity生命周期?
3.Android四大组件?
4.app测试和web测试有什么区别?
5.android和ios测试区别?
6.app出现ANR,是什么原因导致的?
7.App出现crash原因有哪些?
8.app对于不稳定偶然出现anr和crash时候你是怎么处理的?
9.app的日志如何抓取?
10.你平常会看日志吗, 一般会出现哪些异常(Exception)?
1.什么是activity
官方的说法是Activity一个应用程序的组件,它提供一个屏幕来与用户交互,以便做一些诸如打电话、发邮件和看地图之类的事情。
Activity是一个Android的应用组件,它提供屏幕进行交互。每个Activity都会获得一个用于绘制其用户界面的窗口,窗口可以充满哦屏幕也可以小于屏幕并浮动在其他窗口之上。
一个应用通常是由多个彼此松散联系的Activity组成,一般会指定应用中的某个Activity为主活动,也就是说首次启动应用时给用户呈现的Activity。将Activity设为主活动的方法
当然Activity之间可以进行互相跳转,以便执行不同的操作。每当新Activity启动时,旧的Activity便会停止,但是系统会在堆栈也就是返回栈中保留该Activity。
当新Activity启动时,系统也会将其推送到返回栈上,并取得用户的操作焦点。当用户完成当前Activity并按返回按钮是,系统就会从堆栈将其弹出销毁,然后回复前一Activity
当一个Activity因某个新Activity启动而停止时,系统会通过该Activity的生命周期回调方法通知其这一状态的变化。
Activity因状态变化每个变化可能有若干种,每一种回调都会提供执行与该状态相应的特定操作的机会
2.Activity生命周期?
周期即活动从开始到结束所经历的各种状态。生命周期即活动从开始到结束所经历的各个状态。从一个状态到另一个状态的转变,从无到有再到无,这样一个过程中所经历的状态就叫做生命周期。
Activity本质上有四种状态:
1.运行(Active/Running):Activity处于活动状态,此时Activity处于栈顶,是可见状态,可以与用户进行交互
2.暂停(Paused):当Activity失去焦点时,或被一个新的非全面屏的Activity,或被一个透明的Activity放置在栈顶时,Activity就转化为Paused状态。此刻并不会被销毁,只是失去了与用户交互的能力,其所有的状态信息及其成员变量都还在,只有在系统内存紧张的情况下,才有可能被系统回收掉
3.停止(Stopped):当Activity被系统完全覆盖时,被覆盖的Activity就会进入Stopped状态,此时已不在可见,但是资源还是没有被收回
4.系统回收(Killed):当Activity被系统回收掉,Activity就处于Killed状态
如果一个活动在处于停止或者暂停的状态下,系统内存缺乏时会将其结束(finish)或者杀死(kill)。这种非正常情况下,系统在杀死或者结束之前会调用onSaveInstance()方法来保存信息,同时,当Activity被移动到前台时,重新启动该Activity并调用onRestoreInstance()方法加载保留的信息,以保持原有的状态。
在上面的四中常有的状态之间,还有着其他的生命周期来作为不同状态之间的过度,用于在不同的状态之间进行转换,生命周期的具体说明见下。
onCreate() 首次创建 Activity 时调用。
onCreate() 首次创建 Activity 时调用。
onStart() 在Activity 即将对用户可见之前调用。
onStart() 在Activity 即将对用户可见之前调用。
onResume()
在 Activity 即将开始与用户进行交互之前调用。此时,Activity 处于 Activity 堆栈的顶层,并具有用户输入焦点。始终后接 onPause()
。
onResume()
onPause()
当系统即将开始继续另一个 Activity 时调用。如果 Activity 返回前台,则后接 onResume()
,如果 Activity 转入对用户不可见状态,则后接onStop()
。
onPause()
onStop()
在 Activity 对用户不再可见时调用。如果 Activity 恢复与用户的交互,则后接 onRestart()
,如果 Activity 被销毁,则后接onDestroy()
。
onStop()
onDestroy()在 Activity 被销毁前调用。这是 Activity 将收到的最后调用。
onDestroy()在 Activity 被销毁前调用。这是 Activity 将收到的最后调用。
onRestart()在 Activity 已停止并即将再次启动前调用。
始终后接 onStart()。
onRestart()在 Activity 已停止并即将再次启动前调用。
3.Android四大组件
Android四大基本组件:Activity、BroadcastReceiver广播接收器、ContentProvider内容提供者、Service服务。
Activity:
应用程序中,一个Activity就相当于手机屏幕,它是一种可以包含用户界面的组件,主要用于和用户进行交互。一个应用程序可以包含许多活动,比如事件的点击,一般都会触发一个新的Activity。
BroadcastReceiver广播接收器:
应用可以使用它对外部事件进行过滤只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应。广播接收器没有用户界面。然而,它们可以启动一个activity或serice
来响应它们收到的信息,或者用NotificationManager来通知用户。通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。
ContentProvider内容提供者:
内容提供者主要用于在不同应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问数据的安全性。只有需要在多个应用程序间共享数据时才需要内容提供者。例如:通讯录数据被多个应用程序使用,且必须存储在一个内容提供者中。它的好处:统一数据访问方式。
Service服务:
是Android中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还要长期运行的任务(一边打电话,后台挂着QQ)。服务的运行不依赖于任何用户界面,即使程序被切换到后台,或者用户打开了另一个应用程序,服务扔然能够保持正常运行,不过服务并不是运行在一个独立的进程当中,而是依赖于创建服务时所在的应用程序进程。当某个应用程序进程被杀掉后,所有依赖于该进程的服务也会停止运行(正在听音乐,然后把音乐程序退出)。
原文:https://blog.csdn.net/m0_37989980/article/details/78681367
4.app测试和web测试有什么区别?
WEB测试和App测试从流程上来说,没有区别。
都需要经历测试计划方案,用例设计,测试执行,缺陷管理,测试报告等相关活动。
从技术上来说,WEB测试和APP测试其测试类型也基本相似,都需要进行功能测试、性能测试、安全性测试、GUI测试等测试类型。
他们的主要区别在于具体测试的细节和方法有区别,比如:
1、架构区别:WEB项目是B/S架构,基于浏览器的,而APP是C/S架构,必须要有客户端。web测试只要更新了服务器端,客户端就会同步会更新。而且客户端是可以保证每一个用户的客户端完全一致的。但是app端是不能够保证完全一致的,除非用户更新客户端。如果是app下修改了服务端,意味着客户端用户所使用的核心版本都需要进行回归测试一遍。
2、性能测试:在WEB测试只需要测试响应时间这个要素,在App测试中还需要考虑流量、电量、CPU、GPU、Memory、fps(流畅度),安装耗时和启动耗时这些。一般使用emmagee,GT工具测试。
3、兼容性测试:在WEB端是兼容浏览器,在App端兼容的是手机或平板设备。浏览器的兼容则是一般是选择不同的浏览器内核进行测试(IE、chrome、Firefox)。app的测试不仅要看分辨率,屏幕尺寸,还要看设备系统。系统总的来说也就分为Android和iOS,不过国内的Android的定制系统太多,也是比较容易出现问题的。一般app的兼容测试三种方法,云测试,请团队测试,真机测试。云测试咱们稍后再聊,这里说说真机的选择。首先要选择主流的机型,其次要选择不同的分辨率,尺寸,然后就是不同的操作系统。
4、安装测试:WEB测试基本上没有客户端层面的安装测试,但是App测试是存在客户端的,必须测试安装、更新、卸载。除了常规的安装、更新、卸载还要考虑到异常场景。包括安装时的中断、弱网、内存不足、安装后删除安装文件,更新的强制更新与非强制更新、增量包更新、断点续传、弱网,卸载后删除app相关的文件等等。升级测试的提醒机制,升级取消是否会影响原有功能的使用,升级后用户数据是否被清除了。
5、交叉事件测试:就是在操作某个软件的时候,来电话、来短信,电量不足提示等外部事件。
6、操作类型测试:如横屏测试,手势测试,多点触控,前后台切换。
7、网络测试:包含弱网和网络切换测试。需要测试弱网所造成的用户体验,重点要考虑回退和刷新是否会造成二次提交。弱网络的模拟,据说可以用360wifi实现设置。
原文地址:https://www.cnblogs.com/laoluoits/p/5673291.html
5.android和ios测试区别?
App测试中ios和Android有哪些区别呢?
1.Android长按home键呼出应用列表和切换应用,然后右滑则终止应用;
2.多分辨率测试,Android端20多种,ios较少;
3.手机操作系统,Android较多,ios较少且不能降级,只能单向升级;新的ios系统中的资源库不能完全兼容低版本中的ios系统中的应用,低版本ios系统中的应用调用了新的资源库,会直接导致闪退(Crash);
4.操作习惯:Android,Back键是否被重写,测试点击Back键后的反馈是否正确;应用数据从内存移动到SD卡后能否正常运行等;
5.push测试:Android:点击home键,程序后台运行时,此时接收到push,点击后唤醒应用,此时是否可以正确跳转;ios,点击home键关闭程序和屏幕锁屏的情况(红点的显示);
6.安装卸载测试:Android的下载和安装的平台和工具和渠道比较多,ios主要有app store,iTunes和testflight下载;
7.升级测试:可以被升级的必要条件:新旧版本具有相同的签名;新旧版本具有相同的包名;有一个标示符区分新旧版本(如版本号),
对于Android若有内置的应用需检查升级之后内置文件是否匹配(如内置的输入法)
另外:对于测试还需要注意一下几点:
1.并发(中断)测试:闹铃弹出框提示,另一个应用的启动、视频音频的播放,来电、用户正在输入等,语音、录音等的播放时强制其他正在播放的要暂停;
2.数据来源的测试:输入,选择、复制、语音输入,安装不同输入法输入等;
3.push(推送)测试:在开关机、待机状态下执行推送,消息先死及其推送跳转的正确性;
应用在开发、未打开状态、应用启动且在后台运行的情况下是push显示和跳转否正确;
推送消息阅读前后数字的变化是否正确;
多条推送的合集的显示和跳转是否正确;
4.分享跳转:分享后的文案是否正确;分享后跳转是否正确,显示的消息来源是否正确;
5.触屏测试:同时触摸不同的位置或者同时进行不同操作,查看客户端的处理情况,是否会crash等
原文链接:https://www.jianshu.com/p/91d7acfb036e
6.app出现ANR,是什么原因导致的?
那么导致ANR的根本原因是什么呢?简单的总结有以下两点:
1.主线程执行了耗时操作,比如数据库操作或网络编程
2.其他进程(就是其他程序)占用CPU导致本进程得不到CPU时间片,比如其他进程的频繁读写操作可能会导致这个问题。
细分的话,导致ANR的原因有如下几点:
1.耗时的网络访问
2.大量的数据读写
3.数据库操作
4.硬件操作(比如camera)
5.调用thread的join()方法、sleep()方法、wait()方法或者等待线程锁的时候
6.service binder的数量达到上限
7.system server中发生WatchDog ANR
8.service忙导致超时无响应
9.其他线程持有锁,导致主线程等待超时
10.其它线程终止或崩溃导致主线程一直等待。
原文:https://blog.csdn.net/jaychou_maple/article/details/78782822
7.App出现crash原因有哪些?
为什么App会出现崩溃呢?百度了一下,查到和App崩溃相关的几个因素:内存管理错误,程序逻辑错误,设备兼容,网络因素等,如下:
1.内存管理错误:可能是可用内存过低,app所需的内存超过设备的限制,app跑不起来导致App crash。
或是内存泄露,程序运行的时间越长,所占用的内存越大,最终用尽全部内存,导致整个系统崩溃。
亦或非授权的内存位置的使用也可能会导致App crash。
2.程序逻辑错误:数组越界、堆栈溢出、并发操作、逻辑错误。
e.g. app新添加一个未经测试的新功能,调用了一个已释放的指针,运行的时候就会crash。
3.设备兼容:由于设备多样性,app在不同的设备上可能会有不同的表现。
4.网络因素:可能是网速欠佳,无法达到app所需的快速响应时间,导致app crash。或者是不同网络的切换也可能会影响app的稳定性。
原文:https://blog.csdn.net/yangtuxiaojie/article/details/47123243
8.app对于不稳定偶然出现anr和crash时候你是怎么处理的?
app偶然出现anr和crash是比较头疼的问题,由于偶然出现无法复现步骤,这也是一个测试人员必备的技能,需要抓日志。查看日志主要有3个方法:
方法一:app开发保存错误日志到本地
一般app开发在debug版本,出现anr和crash的时候会自动把日志保存到本地实际的sd卡上,去对应的app目录取出来就可以了
方法二:实时抓取
当出现偶然的crash时候,这时候可以把手机拉到你们app开发那,手机连上他的开发代码的环境,有ddms会抓日志,这时候出现crash就会记录下来日志。
尽量重复操作让bug复现就可以了
也可以自己开着logcat,保存日志到电脑本地,参考这篇:https://www.cnblogs.com/yoyoketang/p/9101365.html
adb logcat | find "com.sankuai.meituan" >d:\hello.txt
方法三:第三方sdk统计工具
一般接入了第三方统计sdk,比如友盟统计,在友盟的后台会抓到报错的日志
9.app的日志如何抓取?
app本身的日志,可以用logcat抓取,参考这篇:https://www.cnblogs.com/yoyoketang/p/9101365.html
adb logcat | find "com.sankuai.meituan" >d:\hello.txt
也可以用ddms抓取,手机连上电脑,打开ddms工具,或者在Android Studio开发工具中,打开DDMS
关于ddms更多的功能,参考这篇:https://www.cnblogs.com/gaobig/p/5029381.html
10.你平常会看日志吗, 一般会出现哪些异常(Exception)?
这个主要是面试官考察你会不会看日志,是不是看得懂java里面抛出的异常,Exception
一般面试中java Exception(runtimeException )是必会被问到的问题
app崩溃的常见原因应该也是这些了。常见的异常列出四五种,是基本要求。
常见的几种如下:
NullPointerException - 空指针引用异常
ClassCastException - 类型强制转换异常。
IllegalArgumentException - 传递非法参数异常。
ArithmeticException - 算术运算异常
ArrayStoreException - 向数组中存放与声明类型不兼容对象异常
IndexOutOfBoundsException - 下标越界异常
NegativeArraySizeException - 创建一个大小为负数的数组错误异常
NumberFormatException - 数字格式异常
SecurityException - 安全异常
UnsupportedOperationException - 不支持的操作异常