测试面试题

测试面试题

  • 测试工具系列
    • postman测试流程
    • fiddler
    • Jemeter——性能测试
    • 自动化测试
      • 预备知识
      • 元素的定位
      • radio单选框,checkbox复选框,select选择框的操纵
    • unitTest单元测试框架
  • 网络热点
    • 七层模型以及对应的协议
    • ARP(Address Resolution Protocol,地址解析协议)
    • 请简述一下cookie、session以及token的区别
    • 域名解析
    • 跨域
    • URL(统一资源定位符,获取服务器资源的一种)
    • http和https
    • Http1.1和Http2.0
    • Http1.1默认使用长链接(keep-alive)
    • Http(HyperText Transfer Protocol,超文本传输协议)
    • Https和ssl加密
    • http的常见请求方法
    • http请求头
    • TCP与UDP(传输层),也是http交互过程
    • 对称加密与非对称加密
    • 输入网址到获得页面的过程
    • 百度top100热词
  • 测试理论
    • 开发过程遇到的问题(jstack、jmap、索引失效)
    • 为什么选择测试开发
    • 提交的bug开发不认可
    • 接口测试
    • 在1-100之间随机抽10个,要求不重复,如何优化?
    • 冒烟测试
    • 接口测试和功能测试的区别
    • APP测试和Web测试的区别
    • jstack(调试线程间关系,CPU过高,阻塞、死锁等问题)
    • jmap(内存泄露问题)
    • 前端bug还是后端bug
    • 黑盒测试、白盒测试、灰盒测试
    • 单元测试、集成测试、系统测试、回归测试、验收测试
    • Junit单元测试框架
    • baidu网页打不开,是哪一层出了问题
    • 无人售货柜测试用例
    • 笔测试
    • 矿泉水瓶测试
    • 百度首页测试
    • 小红书测试
    • 支付功能、直播打赏等的测试
    • APP加载不出来/视频加载不出来怎么测试
    • 对测试工作的理解
    • 自动化测试能否代替人工测试

测试工具系列

postman测试流程

步骤:
1.在postman中添加一个collection,然后在collection中添加请求
2.对照接口文档去设置请求方法(Get,Post),URL
3.构造请求数据,请求头、请求体(根据要求输入JSON数据类型或form表单等,如果要上传图片的话可以选择binary中的file类型)
4.在test里面设置断言(一般在右侧选择常用断言,注意:如果有的接口需要登录后拿到token或cookie才能进行操作,那么可以在断言中通过pm.response的方法获取相关信息,并设置为环境变量以帮助下一次登录)
在这里插入图片描述
5.调试并执行用例,最后编写接口测试报告

fiddler

Replay重放功能:让这个请求重新发送一次
Shift+R:可以输入数字,比如50,那么就会有50次请求,不过这是串行的,并行的要用jemeter
测试面试题_第1张图片
X表示Remove:可以过滤掉某种类型的包
测试面试题_第2张图片
GO:设置断点后发送请求会中断,被fiddler截取,点击GO的话将会发送给目标地址
测试面试题_第3张图片
弱网测试:Rules>Simulate Modem Speeds,也可以在Rules的config中设置sends的300ms per KB和receives的150ms per KB

Jemeter——性能测试

ramp-up时间:启动我设置的线程数所需要的时间。
一般而言:
100以内的并发用户数,ramp-up时间设置为1-2s
100-500左右,rramp-up时间设置为2-3s
500以上,ramp-up时间设置为5-10s

1.弱压力测试:模拟半小时内1000个用户访问服务资源,要求平均响应时间3000ms,错误率0
①添加线程组
②添加取样器
测试面试题_第4张图片
③设置线程数1000,设置ramp-Up时间1800s(半小时)
测试面试题_第5张图片
④加入监听器——聚合报告
2.高并发测试:模拟10s内有1000个用户访问服务器资源,并发数量为100,要求平均响应时间3000ms,错误率0
①添加线程组
②添加取样器
测试面试题_第6张图片
③设置线程数100,ramp-up时间1
测试面试题_第7张图片
④加入同步定时器
测试面试题_第8张图片

测试面试题_第9张图片
1、模拟用户组的数量:设置并发用户数,如果设为0,则代表线程组的线程数
2、超时时间:设置并发用户数等待的时间
举例:模拟用户组数据设置为10,超时时间设置为5S,运行登录脚本:
用户1第一个到达后,同步定时器开始计时
如果3S到了,10个用户均已到达,就一起释放执行后续的请求,意味着10个线程同一时间完成登录
如果5S到了,只到达了7个用户,那么7个一起释放执行后续的请求,超过设置的最大等待时间5S后还没达到模拟用户组中设置的值,线程组将不再等待,释放已到达的线程
⑥运行后,查看聚合报告,平均时间13ms,满足要求
测试面试题_第10张图片
高频率:模拟2个用户以30QPS的频率访问服务器资源持续10s,要求平均响应时间3000ms,错误率0
①同上
②设置常数吞吐量计时器(一个线程访问的频率),设计为1200
测试面试题_第11张图片
③设置线程数2,循环次数(每个线程)200次
测试面试题_第12张图片
④查看报告,满足要求
测试面试题_第13张图片

自动化测试

自动化测试:是指使用特定的软件,去控制测试流程,并比较实际结果与预期结果之间的差异。通过将测试自动化,可以把人对软件的测试行为转化为由机器自动执行测试的行为,从而替代大量的手工测试操作,使得测试可以快速,反复的进行。

预备知识

1、导入python的selenium包
2、通过浏览器驱动实例化浏览器并打开网址
3、用ele = find_element(By.ID,‘id’),通过ID、name、Xpath、LinkText、cssselector等定位元素,例如定位一个输入框,然后els.send_keys(“”),例如定位后点击按钮driver.find_element_by_id(‘stb’).click()

4、获取元素的尺寸.size,文本.text,属性值.get_attribute
5、注意设置元素等待,因为有时由于网络原因,可能导致元素未能第一时间加载,
time.sleep():强制等待,不管有没有元素,都等待3s
隐式等待:driver.implicitly_wait(),等x秒后,这个页面所有的内容加载出来而不是只有定位的对象加载出来,再去点击
显示等待:只要定位的对象加载了就去点击

6、弹出框的处理alert = driver.switch_to.alert(),alert.accept(),alert.dismiss()
7、多窗口的切换,因为selenium默认聚焦在主窗口上的元素,为了操作其他窗口,需要切换窗口
handles = driver.window_handles(获取由driver启动的所有窗口句柄)
driver.switch_to.window(handles[i])

8、验证码处理
一般先在用户登录状态时,在cookie中根据对应的域名、路径来确定所需的cookie,以键值对的形式cookie_value = {‘name’:‘BDUSS’,
‘value’:‘…’}
driver.add_cookie(cookie_value)

元素的定位

可以F12之后,在界面中定位的html位置,也可以直接鼠标放在元素上右键inspect
1、找浏览器中的elements
一般都是用ID,ID是唯一的
如果要找出某一类,可以使用elements = web.find_elements_by_class_name(‘animal’),那么这个elements其实是一个元素列表
2、找element中的元素,element.find_elements_by_class_name(‘span’)
3、获取元素属性,element.get_attribute(‘class’)

radio单选框,checkbox复选框,select选择框的操纵

1、对于radio:
如下,首先确定选择器的名字s_radio,然后再wd.find_element_by_css_selector(‘#s_radio input[check=checked]’),即可进行定位,然后打印出value信息,知道选的是谁
然后再同样定位元素,加上方法.click()即可选择
测试面试题_第14张图片
2、checkbox复选框
测试面试题_第15张图片

unitTest单元测试框架

Unittest框架最核心的五个概念:
test case:测试用例
test suite:测试套件
Texttestrunner: 用来执行测试用例和测试套件,并返回测试用例的执行结果
TestLoader:批量执行测试用例
test fixure:测试夹具

1、test case:要求继承unitTest中的Testcase方法,而且必须以test开头,执行顺序安装ASCII值,里面用def定义测试的脚本

# test_001.py
import unittest

def add(x, y):
  return x + y

class Test_Case_01(unitest.TestCase):      # 新建测试类必须继承unittest.TestCase

  # 测试方法名称必须以 test 开头
  def test_add_01(self):  
    result = add(2, 4)
    print(f'两数和为:{result}')

  def test_add_02(self):
    result = add(5, 7)
    print(f'两数之和为:{result}')


if __name__ == '__main__':
  # 执行测试用例
  unittest.main()

2、Test Suite测试套件:把多个测试用例集合在一起执行,实例化testsuite对象后,用addTest来加载Testcase到testsuite中,有单独添加和批量添加两种方法,但是必须要用testrunner执行

3、TextTestRunner:用来执行测试用例和测试套件,并返回测试用例的执行结果。

# 公众号:大森玩测试
# 案例

import unittest
from test_001 import Test_Case_01

# 实例化测试套件对象
suite = unittest.TestSuite()
# 单独添加测试用例
suite.addTest(Test_Case_01("test_add_01"))
suite.addTest(Test_Case_01("test_add_02"))

# 批量添加用例, addTest()添加的次数根据Test_Case_01中的测试用例个数决定,这里是添加2次
suite.addTest(unittest.makeSuite(Test_Case_01))

# 执行
runner = unittest.TextTestRunner()
runner.run(suite)

4、TestLoader:搜索指定目录下的满足命名要求(正则).py文件,并将查到的测试用例组装到测试套间中

# 示例
# 公众号:大森玩测试
import os
import unittest
# 获取根目录
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))   # 获取文件的根目录

# 测试用例地址
test_case_path = os.path.join(BASE_DIR, "Scripts")

suit = unittest.TestSuite()
loader = unittest.TestLoader()  # 专门用来查找用例的实例
# test_case_path:测试用例的所在路径。pattern:搜索以test开头的py文件,默认为‘test*.py’
suit.addTests(loader.discover(test_case_path, pattern="test*.py"))

runner = unittest.TextTestRunner()
runner.run(suit)

5、Fixture:套间夹具
主要有函数级别、类级别、模块级别
测试面试题_第16张图片

# 示例
# 公众号:大森玩测试
import time
import unittest
from selenium import webdriver

class Test_Tmall_Login(unittest.TestCase):

    def setUp(self) -> None:
        # 获取Chrome浏览器驱动对象
        self.driver = webdriver.Chrome()
        # 打开url
        self.driver.get("http://www.tmall.com")
        # 窗口最大化
        self.driver.maximize_window()
        # 隐式等待
        self.driver.implicitly_wait(30)

    def tearDown(self) -> None:
        # 等待3秒,关闭浏览器
        time.sleep(3)
        self.driver.quit()

    def test_login(self):
        driver = self.driver
        # 输入用户名
        driver.find_element(by="id", value="username").send_keys("test001")
        # 输入密码
        driver.find_element(by="id", value="password").send_keys("admin001")
        # 点击登录按钮
        driver.find_element(by="name", value="sbtbutton").click()

6、参数化测试
使用parameterized.expand()注解测试用例

  @parameterized.expand(
        [("test","[email protected]","123456","123456","用户名不符合格式要求"),
        ("","[email protected]","123456","123456","请设置用户名")]
    )

7、生成HTML测试报告

pip install XTestRunner

网络热点

七层模型以及对应的协议

测试面试题_第17张图片
测试面试题_第18张图片

ARP(Address Resolution Protocol,地址解析协议)

学习:记录IP地址和MAC地址的对应情况
-----Host1查找自身缓存表,如没有发送广播ARP Request报文(目的MAC地址为 FF-FF-FF-FF-FF-FF)

-----交换机对该广播帧直接执行泛洪操作并且进行学习,所有主机都接受到该ARP Request报文后,都会检查该帧的目的IP地址与自身的IP地址是否匹配,不匹配就直接丢弃

-----Host2查询到是在问询自己,先进行学习再进行回复ARP Reply报文

-----交换机进行转发该单播数据帧,并且学习MAC地址信息和端口号

-----Host1收到回复后进行学习到ARP缓存表中

-----Host1将Host2的MAC地址封装到目的MAC地址,然后进行传输信息

-----交换机收到该单播信息帧后,将该帧解封装到第二层数据链路层(交换机是二层设备)获取目的MAC地址,在查询自身MAC缓存表进行转发操作

-----Host2收到该帧后进行解封装获取信息内容

请简述一下cookie、session以及token的区别

测试面试题_第19张图片

  1. 客户端发送请求到服务端(比如登录请求)。
  2. 服务端收到请求后生成一个 session 会话,里面存储用户信息。
  3. 服务端响应客户端,并在响应头中设置 Set-Cookie,其中包含了有效时间、域名、路径、sessionId(用于鉴定用户与服务端之间的权限)等。
    Set-Cookie的格式如下:
    测试面试题_第20张图片
    举例如下
    测试面试题_第21张图片
  4. 客户端收到该请求后,如果服务器给了 Set-Cookie,那么下次浏览器就会在请求头中自动携带 cookie。
  5. 客户端发送其它请求,自动携带了 cookie,cookie 中携带有用户信息等。
  6. 服务端接收到请求,验证 cookie 信息,比如通过 sessionId 来判断是否存在会话,存在则正常响应。

由于cookie+session这方认证方式存在缺点:1.每次携带cookie会浪费性能 2.服务器为每个连接进来的客服端生成session,占用服务器资源 3.易遭受跨站域请求伪造;于是提出token
token:对用户id等信息加密后生成的,由服务器生成发送给客户端,客户端发送请求时可携带在请求头上。
测试面试题_第22张图片
总结:
测试面试题_第23张图片

域名解析

测试面试题_第24张图片
输入域名www.baidu.com后,浏览器先检查缓存和本地Host文件,看有没有对应的ip地址,有则直接使用,没有就会向本地DNS服务器发送请求询问域名对应ip地址,本地DNS服务器也是先查缓存,没有的话则向根域名服务器询问.com顶级域名服务器的ip地址,根域名服务器返回.com顶级域名服务器的ip地址后,本地DNS向.com顶级域名服务器询问baidu.com权威域名服务器地址,顶级域名服务器返回baidu.com权威域名服务器地址后,本地DNS向baidu.com权威域名服务器询问www.baidu.com的IP地址,然后baidu.com权威域名服务器会返回www.baidu.com的ip地址,然后DNS将该ip地址返回给主机。

跨域

一级、二级域名不同,域名相同端口号不同、协议不同

URL(统一资源定位符,获取服务器资源的一种)

标准格式: 协议://服务器IP:端⼝/路径1/路径N ? key1=value1 & key2=value2
协议:不同的协议有不同的解析⽅式
服务器ip: ⽹络中存在⽆数的主机,要访问的哪⼀台, 通过公⽹ip区分
端⼝: ⼀台主机上运⾏着很多的进程,为了区分不同进程,⼀个端⼝(端口用来监听信息)对应⼀个进程,http默认的端⼝是80
路径: 资源N多种,为了更进⼀步区分资源所在的路径(后端接⼝,⼀般称为 “接⼝路径”,“接⼝”)

http和https

1、HTTPS 协议需要到 CA (Certificate Authority,证书颁发机构)申请证书,一般免费证书较少,因而需要一定费用。(以前的网易官网是http,而网易邮箱是 https 。)
2、HTTP 是超文本传输协议,信息是明文传输,HTTPS 则是具有安全性的 SSL 加密传输协议。
3、HTTP 和 HTTPS 使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、HTTP 的连接很简单,是无状态的。HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。(无状态的意思是其数据包的发送、传输和接收都是相互独立的。无连接的意思是指通信双方都不长久的维持对方的任何信息。)

Http1.1和Http2.0

1、HTTP/2采用二进制格式而非文本格式
2、HTTP/2是完全多路复用的,而非有序并阻塞的——只需一个连接即可实现并行(流,将一个请求分割和排序,接着先回复已经处理好的部分,等全部处理好后再合并。每个请求都是这样,各有各的序列,不会产生错乱)
3、HTTP/2使用encoder压缩了header,减小了开销
4、HTTP/2让服务器可以将响应(它认为客服端需要的)主动“推送”到客户端缓存中

Http1.1默认使用长链接(keep-alive)

TCP协议有长连接(持续有效,但为了避免出现问题但连接还未正常释放,长时间的大量连接造成资源浪费,于是提出keepalive保活探测机制)和短连接(http1.0,数据交互后主动释放连接)
TCP连接建立后会启动计时器(默认两小时),计时器到达0后会发送一个报文,对方主机若:
1.响应正常,则计时器复位
2.对方主机崩溃,每隔75s发送一次探测,如果都没有回应则终止连接

Http(HyperText Transfer Protocol,超文本传输协议)

Http组成:
1)请求行:请求方法、URL字段、HTTP协议版本号三部分组成
2)请求头(键值对):
Accept-Encoding:可接受的压缩格式
Accept-Language:可接受的语言
cookie:
Referer:告知服务器当前请求来自哪个页面,如果是直接访问则不会有这个。
3)请求体
当请求方式是post时,格式可以是:JSON,form-data,binary

4、Http响应
1)响应行:常用状态码
2)响应头:服务器端将信息以键值对的形式返回给客户端
Location:重定向的地址
set-cookie:
3)响应体:是服务器回写给客户端的页面正文,浏览器将正文加载到内存,然后解析渲染,显示在页面的内容。

Https和ssl加密

概括来说,现在网络HTTPS简化的加密通信的流程就是:
1…客户访问某网站X,网站将自己的证书(里面有公钥)给到客户(其实是给到浏览器,客户不会有感知)
2.浏览器从证书中拿到某网站X的公钥A
3.浏览器生成一个只有自己知道的对称密钥B,用公钥A加密,并传给某网站X(其实是有协商的过程,这里为了便于理解先简化)
4.某网站X通过私钥解密,拿到对称密钥B
5.浏览器、 某网站X之后的数据通信,都用密钥B进行加密
注意:对于每个访问某网站X的用户,生成的对称密钥B理论上来说都是不一样的。比如客户1、客户2、客户3,可能生成的就是B1、B2、B3.
测试面试题_第25张图片
注意:如果做压测,直接压测内网ip,如果压测公网域名,不管是http还是https,都会带来额外的损耗导致结果不准确

http的常见请求方法

  • GET:向服务器获取资源,如查询操作,对应select
    PUT和POST都有更改指定URL的语义,但PUT被定义为idempotent(幂等:任意多次执行所产生的影响均与一次执行的影响相同)的方法,POST则不是idempotent的方法。PUT请求: 如果两个请求相同,后一个请求会把第一个请求覆盖掉。 (所以PUT用来改资源) Post请求: 后一个请求不会把第一个请求覆盖掉。 (所以Post用来增资源)
  • POST :向服务器提交数据,侧重新增数据,对应insert,该请求会返回两次,一次先发送header,返回 continue,然后发生body,返回200 OK.
  • PUT:向服务器提交数据,侧重更新数据对应update
  • DELETE:用来删除指定的资源,它会删除URI给出的目标资源的所有当前内容,对应delete

get和post的区别
1.get请求的参数直接放url里,post放在请求体里
2.get可以被浏览器缓存(使用get请求,如果每次url一致,浏览器会使用缓存的值,而不去服务区获取最新的数据:使用后面加UUID随机数解决,如www.baidu.com?key=${20}),但post不会
3.get请求有长度限制,post没有
4.get产生一个tcp数据包,post产生两个,一次先发送header,返回 continue,然后发送body,返回200 OK.

http请求头

http请求分为三部分:
请求行:协议,url
请求头:服务端据此获取客服端基本信息,格式为属性名:属性值
常见请求头:
Accept: 浏览器支持的 MIME 媒体类型, 比如 text/html,application/json,image/webp,/ 等
Referer:告诉服务器请求的原始资源的URI,其用于所有类型的请求,并且包括:协议+域名+查询参数; 很多抢购服务会用这个做限制,必须通过某个入来进来才有效
Cookie: 表示服务端给客户端传的http请求状态,也是多个key=value形式组合,比如登录后的令牌等
请求体:

TCP与UDP(传输层),也是http交互过程

测试面试题_第26张图片

TCP是基于连接的,步骤为:
测试面试题_第27张图片
①三次握手:首先A向B发生TCP报文,标志位为SYN,表示“请求建立连接”,序号seq =x(一般为1),然后服务器端返回报文,标志位为SYN和ACK(收到信息),表示同意建立连接,序号seq = Y,确认号ack = x+ 报文长度,客户端收到报文后发送ACK(收到信息),序号seq = x +报文长度,确认号ack = y+报文长度,然后二者创建连接。
其中ack值代表对方下一次发送报文的序号。
为什么不能两次握手:避免客户端的一次SYN包产生滞留,重发的SYN包和服务器建立连接后不久之前的SYN包传递过去又建立了连接,这样服务有建立两个连接造成开销。
②传输确认:发送方可一次发送多个报文,接收方进行重组。每次回复的ack值是对方下一包起始序列号,所以如果数据丢失,则向发送端发送对应ack的报文。测试面试题_第28张图片
③四次挥手:客户端发送FIN包(FIN标志位为1),服务器接收后发送ACK包进入关闭等待状态(此时服务端仍可发送数据,客户端也可接收,因为客户端发送FIN包只能说明客户端没有数据发送给服务器了,可能还存在着服务器的数据还没完全发送给客户端),服务端发送完数据后发送FIN包进入最后确认状态,客户端接受后发送ACK进入超时等待状态(如果没有TIME_WAIT状态的话,客户端最后一次发送ack应答报文后就进入了close阶段。如果服务端没有收到ack报文的话,就会重传FIN报文,而此时客户端已经close了,就会返回一个RST错误报文,而有了TIME_WAIT状态的话,客户端并不会着急关闭,而是等待了2MSL再关闭,这样的话就算重传的fin报文也能正确响应,保证了服务端的正确关闭),如服务端未收到ACK包会重发FIN包,客户端会响应FIN包再发送ACK包。

为什么第四次挥手:避免FIN包丢失,服务器关闭了,但客户端没有关闭

UDP:基于非连接,封装成数据包后直接发出去,性能损耗少但不能保证丢包等问题。
TCP用于稳定可靠的连接(右键),UDP用于时效性高,稳定性要求没那么高的(通话等)。

对称加密与非对称加密

公钥:可以公开传输的密钥
私钥:必须保密保存的密钥

对称加密:加密和解密使用同一个秘钥。(称为私钥,其实也是公钥)
加密过程:
加密:原文+密钥 = 密文
解密:密文-密钥 = 原文

非对称加密:加密和解密使用不同的秘钥,一把作为公开的公钥,另一把作为私钥。
使用算法(RSA算法,p、q是随机选择的两个大质数,n是大质数的乘积,选择一个公钥(即加密密钥)E,使其不是(P-1)(Q-1)的因子,选择私钥(即解密密钥)D,满足下列条件:
(DE) mod (P-1)(Q-1) = 1。利用质数的数学性质,构造了一套公钥加密私钥解密的方法。公钥推出私钥需要对大整数因数分解,对算力要求很高)生成一对具有数学关联(尽管有关联,但不可以互推)的公钥和私钥,公钥用来加密数据,只有私钥才能解密公钥加密的数据。
加密过程:
互相交换彼此的公钥
A使用B的公钥对要发送给B的数据加密,B可以使用B的私钥进行解密
如果C拦截到了A的消息,无法解开,因为他没有B的私钥

输入网址到获得页面的过程

1.浏览器先依次查看浏览器缓存、系统缓存、路由器缓存,如果有就返回IP地址
2.如果没有,则向本地DNS服务器请求解析,获取IP地址,再由IP地址获取MAC地址
3.浏览器与WEB服务器建立TCP连接(三次握手)
4.浏览器发送HTTP请求
5.服务器处理HTTP请求并返回一个html文件作为响应,浏览器接收到响应后,对html文件进行解析,并开始页面渲染过程。
6.对html解析生成DOM树,对CSS文件解析生成CSS树,两者一起生成渲染树,用渲染树对页面布局和绘制。
7.TCP四次挥手停止连接

百度top100热词

题目描述
某搜索引擎,就比如百度,每天的用户搜索词汇是百亿数据量,请设计一种算法,求出每天热门Top100词汇。

思路分析
首先,还是基于哈希分流的思想,用哈希函数,将问题映射到N台分布式计算机上统计各个搜索词频。
假设1000台分布式计算机,那么,此时,原始的数据就平均分成了1000份,并且,因为哈希函数的性质,相同的数据肯定会被分配到相同的分布式计算机上,因此,这1000台各自统计的数据都是正确无误的,相同词汇不可能出现在两台分布式计算机上。
然后,在各自的分布式计算机上,维护一个大根堆,堆顶就是出现频次最高的词汇。
然后,取出每一个大根堆的堆顶,再组成一个总的大根堆,此时,这个总大根堆的堆顶就是当天词频第一的,然后,词频第一的词出总堆,同时他也从他所在的分布式堆顶出堆,然后,这个词汇是从哪一个分布式上的大根堆出来的,就让那个分布式的新堆顶入总大根堆,然后,再从总大根堆选出第二高频词,依次循环上述步骤,选出前100个。

总结
说白了,先用哈希分流,挨个统计,然后,把每个的最大值,再放入总的一起比较出最大值,然后依次更新总的堆。因为是堆结构,因此出堆调整堆的时间复杂度都是O(logn)

测试理论

开发过程遇到的问题(jstack、jmap、索引失效)

为什么选择测试开发

测试面试题_第29张图片
同时我也想更多了解软件开发的整个生命流程,包含开发流程和测试流程,让我对系统开发有更多认识,同时我感觉我平时对于软件产品需求体验方面的思考更多一些,所以更喜欢偏测试的工作

提交的bug开发不认可

首先,我会检查我提交的bug是否符合bug的定义和标准,是否有明确的重现步骤,预期结果和实际结果,是否有相关的截图或视频,是否有足够的信息让开发能够理解和定位问题。

  • 其次,我会和开发沟通,了解他们为什么认为不是bug,是不是有需求理解上的差异,或者是不是有其他的影响因素导致问题出现。我会尊重开发的意见,但也会坚持我的观点,用事实和数据来支持我的判断。
  • 最后,如果沟通无果,我会寻求项目经理或测试经理的帮助,让他们来协调和决定问题的优先级和处理方式。我会遵循项目的流程和规范,不会随意关闭或修改bug的状态。

接口测试

测试面试题_第30张图片
服务器使用率:内存、CPU、GPU使用率
接口权限:某些敏感的接口只有特定的用户才可以调用。
访问测试限制:能否从外部对函数里面重要的属性进行任意修改
访问频率限制:鼠标点的太快了,会提示“操作频率太快…”。

在1-100之间随机抽10个,要求不重复,如何优化?

public class Question {
    public static void main(String[] args){
        Set<Integer> set = new HashSet<Integer>();
        while (true){
            int c = randomNumber();
            if (!set.contains(c)){
                set.add(c);
            }
            if(set.size() == 10)    break;;
        }
        for(int c:set)
            System.out.println(c);

    }
    public static int randomNumber(){
        Random random = new Random();
        return random.nextInt(30)+1;
    }
}

冒烟测试

对软件的基本功能进行测试,目的是确认软件的基本功能正常,保证软件系统能正常跑起来,可以进行后续的正常测试工作的进行,如果最基本的测试都有问题,那么就直接返回给开发。

接口测试和功能测试的区别

测试目的:接口测试目的是测试应用程序接口能按照规范要求与其他组件交互,以及不同负载下的性能、稳定性和安全性,功能测试是为了确保应用程序功能符合需求文档中的设定。
测试内容:接口测试主要是接口输入、输出、返回码和性能,功能测试是应用程序能否按照需要稳定规定中执行。
测试重点:接口测试测试重点是接口的正确性、稳定性和安全性,功能测试是应用程序能否按照需要稳定规定中执行。

APP测试和Web测试的区别

系统架构方面:Web一般是B/S架构,更新服务器端,客户端就会重新更新,APP项目是C/S架构,两种都需要更新。
兼容性测试:WEB针对不同的操作系统(Windows、MAC、Linux)和不同的浏览器内核(IE、chrome、Firefox),APP针对Android(不同平台)、IOS、分辨率、屏幕尺寸
性能测试:WEB主要是响应时间,APP是流量、电量、CPU、GPU、内存,弱网、网络切换
界面:因为是触摸屏,APP要针对手势、横竖屏、多点触控等等
功能测试:APP需要安装(安装过程能否取消、安装时遇到死机、断电等意外情况,环境恢复后能否正确安装、空间不足是否提示)、更新、卸载(卸载过程能否取消、安装时遇到死机、断电等意外情况,环境恢复后能否正确卸载、是否删除所有安装文件夹)等
异常测试:APP运行时,没有内存空间、手机断电、断网、接拨电话,使用导航功能等等。

jstack(调试线程间关系,CPU过高,阻塞、死锁等问题)

(1)CPU过高问题

1、先top查看各进程使用cpu情况
测试面试题_第31张图片

2、对于cpu占用率过高的,top -HP 23344可以查看该进程下各个线程的cpu使用情况;
测试面试题_第32张图片
3、找到占用最高的线程tid,然后转换为16进制的nid
4、使用jstack查看该进程堆栈状态
jstack pid > /tmp/log.txt 将该进程堆栈信息生成到一个日志中
然后将刚刚的占用率较高的线程pid转换为16进制的nid,在thread dump(即堆栈信息中)查询nid,判断状态,发现一直运行,而且能定位到代码
测试面试题_第33张图片

(2)先输入jps,查看当前运行的java程序,如下,观察到有个死锁进程,pid是23780
测试面试题_第34张图片
再使用jstack -l pid,查看线程以及锁的详情,-l表示看锁的意思
Found one Java-level deadlock表示有死锁,以及两个线程各在哪一行
测试面试题_第35张图片

jmap(内存泄露问题)

jmap -dump:format=b,file = 文件名,进程号,生成dump文件(堆快照)
使用MAT分析,看看有没有某个线程生成了大量的对象,或手动触发垃圾回收器,看数量有没有较大变化

内存泄露部分:
1、top查看cpu情况,看到进程PID360cpu利用率达到100%,因为考虑到Java进程,并不做大量CPU运算,出现这种CPU飙升的情况,要么走到了死循环,要么就是在做大量的GC。
测试面试题_第36张图片
2、使用jstat -gc pid [interval] 10// vmid interval值可以为1000,表示时间间隔,一共显示10次
命令查看了java进程的GC状态,果然,FULL GC(老年代垃圾回收次数)达到了每秒一次。说明有内存泄露
15718,15719,15720…
在这里插入图片描述
3、假设利用率高的PID是360,那么可以保存该进程堆和栈的现场

jstack pid > jstack.log保存了线程栈的现场
使用jmap -dump:format=b,file=heap.log pid保存了堆现场

1.找到日志,grep “ERROR” 日志名.log,根据出现的信息分析是哪里出现错误

前端bug还是后端bug

一、界面相关
界面相关(排版、文案),交互类(按钮,单、多选、滑块控件)都是前端的问题

二、功能相关
从抓包分析接口请求的:url和传参
1.请求的接口url、传参是否错误?错误:前端错误,正确:后端错误

三、性能相关
例如页面加载慢或提交表单慢,一直pending,抓包查看请求耗时,如果耗时长,那就属于后端bug

四、安全相关
例如可以越权查看数据,就属于后端bug

五、前后端均有问题
例如对于字段有效性的校验等,前后端均需要校验,因此属于前后端共同的bug
可以利用工具ajax,输入请求方式,url等待,根据返回的状态码判断错误

黑盒测试、白盒测试、灰盒测试

黑盒测试(功能测试):根据功能需求设计测试用例,以穷举法的形式检查每个功能能否按照需求规格说明书的规定输入和输出,但并不关心内部的实现。
常用的方法有:
等价类划分法:把所有可能输入的数据划分成若干子集(有效的、无效的),从子集中选取具有代表性的数据作为测试用例。
边界值分析法:对输入或输出的边界值进行测试,一般测试用例都来自等价类的边界。
判定表:有多个输入输出,且输入输出之间有组合关系,输入与输出之间有约束和因果关系
测试面试题_第37张图片
步骤:1.明确条件桩2.明确动作桩3.对条件桩全组合4.明确每个组合的步骤5.设计case
测试面试题_第38张图片
正交法:使用最小的测试集合获得最大的测试覆盖率,正交表:Ln(m^k),
n表示行数,也是测试组合的次数,k是列数,表示空间个数,m是每个控件的取值个数。如L9(3^4)叫做4因素,3水平,9组合
测试面试题_第39张图片
组合覆盖法:一般用pair-wise方法在众多因素的值中只覆盖任意2个因素所有状态的测试用例集合,典型有微软的PICT。
测试面试题_第40张图片
白盒测试(结构测试):主要用于检测软件编码过程中的错误,一般由开发自己测试。包括单元测试(junit)和集成测试。
灰盒测试:程序员做完白盒测试之后,在功能测试人员进行大规模集成测试之前,结合程序外部功能和内部逻辑来设计测试用例。

单元测试、集成测试、系统测试、回归测试、验收测试

单元测试(好处是不用编写类,创建对象再测):针对最小功能单元进行的测试,例如一个函数方法

集成测试:按照设计要求将单元组装在一起进行的测试。因为:一些模块虽然能够单独地工作,但并不能保证连接起来也能正常的工作。一些局部反映不出来的问题,在全局上很可能暴露出来。(大爆炸测试,增量集成测试:将逻辑上有关的单元两个单元放在一起测试,再不断加入新单元)

系统测试:将软件系统看成是一个系统,对整个软件系统进行的测试。

回归测试:检查开发人员在修复已有bug时是否又导致了新的bug(因为改动了大量代码,不能保证其他功能点不受影)。根据之前bug的严重程度,决定是执行全部的测试用例还是选择重要的、常用的、与BUG相关的功能点进行回归测试。

验收测试:在系统测试完成之后,产品发布之前所进行的测试活动。验收测试是技术测试的最后一个阶段,也称交付测试。目的是确保软件准备就绪,并且可以让最终用户将其用于执行软件的既定功能和任务。

Junit单元测试框架

  1. 基础注解
    测试面试题_第41张图片
    2.断言语句
    使用断言方法检查测试方法的期望结果值和真实返回值。
    测试面试题_第42张图片
    3.参数化测试:通过变化范围的参数值来测试方法
    1.对测试类添加注解@RunWith(Parameterized.class)
    2.将需要测试的参数定义为私有变量
    3.用@Parameters为需要测试的各种变量值组成的集合做注解
    4.使用定义的私有变量进行测试断言

4.套件测试:为一套测试类创建一个测试套件来批量运行测试类
1.添加注解@RunWith(suite.class)
2.为所有的测试类放在集合中,作为@SuiteClasses()的参数
@SuiteClasses({ ArithmeticTest.class, GeometryTest.class })

5.忽略测试
@Ingore应用到测试方法/类上,来忽略测试

@Test
@Ignore
public void testSubstract() {
    Arithmetic arithmetic = new Arithmetic();
    int actualResult = arithmetic.substract(4, 2);
    int expectedResult = 2;
    // example of test case failure
    assertEquals(expectedResult, actualResult);
}

6.超时测试
1.为测试方法添加 @timeout(5) //表示5ms
2.为所有方法添加
@Rule
public Timeout timeout = new Timeout(1000);

7.期望异常测试
@Test(expected = …)

8.优先级测试
@FixMethodOrder(MethodSorters.JVM)

baidu网页打不开,是哪一层出了问题

测试面试题_第43张图片
一般设置程序时本地服务用localhost是最好的,localhost不会解析成ip,也不会占用网卡、网络资源。

1、传输层 :ping 127.0.0.1即ping自己的环回地址(向自身发送通信的一个特殊地址),判断网卡和TCP/IP协议有没有问题,如果丢包率为0说明本机网络协议正常,如果timeout说明网卡安装或者TCP/IP协议有问题,卸载重装。

2、数据链路层(分为两个子层,上面的LLC子层实现数据链路层与硬件无关的功能,比如流量控制、差错恢复等;较低的MAC子层提供LLC和物理层之间的接口。网卡上面有mac信息):ping本地ip,检查网卡是否工作正常。(暂时记为到达交换机后再回来)

应用层: ping DNS查看域名解析有没有问题
再用下面命令查看DNS能否正常解析

nslookup baidu.com 

3、不知道哪一层 :ping 网关地址 检查本地主机与网关的链路是否通畅。

4、网络层 :ping 远程网站 检查本地主机与外网远程网站关的链路是否通畅。

无人售货柜测试用例

功能测试:
1、自动售货机的按钮能否正常使用,有没有按不动的情况
2、验证用户选择饮料功能是否正确,比如选择农夫山泉最终出来的是不是农夫山泉
3、验证投币付款功能是否正确,(包括不同面额的纸币硬币,会不会不接受有些面额)
4、找钱功能是否可用,输入10块,找5块这种
5、还有其他支付方式,比如微信支付宝;
6、有没有消费者投诉电话
7、操作过程有没有相应的提示音
8、能不能进行补货,售货机缺货时会不会有提醒
9、定价功能可否正常使用,是否支持非整数定价,像定个九块
10、优惠信息可否正常折扣,像有优惠券或打折时
11、以上操作是否跟网络状态有关系(弱网、强网、无网)
12、对于饮料有没有冷藏功能,冷藏的温度能不能设置

界面测试
1、按说明书检查,
2、操作界面的布局搭配是否合理,
3、按钮的大小、颜色、形状是否美观,是否通俗易懂
4、有没有消费者投诉电话
5、操作接口是否齐全
6、有没有设备编号、服务电话标识
7、售货机的大小是否得体

性能测试:
1、利用微信、支付宝等第三方平台支付时的响应速度;
2、选好饮料弹出提示信息的时间;
3、退币时的响应时间和退币速度;
4、付款时突然断电;
5、跟第三方支付平台的接口对接是否可用
6、软硬件结合的效率,软硬件软件发出操作指令后,硬件的及时正确响应

安全性测试:
1、售货机上的二维码是否在售货机内部,防止他人恶意替换二维码
2、收款码是否携带恶意病毒
3、售货机的材料是否安全无害
4、售货机设计的有没有锋利的地方,会不会划伤到顾客
5、售货机存钱的地方是否安全,会不会被他人偷取

笔测试

功能测试:笔筒开合,笔芯替换,出墨快慢
性能测试(能用量衡量的):笔芯寿命,流畅度,高低温环境下对出墨的影响
兼容性测试:笔壳和笔芯能否适应其他主流笔的尺寸,笔尖能够用其他笔芯的笔尖替换,笔墨用完能否用其他笔芯的笔墨替换。
界面测试:形状是否美观,颜色搭配是否合理,印的logo或者文字是否正确
安全性测试:笔墨是否易燃、对皮肤有害;笔杆材质会不会刮破手
易用性测试:是否方便携带和存放

矿泉水瓶测试

  • 功能:
    测试矿泉水瓶是否能够装水
    测试水瓶的最大值
    测试水瓶是否能够喝到水
  • 安全:
    测试在高温下,是否有毒
    测试水瓶的材质
  • 兼容:
    测试是否能够装下其他液体
  • 易用:
    测试水瓶是否方便携带
    测试水瓶是否方便喝水
  • 界面:
    水瓶的设计是否美观

百度首页测试

  • 界面测试
    1、字体大小、颜色和页面布局是否合理
    2、 重点和热点内容是否突出
    3、所有图标能否正常显示
    4、页面的中心的大百度字样是否正确
  • 功能测试
    1、不输入任何东西,看看是否是刷新
    2、图片、英文、繁体字、特殊字符等能不能正常搜索
    3、界面上的所有链接能否调整
    4、搜索关键字过长能否搜索
  • 性能测试
    1、不同网速下,点击链接跳转到响应页面的响应时间
    2、图片搜索的响应时间
    3、使用搜索功能时,CPU和内存利用率是多少
  • 安全测试
    1、是否对敏感内容做了过滤
    2、有sql注入时能否搜索
  • 兼容性测试
    1、是否可以在不同的浏览器上正常运行。
    Chrome, Firefox, IE, Edge…
    2、是否可以在不同操作系统的电脑上正常运行。
    · Windows 电脑
    · MAC 电脑
    3、是否可以在不同的手机系统上正常运行。
    · 安卓系统
    · 苹果系统
  • 易用性测试
    1、快捷键、菜单是否正确
    2、是否具备播放记忆功能
    3、是否自动保存以前的播放列表

小红书测试

  • 兼容性测试
    1、是否可以在不同的浏览器上正常运行。
    Chrome, Firefox, IE, Edge…
    2、是否可以在不同操作系统的电脑上正常运行。
    · Windows 电脑
    · MAC 电脑
    3、是否可以在不同的手机系统上正常运行。
    · 安卓系统
    · 苹果系统
  • 性能测试
    1、不同网速下,点击链接跳转到响应页面的响应时间
    2、视频、图片、文字等上传的响应时间
    3、使用各功能时,CPU和内存利用率是多少
  • 界面测试
    1、字体大小、颜色和页面布局是否合理
    2、重点和热点内容是否突出
    3、所有图标能否正常显示
  • 功能测试
    1、视频的播放、暂停、快进、快退是否有卡顿现象,播放时退出再返回是否保存放进度,音量功能,最大、小化、字画同步
    2、如果限制图片大小为5M,分别选择<5M的,=5M,>5M的上传测试,然后在数据库中检查数据有没有传上去,大小对不对,上传图片数量(是不是一次最多9张),格式(JPG,PNG)
    3、是否可以点赞、重复、给自己、给陌生人点赞。
    是否可以评论、给自己、陌生人评论,评论字数限制,使用表情。
    点击分享能不能弹出分享平台图标,分享至微信好友、朋友能否正常实现。
    是否可以收藏表情、图片等,收藏上限时能否正常处理
    滑动测试:流畅度、有没有惯性,左右滑动能不能退出等待

支付功能、直播打赏等的测试

功能方面:
1、确定可以取消支付:调起订单后可以取消支付
2、支付方式
正常:信用卡、借记卡、第三方(微信、支付宝),优惠券能不能抵扣
异常:未绑定支付账户能否正常提示
3、支付金额
正常:单笔最大、最小金额,单日最大金额,小于账户余额
异常:0、空、非数字、负数
4、支付密码
正常:面部、指纹、密码、免密
异常:错误密码提示,超出错误次数冻结
5、购物车结算能否多笔一起支付
6、中断功能:支付时来电话、断网、切换其他应用等等能否正常运行
7:退款能否全部退款或部分退款

非功能方面:
界面:
兼容性:
性能:用户多、长时间运行系统,响应时间,占用CPU率,内存率
安全:篡改数据

APP加载不出来/视频加载不出来怎么测试

1、手机缓存空间不足,清理一下缓存
2、手机系统与APP之间的兼容问题,要么更新手机系统,要么更新APP
3、手机网络出现问题
4、APP缓存太多,清理该APP缓存
5、APP本身出了问题(误删过应用文件),卸载后重新下载
6、APP的服务器出现问题,等待修复

对测试工作的理解

1.测试工作的必要性:
①确保设计需求功能的正确使用
兼容性要求、功能要求、性能要求、界面要求、易用性等等
②你永远不知道你的用户是如何使用你的产品?
比如说有的人可能会上传敏感的图片、文字,或者输入时做一些sql注入,盗号,转账,甚至有些人利用漏洞(新用户)来薅羊毛等等,不仅是软件,所有的产品或则服务上线前都要经过测试:飞机,汽车等等

2.测试开发的流程
一、需求评审:通过三方评审:开发,测试,需求人员来制定规格需求说明书(哪些功能性、非功能性需求、用户会怎么使用我们的产品)
二、搭建测试环境:比如app的测试环境需要appium+python,web自动化测试需要Python+Selenium
三、编写测试用例:黑盒测试:…,白盒测试:…,除此之外还会有性能测试、压力测试等
四、执行测试用例
四、用一些系统化缺陷管理工具去跟踪bug,提交bug单给开发
五、写测试报告

自动化测试能否代替人工测试

不能:1、用户关系的界面UI对应的各种细节,需要人工测试发现
2、自动化测试无法检测未编程的错误,手动测试可以在反复巡查中发现
3、手动测试人员更了解用户习惯,他们可以提出超出设备功能要求的反馈建议。
4、对于小型项目来说,花费大量时间经历去初始化脚本以及完善自动化测试的(上下文相当于一个全新的浏览器配置文件)是不合适的。

你可能感兴趣的:(实习,校招,postman,java,测试工具)