测试-笔试题
一、请以纸笔或者文本形式完成以下题目,勿使用IDE等开发工具
题目:完成一个函数,实现功能为判断一个字符串是否是一个合法的ip地址
输入:任意字符串
输出:如果是一个合法ip地址,返回true;否则,返回false
举例:输入10.0.0.1,输出true;输入aaaa,输出false
要求:可以用c/c++/java/php/python等任意熟悉语言,但不能使用规则表达式等已有算法; 实现方法:
#include
#include
bool IpCheck(char *inputStr){
if(NULL == inputStr)
{
retrun false;
}
char * pIP = inputStr;
char temp=*pIp;
int count=0;
//长度和合法字符校验
While(temp != ‘\0’){
if((temp =’.’||(temp>=’0’&&temp
else{ return false;}
temp=*( pIp++);
}
//数字有效性校验
pIP = inputStr;
int IpMem[4] ={0};
if(4!=sscanf((const char*)pIp,”%d.%d.%d.%d”,& IpMem[0], & IpMem[1], & IpMem[2], &
IpMem[3])){ return false;}
for(int j=0;j
if(IpMem[j]255){ return false;}
}
return true;
}
二、文字描述(控制在300字以内)
1、谈谈对于敏捷的理解
从软工程发展的角度看,经历了瀑布模型,迭代模型,再到敏捷模型;瀑布算是重量级模型,重过程,风险往往在后期集成测试期集中爆发;迭代模型算是中量级模型;没有明显的过程,需求分批,每批一轮迭代,每轮迭代都是小瀑布;敏捷是轻量级模型;需求分解粒度更细;开发测试没有明显时间点分割,更多的是开发和测试一起完成需求的实现验证交付;
敏捷实施:需要一个全功能团队,SE,开发,测试,交付坐在一起办公,同一视听,团队内部问题和工作能快速反馈;简单设计,架构先行;测试前移,需求经过测试论证后才开始编码;防止设计上出现返工;版本按Onetrack走,需求按特性流转;结对编程,交叉
检视;用状态墙跟踪和控制进度;每日站会沟通进度,风险,困难;本地构建,自动化工厂验证,版本级每日构建;精准测试,模型化测试;社交化特性测试策略管理,做好特性风险,覆盖,问题管理;必要的代码重构,防止代码腐朽;组织定期迭代回顾会议,总结好的做法,头脑风暴TOP问题,会后跟踪闭环。
2、讲讲什么是压力测试?以及要做好压力测试需要考虑哪些东西 压力测试是向系统施加预期最大压力,测试系统在繁忙状态下的性能表现;我理解要从压力测试得到有效信息需要考虑从用户角度,业务角度,开发角度,维护角度考虑设计压力测试场景;模拟场景符合典型用户操作习惯,测试环境组网符合生产环境等比例缩放要求;系统预置数据合理;测试场景产生的负载合理。
下边是之前面试过测试的候选人总结下来的部分问题
很可能会因为你项目做的不同方向的不同而进行一些问题上的改变
请做好准备和复习,谢谢
研发和测试理论相关:
1. 敏捷的理解,敏捷的精髓,敏捷的迭代如何并行,敏捷的story如何拆分,敏捷研发流程
2. TDD是如何进行的,测试在其中的作用 3. 压力测试,压力测试的重点
4. 测试准入指标
测试方法相关:
1. 流畅度指标是什么?最低FPS是多少,视频播放最低频率?
“每秒传输帧数”。更确切的解释,就是“每秒中填充图像的帧数(帧/秒)“。这里的“FPS”就是我们常在CS游戏里说的“FPS”值,也可以理解为我们常说的“刷新率(Hz)”。我们在装机选购显卡和显示器的时候,都会注意到“刷新率”
2. 客户端内存泄漏问题如何排查,终端登录手机命令是什么,内存测试命令是什么?
在命令符终端输入 adb shell,若光标变成了adb shell的下一行出现了 $ 说明实现了cmd shell连接
2.使用DDMS
Eclipse中的DDMS提供了一个观察内存使用情况的GUI,当我们不断点击Cause GC时,就会看到当前程序的Heap,使用比较方便,具体用法可以Google一下。
3.
使用adb dumpsys
命令
adb是一个非常强大的工具,使用adb查看应用程序内存使用情况可按如下格式在命令行里查看内存使用情况:
adb shell dumpsys meminfo
其中,package_name 也可以换成程序的pid,pid可以通过 adb shell top | grep app_name 来查找,下图是某个程序的内存使用情况:
重点关注如下几个字段:
(1) Native/Dalvik 的 Heap 信息
具体在上面的第一行和第二行,它分别给出的是JNI层和Java层的内存分配情况,如果发现这个值一直增长,则代表程序可能出现了内存泄漏。
(2) Total 的 PSS 信息
这个值就是你的应用真正占据的内存大小,通过这个信息,你可以轻松判别手机中哪些程序占内存比较大了。
4. 使用adb shell procrank
手机中的sh是经过精简过的,有些手机可能没有 procrank 命令,可以使用genymotion模拟器,或是自己安装procrank命令。使用procrank时,命令行的输出入下图:
可以看到,在linux下表示内存的耗用情况有四种不同的表现形式:
VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)
PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
VSS:VSS表示一个进程可访问的全部内存地址空间的大小。这个大小包括了进程已经申请但尚未使用的内存空间。在实际中很少用这种方式来表示进程占用内存的情况,用它来表示单个进程的内存使用情况是不准确的。
RSS:表示一个进程在RAM中实际使用的空间地址大小,包括了全部共享库占用的内存,这种表示进程占用内存的情况也是不准确的。
PSS:表示一个进程在RAM中实际使用的空间地址大小,它按比例包含了共享库占用的内存。假如有3个进程使用同一个共享库,那么每个进程的PSS就包括了1/3大小的共享库内存。这种方式表示进程的内存使用情况较准确,但当只有一个进程使用共享库时,其情况和RSS一模一样。 USS:表示一个进程本身占用的内存空间大小,不包含其它任何成分,这是表示进程内存大小的最好方式!
可以看到:VSS>=RSS>=PSS>=USS
5.其它常用命令命令:
adb shell kill PIDNumber 死你想杀死的后台进程来模拟某种 bug 的复现条件。
adb shell ps 查看当前终端中的进程信息
那么如何在代码中判断当前的硬件系统有多少的 RAM 呢?在 Framework ProcessList.java 中有如下代码可用:
ProcessList() {
MemInfoReader minfo = new MemInfoReader();
minfo.readMemInfo();
mTotalMemMb = minfo.getTotalSize()/(1024*1024);
}
查看进程占用cpu的情况:adb shell top -n 1 -d 0.5 | grep proc_ id
3.使用adb dumpsys 命令
adb是一个非常强大的工具,使用adb查看应用程序内存使用情况可按如下格式在命令行里查看内存使用情况:
adb shell dumpsys meminfo
其中,package_name 也可以换成程序的pid,pid可以通过 adb shell top | grep app_name 来查找,下图是某个程
(二) 使用MAT导入.hprof文件
1. 如果是eclipse 自动生成的.hprof 文件,可以使用MAT 插件直接打开(可能是比较新的ADT才支持);
2. 如果eclipse 自动生成的.hprof 文件不能被MAT 直接打开, 或者是使用android.os.Debug.dumpHprofData()方法手动生成的.hprof 文件,则需要将.hprof 文件进行转换,转换的方法: 例如我将.hprof 文件拷贝到PC 上的/ANDROID_SDK/tools 目录下,并输入命令hprofconv xxx.hprof yyy.hprof,其中xxx.hprof 为原始文件,yyy.hprof 为转换过后的文件。转换过后的文件自动放在/ANDROID_SDK/tools 目录下。OK,到此为止,.hprof 文件处理完毕,可以用来分析内存泄露情况了。
3. 在Eclipse 中点击Windows->Open Perspective->Other->Memory Analyzer,或者打Memory Analyzer Tool 的RCP。在MAT 中点击File->Open File,浏览并导入刚刚转换而得到的.hprof文件。
(三) 使用MAT的视图工具分析内存
3.CPU如何测试?
4.图像质量测试的原理
计算机和移动操作系统理论相关:
1.判断
ip是否合法
2.安卓和iOS push原理
3.APNs如何工作,
Push的原理:
Push 的工作机制可以简单的概括为下图
图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider。
APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器。
上图可以分为三个阶段。
第一阶段:Push服务器应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。
第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone。
第三阶段:iPhone把发来的消息传递给相应的应用程序, 并且按照设定弹出Push通知。
从上图我们可以看到。
1、首先是应用程序注册消息推送。
2、 IOS跟APNS Server要deviceToken。应用程序接受deviceToken。
3、应用程序将deviceToken发送给PUSH服务端程序。
4、 服务端程序向APNS服务发送消息。
5、APNS服务将消息发送给iPhone应用程序。
无论是iPhone客户端跟APNS,还是Provider和APNS都需要通过证书进行连接的。下面介绍一下所用到证书的制作
4.后台服务器如何拿到用户device id
网络相关:
1. 长连接和短连接
TCP/IP
TCP/IP是个协议组,可分为三个层次:网络层、传输层和应用层。
在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。
在传输层中有TCP协议与UDP协议。
在应用层有:TCP包括FTP、HTTP、TELNET、SMTP等协议
UDP包括DNS、TFTP等协议
短连接
连接->传输数据->关闭连接
HTTP是无状态的,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。
也可以这样说:短连接是指SOCKET连接后发送后接收完数据后马上断开连接。
长连接
连接->传输数据->保持连接 -> 传输数据-> 。。。 ->关闭连接。
长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差。
http的长连接
HTTP也可以建立长连接的,使用Connection:keep-alive,HTTP 1.1默认进行持久连接。HTTP1.1和HTTP1.0相比较而言,最大的区别就是增加了持久连接支持(貌似最新的 http1.0 可以显示的指定 keep-alive),但还是无状态的,或者说是不可以信任的。
什么时候用长连接,短连接?
长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况,。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。
而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。
总之,长连接和短连接的选择要视情况而定
2.网络寻址方法
3.移动2G,3G,4G可以达到的最大下载速度
2G 30k;3G300k;4G 15m
4.指定带宽的wifi如何计算最大下载速度
计算方法:上网速率=带宽/8.,结果单位是m/s,一般我们看速率是计算多是kb/s,用刚那结果*1024就好了。=512KB/S