一、APP测试如何区分原生和H5页面?
我们可以从以下几个现象来进行一个区分:
1.如果断开网络立即显示404或者错误页面的话,基本上就是H5了
2.我们可以通过查看页面布局边界,可以到我们的手机设置的开发者选项中去开启页面布局边界的一个开关,然后进入到这个应用里面去查看这个应用的一个布局边界,一般来说,原生应用可以看到各个控件的一个布局边界,而如果是H5,是一个整体页面的一个布局边界
3.如果长按页面会出现一些放大镜或者是复制粘贴等功能甚至是手机它震动一下,那么基本上这个页面就是一个H5的页面了
4.如果打开一个新页面,在这个导航栏下面有一条显示进度加载的线,这个页面也基本上就是H5了
5.如果app的导航栏上面会出现关闭的按钮或者是关闭的图标的话,当前页面也基本上是一个H5页面
6.如果你下拉页面出现了网址提示方的这种页面,也是H5的页面

二、APP的多种开发方式是什么?
其实现在比较主流的几种app的开发方式主要有以下几种:
1.H5方式的开发
2.原生app的一种开发方式
3.一种混合的开发方式

首先所谓的H5它其实指的就是html的第5个版本,所以H5它本质上是一个网站页面,比如一个网页,而像原生app其实也叫做native app,它其实就是基于现有的智能手机的操作系统的基础上,使用本身系统所支持的一些开发工具或者是编程语言,来进行一个开发和编写的,比如说像IOS系统所支持的Objective-C,像安卓系统所支持的Java,最后那种混合开发,就是既使用了H5的开发方式也使用了原生app的开发方式,这种方式是现在app的一种主流的存在形式。

三、说下什么是APP电量测试? ----perfdog
所谓电量测试就是测试移动端设备电量消耗快慢的一种测试方法,电量测试的目的是通过测试不同的场景找到电量消耗比较快的这种场景进行优化,从而使APP的耗电量更低,提高用户的使用体验。

四、什么是APP流量测试?
目前我们的网络类型有2g、3g、4g、5g、wifi,其中还有不同运营商的一个区分,我们在app的使用过程中经常会遇到大资源重复请求还有调用响应慢的各种情况。在不同的网络类型下面使用 app,我们不仅要控制流量的使用,还要加快请求的一个响应速度,所以通过流量测试我们可以知道app的一个流量消耗情况,以此来指导开发进行一个速度和资源的优化

五 、请问一下app弱网测试是什么?
因为app它区别于web应用,它主要是安装在移动端,移动端它的网络类型比较复杂一些,有一些手机是2G网络,也有些是3G网络、4G网络,有些手机也处于信号不太好的wifi环境,另外因为 移动端的使用场景比较多变,经常会出现在公交地铁、电梯甚至是在地下停车库这些场景,以上场景都会导致app出现弱网 环境,所以我们测试去覆盖app的弱网环境就显得尤为重要,所以弱网测试可以在以上场景中提高产品的容错度还有友好度,能够很大程度上提高用户的体验。

六、什么是APP压力稳定性测试?
因为现在APP经常长时间的运行在手机上的前台跟后台,所以用户对于APP的一个长时间下稳定性测试的一个要求就会更高一点,所以作为测试人员就需要测试一下app在长时间运行下面避免出现一些崩溃闪退或者是内存泄漏的问题,通常我们会选取Monkey工具来遍历app进行稳定性测试

七、什么是Android app安全测试?
由于Android系统的开源性,在市面上面对开源代码的定制的ROM(read-only memory:只读存储器)也参差不齐,所以在系统层面的一个安全防范和易损性也是不一样的 ,而且Android应用市场对Android应用的一个审核相对于ios来说也要宽松很多,这也为很多的漏洞提供了可乘之机,所以Android app的一些安全设置的要点我们主要包括以下几个方面:首先安装包的安全性、数据安全性、通信安全性还有账号安全性,以及软件盘一些劫持和备份方案等等。

八、性能测试不都是测试服务器端性能么,那么APP本身也需要做性能测试吗?
是的,因为我们的app在用户使用的时候会有一些情况,比如说这个app使用的时候特别的耗流量,或者是说这个app使用的时候特别耗电,还有就是使用app切换页面时经常会出现一些卡顿,所以作为测试我们一般需要用一些数据来衡量这个app的性能,那么我们一般会关注以下的一些指标:比如说cpu、内存、电量、流量、app的一些响应时间,还有app的一些启动的时间等等,当然这些指标数据我们可以使用GT工具来获取,它支持安卓和ios系统。

九、ios app测试版本怎么安装?
因为ios系统的非开源性,不允许未经过苹果授权的应用安装在苹果设备上面,所以我们要测试ios上面的app可以通过以下两种方法来进行内部版本的安装:
第一种方法:可以通过将被测设备的UDID

UDID是Unique Device Identifier的英文缩写,UDID可关联其它各种数据到相关设备上,它是由子母和数字组成的40个字符串的序号,除了序列号外,每一台IOS设备都有一个UDID识别码,通过UDID识别码可以分辨每一个唯一的iOS设备,包括 iPhones, iPads, 以及 iPod touches等苹果设备,UDID和硬件设备特点相互联系,UDID说白一点就是相当于你的身份证

添加到开发者账号中,而去获取设备的UDID的方法可以通过一些工具来获得,比如说像通过苹果官方的工具iTunes或者xcode都可以,还有一些第三方工具,比如说iTools以及像蒲公英这种工具也可以获得。一旦获得了设备的UDID发给开发,开发把它放到我们的开发者账号里面去,添加成功之后,我们的设备就可以成功的安装我们的测试版本了;
第二种方法:其实也可以通过testflight来进行一个内部版本的安装,testflight是苹果官方的一个可以安装内部测试版本的一个工具。

iTunes是一款MAC和PC使用的一款免费数字媒体播放应用程序,能管理和播放数字音乐和视频
Xcode是运行在操作系统Mac OSX上的集成开发工具(IDE),由Apple Inc开发。 Xcode是开发Mac OS 和IOS应用程序的最快捷的方式。Xcode具有统一的用户界面设计,编码、测试、调试都在一个简单的窗口内完成。Xcode同时也是一种语言,作为一种基于XML的语言,Xcode可以设想各种使用场景。
iTools是一款针对IOS设备的同步管理软件,提供包括壁纸、铃声、电池管理在内的17项设备管理功能,允许免费下载海量应用资源,并支持手机与电脑、电视间的大屏娱乐和录屏功能
蒲公英为移动应用开发者提供的常用工具,提供免费的苹果IOS、安卓Android应用的内测分发服务,永久免费,不限分发次数
TestFlight是一款专为苹果用户设计的软件独立测试平台,用户在进行软件或者游戏内测的时候都需要在testflight登录进入,可以去玩许多游戏或者软件的内测,为开发人员提供有价值的反馈信息,发表自己的意见,改善不完美的地方(apple手机会收集和发送日志、使用信息并记录所有反馈)

十、app上线之后很卡,要从哪些方面考虑原因呢?
如果是当前升级的这个反馈功能很卡的话,大概有2个原因:
1.可能是你反馈的资源太多了,所以加载起来比较慢,从而很卡;
2.可能是请求用户太大了,所以导致卡
如果是整个app操作都很卡的话,大概有如下的几个原因:
1.可能是网络问题,要检查一下你的网络;
2.可能是app的占用内存太大了,导致的内存不足;
3.可能是与手机的其他软件,或者是手机系统有不兼容的问题;
4.可能是服务器的资源不足

十一、APP出现crash的原因有哪些?
可能的原因有以下几点:
1.内存管理错误,可能是内存过低,或者是出现了内存泄漏
2.程序逻辑错误,可能是数组越界了,或者是堆栈溢出,或者是出现了指针错误
3.设备兼容,可能app不能兼容某些设备或者系统版本,从而导致这种crash的现象
最后一点可能是网络的问题,因为网络欠佳,或者是因为不同网络类型的一个切换,而导致app出现稳定性的问题

数组越界:比如数组定义时有十个元素,那么a[0] – a[9] 分别对应相应的元素,在程序中如果使用了a[10]那么就超出了原来的数组定义的范围,这就是数组下标越界。c和c++语言中数组下标越界,编译器是不会检查出错误的,但是实际上后果可能会很严重,比如程序崩溃等
堆栈溢出:堆栈(Stack)是一种抽象数据结构,是一组相同数据类型的组合,所有的操作均在堆栈顶端进行,具有“后进先出”的特性,即最后一个放入堆栈中的物体总是被最先拿出来。堆栈中两个最重要的是PUSH(进栈)和POP(出栈), PUSH操作在堆栈的顶部加入一 个元素,POP操作相反, 在堆栈顶部移去一个元素, 并将堆栈的大小减一。水满则溢,堆栈是有一定容量限制的,当超出了该容量限制,就会发生溢出
指针错误:在声明了指针变量以后,就可以利用该指针变量来对所指向的对象进行操纵,当然在进行操纵前必须保证所操纵的对象是有效的,即该指针不为空,否则会引起“内存访问冲突”的错误,导致程序崩溃。判断一个指针是否有效的办法是判断它是否为空指针

十二、APP出现ANR是什么问题 ?
总结一下大概有以下几个原因 :
第一:耗时的一些网络访问
第二 :如果有大量的数据在读写的话,也可能会导致ANR
第三:有可能是APP要去调用一些手机的硬件,比如说相机
第四:要用现成的一些sleep还有wait等方法的时候或者是等待线程锁的时候也容易出现ANR的现象
第五:还有可能是其他线程持有锁,而导致主线程的一个等待超时
第六 :其他线程的终止或者是崩溃可能会导致主线程一直处于等待,然后出现ANR
最后一点可能是服务器中的某些Service忙而导致持续无响应

一、sleep()方法与wait()方法的区别?
sleep()和wait()方法都是可以让线程停止执行的方法,但是两者有很多的不同之处。
1.原理不同。sleep()是Thread类的静态方法,是线程用来控制自身流程的,它会使线程暂停一段时间,把执行机会让给其他线程,等计时时间一到,此线程会自动“苏醒”;而wait()方法时Object类的方法,用于线程之间的通信,这个方法会使拥有对象锁的线程进入等待状态,直到其他线程调用notify方法才能“唤醒”,当然也可以指定一个时间醒来。
2.对锁的处理机制不同。由于sleep()方法主要是让线程暂停执行一段时间,时间一到则立即恢复运行,不涉及线程之间的通信,所以调用sleep()方法不会释放锁;当调用wait()方法后,线程释放它所占有的锁,让给其他线程去争夺锁。
3.使用区域不同。sleep()可以放在任何地方使用,而wait()只能放在同步方法或者同步块中使用。
4.sleep()必须捕获异常,而wait()不用,由于在sleep()的时间当中有可能被对象调用interrupt()方法,产生InterruptException。
5.由于sleep()不会释放锁,容易导致“死锁”的情况发生,在多线程的时候,一般情况下用wait()方法好

二、线程的六大状态
NEW:线程刚创建
RUNNABLE:在JVM中正在运行的线程
BLOCKED:线程处于阻塞状态,等待监视锁,可以重新进行同步代码块中执行
WAITING:等待状态
TIMED_WAITING:调用sleep() join() wait()方法可能导致线程处于等待状态
TERMINATED:线程执行完毕,已经退出

三、线程锁的原理:当对象获取锁时,它首先使自己的高速缓存无效,这样就可以保证直接从主内存中装入变量。 同样,在对象释放锁之前,它会刷新其高速缓存,强制使已做的任何更改都出现在主内存中。 这样,会保证在同一个锁上同步的两个线程看到在 synchronized 块内修改的变量的相同值。一般来说,线程以某种不必让其他线程立即可以看到的方式(不管这些线程在寄存器中、在处理器特定的缓存中,还是通过指令重排或者其他编译器优化),不受缓存变量值的约束
线程锁在run()函数中使用QMutex实现同步,当多个线程访问共享变量时,使用lock/trylock和unlock将共享变量包裹,以保证同步访问共享变量。
如果不加锁将会在2秒后同时修改num变量,将会导致线程不按照我们的想法执行,当前线程锁定后,其他线程如果遇到共享变量将会等待解锁;
使用QMutex上锁解锁时,当代码提前退出有可能并未执行unlock(),若其他线程采用lock上锁会一直被阻塞,导致内存溢出

十三、Android手机自动化测试工具有哪几种?
1.Appium ,不仅支持安卓应用,而且支持IOS、web和混合应用
2.Airtest是我们的国货之光,中文文档健全,而且还支持图形化识别
3.Detox ,一个非常强大的移动JavaScript测试框架,它的测试执行非常的强大和迅速
4.Espresso ,新型的安卓自动化测试框架,由Google开源,Espresso的API体积小,可预测、易学习

十四、APP的闪退通常是什么原因?
1.缓存垃圾太多,如果长时间不清理这些垃圾文件会导致越来越卡甚至是闪退
2.运行程序太多,导致内存不足
3.版本兼容问题
4.访问网络
5.app的SDK和系统不兼容(系统兼容问题
6.系统升级以后,新版本不兼容老版本的API

十五、APP测试需要关注哪些测试点?
主要关注以下四点:
1.性能测试当中的CPU、内存、耗电量、流畅度、APP的安装和卸载
2.在不同的操作系统当中的安装、拉起、点击和卸载
3.当手机充满电的时候能玩多久,挂机五分钟耗多少电,app每小时耗电多少
4.就是在app的前台和后台运行的状态下,文件的下载状态下面测试电话、短信、微博以及其他的通知进来的时候app的反应

更多推荐

APP面试题集