公司喜欢被问到的高频问题:
1、java 八股文
2、jvm
3、mysql 原理
4、接口自动化
5、性能测试
6、算法和代码
隐式等待(全局)driver.implicitly_wait(20)
implicitly_wait()方法用来等待页面加载完成(直观的就是浏览器tab页上的小圈圈转完)
def find_string(s):
# result = t in s
# print(result)
list = [ i for i in s ]
print(list)
set_list = set(list)
if len(set_list) == len(list):
print("不重复")
else:
print("重复")
def all_list(arry):
result = {}
for i in set(arry):
result[i] = arry.count(i)
return result
def all_list(arry):
dict = {}
for key in arry:
dict[key] = dict.get(key,0) + 1
print(dict)
堆: 先进先出
栈:先进后出
栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由 OS 回收,分配方式倒是类似于链表。
什么是 “堆”,"栈","堆栈","队列",它们的区别:https://www.cnblogs.com/guoxiaoyan/p/8664150.html
堆栈: https://baike.baidu.com/item/%E5%A0%86%E6%A0%88/1682032?fr=aladdin
eden 满了 minor gc,升到老年代的对象大于老年代剩余空间 full
gc,或者小于时被 HandlePromotionFailure 参数强制 full
gc;gc 与非 gc 时间耗时超过了 GCTimeRatio 的限制引发 OOM,调优诸如通过 NewRatio 控制新生代老年代比例,通过
MaxTenuringThreshold 控制进入老年前生存次数等
从 root 搜索不到,而且经过第一次标记、清理后,仍然没有复活的对象
新生代做的是复制清理、from survivor、to survivor 是干啥用的、老年代做的是标记清理、标记清理后碎片要不要整理、复制清理和标记清理有有什么优劣势等
新生代:复制清理;
老年代:标记 - 清除和标记 - 压缩算法
永久代:存放 Java 中的类和加载类的类加载器本身
引用计数法
复制算法(Java 中新生代采用)
标记清除法(Mark-Sweep)
标记压缩清除法(Java 中老年代采用)
参考:
https://www.jianshu.com/p/d3a0b4e36c28
https://blog.csdn.net/cy609329119/article/details/51771953
https://zhuanlan.zhihu.com/p/29564649
MinorGC 触发机制
Eden 区满的时候,JVM 会触发 MinorGC。
MajorGC 触发机制
在进行 MajorGC 之前,一般都先进行了一次 MinorGC,使得有新生代的对象进入老年代,当老年代空间不足时就会触发 MajorGC
当无法找到足够大的连续空间分配给新创建的较大对象时 (如大数组),也会触发 MajorGC 进行垃圾回收腾出空间
Full GC 触发机制:
1、调用 System.gc 时,系统建议执行 Full
GC,但是不必然执行
2、老年代空间不足
3、方法区空间不足
4、通过 Minor GC 后进入老年代的平均大小大于老年代的可用内存
5、由 Eden 区、survivor space1(From
Space)区向 survivor space2(To Space)区复制时,
当永久代满时也会引发 Full GC,会导致 Class、Method 元信息的卸载。
参考: Java 新生代、老生代和永久代详解 https://www.jianshu.com/p/d3a0b4e36c28
线程池概念
线程池: 简单理解,它就是一个管理线程的池子。
它帮我们管理线程,避免增加创建线程和销毁线程的资源损耗。因为线程其实也是一个对象,创建一个对象,需要经过类加载过程,销毁一个对象,需要走 GC 垃圾回收流程,都是需要资源开销的。
提高响应速度。 如果任务到达了,相对于从线程池拿线程,重新去创建一条线程执行,速度肯定慢很多。
重复利用。 线程用完,再放回池子,可以达到重复利用的效果,节省资源。
几个核心参数的作用:
corePoolSize: 线程池核心线程数最大值
maximumPoolSize: 线程池最大线程数大小
keepAliveTime: 线程池中非核心线程空闲的存活时间大小
unit: 线程空闲存活时间单位
workQueue: 存放任务的阻塞队列
threadFactory: 用于设置创建线程的工厂,可以给创建的线程设置有意义的名字,可方便排查问题。
handler: 线城池的饱和策略事件,主要有四种类型
参考: https://www.cnblogs.com/jkzr/p/10729124.html
mylist = [1,2,2,2,2,3,3,3,4,4,4,4]
myset = set(mylist)
for item in myset:
print("the %d has found %d" %(item,mylist.count(item)))
from collections import Counter
Counter([1,2,2,2,2,3,3,3,4,4,4,4])
Counter({2: 4, 4: 4, 3: 3, 1: 1})
List=[1,2,2,2,2,3,3,3,4,4,4,4]
a = {}
for i in List:
if List.count(i)>1:
a[i] = List.count(i)
https://www.cnblogs.com/guyannanfei/p/10446496.html
所谓值传递,实际上就是将实际参数值的副本(复制品)传入函数,而参数本身不会受到任何影响。
from functools import wraps
def get_time(func):
@wraps(func)
def do_some():
print(time.time())
func()
print(time.time())
return do_some
聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿,后者按姓氏排列数据。 聚集索引对于那些经常要搜索范围值的列特别有效
如果非要把非聚集索引类比成现实生活中的东西,那么非聚集索引就像新华字典的偏旁字典,他结构顺序与实际存放顺序不一定一致
1、为什么用事务
2、事务分类
3、大促的测试方案
参考: https://www.cnblogs.com/jay36/p/7680008.html
由前后端配合解决,解决的是与前端交互的时候,前端重复提交问题.
服务端之间调用,上面案例提到的场景.
消息重复消费,MQ 消息队列,消息重复消费.
1、协议层区别
HTTP ,HTTPS 使用的是 应用层协议 应用层协议:定义了用于在网络中进行通信和传输数据的接口
DUBBO 接口使用的是 TCP/IP 是传输层协议 传输层协议:管理着网络中的端到端的数据传输;因此要比 HTTP 协议快
2、socket 层区别
Dubbo 接口:
Dubbo 接口是阿里巴巴开源的致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案。
dubbo 框架告别了传统的 web service 的服务模式,进而改用 provider 和 consumer 模式进行服务。
请求需要经历那些流程,描述一下请求过程?
1.浏览器输入对应的 url
2.解析域名,找到主机 ip 地址
3.浏览器与主机建立 tcp 连接
4.浏览器定向发起定向请求
5.服务器响应请求,返回 html 页面
1.cookie 数据存放在客户的浏览器上,session 数据放在服务器上。
2.cookie 不是很安全,别人可以分析存放在本地的 COOKIE 并进行 COOKIE 欺骗考虑到安全应当使用 session。
3.设置 cookie 时间可以使 cookie 过期。但是使用
session-destory(),将会销毁会话。
4.session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用 cookie。
5.单个 cookie 保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存 20 个 cookie。(Session 对象没有对存储的数据量的限制,其中可以保存更为复杂的数据类型)
Producer(生产者)
测试注意点有:
数据是否真正推送到队列中
数据是否推送到正确的topic下
如果一次推送的数据过多,前面推送的数据如何处理(超过队列)
同时需要注意每个topic下的queue如何分布数据
Consumer(消费者)
确认应用的消费是哪种
测试消费者的消费信息源是否正确(能否从正确的topic中拿到正确的消息)
测试Topic的消费队列策略是什么
数据被消费者使用后,有没有及时的被清除
当消息队列过长(消费速度过慢)时,MQ会溢出的数据如何处理
是否会越权消费别的 topic中的信息
如果是PULL类型的消费者,需要测试拉取的时间间隔,如果是push的类型,需要测试当有生产者生成消息时,消费者是否能及时得到信息并消费
MQ 术语
offsetStore---------commitOffset:消费到的 offset
PullRequest ------ offset 的区别:拉取的位置
MQ 消费策略
MQ 的常规测试方案
https://zhuanlan.zhihu.com/p/163398169
记录一次测开面试题记录
https://testerhome.com/topics/25466
关于面试的一些想法
https://testerhome.com/topics/27968
接口幂等性
https://www.jianshu.com/p/5d006a5497dd
如何保证接口的幂等性
https://segmentfault.com/a/1190000020172463
UI 自动化常用设计模式
https://testerhome.com/topics/15768
python 常用 UI 自动化设计模式总结
https://testerhome.com/topics/16892
大厂测试开发面试题整理(一面,附答案)
https://testerhome.com/topics/30721
大厂测试开发面试题整理(二面,附答案)
https://testerhome.com/topics/30722