从外包菜鸟到搭建测试大佬,薪资三年翻三倍,连自己都不敢信(附面试真题与学习笔记)

目录

  • 前言
  • 故事
  • 查看学习笔记
  • 计算机基础知识面试题
    • 1. 你对http请求跟webservice请求的了解
    • 2. 描述一下Http协议
    • 3.get 和 post 请求区别,这个是被问烂的题了
    • 4.HTTP 状态码 2xx,3xx,4xx,5xx 分别是什么意思?
    • 5.什么是 DNS?
  • Python编程语言面试题
    • 1.字符串切割
    • 2.格式化输出
    • 3. 队列
    • 4.水仙花
    • 5.排序
  • 数据库面试题
    • SQL数据库
      • 学生表 查询
        • 1.列出数学成绩前 3 名的学生(要求显示字段:学号,姓名, 科目,成绩)
        • 2.查询第 2-3 名记录
        • 3.查询第 3 到后面所有的
        • 4.统计每门课程不及格、一般、优秀(课程 不及格(<60) 一般(60<= x <=80) 优秀(>80))
  • linux操作面试题
    • 1.说出 10 个 linux 常用的指令
    • 2.如何查看所有 java 进程
    • 3.如何查看测试项目的日志
    • 4.如何查看最近 1000 行日志
    • 5.如果知道一个文件名称,怎么查这个文件在 linux 下的哪个目录,如:要查找tnsnames.ora 文件
    • 6.find 查找文件
  • WEBUI自动化测试面试题
    • 1.如何判断一个页面上元素是否存在?
    • 2.用例在运行过程中经常会出现不稳定的情况,也就是说这次可以通过,下次就没办法通过了,如何去提升用例的稳定性?
    • 3.如何截取某一个元素的图片,不要截取全部图片
    • 4.如何定位动态元素
  • APP自动化测试面试题
    • 1.app 测试和 web 测试有什么区别?
    • 2.android 和 ios 测试区别?
    • 3.app 出现 ANR,是什么原因导致的?
    • 4.app 对于不稳定偶然出现 anr 和 crash 时候是怎么处理的?
    • 5.你平常会看日志吗, 一般会出现哪些异常(Exception)?
  • 接口自动化测试面试题
    • 1.为什么要做接口测试?
    • 2.平常你是怎么测试接口的?
    • 3.平常用什么工具测接口的
    • 4.webService 接口是如何测试的
    • 5.在手工接口测试或者自动化接口测试的过程中,上下游接口有数据依赖如何处理?
    • 6.当一个接口出现异常时候,你是如何分析异常的?
    • 7.json 和字典 dict 的区别?
    • 8.测试的数据你放在哪
    • 9.什么是数据驱动,如何参数化?
  • 笔记分享

前言

见过许多转行做测试的,但是三年从转行测试小白做到公司内测试团队总监候选,我想应该没几个从外包菜鸟到搭建测试大佬,薪资三年翻三倍,连自己都不敢信(附面试真题与学习笔记)_第1张图片

友商一家公司有一个传奇人物,和大多数人转行测试开始工作一样,她也是从外包开始干起,在此不好指出这个人,毕竟做过外包在正统的计算机专业出生眼中,总容易被看低一头,并不想因为这篇文章,让他被戴上偏见的帽子,就称呼其为黄某

没技术、没经验、没高学历、没正经公司要,只有从外包开始干起,甚至连外包都没得选,只是单纯的被外包公司挑来挑去

从外包菜鸟到搭建测试大佬,薪资三年翻三倍,连自己都不敢信(附面试真题与学习笔记)_第2张图片

故事

黄某25岁销售专业转行,刚进外包之初,她给自己的人生规划凸显出了她比之毕业大学生更丰富的阅历

作为一个自学测试知识转行后的第一份工作,她并不表现得很兴奋,因为她很清楚这是一个外包公司,从她入职的第一天,就没有过“我需要为这个公司这个行业努力打拼奉献一生”的觉悟

她说那时的她很清楚,软件测试连互联网的门都没进,所在的外包公司更是只能远远地看着互联网测试的大门,若是说互联网行业是一个小院子,那么此时的她仅仅只是门外遥之千里的一个无名旅人,离互联网行业还差的远

“我不理解那些埋怨行业的人,他们真的今日行业了吗?”
从外包菜鸟到搭建测试大佬,薪资三年翻三倍,连自己都不敢信(附面试真题与学习笔记)_第3张图片

黄某转行的理由很简单也很实在,那就是赚钱,在信息时代,她觉得互联网的红利自己是可以赶上的,有了明确的目的,她便开始学习和互联网行业有直接关系的东西——一门编程语言

她自学的方式比许多人明智,想到自己就是为了工作,那么就为了岗位而学习

她去各种网站、各种平台、各种app上找测试需求的技能,看见名词的就去查,就去问同事,再不济就去论坛、交流群里问问,一开始是很困难了,没有计算机基础的她甚至连什么是C++,什么是Java,什么是Python都搞不懂

但当她慢慢地搞懂这些名词,开始慢慢的摸索属于自己的学习路线,从计算机基础知识开始,一直到自动化测试

计算机基础知识>>>Python编程语言>>>数据库知识>>>WEBUI自动化测试>>>APP自动化测试>>>接口自动化测试>>>pytest>>>jenkins>>>PageObject设计模式

查看学习笔记

分享一些她的学习笔记,大致的学习路线就像这样,完整的图有点大,截全图就太糊了,不过需要这份学习路线完整图的伙伴,可以点击并输入暗号:CSDN进行领取

从外包菜鸟到搭建测试大佬,薪资三年翻三倍,连自己都不敢信(附面试真题与学习笔记)_第4张图片)
“所谓提升就是不断的出错。”

黄某在入行的时候,就见过互联行业里的一句话“如果你写过10000行不重复的有效代码,你就算入门互联网前沿了。”

经过了将近八九个月零碎的学习,她觉得自己会了,但社会经验告诉过所有人一件事,你觉得自己会和你真的会是两码事,这两者之间是需要很多事情去磨炼的。

那怎么办呢?这个时候她想到了两种方法,github找开源项目和面试,虽然作为外包,但是每个月还是有三天假期可以请。

做开源项目——请假面试——做开源项目——请假面试

陆陆续续过了三四个月,她从外包公司这摊泥里脱离了出来,虽然样子好不狼狈,但是确实想着光

第二岗位是一家电商公司的,一家不大不小的公司,公司内部新开项目,正好缺人,招了一些大学应届生和社招跳槽的人

这里就告一段落了,我问了问当初她在面试时记忆最深刻的问题,毕竟她和我不一样,时间长了当初入行自动化测试行业的问题,我是真的不记得了

虽然说我也收集过不少朋友给的大厂面试真实题目,但隔着一个网络总有点不真实感,这些面试题我也进行过整理

需要领取这些上百次真实的大厂面试题可以点击并输入暗号:CSDN进行领取
在这里插入图片描述

计算机基础知识面试题

1. 你对http请求跟webservice请求的了解

  • webService接口:是走soap协议通过http传输,请求报文和返回报文都是xml格式的,我们在测试的时候都用通过工具才能进行调用,测试。可以使用的工具有SoapUI、jmeter、loadrunner等

  • http api接口:是走http协议,通过路径来区分调用的方法,请求报文都是key-value形式的,返回报文一般都是json串,有get和post等方法,这也是最常用的两种请求方式。可以使用的工具有postman、RESTClient、jmeter、loadrunner等

2. 描述一下Http协议

http协议又叫做超文本传输协议,在做网络请求的时候,我们基本上是使用http协议。
http协议包括请求和响应。

请求中包括:请求地址,请求方式,请求方式包括get请求和post请求,get和post的区别是get请求是在地址栏后边跟随请求参数,但是请求参数大小是有限制,不同浏览器是不同的。一般是4KB。post请求主要用于向服务器提交请求参数。post请求的参数是放到请求实体内容中的,相对get请求较为安全一些。

另外,请求中会有各种请求头信息,比如支持的数据类型,请求的来源位置,以及Cookie头等相关头信息。

响应,主要包含响应的状态码,像200(),404(),500(),304(),307()
还有各种响应头信息,比如设置缓存的响应头,Content-Type内容类型,设置cookie头信息。

3.get 和 post 请求区别,这个是被问烂的题了

首先这个题看似简单,实际上是个送命题!如果你百度搜到的标准答案可能是这
样的

  • GET 在浏览器回退时是无害的,而 POST 会再次提交请求。
  • GET 产生的 URL 地址可以被 Bookmark,而 POST 不可以。
  • GET 请求会被浏览器主动 cache,而 POST 不会,除非手动设置。
  • GET 请求只能进行 url 编码,而 POST 支持多种编码方式。
  • GET 请求参数会被完整保留在浏览器历史记录里,而 POST 中的参数不会
    被保留。
  • GET 请求在 URL 中传送的参数是有长度限制的,而 POST 么有。
  • 对参数的数据类型,GET 只接受 ASCII 字符,而 POST 没有限制。
  • GET 比 POST 更不安全,因为参数直接暴露在 URL 上,所以不能用来传递
    敏感信息。
  • GET 参数通过 URL 传递,POST 放在 Request body 中。

简单的说:
GET 产生一个 TCP 数据包;POST 产生两个 TCP 数据包。
长的说:对于 GET 方式的请求,浏览器会把 http header 和 data 一并发送出去,服务器响应 200(返回数据); 而对于 POST,浏览器先发送 header,服务器响应 100 continue,浏览器再发送data,服务器响应 200 ok(返回数据)。

4.HTTP 状态码 2xx,3xx,4xx,5xx 分别是什么意思?

  • 200 请求已成功,请求所希望的响应头或数据体将随此响应返回。
  • 201 请求已经被实现,而且有一个新的资源已经依据请求的需要而建立,且其 URI 已经随 Location 头信息返回
  • 202 服务器已接受请求,但尚未处理
  • 301 (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
  • 302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
  • 303 (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
  • 304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。  305 (使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。
  • 307 (临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
  • 401 当前请求需要用户验证。如果当前请求已经包含了 Authorization 证书,那么 401 响应代表着服务器验证已经拒绝了那些证书
  • 403 服务器已经理解请求,但是拒绝执行它。与 401 响应不同的是,身份验证并不能提供任何帮助,而且这个请求也不应该被重复提交
  • 404 请求失败,请求所希望得到的资源未被在服务器上发现
  • 500 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器的程序码出错时出现。
  • 501 服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。
  • 502 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
  • 503 由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。

5.什么是 DNS?

域名解析服务。将主机名转换为 IP 地址。如将 http://www.cnblogs.com/主机名转换为 IP 地址:211.137.51.78

Python编程语言面试题

1.字符串切割

已知一个字符串为“hello_world”, 如何得到一个队列

["hello","world"]
a = "hello_world"
b = a.split("_")
print(b)

2.格式化输出

已知一个数字为 1,如何输出“0001”
a = 1
print("%04d" % a)

3. 队列

已知一个队列,如: [1, 3, 5, 7], 如何把第一个数字,放到第三个位置,得到:
[3, 5, 1, 7]

a = [1, 3, 5, 7]
# insert 插入数据
a.insert(3, a[0])
print(a[1:])

4.水仙花

打印出 100-999 所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数
字立方和等于该数本身。例如:153 是一个"水仙花数",因为 153=1 的三次方+
5 的三次方+3 的三次方。

sxh = []
for i in range(100, 1000):
 s = 0
 m = list(str(i))
 for j in m:
 s += int(j)**len(m)
 if i == s:
 print(i)
 sxh.append(i)
print("100-999 的水仙花数:%s" % sxh)

5.排序

用 python 写个冒泡排序

a = [1, 3, 10, 9, 21, 35, 4, 6]
s = range(1, len(a))[::-1]
print(list(s)) # 交换次数
for i in s:
 for j in range(i):
 if a[j] > a[j + 1]:
 a[j], a[j + 1] = a[j + 1], a[j]
 print("第 %s 轮交换后数据:%s" % (len(s)-i+1, a))
print(a)

数据库面试题

SQL数据库

学生表 查询

有 2 张表,学生表(student)基本信息如下
从外包菜鸟到搭建测试大佬,薪资三年翻三倍,连自己都不敢信(附面试真题与学习笔记)_第5张图片
科目和分数表(grade)
从外包菜鸟到搭建测试大佬,薪资三年翻三倍,连自己都不敢信(附面试真题与学习笔记)_第6张图片

1.列出数学成绩前 3 名的学生(要求显示字段:学号,姓名, 科目,成绩)

select * 
from grade
where kemu = '数学'
order by score 
desc
limit 3

2.查询第 2-3 名记录

select a.id, a.name, b.kemu, b.score
from student a, grade b
where a.id = b.id
and kemu = '数学'
order by score 
desc
limit 1, 2

3.查询第 3 到后面所有的

select a.id, a.name, b.kemu, b.score
from student a, grade b
where a.id = b.id
and kemu = '数学'
order by score 
desc
limit 3, 10000

4.统计每门课程不及格、一般、优秀(课程 不及格(<60) 一般(60<= x <=80) 优秀(>80))

SELECT b.kemu, 
(SELECT COUNT(*) FROM grade WHERE score < 60 and kemu = b.kemu) as 不
及格,
(SELECT COUNT(*) FROM grade WHERE score between 60 and 80 and kemu = b.kemu) 
as 一般,
(SELECT COUNT(*) FROM grade WHERE score > 80 and kemu = b.kemu) as 优 秀
FROM grade b
GROUP BY kemu

linux操作面试题

1.说出 10 个 linux 常用的指令

  • ls 查看目录中的文件
  • cd /home 进入 ‘/ home’ 目录;cd … 返回上一级目录;cd …/… 返回上两级目录
  • mkdir dir1 创建一个叫做 ‘dir1’ 的目录
  • rmdir dir1 删除一个叫做 ‘dir1’ 的目录 (只能删除空目录)
  • rm -f file1 删除一个叫做 ‘file1’ 的文件’,-f 参数,忽略不存在的文件,从不给出提示。
  • rm -rf /mulu 目录下面文件以及子目录下文件
  • cp /test1/file1 /test3/file2 如将/test1 目录下的 file1 复制到/test3 目录,并将文件名改为 file2
  • mv /test1/file1 /test3/file2 如将/test1 目录下的 file1 移动到/test3 目录,并将文件名改为 file2
  • mv * …/ Linux 当前目录所有文件移动到上一级目录
  • ps -ef|grep xxx 显示进程 pid
  • kill 使用 kill 命令来终结进程。先使用 ps 命令找到进程 id,使用 kill -9 命令,终止进程。
  • tar –xvf file.tar 解压 tar 包  unzip file.zip 解压 zip
  • unrar e file.rar 解压 rar
  • free -m 查看服务器内存使用情况

2.如何查看所有 java 进程

  • grep 是搜索关键字
    ps -ef | grep java
  • -aux 显示所有状态
    ps -aux | grep java

3.如何查看测试项目的日志

一般测试的项目里面,有个 logs 的目录文件,会存放日志文件,有个 xxx.out的文件,可以用 tail -f 动态实时查看后端日志
先 cd 到 logs 目录(里面有 xx.out 文件)
tail -f xx.out
这时屏幕上会动态实时显示当前的日志,ctr+c 停止

4.如何查看最近 1000 行日志

tail -1000 xx.out

5.如果知道一个文件名称,怎么查这个文件在 linux 下的哪个目录,如:要查找tnsnames.ora 文件

find / -name tnsnames.ora
查到:
/opt/app/oracle/product/10.2/network/admin/tnsnames.ora
/opt/app/oracle/product/10.2/network/admin/samples/tnsnames.ora
还可以用 locate 来查找
locate tnsnames.ora
结果是:
/opt/app/oracle/product/10.2/hs/admin/tnsnames.ora.sample
/opt/app/oracle/product/10.2/network/admin/tnsnames.ora
/opt/app/oracle/product/10.2/network/admin/samples/tnsnames.ora

6.find 查找文件

find / -name httpd.conf #在根目录下查找文件 httpd.conf,表示在整个硬盘查找
find /etc -name httpd.conf #在/etc 目录下文件 httpd.conf
find /etc -name ‘srm’ #使用通配符(0 或者任意多个)。表示在/etc 目录下查找文件名中含有字符串‘srm’的文件
find . -name ‘srm’ #表示当前目录下查找文件名开头是字符串‘srm’的文件

按照文件特征查找
find / -amin -10 # 查找在系统中最后 10 分钟访问的文件(access time)
find / -atime -2 # 查找在系统中最后 48 小时访问的文件
find / -empty # 查找在系统中为空的文件或者文件夹
find / -group cat # 查找在系统中属于 group 为 cat 的文件
find / -mmin -5 # 查找在系统中最后 5 分钟里修改过的文件(modify time)
find / -mtime -1 #查找在系统中最后 24 小时里修改过的文件
find / -user fred #查找在系统中属于 fred 这个用户的文件
find / -size +10000c #查找出大于 10000000 字节的文件(c:字节,w:双字,k:KB,M:MB,G:GB)
find / -size -1000k #查找出小于 1000KB 的文件

WEBUI自动化测试面试题

1.如何判断一个页面上元素是否存在?

def is_element_exsist(driver, locator):
 '''
 判断元素是否存在,存在返回 True,不存返回 False
 :param locator: locator 为元组类型,如("id", "yoyo")
 :return: bool 值,True or False
 '''
 try:
 driver.find_element(*locator)
 return True
 except Exception as msg:
 print("元素%s 找不到:%s" % (locator, msg))
 return False
if __name__ == '__main__':
 loc1 = ("id", "yoyo") # 元素 1
 print(is_element_exsist(driver, loc1))

2.用例在运行过程中经常会出现不稳定的情况,也就是说这次可以通过,下次就没办法通过了,如何去提升用例的稳定性?

  1. 不要右键复制 xpath
  2. 定位没问题,第二个影响因素那就是等待了,sleep 等待尽量少用
  3. 定位元素方法重新封装,结合 WebDriverWait 和expected_conditions 判断元素方法,自己封装一套定位元素方法

3.如何截取某一个元素的图片,不要截取全部图片

# coding:utf-8
from selenium import webdriver
from PIL import Image
driver = webdriver.Chrome()
driver.get('http://www.baidu.com/')
driver.save_screenshot('button.png')
element = driver.find_element_by_id("su")
print(element.location) # 打印元素坐标
print(element.size) # 打印元素大小
left = element.location['x']
top = element.location['y']
right = element.location['x'] + element.size['width']
bottom = element.location['y'] + element.size['height']
im = Image.open('button.png')
im = im.crop((left, top, right, bottom))
im.save('button.png')

4.如何定位动态元素

动态元素有 2 种情况,一个是属性动态,比如 id 是动态的,定位时候,那就不要用 id 定位就是了

<p id="cha" class="hello world"> 
 <button id="cha_auto_20201210" name="heo" >登录</button>
 <br>
</p>

比如上面这个 button 元素,id 是动态的,定位方法千千万,何必死在 id 上,可以用 name 定位,哪怕这个元素属性都是动态的,它的标签不可能动态吧,那就定位父元素
id="cha"a: .//*[@id=‘cha’]/button

还有一种情况动态的,那就是这个元素一会在页面上方,一会在下方,飘忽不定的动态元素,定位方法也是一样,按 f12,根据元素属性定位(元素的 tag、name的步伐属性是不会变的,动的只是 class 属性和 styles 属性)

APP自动化测试面试题

1.app 测试和 web 测试有什么区别?

他们的主要区别在于具体测试的细节和方法有区别,比如:性能测试,在 WEB测试只需要测试响应时间这个要素,在 App 测试中还需要考虑流量测试和耗电量测试。

兼容性测试:web主要兼容个浏览器,而app测试需要兼容不同品牌、分辨率、不同操作系统
安装测试:App 测试是存在客户端层面的安装测试,那么就具备相关的测试点。
交叉事件测试:在操作某个软件的时候,来电话、来短信,电量不足提示等外部事件。
操作类型测试:如横屏测试,手势测试
升级测试:升级测试的提醒机制,升级取消是否会影响原有功能的使用,升级后用户数据是否被清除了。

2.android 和 ios 测试区别?

1.Android 长按 home 键呼出应用列表和切换应用,然后右滑则终止应用;
2.多分辨率测试,Android 端 20 多种,ios 较少;
3.手机操作系统,Android 较多,ios 较少且不能降级,只能单向升级;新的 ios系统中的资源库不能完全兼容低版本中的 ios 系统中的应用,低版本 ios 系统中的应用调用了新的资源库,会直接导致闪退(Crash);
4.操作习惯:Android,Back 键是否被重写,测试点击 Back 键后的反馈是否正确;应用数据从内存移动到 SD 卡后能否正常运行等;
5.push 测试:Android:点击 home 键,程序后台运行时,此时接收到 push,点击后唤醒应用,此时是否可以正确跳转;ios,点击 home 键关闭程序和屏幕锁屏的情况(红点的显示);
6.安装卸载测试:Android 的下载和安装的平台和工具和渠道比较多,ios 主要有 app store,iTunes 和 testflight 下载;
7.升级测试:可以被升级的必要条件:新旧版本具有相同的签名;新旧版本具有相同的包名;有一个标示符区分新旧版本(如版本号),对于 Android 若有内置的应用需检查升级之后内置文件是否匹配(如内置的输入法)

3.app 出现 ANR,是什么原因导致的?

总结有以下两点:
1.主线程执行了耗时操作,比如数据库操作或网络编程
2.其他进程(就是其他程序)占用 CPU 导致本进程得不到 CPU 时间片,比如其他进程的频繁读写操作可能会导致这个问题。

主要有如下几点:

  1. 耗时的网络访问
  2. 大量的数据读写
  3. 数据库操作
  4. 硬件操作(比如 camera)
  5. 调用 thread 的 join()方法、sleep()方法、wait()方法或者等待线程锁的时候
  6. service binder 的数量达到上限
  7. system server 中发生 WatchDog ANR
  8. service 忙导致超时无响应
  9. 其他线程持有锁,导致主线程等待超时
  10. 其它线程终止或崩溃导致主线程一直等待。

4.app 对于不稳定偶然出现 anr 和 crash 时候是怎么处理的?

抓日志

1. app 开发保存错误日志到本地
一般 app 开发在 debug 版本,出现 anr 和 crash 的时候会自动把日志保存到本地实际的 sd 卡上,去对应的 app 目录取出来就可以了
2.第三方 sdk 统计工具
一般接入了第三方统计 sdk,比如友盟统计,在友盟的后台会抓到报错的日志

5.你平常会看日志吗, 一般会出现哪些异常(Exception)?

常见的异常几种如下:

  • NullPointerException - 空指针引用异常
  • ClassCastException - 类型强制转换异常。
  • IllegalArgumentException - 传递非法参数异常。
  • ArithmeticException - 算术运算异常
  • ArrayStoreException - 向数组中存放与声明类型不兼容对象异常
  • IndexOutOfBoundsException - 下标越界异常
  • NegativeArraySizeException - 创建一个大小为负数的数组错误异常
  • NumberFormatException - 数字格式异常
  • SecurityException - 安全异常
  • UnsupportedOperationException - 不支持的操作异常

接口自动化测试面试题

1.为什么要做接口测试?

  1. 可以发现很多在页面上操作发现不了的 bug
  2. 检查系统的异常处理能力
  3. 检查系统的安全性、稳定性
  4. 前端随便变,接口测好了,后端不用变
  5. 可以测试并发情况,一个账号,同时(大于 2 个请求)对最后一个商品下单,或不同账号,对最后一个商品下单
  6. 可以修改请求参数,突破前端页面输入限制

2.平常你是怎么测试接口的?

  • 通过性验证:首先肯定要保证这个接口功能是好使的,也就是正常的通过性测试,按照接口文档上的参数,正常传入,是否可以返回正确的结果。
  • 参数组合:现在有一个操作商品的接口,有个字段 type,传 1 的时候代表修改商品,商品 id、商品名称、价格有一个是必传的,type 传 2 的时候是删除商品,商品 id 是必传的,这样的,就要测参数组合了,type 传 1 的时候,只传商品名称能不能修改成功,id、名称、价格都传的时候能不能修改成功。
  • 接口安全:
  1. 绕过验证,比如说购买了一个商品,它的价格是 300 元,那我在提交订单时候,我把这个商品的价格改成 3 元,后端有没有做验证,更狠点,我把钱改成-3,是不是我的余额还要增加?
  2. 绕过身份授权,比如说修改商品信息接口,那必须得是卖家才能修改,那我传一个普通用户,能不能修改成功,我传一个其他的卖家能不能修改成功
  3. 参数是否加密,比如说我登陆的接口,用户名和密码是不是加密,如果不加密的话,别人拦截到你的请求,就能获取到你的信息了,加密规则是否容易破解。
  4. 密码安全规则,密码的复杂程度校验
  • 异常验证:
    所谓异常验证,也就是我不按照你接口文档上的要求输入参数,来验证接口对异常情况的校验。比如说必填的参数不填,输入整数类型的,传入字符串类型,长度是 10 的,传 11,总之就是你说怎么来,我就不怎么来,其实也就这三种,必传非必传、参数类型、入参长度。
  • 性能测试
    接口并发情况,如上面提到的:一个账号,同时(大于 2 个请求)对最后一个商品下单,或不同账号,对最后一个商品下单接口响应时间,响应时间太长了,肯定需要优化,一般都是毫秒级别

3.平常用什么工具测接口的

postman和jmeter

4.webService 接口是如何测试的

webService 接口用 SoapUI

5.在手工接口测试或者自动化接口测试的过程中,上下游接口有数据依赖如何处理?

用一个全局变量来处理依赖的数据,比如登录后返回 token,其它接口都需要这个 token,那就用全局变量来传 token 参数

6.当一个接口出现异常时候,你是如何分析异常的?

1.抓包,用 fiddler 工具抓包,或者浏览器上 f12,app 上的话,那就用 fiddler设置代理,去看请求报文和返回报文了
2.查看后端日志,xhell 连上服务器,查看日志

7.json 和字典 dict 的区别?

json 本质上是字符串,只是按 key:value 这种键值对的格式来的字符串

import json
# a 是字典 dict
a = {
     "a": 1, "b": 2, "c": True}
# b 是 json
b = '{"a": 1, "b": 2, "c": true}'
print(type(a))
print(json.dumps(a)) # a 转 json
运行结果
<class 'dict'>
{
     "a": 1, "b": 2, "c": true}
<class 'str'>
{
     'a': 1, 'b': 2, 'c': True}

8.测试的数据你放在哪

1.对于账号密码,这种管全局的参数,可以用命令行参数,单独抽出来,写的配置文件里(如 ini)
2.对于一些一次性消耗的数据,比如注册,每次注册不一样的数,可以用随机函数生成
3.对于一个接口有多组测试的参数,可以参数化,数据放yaml,text,json,excel都可以
4.对于可以反复使用的数据,比如订单的各种状态需要造数据的情况,可以放到数据库,每次数据初始化,用完后再清理
5.对于邮箱配置的一些参数,可以用 ini 配置文件
6.对于全部是独立的接口项目,可以用数据驱动方式,用 excel/csv 管理测试的接口数据
7.对于少量的静态数据,比如一个接口的测试数据,也就 2-3 组,可以写到 py脚本的开头,十年八年都不会变更的

9.什么是数据驱动,如何参数化?

参数化就是代码用例写好了后,不需要改代码,只需维护测试数据就可以了,并且根据不同的测试数据生成多个用例

数据驱动就像

import unittest
import ddt
# 测试数据
datas = [ {
     "user": "admin", "psw": "123", "result": "true"},
 {
     "user": "admin1", "psw": "1234", "result": "true"},
 {
     "user": "admin2", "psw": "1234", "result": "true"},
 {
     "user": "admin3", "psw": "1234", "result": "true"},
 {
     "user": "admin4", "psw": "1234", "result": "true"},
 {
     "user": "admin5", "psw": "1234", "result": "true"},
 {
     "user": "admin6", "psw": "1234", "result": "true"},
 {
     "user": "admin7", "psw": "1234", "result": "true"},
 {
     "user": "admin8", "psw": "1234", "result": "true"},
 {
     "user": "admin9", "psw": "1234", "result": "true"},
 {
     "user": "admin10", "psw": "1234", "result": "true"},
 {
     "user": "admin11", "psw": "1234", "result": "true"}]
@ddt.ddt
class Test(unittest.TestCase):
 @ddt.data(*datas)
 def test_(self, d):
 """cha:{0}"""

笔记分享

她的笔记有点多,我看的时候,好家伙word文档一千多页,此外她还记在了笔记本上,写了有一本半的笔记,铺的满满当当
我就翻看了一下,挑了些比较符合面试官会问的问题,当然通过朋友(py)交易,将那份笔记弄到了手,有需要的可以点击并输入暗号:CSDN进行领取

从外包菜鸟到搭建测试大佬,薪资三年翻三倍,连自己都不敢信(附面试真题与学习笔记)_第7张图片

你可能感兴趣的:(面经,软件测试,测试和开发,自动化测试,程序人生,恰饭)