职业经验 最近面试题分享

xinxi · 2021年10月21日 · 最后由 乌鸦不会飞 回复于 2022年03月22日 · 7109 次阅读

前言

公司喜欢被问到的高频问题:

1、java 八股文

2、jvm

3、mysql 原理

4、接口自动化

5、性能测试

6、算法和代码

UI 自动化

UI 自动化查找元素方法

  • text
  • id
  • xpath
  • css

Appium 隐式等待

隐式等待(全局)driver.implicitly_wait(20)

implicitly_wait()方法用来等待页面加载完成(直观的就是浏览器tab页上的小圈圈转完)

UI 自动化设计模式

  • page object 设计模式
  • 工厂模式
  • 单例模式
  • 模板模式
  • 建造者模式

k8s

k8s 的 yml 文件了解?

dockerfile 怎么写、怎么构建容器?

大数据

是否了解大数据数据库?habse、hdfs 怎么操作?

大数据组件

ES 相关概念

代码题

代码题,列表中找重复字符串

代码题,判断字符串驼峰

代码题,字符串压缩

判断连续的字符串

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)

python 实现判断一个字符串是否是合法 IP 地址

java

java 内存

堆栈概念

堆: 先进先出

栈:先进后出

栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由 OS 回收,分配方式倒是类似于链表。

什么是 “堆”,"栈","堆栈","队列",它们的区别:https://www.cnblogs.com/guoxiaoyan/p/8664150.html

堆栈: https://baike.baidu.com/item/%E5%A0%86%E6%A0%88/1682032?fr=aladdin

java 的 GC

什么时候?

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

Java 新生代、老生代和永久代详解

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

java 多线程

线程池概念

线程池: 简单理解,它就是一个管理线程的池子。

它帮我们管理线程,避免增加创建线程和销毁线程的资源损耗。因为线程其实也是一个对象,创建一个对象,需要经过类加载过程,销毁一个对象,需要走 GC 垃圾回收流程,都是需要资源开销的。

提高响应速度。 如果任务到达了,相对于从线程池拿线程,重新去创建一条线程执行,速度肯定慢很多。

重复利用。 线程用完,再放回池子,可以达到重复利用的效果,节省资源。

java 线程池参数

几个核心参数的作用:

corePoolSize: 线程池核心线程数最大值

maximumPoolSize: 线程池最大线程数大小

keepAliveTime: 线程池中非核心线程空闲的存活时间大小

unit: 线程空闲存活时间单位

workQueue: 存放任务的阻塞队列

threadFactory: 用于设置创建线程的工厂,可以给创建的线程设置有意义的名字,可方便排查问题。

handler: 线城池的饱和策略事件,主要有四种类型

Java 常用的一些容器

Collection
Map
List
Set
TreeSet
Queue
Collections 和 Arrays

参考: https://www.cnblogs.com/jkzr/p/10729124.html

java hashmap 底层结构

java hashmap 的扩容

python

Python3 查找列表中重复元素的个数的 3 种方法详解

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)

python 字符串反转

python 的浅拷贝和深拷贝

python 多线程

Django 执行流程

https://www.cnblogs.com/guyannanfei/p/10446496.html

Django 的项目工程模块

Django 的一个请求经过哪几层?

Python 函数参数传递机制

所谓值传递,实际上就是将实际参数值的副本(复制品)传入函数,而参数本身不会受到任何影响。

python 装饰器

from functools import wraps

def get_time(func):

    @wraps(func)
    def do_some():
        print(time.time())
        func()
        print(time.time())
    return do_some

linux

linux top 命令

linux Load Avg 负载

mysql

mysql 索引类型

mysql 什么索引会失效

mysql 回滚

mongo 线上配置

mysql 为什么用事务

mysql 的索引

聚集索引

聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿,后者按姓氏排列数据。 聚集索引对于那些经常要搜索范围值的列特别有效

非聚合索引

如果非要把非聚集索引类比成现实生活中的东西,那么非聚集索引就像新华字典的偏旁字典,他结构顺序与实际存放顺序不一定一致

mysql 事务的并发问题

mysql 事务

1、为什么用事务

2、事务分类

3、大促的测试方案

性能测试

jvm 调优

参考: https://www.cnblogs.com/jay36/p/7680008.html

内存泄漏分析

JVM 监控工具介绍

jstack

jconsole

jinfo

jmap

性能压测流程

性能测试关注什么指标?

MQTT 协议测试

jmeter 私有协议

接口测试

接口幂等

由前后端配合解决,解决的是与前端交互的时候,前端重复提交问题.

服务端之间调用,上面案例提到的场景.

消息重复消费,MQ 消息队列,消息重复消费.

jmeter 的私有 api 扩展

http 和 dubbo 的区别

1、协议层区别

  • HTTP ,HTTPS 使用的是 应用层协议 应用层协议:定义了用于在网络中进行通信和传输数据的接口

  • DUBBO 接口使用的是 TCP/IP 是传输层协议 传输层协议:管理着网络中的端到端的数据传输;因此要比 HTTP 协议快

2、socket 层区别

  • dubbo 默认使用 socket 长连接,即首次访问建立连接以后,后续网络请求使用相同的网络通道
  • http1.1 协议默认使用短连接,每次请求均需要进行三次握手,而 http2.0 协议开始将默认 socket 连接改为了长连接 (keep-alive)

Dubbo 接口:

Dubbo 接口是阿里巴巴开源的致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案。
dubbo 框架告别了传统的 web service 的服务模式,进而改用 provider 和 consumer 模式进行服务。

接口自动化框架分层

接口平台参数化

http 的请求头

通用测试

开发工具如何推广

开发项目效率提升

项目开发的具体的某一个功能实现

页面打不开,怎么排查

  • 检查输入 url 等参数
  • 检查网络情况
  • 请求抓包
  • nginx 解析
  • nginx 解析

一次完整 http

请求需要经历那些流程,描述一下请求过程?

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 对象没有对存储的数据量的限制,其中可以保存更为复杂的数据类型)

jvm 内存分配

jvm 的堆和栈

微服务架构

MQ 使用

Redis 使用

MQ 如何测试

  • Producer(生产者)

    测试注意点有:
    数据是否真正推送到队列中
    数据是否推送到正确的topic下
    如果一次推送的数据过多,前面推送的数据如何处理(超过队列)
    同时需要注意每个topic下的queue如何分布数据
    
  • Consumer(消费者)

    确认应用的消费是哪种
    测试消费者的消费信息源是否正确(能否从正确的topic中拿到正确的消息)
    测试Topic的消费队列策略是什么
    数据被消费者使用后,有没有及时的被清除
    当消息队列过长(消费速度过慢)时,MQ会溢出的数据如何处理
    是否会越权消费别的 topic中的信息
    如果是PULL类型的消费者,需要测试拉取的时间间隔,如果是push的类型,需要测试当有生产者生成消息时,消费者是否能及时得到信息并消费
    

MQ 术语

  • topic: 最细粒度的订阅单位,一个 group 可以订阅多个 topic 的消息
  • group: 组,一个组可以订阅多个 topic
  • clientId: 一个服务 (IP/机器) 的标识,一个机器可以有多个 group;同时,多个相同 group 的 clientId 组成一个集群,一起消费消息
  • messageQueue:消息队列,一个 broker 的一个 topic 有多个 messageQueue
  • offset: 每一个消息队列里面还有偏移 (commitOffset, offset) 的区别,为什么有 2 个 offset 呢?

offsetStore---------commitOffset:消费到的 offset
PullRequest ------ offset 的区别:拉取的位置

MQ 消费策略

  • 集群消费:同一个 consumer 消费组中的每个消费者实例,互斥消费消息
  • 广播消费:同一个消息可以被多个 consumer 消费,即使 consumer 同属于一个 consume

功能测试

水杯测试

直播和用户打赏的测试用例

抢红包测试

项目流程

  • 需求提出
  • 产研立项
  • 需求设计
  • 产品内部评审
  • 需求预审
  • 产研需求评审
  • 需求复述
  • 项目计划确认
  • 项目开发
  • 开发联调
  • 开发自测
  • 测试用例
  • 测试阶段
  • 上线评审
  • 产品验收
  • 发布上线
  • 回归测试
  • 复盘

团队管理

参考文章

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

共收到 13 条回复 时间 点赞

赞,你面的一般是啥岗位?

看面试题的话,应该是服务端的测开方向吧?

恒温 回复

就是测开,客户端多一点

在路上 回复

并不是,啥都有

感觉没有一道是问客户端的😂

大佬厉害,我都不会呢

🚑 🚑 九敏,好难呀

挺好的,测开广度是可以,深度其实也要比较专。测试开发就得准备测试 + 开发两部分内容。

难度很高啊,又广又深。

我的八股文已经没有问题了,来吧

😂 不管 jd 里有木有 java 都会问 java 的八股文吗

你好,关于【jmeter 私有协议】能再给指点一二吗?或者再提供几个关键字,多谢。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册