一、自我介绍(1~2分钟,人家考察的点是对你这个人的第一印象,所以你语言表达要流畅,不卡顿)
面试官,你好,我叫***,来自**,2016年来到上海发展,这几年当中,一直从事软件测试工作,迄今为止,也有5年的一个工作经验了,在工作中,我自认为我是一个比较细心,责任感非常强的一个人,上家公司的领导对我还算比较满意,这几年的测试工作,对我来说也有很大的进步,我熟悉软件测试的基本理论,熟练掌握linux,mysql数据库,jmeter接口测试,等一些相关的测试软件,上家公司做的项目有涉及到web端跟APP端,主要是做了* * * ***项目,我很开心今天能够来到贵公司面试,如果有幸能够通过今天的面试,和您成为同事,我会感觉非常荣幸,以上是我个人简单的一个自我介绍,您可以接着问下一个问题。
(2-3年工作经验的参考以下自我介绍)
面试官好,我叫***,来自**,自毕业以后一直从事软件测试工作,虽然我工作年限不是很多,但是我个人觉得我还是一个比较踏实认真的人,这两年的工作经验,包括我的实习经验都给了我很大的成长,我也掌握软件测试的流程跟方法,平时工作会写测试用例啊,做功能测试跟接口测试,同时我也掌握缺陷管理工具的使用,还有linux操作系统的常用命令,Jmeter接口测试工具的使用,以及数据库的增删改查,感谢面试官给我面试的机会,如果今天我能有机会通过贵公司的面试,我也会好好珍惜这份工作,那么以上就是我个人的一个简单介绍,您可以接着问下一个问题
二、你平时工作是如何开展的?(你们的项目流程是怎么样的/或者是测试工作流程是怎样的)
你好面试官,我们测试人员的工作是从接到需求书开始的,拿到需求文档以后,项目经理组织我们召开需求评审会议,这个会议中我们把需求不完整、我们测试跟开发理解不一致的地方进行讨论,给出一个最终的解决方案,完了以后我们就去写测试用例,开发就去写代码去了,差不多写好以后我们就等开发提测,部署一下测试环境后简单的冒个烟,然后就进行全面的第一轮系统性测试,在这个测试过程中,我们会发现大量的缺陷,那我们就把缺陷提交到bugzilla(缺陷管理工具可以改成别的)里面,然后第一轮测试以后呢,我们就测第二轮,同样的,也部署下测试环境的包,先把第一轮发现的缺陷验证一下,然后进行第二轮的全量回归,如果还有缺陷就继续提交缺陷,接着第三轮,第四轮这样子,如果没有了,我们就叫产品来做UAT测试,过了就点测试通过,写下测试报告,等待发版上线,差不多就是这样子一个流程。
这里一定要补充两个点:
1、第一个预防缺陷,在时间允许的情况下,开发提测前去开发环境里面走一遭,多点点,不让一些严重的缺陷流入测试环境,或者把自己写的测试用例发给开发让他们自测。
2、把UAT测试放在第一轮测试结束之后,为什么这么做呢,因为这个功能实现后产品没有来U之前他也不知道做成什么样子,我叫他提前来,万一做的不符合要求,或者有什么点不完善,这个时间开发还有大量的时间去改,那如果我在发版之前U,万一U出来个缺陷呢,开发也很不情愿,说没有时间改啊之类的,那么放在第一轮测试之后,大家都会比较轻松
简洁版(适用于实在是记不住的童鞋,根据这几个点讲哈)
1、需求会议评审
2、编写测试用例,用例评审
3、开发提测后部署测试环境,冒烟测试
4、第一轮系统性测试,提交缺陷,跟踪缺陷
5、第二轮回归测试,验证缺陷
6、UAT测试,编写测试报告
三、测试环境你们自己维护吗?(部署测试吗?怎么部署的?linux常用的操作命令是什么)
你好面试官,测试环境我们自己维护的,开发提测后,我们会先把测试环境包的给做一个拷贝(备份),用到的命令是cp -r命令
然后开发会发给我们一个包,这个包像数据库脚本一般是zip格式的,解压是unzip命令,前端包,后端包是,那么用到解压命令就是tar -zxvf命令,然后我们把这个包替换到测试环境的路径下,用到mv命令,替换好以后需要重启服务,先看下之前的进程在不在,查看一下进程ps -ef | grep $USER ,杀掉之前的进程kill -9 ,然后重启服务(这里有些重启命令不是这样子的,每台服务器可能不一样,回答的时候你就说我们公司就是这么用的就可以了)
另外,我们修改配置文件magpie文件的时候,需要用到vi编辑器,vi打开这个文件,进入编辑模式修改好文件内容后,要么保存退出用到:wq命令,要么退出不保存用到:q!命令
除此之外,我们查看日志用到tail -f ,还有查看文件内容用cat啊 通过关键字去查看日志内容用 grep 关键字+文件名,那么我根据时间段去查询的话呢就是sed -n '/2019-10-24 22:16:21/,/2019-10-24 22:16:59/p' ,等等
四、面试问,接口测试的重点在哪里?
回答思路(浅一点的):
1、这个问题很广泛,咱们最好是举例子说明,从对比功能测试跟接口测试的不同点去出发
你好面试官,我觉得接口测试的重点是这样子的,我举个例子说明一下,因为咱们功能都是在页面上点嘛,有些下拉框就是直接选值,也没有反例的情况,但是接口不同,接口是借助Jmeter工具,绕过前端,在脚本里面一般用JSON格式的字符串,一个key对应一个value值这样子去填写值,那么久比如有个字段是叫教育程度,它是一个选择框,有初中、高中、大专、本科、研究生,那么页面上我直接选择就ok了,但是接口的话我就得根据接口填写它对应的值,比如0-初中、1-高中、2-大专、3-本科、4-研究生,那么这个value值就是0-4的值,它有很多个反例,像非0-4的值,就5啊,小数啊、负数啊,重复值我给写个0;0或者同时填写0;1;2;3;4这几个值会不会后台拦截呢,还有中英文啊,非int类型的值,所以从这点可以看出,我觉得接口测试就要测一些内部逻辑的东西,反例跟功能相对比而言多一点,而且接口他能测出来页面上测不出来的缺陷
场景:比如说我配置优惠券的时候,给这个优惠券配置一些规则,限制优惠券的使用地区,那么就有这两个字段,一个是是否限制城市先(是或否),一个是城市列表,只有当限制城市为是的时候才展示城市列表,那么我通过页面上去点的时候是实现不了限制城市为否,填写城市列表的这种情况,但是接口这种场景是可以去测的,就是接口的入参city_limit,0-否;1-是,cityID就输入一些城市代码,那么我就把city_limit的值填写为0,但是下面也传cityID为00010000,假设是上海,那么运行这个的结果应该是报错,后台拦截的,如果后台没有拦截城市为否,又填写城市ID的值的这种情况的话,就是一个Bug
五、你们工作中,抓包工具用什么?怎么定位前后端bug的?
web项目的话,一般工作中使用方式比较多的是使用浏览器自带的F12抓包看接口请求。
如果是app客户端之类的,一般采用fiddler等工具进行抓包接口。
不管哪种方式,目的都是通过查看接口,去定位分析属于前端问题还是后端问题。
比如你在淘宝上边购买了一件商品,并且成功支付,但是在我的订单里面却没有记录,你应该如何去分析定位这个问题?
首先需要搞明白的是这个场景的数据流调用的逻辑关系,不过这个问题比较简单。
整体来说就是前端购买商品,支付成功,会把这条数据的商品信息加支付信息都落入数据库中。
然后点击我的订单,会调后端接口,后端从数据库取相关信息,然后前端渲染展示商品和支付信息。
搞明白这个场景的数据流转就很容易定位分析这个bug了,可以使用抓包工具抓包这个我的订单调后端的接口。
如果抓不到这个接口,就是前端没有发出请求,显然是前端问题。
如果有请求并且响应了,就查看这个接口响应信息,如果返回报错了,则需要具体分析报错内容。
这个时候既有可能是前端入参传的不对,导致后端报错。也有可能是前端传对了,后端处理错误,需要具体分析是前端问题还是后端问题。
如果后端成功响应了且返回信息跟接口文档定义的一致,那么大概率是前端展示的问题,这个时候需要找前端同事。
所以,前后端问题就是具体问题具体分析,我们最终的目的就是通过抓包协助开发定位问题,缩小定位的范围值
另外一个例子:
1)访问:http://39.108.136.60:8380/ningmengban/app/login/
2)输入登录账号(用户名 / 密码):304034318@ / 123456
3)点击登录,无任何反映(没有提示也没有跳转)
从页面交互看,输入账号,点击登录要么登录成功进入系统,跳转到系统其他页面,要么登录失败给出错误提示,而现在没有任何反应,这肯定是一个bug,但是这个bug到底是属于前端bug还是后端,我们无从而知,但是我们可以顺手打开浏览器调试器来分析定位一下。
打开控制台,我们看到了控制台并没有js错误,但是有向后台发起一个请求,同样,此时还无法有效定位到问题到底发生在前端还是后端,但是可以截个图,写上自己的测试过程:
继续打开“网络”标签,我们看到这个底下有一个500请求,根据请求中的关键字眼login我们断定这个就是登录接口,而500则说明是后端服务器内部异常,一般是由于后台代码执行中报错导致的,所以截图写上我们的分析,到时候提bug附上这个截图
结论:根据请求返回的状态码500,我们就能断定这个bug是后台代码执行时候报错导致的,提bug带上上面的这个信息,开发人员就知道要去检查登录接口的代码了,因此缩小了开发定位问题的范围,保证了开发能在第一时间快速fix掉bug
这里可能面试官还会问你,如果抓包抓不到这个请求,也没有后台日志,那么你觉得,按钮点不动的原因都有哪些?
1)最主要的是可能前端的代码有问题,需要请开发小哥来帮忙检查下代码
2)还有可能是缓存造成的浏览器假死,需要把缓存清一下
3)另外就是防火墙是不是被拦截了
4)界面元素的问题,就是最外层div高度低于底层图片高度,点击图片上的按钮时出现偶发性点击不动的现象,即点击按钮实际点击的是底层的div静态图片,增加子元素的高度以及设置子元素有效。
六、Jmeter参数化的几种方式是什么(具体不知道操作步骤的话可以看看****上面的图例)
1、用户参数 前置处理器 (PreProcessors) -- 用户参数(User Parameters 它每次的值都是变动的,变量
2、用户自定义的变量 用户定义变量的所有数据只会初始化一次,不管你多少线程,循环多少次,它的值是不变的,只是在多个接口里面用到
3、csv文件参数化 (1)创建csv文件;(2)在线程组中添加并配置CSV Data Set Config ; (3)配置CSV Data Set Config;
(4)引用csv文件中的数据,找到需要传递参数的HTTP请求,将具体值改为变量引用,引用变量:${变量名},在察看结果树中,察看变量引用的具体值
4、函数助手,用的比较少,可以简单带一下就成
正则表达式的用法(下游的入参需要用到上游的出参,但是这个参数又是个变量的情况下)
假设我新增配置一张优惠券,那么我就是新增,但是每新增一张就是一个新的活动ID,那么我需要去修改这个优惠券的时候,需要用户这个活动ID,那么我就用正则表达式去提取变量,添加后置处理器-正则表达式提取器,写入引用名称,也就是ActivityID,正则表达式就是“ActivityID”:"(.+?)" 模板为$1$,匹配数字为1,然后执行脚本查看结果
断言怎么添加:(设定运行结果是对是错,包含什么内容)
线程组-响应断言,把要测试的响应字段选为响应文本,模式匹配规则为包括,假设我优惠券新增成功以后的ActivityID是132开头的,那就把要测试的模式里面写入132
七、你知道jmeter是怎么连接数据库的么?
1、首先要下载好myaql的JDBC驱动jar包,把它放在jmeter的lib目录下
2、在测试计划下添加驱动地址
3、选择线程组-添加-配置原件-JDBC Connection Configuration
4、配置JDBC Connection Configuration ,Database URL(数据库的IP地址,端口、名称),JDBC Driver Class(数据库驱动),Username(用户名),Password(密码),连接好验证一下是不是可以用就可以了
jmeter 操作数据库
操作数据库基本有四个步骤:(1)导入mysql的jdbc的jar包 (2)创建数据库的连接配置,线程组里添加配置元件-JDBC Connection Configuration (3)线程组里添加jdbc request,写sql语句 (4)添加察看结果树,点击启动按钮,就能看到执行的SQL
九、如果面试问,你在这个版本的项目需求评审中,提出了哪些有效的意见?
回答:你好面试官,我记得当时这个版本的一次迭代中,新增了四个字段,叫做跳转参数,并且它的要求是需要同步给数据中心,这个字段叫做param1、param2、param3、param4,然后是依次同步的,然后我就有个疑问,数据库落表的话,如果我只填写了param2跟param4,它是落表也是直接落到相对应的param2跟param4字段里面吗?还是说我在1跟3不填的情况下,会把2跟4的值落入1跟3,内部的处理逻辑是怎么样子的,因为之前遇到过这种问题
如果面试官追问,那最终是怎么处理的?
回答:最终就是如果在1跟3没有填写的情况下,就把2跟4的值默认落入1跟3,因为前面一个值无效,不处理第二个值,如果第二个值有效,就把第二个当成第一个值取处理,因为这个需求没有明确说明,后来就是经过讨论,要么四个值都为空,其中一个或两个为空,无法保存该值,就不会有这个问题了
十、开发认为不是缺陷,你觉得是缺陷?(人家面试官考验的问题在于这个bug最终有没有解决,而是你处理问题的能力)
回答思路:你好面试官,这种问题很常见,我举个简单的例子来讲,我发现有个缺陷就是需求要求这个字段是必填,我去测的时候确实也是必填,但是开发漏掉了一个*的标志,虽然不影响使用,但是就比如电话号码这样一个字段,有些用户的习惯就是不想填入个人的隐私的问题,他第一眼看过去就是没有*必填的标志,结果他没有填写,然后他提交的时候又提示他必填,客户还得回去填写一下,但是如果有或者标志,那他们可能填写的时候就直接写了对吧,因为这个事情,开发说需求里面没有说要加*必填的标志,就不愿意改,然后我把我作为用户的一个场景跟感受给开发说了以后人家就加上去了,我们经常因为这种很小很小的问题会有不同意见,但是没关系,我们最终的目的是要解决问题,而不是扯别的,我会很心平气和跟我们开发讲,因为平时工作中,我还是帮他很大忙,就好比提测前,我去开发环境帮他测,大量的减少了缺陷的产生,我也经常收到开发买的小零食,这种问题我不会跟他发生很大的矛盾,就算实在有问题,那么我就只好请产品介入明确需求了
十一、Web端跟APP端的区别有哪些?
你好面试官,APP端web端还是有很多方面的区别的,比如说从兼容性方面来讲,web端要测不同的浏览器,像谷歌、IE、火狐、360这些,还有windows系统,mac系统
APP端的话就是不同品牌的手机,还有不同配置的手机,还有不同手机尺寸的分辨率,还有不同的手机系统,例如安卓、IOS,还要测平板的
从安全性方面来讲的话,web端密码显示成密文,浏览器上方的URL隐蔽性跟安全性有重要信息的转码,每次去访问就会有cookie跟session
APP端密码、cookie跟session跟web端是一样,不一样的是APP端有些比如通讯录、短信、地址、微信这些需要去授权才能访问
还有从网络这方面,web端就是网线跟wifi嘛,APP端的话是出WIFI外,还有2G、3G、4G、5G、完全无网络的状态下,也是我们需要去做的一些弱网测试
另外就是一些APP专项测试,像安装、更新升级、卸载、耗电量、内存、手机流量消耗等,大概就是这些!
十二、面试官可能会跟上以上问题引申出来的一个问题,那么cookie跟session区别跟联系你知道吗?(也是面试常问的)
cookie:存储在本地浏览器中,session是存储在服务器上的,可以存在数据库,也可以存在redis,也可以存在服务端的本地文件中
cookie:时效性,需要在本地手动清理。session的失效,是在代码的配置文件中设置的。
验证登录:cookie验证登录、session验证登录,一般是用token验证
相对而言session比cookie安全一点。
联系:sessions是以 key:value的形式出现的,那么 它的value 就会保存在本地cookie中
十四、压测怎么做?
压测前要明确压测功能和压测指标,一般需要确定的几个问题:
固定接口参数进行压测还是进行接口参数随机化压测?
要求支持多少并发数?
TPS(每秒钟处理事务数)目标多少?响应时间要达到多少?
压服务器名称还是压服务器IP,一般都是压测指定的服务器
压测结果查看
运行完后,聚合报告会显示压测的结果。主要观察Samples、Average、error、Throughput。
Samples:表示一共发出的请求数
Average:平均响应时间,默认情况下是单个Request的平均响应时间(ms)
Error%:测试出现的错误请求数量百分比。若出现错误就要看服务端的日志,配合开发查找定位原因
Throughput:简称tps,吞吐量,默认情况下表示每秒处理的请求数,也就是指服务器处理能力,tps越高说明服务器处理能力越好。
压测结果的分析
有错误率同开发确认,确定是否允许错误的发生或者错误率允许在多大的范围内;
Throughput吞吐量每秒请求的数大于并发数,则可以慢慢的往上面增加;若在压测的机器性能很好的情况下,出现吞吐量小于并发数,说明并发数不能再增加了,可以慢慢的往下减,找到最佳的并发数;
压测结束,·登陆相应的web服务器查看CPU等性能指标,进行数据的分析;
最大的tps:不断的增加并发数,加到tps达到一定值开始出现下降,那么那个值就是最大的tps。
最大的并发数:最大的并发数和最大的tps是不同的概率,一般不断增加并发数,达到一个值后,服务器出现请求超时,则可认为该值为最大的并发数。
压测过程出现性能瓶颈,若压力机任务管理器查看到的cpu、网络和cpu都正常,未达到90%以上,则可以说明服务器有问题,压力机没有问题。
影响性能考虑点包括:数据库、应用程序、中间件(tomact、Nginx)、网络和操作系统等方面。