面试1
1 可以谈谈你平常关注哪些专业相关的网站或平台吗?
2 请设计一下吃鸡游戏压力测试
参考回答:
一.首先明确需要测试压力的内容:游戏服务器硬件、网络压力、数据库、多线程的最优线程数
1.游戏服务器硬件
a.硬盘I/o
b.内存
c.CPU
2.网络压力
a.长连接
a1.最大连接数
a2.流量(内网、外网、进、出)
b.长连接短周期(类似Http的TCP应用,这个比较特殊的一个需求,专门针对LoginAgent)
b1.每秒建立的连接数
b2.实际处理能力
3.数据库
a.每秒事务数
b.每秒锁等待数
c.平均延时(ms)
d.CPU暂用
4.多线程的最优线程数
a.数据库执行的多线程
b.多连接处理
3 测试路由器怎么测,用命令行还是界面?
答:
测试路由器:
可以采用lperf这个命令,lperf是一个网络性能测试工具,可以测量最大tcp和udp带宽,具有多种参数和特性,可以记录带宽,延迟抖动,数据包丢失,通过这些信息可以发现网络问题,检查网络质量,定位网络瓶颈。
以下了解就行:
iperf的使用非常简单,测试的原理是在wan口连接一台PC机,在LAN口连接一台PC,两边分别运行iperf服务端和客户端模式,用来测量LAN->WAN和WAN->LAN性能。具体命令如下:
服务端:iperf -s -w 1m
客户端:iperf -c -w 1m -t 20 -P 10
含义是TCP wndowsize为1MByte,测试时间是20s,线程是10。
(了解: iperf 分为两种版本,unix/linux版和windows版,unix/linux版更新比较快,版本最新。windows版更新慢。windows版的iperf叫jperf,或者xjperf。jperf是在iperf基础上开发了更好的UI和新的功能。)
4 编程题:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
面试2
1 请简要介绍一下你在本科的学习情况好吗?
(hide)
2 对于有系统大量并发访问的场景,应该如何做测试,你有什么建议呢?
答:
如何做高并发系统的测试,一般而言,整体的测试策略是:先针对部分系统进行性能测试及压力测试,得到各部分的峰值处理性能;再模拟整体流程测试,重点测试整体业务流程以及业务预期负荷。
着重测试以下几点:
1、不同省份,不同运营商CDN节点性能
可采用典型压力测试方案
2、核心机房BGP网络带宽
此部分重点在于测试各运行商的BGP网络可靠性,实际速率,一般采用smokeping,lxChariot等工具
3、各类硬件设备性能
一般采用专业的网络设备测试工具
4、各类服务器(Web服务器、应用服务器、缓存服务器等)并发性能、分布式处理能力
可采用压力测试方案工具
5、业务系统性能
采用业务系统压力测试方案
6、数据库处理性能
这部分需要结合业务系统进行测试,以获取核心业务场景下的数据库的TPS/QPS,
7、如果有支付功能,需要进行支付渠道接口及分流测试
此部分相对而言可能是最大的瓶颈所在,也是互联网公司们无法完全掌控的地方,只能协调银行总部改造支撑。
此外还涉及备份方案,容灾方案,业务降级方案的测试。
3 你认为测试工程师有哪些必备技能
答:
1、掌握一些必备的技能,如自动化测试工具和脚本、一些语言基础等
2、具有逆向思维的能力,具有发散性思维的能力
3、具有敏锐的洞察力和锲而不舍的精神
4、擅于沟通,表达能力要强一点,同软件开发工程师或者领导
沟通的内容主要包括以下 4 方面:①讨论软件的需求与设计,②报告好的软件测试结果,③不仅要报告缺陷,而且要学会如何帮助软件开发工程师定位缺陷。
5、擅于学习
6、追求完美
参考答案:
需要的知识:
• 软件测试基础理论知识,如黑盒测试、白盒测试等;
• 编程语言基础,如C/C++、java、python等;
• 自动化测试工具,如Selenium、Appium、Robotium等;
• 计算机基础知识,如数据库、Linux、计算机网络等;
• 测试框架,如JUnit等。 需要具备的能力:
• 业务分析能力,分析整体业务流程、分析被测业务数据、分析被测系统架构、分析被测业务模块、分析测试所需资源、分析测试完成目标;
• 缺陷洞察能力,一般缺陷的发现能力、隐性问题的发现能力、发现连带问题的能力、发现问题隐患的能力、尽早发现问题的能力、发现问题根源的能力;
• 团队协作能力,合理进行人员分工、协助组员解决问题、配合完成测试任务、配合开发重现缺陷、督促项目整体进度、出现问题勇于承担;
• 专业技术能力,掌握测试基础知识、掌握计算机知识、熟练运用测试工具;
• 逻辑思考能力,判断逻辑的正确性、对可行性逻辑分析、站在客观角度思考;
• 问题解决能力,技术上的问题、工作中的问题、沟通问题;
• 沟通表达能力,和技术人员、产品人员、上下级的沟通;
• 宏观把控能力,有效控制测试时间、有效控制测试成本、有效制定测试计划、有效进行风险评估、有效控制测试方向。
4 编程题:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
答:递归思想。但这个并不是斐波那契数列!!!
解法在这里
复习下斐波那契初级:
long long Fibonacci(unsigned int n)
{
if(n = 0)
return 0;
if(n = 1)
return 1;
if(n>1)
return Fibonacci(n) = Fibonacci(n-1)+Fibonacci(n-1);
}
斐波那契优化:
long long Fibonacci(unsigned int n)
{
int r[2] = {0, 1};
if(n<2)
return r[n];
long long fN=0;
long long fNMinus1 = 1;
long long fNMinus2 = 0;
for(int i=2;i<=n;i++)
{
fN = fNMinus1 + fNMinus2;
fNMinus2 = fNMinus1;//每一层的n-2都和n-1处的下一层的n-1处的值一样
fNMinus1 = fN ;//每一层的n-1都是下一层的n-1和n-2处的值的和
}
return fN;
}
面试3
1 请问在大学期间参与过什么学生组织呢?有什么收获?
(hide)
2 请你解释Redis是单线程的,为什么能这么高效?
答:
Redis 是一个开源(BSD许可)的,基于内存的的数据结构存储系统,它可以用作数据库、缓存和消息中间件。
Redis最常用的功能——缓存。
它支持多种类型的数据结构,如字符串(String),散列(Hash),列表(List),集合(Set),有序集合(Sorted Set或者是ZSet)与范围查询,Bitmaps,Hyperloglogs 和地理空间(Geospatial)索引半径查询。其中常见的数据结构类型有:String、List、Set、Hash、ZSet这5种。
Redis采用的是基于内存的采用的是单进程单线程模型的 KV 数据库,由C语言编写,官方提供的数据是可以达到100000+的QPS(每秒内查询次数)。
为什么这么快?
1、完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);
2、数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的;
3、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
4、使用多路I/O复用模型,非阻塞IO;
5、使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;
如果你想玩一下Redis,又不想自己搭建环境,可以试一下这一个非常好玩的网页:Try Redis,你可以按照上面的提示,熟悉Redis的基础命令,感受一下Redis的C/S模式。
3 请你简要说明C++和C的区别?
答:
- C语言时面向过程的程序设计,主要核心为:数据结构和算法,具有高效的特性。C语言的程序设计主要考虑如何通过一个过程对输入进行处理得到一个输出。
C++是面向对象的程序设计,对于C++,首先考虑的是如何构造一个对象模型,让这个模型配合相对应的问题,通过获取对象状态信息来得到输出或者实现过程控制。
C和C++的最大区别就是,他们用于解决问题的思想方法不一样 - C++比C语言的加强点:
功能扩充:register关键字使得变量直接放在寄存器里,取值速度快;struct在C++中等于是一个新类型的定义声明;增加了bool关键字
增加面向对象的编程机制:类、对象、封装、多态、继承
补充:
register关键字的增强: 关键字,请求编译器直接变量放在寄存器里,速度快;在C语言中寄存器里是没办法取地址的,也就是说不能在寄存器变量上取地址;而在C++中是可以在寄存器变量上取地址的