总结面试当中遇到的问题

声明:此文转载至博客园【奔跑的七七

总结一下这几天面试遇到的问题

面试环节,大同小异

第一轮:

电话面试 做简单的筛选 时间15-30分钟,主要是了解一下你会哪些?问题会问你之前做过的项目,目的在于了解你是否熟悉掌握测试流程和测试思路,这块描述流程的时候,可以把自己会的一些工具加上去。测试流程大致为需求评审–写测试计划与方案-画流程图–冒烟测试-测试用例编写–执行功能测试–ui测试–性能测试–安全测试等等;整个流程涉及到的技术和工具,夹杂在流程思路里去分析解说,可以加分;比如用什么工具管理用例,用什么工具画流程图,bug管理工具,文件配置工具,性能工具会哪些,接口工具有哪些?等等..第一轮面试一般还会问在职还是离职?之前离职的原因?目前住哪里?工作地点有什么要求?薪资范围是多少?以上这些附加的软情商类问题,还会问一些技术技能,比如会不会自动化?会不会接口?会不会脚本?掌握程度怎么样?会不会linux?会不会数据库?初面不会深问

第二轮:

一般是公司的测试负责人面试,时间大概是60-90分钟,这里一般会聊得非常细。因为技术是一个非常广阔的领域,其实这块的话可以引导面试官,争取在自己擅长的领域去发挥,让面试官跟着你的思路走;常问的问题总结如下:

一、数据库

一般问的比较少,针对初级的可能会问细节,这块让面试官不追问细节的好办法就是主动的罗列总结一些数据库的知识,比如数据库无非就是分为插入,查询和更新,以下是我面试遇到过的问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
--创建库
Create database xsk default character set utf8;
--创建表
Create table students(
Id int(10) primary key not null unique auto_increment,
Name varchar(20) not null,
Sex varchar(4),
Class varchar(20) not null
);
Default charset = utf8;
--删表
Use xsk;
drop table students;
Truncate table students;
Delete from students where name=’mike’
drop --删除数据库或表
Delete --删除表里的内容
truncate --删除速度快,不可恢复,delete一行一行删除,可以回滚
--新增
Insert into students(sid,sname,age) values(1,’小明’,20);
--修改
Update students set name=’小明’ where id =1;
--修改字段类型和注释
Alter table sys_application modify column app_name varchar(20) comment ‘应用的名称’
--查询
Select * from students;
select xxx,xxx,聚合函数()
from a a,b b
where a.id=b.id and 条件
group by 字段
having in (筛选)
Order by desc/asc
limit x //取多少行
聚合函数:sum max avg count

左连接:左表有多少条数据,就显示多少条数据

右连接:右表有多少条数据,就显示多少条数据

外链接:显示左表和右表所有的数据

内连接:显示两张表都有的数据

笛卡尔积:简单的说就是两个集合相乘,两个表中去除 重复的数据(例如关联的列)

1
2
3
4
Select * from students st left join score s on st.id=s.stu_id;
Select * from students st right join score s on st.id=s.stu_id;
Select * from students st inner join score s on st.id=s.stu_id;
Select * from students st,score s where st.id=s.stu_id;

二、Linux

查看进程,创建目录,创建文件,赋予权限,解压,查看进程 查看端口号 修改文件 解压包 打印日志

  1. 字符串处理

哪个字符串出现的次数最多,是多少?Shell脚本

将文件夹中的aaa改为bbb,写个shell?

  1. 包解压命令
1
2
3
4
#压缩 
tar -zxvf /tmp/zheng.tar.gz
#打包
tar -zcvf /tmp/zheng.tar.gz /home/zheng
  1. vi模式下,批量把aaa替成bbb
1
2
3
:1,’s/aaa/bbb/g’   #从第1行开始替换
sed -i ‘s/aaa/bbb/g’ wenjianming
sed -i ‘s/http:\/\/www.besttest.cn\//http:\/\/127.0.0.1:8000\/g’ 1txt
  1. 定时任务
1
2
3
Crontab -e
5 0 * * *
Crontab -u root -l

三、怎么部署环境

我说的比较简单

  1. 安装好项目

安装jdk,再安装Tomcat,再把项目部署到webapps文件夹下,静态HTML的访问配置,进入tomcat的bin目录 执行./startup.sh重启tomcat,再到前台页面去启动该项目,网页输入网址:格式:ip:端口号/项目,如:http://192.168.199.134:8082/diaowen/

  1. 配置链接数据库

配置链接数据库 安装MySQL 命令:yum -y install mysql,配置application.properties文件目录;如/usr/local/tomcat7.2/webapps/diaowen/WEB_INF/classes/conf/application.properties设置好端口号,数据库名和密码,方便访问链接,想要深入加分可自行百度;

四、画个架构

  1. nginx将请求转发到服务端,服务端直接去zk上去取kafka,然后进行连接

kafka到zk上去注册,直接连接到zk,zk和kafka之间相互交互,服务端不会直接跟kafka直接交互

  1. 服务器直接去连接文件服务器集群,直接去取直接去返回 server<--->文件服务器

  2. 服务器直接去连接mysql集群

也有的公司,MySQL去zk上注册,应用服务直接去zk里面取到生效的mysql,然后去MySQL集群里面取mysql(相当于zk在管理MySQL的集群)

  1. 服务器直接去连接redis 直接去取,直接去返回 server<--->redis

也有的公司,redis去zk上注册,应用服务直接去zk里面取到生效的缓存,然后去redis集群里面取信息(相当于zk在管理redis的集群)

  1. cdn:不属于服务的架构之内,有的公司会去租用阿里云等的cdn,主要用于 前端 的访问策略,是在自己的服务之外的

五、性能问题怎么去定位

性能发现什么问题?怎么去分析的?

响应时间慢,tps小,CPU使用高,内存溢出等问题

服务器响应时间慢,tps小的分析思路:

1).了解系统架构,并画出系统架构图

2).根据系统架构图,画出被测接口请求的数据流经图,并列出可能存在问题的每个点,寻找一些快速定位的方法

3).根据经验主义进行对问题进行排查

a: 要么从简单的开始排查(负载机-网络-硬件)-(容器连接池、db连接池)-sql执行效率-gc(垃圾回收)-code(代码)

  • 负载机

(1)单机max 50个并发,tps=500;单机并发>50的时候,tps<500。

50并发tps是500,大于50并发tps却下降了,请问原因在哪里:CPU问题:进程越大,上下文切换越大,非lr时间变大,那么工作时间减少,发送的请求数量变少

(2)50个并发,单机tps=500,三机tps=800。

说明是负载机的性能瓶颈问题,三机tps并不是1500,说明服务器cpu性能问题

Linux性能监控命令:top、vmstat、iostat、sar等命令进行监控

  • 网络

(各个服务器之间的网路连接)netstat -i看网络有没有丢包,延迟高不高

  • 硬件cpu,应用程序、数据库(cpu 、内存、磁盘):top一下

Web容器连接池:线程是否被占满,有没有排队?在tomcat/conf/tomcat-users.xml下配置status,浏览器ip:端口号/manager/status,输入用户名tomcat ,密码:123456,即可查看tomcat的线程配置和使用情况。Tomcat的配置文件:tomcat/conf/server.xml

  • 数据库连接池

线程是否被占满,有没有排队?

1
2
3
show variables like '%max_connections%';  --查看当前最大连接数
show global status like 'Max_used_connections'; --服务器响应的最大连接数
set global max_connections=1000; --重新设置数据库最大连接数
  • Sql执行效率

开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能。顾名思义,慢查询日志中记录的是执行时间较长的query,也就是我们常说的slowquery,通过设–log-slow-queries[=file_name]来打开该功能并设置记录位置和文件名。

Spotlight on MySQL监控MySQL服务器。

  • 优化

减少IO次数、降低cpu计算、查询选取最适用的字段类型避免查询浪费、减少排序,为经常需要排序、分组和联合查询操作的字段建立索引、禁用外键、避免大sql、避免大批量更新、避免取过量数据,灵活使用limit、避免在SQL 语句中进行数学运算、函数计算、逻辑判断等操作如=、+,、避免OR、避免select * from t ;

  • Gc垃圾回收(JVM)

oom内存是否溢出、GC时间很长

1
2
3
4
5
6
ps -ef|grep java
jstat -gcutil java 的进程号
看下有没有fgc,没有的话说明不是GC导致的
jstat -gcutil pid 查看gc情况,jmap -histo PID 查看哪个方法导致内存溢出
jmap -dump:live,format=b,file=heap.bin 2143然后用jhat或者MAT分析看堆
jstack 2143(线程id) 查看栈的使用情况
  • Code代码

不会代码,一般不说代码这块,会的可以自己百度下,

  • 压测的时候CPU高(用户cpu高)
  1. top一下 ,然后shift+p(按CPU消耗排序),查看是哪个进程导致的CPU使用高,查看它的PID

  2. top -H 21380 查看进程对应的什么线程导致CPU使用高

查看是哪些线程占用的cpu高 PID为21383和21384 对应线程占用CPU高

查看jstack里面的tid是16进制的,21383是10进制的,需要把十进制的换算成16进制的

printf “%x” 21383 转换出来了以后是5388和5387

然后去看这个线程id在执行什么方法

  1. jstack 21380 >2.txt

vim 2.txt

在里面直接搜索:5388(nid的值)

分此线程在干什么(GC导致了CPU使用高)

实际工作中,查看导致CPU使用过高的线程栈在执行什么方法

jstat -gcutil -21380 500 3 //再看看

b. 要么通过系统日志打印出接口以及sql(或者web容器排队)时间,然后根据时间去判断可能存在的问题的点,缩小问题的范围

  • CPU使用率高的分析思路

Top--top -H PID--printf “%x” 21383---jstack 21380|grep 5388 查看方法在干嘛

  • Sportlight监控

第一种情况,某个线程一直CPU利用率100%,则说明是这个线程有可能有死循环,那么请记住这个PID。

第二种情况,某个线程一直在TOP十的位置,这说明这个线程可能有性能问题。

第三种情况,CPU利用率TOP几的线程在不停变化,说明并不是由某一个线程导致CPU偏高。

  • 内存溢出分析思路:jprofiler
1
2
3
gc:jstat -gcutil pid 查看gc情况,jmap -histo  PID 查看哪个方法导致内存溢出
jmap -dump:live,format=b,file=heap.bin 2143然后用jhat或者MAT分析 看堆
jstack 2143(线程id) 查看栈的使用情况

502 充当网关或代理的服务器,从远端服务器接收到了一个无效的请求

503 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中

六、接口测试怎么测

思路+工具使用

  • 思路
  1. 基本功能测试(业务逻辑实现)

  2. 边界值分析

  3. 参数组合

  4. 异常处理:

    4.1. 某个接口需要先登录获取 sesssion,如果直接调用该接口应该给出相应提示

    4.2. 重复提交(付款),程序怎么处理的

    4.3. 一个业务流程包含多个操作步骤,如果某个操作失败,那么整个操作需要回滚。或者调用前一个步骤的逆向接口进行操作取消

    4.4. 关联系统出现宕机、超时或者无响应的状态时,接口返回提示正确,业务逻辑正确,不可存在事务性不一致的情况

    4.5. 数据库里数据量较大时(百万级),测试对DB进行增删改查操作的效率。接口传入数据与插入DB的数据一致性:前端某个操作涉及后台DB多张表时。每张表面都要检验数据正确性。

  5. 性能层面:

    5.1. 接口响应时间

    5.2. 吞吐量

    5.3. 并发数

    5.4. 服务器资源使用率(cpu、内存、磁盘、网络)

  6. 安全测试:敏感信息是否加密(前端、日志)、sql注入

  • 工具使用

举例:用jmeter做的接口测试,主要是新建测试计划,测试计划下添加线程组,再添加sample,录入get的url,查看返回的响应状态码和数据、结果;如果判断是否get成功,可以增加响应断言,用正则表达式去提取,比如登录百度,用正则表达式取百度,有百度则成功;用post方法,录入url和传入参数,看响应状态码和返回结果值是否正确;添加查看结果树和分析图监控测试结果;通过CVS去准备参数,正则表达式关联等等.

七、自动化怎么测

jmeter和lr各自优缺点

1)lr是c语言写的(c是多进程的),jmter是纯java语音(java是单进程的)。//lr是多进程的,jmter是单进程的,lr处理能力比jmeter快,数据更准确

2)Loadrunner优点:功能强大、简单、上手容易,支持协议种类多(http、https、websocket、)

缺点:商业,收费,破解稍微麻烦

3)jmeter 优点,开源、免费、小巧 缺点:上手比较难,lr比jmeter好,但是测出的tps没有jmeter高的原因:(原因:jmeter启用长连接的原因,lr没有长链接)

八、HTTP协议了解吗

http是不加密的传输协议,状态码有1xx:信息;200:请求成功,最常见;3xx:重定向;4xx:客户端问题;5xx:服务器问题;https加密协议;如果自己知道几个具体的可以解释一下,可以加分;比如之前一个放在tomcat下的webapps的项目文件名与网址输入的路径名不一致,导致文件目录找不到,报404错误。

九、具体项目的测试

  1. 支付宝转账怎么测试?

  2. 微信聊天怎么测试?

  3. 接单 方圆5公里 接单怎么设计?

    接口:业务逻辑、边界值、参数组合、异常情况(重复提交、登录session、关联系统无响应)

    功能:根据需求文档,考虑正确的业务逻辑实现,正常的异常的,等价类、边界值等

    集成:业务逻辑正常实现,调用其他服务,其中一个服务宕了,怎么处理

    兼容性:不同手机

    安全:敏感信息是否加密(前端、日志)

    Ui:友好、易用

    性能:响应时间、并发数、服务器资源使用率(cpu、内存、磁盘、网络)

    健壮性:对异常处理,没有信号、电话打断。。

  4. 设计提现、添加银行卡的测试点

十、语言算法类

  1. 冒泡排序 阿里面试喜欢问

  2. 请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy(实现语言不限)

  3. 任意给定一个32位无符号整数n,求n的二进制表示中1的个数,比如n = 5(0101)时,返回2,n = 15(1111)时,返回4(实现语言不限)

  4. 请用java vuser或c++实现一个socket请求发送一个消息“text msg”到127.0.0.1:80端口

以上自行百度,阿里的笔试面试题,我是卡在这里了

  1. 任何语言写出给你一组数,从中找出最大或最小的数

  2. 从1000个里面随机抽出10个人进行处理。

十一、性能测试流程,完整(一套流程到出报告)

  1. 性能测试需求分析:

(1)确认性能测试场景: 比如一个银行用户登录流程

(2)性能测试指标:100并发 响应实际3秒以内

(3)确认系统架构:nginx、tomcat(server)、mysql、redis、zk+kafka

  1. 性能能测试计划:

评估工作量、压测排期、测试人员

  1. 性能测试准备:

(1)环境准备

a. 硬件环境:硬件标准CPU颗粒数,内存大小要一致

b. 软件准备:版本必须要与线上一致,如Tomcat、jdk等

(2)数据准备

a. 数据库表准备: order表、pay表、point表、buyer表

b. 脚本准备:order脚本、user脚本 c.参数化数据准备10万买家用户、10万卖家用户

  1. 性能测试执行

a.监控(对测试工具的监控,对linux系统的资源使用情况的监控top)

b.定位瓶颈(CPU使用过高、tps小,响应时间慢,内存溢出)

c.调优

d.回归(跟上一次的数据进行对比)

e.报告(测试环境、测试用例、测试调优,最终达到客户性能要求)


请描述一下性能测试的流程

性能需求分析(确定性能场景,性能指标、系统架构)

性能计划(人员、时间、工作量、困难等)

测试准备(环境准备【硬件环境:cpu、内存一致;软件环境:tomcat、jdk版本一致】、脚本准备、测试数据准备、参数化文件准备)

测试(监控、定位、分析、调优、回测、测试报告)

如何分析和获取性能测试需求和性能测试指标

性能需求

28 原则:测试20的主业务

根据业内的标准:358原则

性能压测过程中一般会关注那些性能指标

响应时间、TPS、并发数、 系统资源使用情况(cpu、内存、磁盘、网络)

性能测试脚本需要经过那些优化

根据不同的协议进行脚本开发(HTTP、https、jdbc、webservice、socket)

保证脚本的干净性:录制或者自己抓包直接写

A.录制精简脚本,删除cookie,删除其他不相关的服务的请求,删思考时间

B.直接改请求的代码:”Mode=HTML”改为”Mode=HTTP”

HTML会发送上下游的跳转以及页面的静态请求等,HTTP仅仅发一个请求

做测试的时候,一个action里面只放一个请求,一个事物里面只放一个请求,将依赖条件(登录)放到init里面,将关联的请求放事物外面

2)参数化:根据业务选择参数化策略,登录互踢,注册数据库对数据有唯一性校验

3)关联:服务器每次返回动态的值,下一次请求需要使用

4)事物:没有事物就没有tps

5)检查点:判断业务是否成功,数据库查询需要加,其他的直接查看数据库里的数据(web_reg_find)

6)集合点:加大某个请求的瞬时并发的概率(秒杀,抢购才需要加集合点)insert–> rendezvous–>填写集合点名称

7)思考时间:run time setting –>thingk time 迭代次数、Pacing:迭代时间、log

a. 单场景测试–接口性能

b. 混合场景测试–接口直接、程序直接、数据库直接的死锁(单混:10-15分钟)

c. 稳定性场景测试—内存泄漏和gc(n*12小时)


请写出常用的监控服务器资源和性能分析的命令

1
2
3
4
5
top  top -H PID   uptime  
Iostat -x netstat -i
jstat -gcutil PID jmap -histo PID jmap -dump jstack PID
ps -ef|grep java/nginx/httpd/tomcat
netstat -lanp|grep 80

十二、请描述JVM的工作原理

堆(对象)存储,栈(方法)运行,堆内存分代收集

性能分析,先看堆:内存不够、内存溢出、GC、程序报heap out of memory

只要是堆的问题:就是减少对象到老年代的频率a.调整年轻带跟老年人的比例b.更换回收器

定位GC: jmap -histo PID

jmap -dump 然后用AMT或jhat进行分析

减少fullGC频率的办法:

1)调大jvm的值

2)调整垃圾回收器

3)然后看栈:用户cpu使用高,系统慢,无响应,I/O过高,线程死锁,都去看栈、jstack PID去分析线程栈,看是什么方法导致了这个现象

4)堆:数据存储单位。new的对象,数组是实例化

5)栈:java运行程序时的单位。怎么去调度,调用什么方法,传递什么参数,方法、程序计数器、全局变量,常量 逻辑判断。

6)栈要操作一些对象和一些数据,这个数据存放在堆里

如果我短时间去跑性能没有问题,但是长时间跑突然又有问题了是什么原因呢?

可以从jvm内存去分析

其他(与上有雷同)

请列举你遇到过的性能瓶颈(前端页面、操作系统、网络、容器、DB、中间件、业务代码等方面)

Msql 或oracle 如何发现、分析、定位数据库耗时比较长的sql,并简述优化sql的原理或过程

请详细描述你所参与项目的测试流程,注:内容涵盖测试环境搭建、及上线流程。

简述你所认为的优秀的测试人员都具备什么样的素质?

linux环境下如何查看当前8080端口是否被占用?如果占用如何停止该进程?

1
2
Netstat -lanp|grep “8080”
Kill -9 PID

数据库中目前存在money表,该表存在uid字段,如何通过uid对money表进行降序查询?降序查询后若只想查看其中的50条记录时如何查看?

Selecet * from money Ordy by uid desc limit 50

请简述性能调优都有哪些方法?

  • Tomcat

1)Tomcat启动、停止

1
2
sh /usr/local/tomcat3/bin/startup.sh
sh /usr/local/tomcat3/bin/shutdown.sh

2)Tomcat访问 //ip端口号

http://192.168.10.233:8080/

3)vim /usr/local/tomcat3/conf/tomcat-users.xml

加入:

1
2
<role rolename="manager-gui"/>
<user username="tomcat" password="123456" roles="manager-gui"/>

访问tomcat地址,http://ip:端口号/manager/status,输入用户名、密码,输入用户名:tomcat ,密码:123456

4)Tomcat配置监控文件

vim /usr/local/tomcat3/conf/server.xml

  • Apache

1)启动:service httpd start

2)查看Apache的版本和当前运行模式 [root@besttest etc]# httpd -V

3)vim/etc/httpd/conf/httpd.conf

这里可以看到我们的apache版本是2.2.15,工作模式为Prefork

Apache的早期版本2.0默认prefork,2.2版本是worker,2.4版本是event

在 Apache 的配置文件 httpd.conf 里添加一段 Location /server-status

多进程单线程改为—多进程多线程 event

4)访问http://ip地址/server-status,便可以看到监控页面

  • 你对tcp和udp协议的区别有什么理解

1) TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接

2) TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付

Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。

3) UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。

4) 每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信

5) TCP对系统资源要求较多,UDP对系统资源要求较少。

第三轮:

一般是公司的CTO面试或者经理面试,时间在20-30分钟左右,技术和上面差不多,但是会多一些软情商的问题

问题总结如下:

  1. 你执行case的测试策略是什么?在项目时间很充裕的情况下你怎么调整测试策略,在时间很紧的情况下怎么调整你的测试执行策略?
  2. 如果公司内部出现一些不愉快的事情你怎么去协调?比如说开发就说这不是一个bug,不愿意修改?或者开发做的东西质量很差,你怎么去协调?
  3. 未来职业发展规划是什么?建议不要说管理岗
  4. 你对科技这块的东西是否感兴趣,谈谈你对未来科技趋势的理解?什么物联网,大数据,人工智能
  5. 你对未来团队的氛围有什么期望吗?
  6. 你有什么缺点?
  7. 你在项目中遇到的困难与挑战是什么?
  8. 建议不要说自己转行(面大厂说自己转行是很减分的,我试过)

    第四轮:

HR谈薪资和入职行政事宜,此处省略;

转载:总结面试当中遇到的问题

原文作者: dgb8901,yinxing

原文链接: https://www.itwork.club/2018/10/18/interview-summary/

版权声明: 转载请注明出处

为您推荐

体验小程序「简易记账」

关注公众号「特想学英语」

CSS学习:伪类、伪元素