java
面向对象
面向过程更注重处理问题的步骤和顺序,面向对象更注重处理问题有哪些参与者、各自需要做什么。
面向过程比较直接高效,面向对象更易于复用、扩展和维护。
特性:封装、继承、多态。
封装:明确标识出允许外部使用的成员函数和数据项,内部细节对外部调用透明。
继承:子类共性的属性和方法直接使用父类的,再添加自己独有的。
多态:接口有不同的实现类。
重载和重写的区别
重载:发生在同一个类中,方法名相同,参数列表不同。
重写:发生在父子类中,方法名和参数列表相同,方法体不同,如果父类方法修饰符为private那么子类不能重写这个方法。
接口和抽象类
抽象类中可以有普通成员方法,接口中的方法必须全部是抽象方法。
抽象类只能继承一个,接口可以实现多个。
抽象类中的成员变量可以是各种类型的,接口中的成员变量只能是public static final类型的
权限修饰符
同一个类中 同一个包中 不同包的子类 不同包的无关类
private yes
默认 yes yes
protect yes yes yes
public yes yes yes yes
final
最终的。
修饰类:表示类不可以被继承。
修饰方法:表示方法不可以重写。
修饰变量:表示变量一旦被赋值就不可以修改它的值。
static
被类的所有成员共享
可以使用类名和对象名调用,推荐使用类名调用
static修饰的方法只能调用static修饰的方法,没有被static修饰的方法可以调用任意方法
String、StringBuffer、StringBuilder
String是final修饰的,不可变,每次修改会产生新的String对象。
StringBuffer和StringBuilder都是在原来的对象上操作的,底层是数组,可以用append()方法增添新元素,性能StringBuilder>StringBuffer>String。
StringBuffer是线程安全的,StringBuilder是线程不安全的,StringBuffer的方法都是synchronized修饰的。
修改少时使用String,经常需要修改时使用StringBuffer和StringBuilder,多线程共享变量时使用StringBuffer。
list
arraylist
通过数组实现
查找效率高,支持随机访问,添加删除效率低,需要移动元素,超过数组容量需要复制所有元素到新的更大的数组
linkedlist
通过链表实现
查找效率低,不支持随机访问,添加删除效率高,不需要移动元素,可以一直添加
map
存储键和值,将键映射到值,键不能重复,一个键最多对应一个值
hashmap
通过哈希表实现
哈希表通过数组和链表、红黑树(链表长度大于8)实现
输入输出顺序不一致
linkedhashmap
比hashmap的每个节点,增加了指向上一个元素和下一个元素的指针
输入输出顺序一致
treemap
通过红黑树实现,实现自然排序和定制排序
hashtable
和hashmap一样,方法用synchronized修饰,多了线程安全,操作时候会将整个hashtable锁住,其他线程无法操作
concurrent hashmap
和hashtable一样,value和哈希表用volatile修饰,只锁数组的一个位置,不影响其他位置
set
和map一样,只是把value设置成了null,只使用key
hashset,linkedhashset,treeset
List和Set的区别
List存储有序、可重复的元素,支持下标访问和迭代器访问。
Set存储无序、不可重复的元素,只能通过迭代器访问。
常用排序算法
1.冒泡排序
相邻的两个比较,把最大的放在后面,n趟排序可以把第n大的放在后面。
2.选择排序
选择最大的,和最后一个交换,剩余部分重复这个过程。
3.插入排序
分为已经有序部分和无序部分,从无序部分取一个数,从大到小比较,若有序的数大于取的数,有序的数往后移动,直到有序的数不大于取的数,可以确定位置。
4.快速排序
随机选一个数作为中心轴,左边都比它小,右边都比它大,在每个区间递归进行这个步骤。
树
根节点,子树
二叉树
根结点,左子树,右子树
二叉查找树、二叉搜索树
左子树小于父结点,右子树大于父结点
平衡二叉树
所有结点的左右子树高度差不超过1,左子树小于父结点,右子树大于父结点,实现快速查找,因为二叉查找树有些情况会变成链表,时间复杂度为O(n),平衡二叉树时间复杂度为O(lgn)
b树
二叉查找树深度太大,磁盘IO次数过多,为了减少磁盘IO的次数,瘦高变成矮胖
节点中元素从小到大排列,中间空着的划分子节点
b+树
相比b树,中间结点只有索引没有数据,更加矮胖
指针指向第一个叶子结点,形成链表,便于查询
红黑树
特点
1结点颜色为红色或者黑色,叶子结点为黑色,根节点为黑色
2如果一个节点是红色,那么它的子节点必须是黑色
3从一个节点到它的子孙节点必须包含相同数量的黑色节点
时间复杂度
O(lgn)
用途
解决了二叉查找树的线性问题,接近于平衡二叉查找树
红黑树查找效率比较低,但是插入删除效率比较高
存储有序的数据,如TreeMap,TreeSet
项目用了哪些框架,每个框架是什么意思,用来干什么
SSM
spring:控制反转ioc,面向切面aop
springMVC:model数据承载和业务处理,view视图,controller控制器
mybatis:连接数据库
1.spring
控制反转ioc
在配置文件里配置bean和相关属性,让spring容器生成和管理对象,调用set方法而不是new
面向切面aop
将一些功能从逻辑中独立出来,通过运行期间动态代理来实现这些功能
2.springMVC
model模型
数据承载bean如实体类
业务处理bean如service类
view视图 和用户交互的界面
controller控制器
将用户请求转发给相应的model进行处理
处理model的计算结果并返回给用户
3.MyBatis
连接数据库
4.springboot
简化spring
常见设计模式
单例模式:类只有一个实例,自己实例化自己,提供对外的接口
工厂模式:创建者和调用者分离
mvc模式:model,view,controller
进程和线程的理解
进程是系统资源分配和调度的基本单位,进程切换开销大,线程是cpu分配和调度的基本单位,线程开销小,一个进程可以有多个线程
系统资源:cpu , 文件,网络,键盘,锁(内存)
线程是进程中的单个顺序控制流,是一条执行路径
一个程序只有一条执行路径就是单线程程序,一个程序有多条执行路径就是多线程程序
创建线程的方法
继承thread类
实现runnable方法
线程池
线程池优点:
降低创建和销毁线程的消耗,提高线程利用率
任务来了,如果有空闲线程可以直接运行,提高响应速度
线程池可以统一管理线程,提高线程的可管理性
创建线程池
newCachedThreadPool() 可缓存
newFixedThreadPool() 可指定大小
newScheduledThreadPool() 可以控制时间和周期
newSingleThreadPool() 单个线程
线程池参数
corePoolSize核心线程池大小:最小线程数量,即使空闲也不会被销毁
maximumPoolSize线程池最大线程数量:任务被提交到线程池以后,首先会找有没有空闲线程,如果没有则缓存到工作队列,工作队列满了则创建新新线程,不能超过线程最大数量,把队头任务交给新线程,把这个任务放到队尾
keepAliveTime空闲线程存活时间:线程空闲,且数量大于corePoolSize,则指定时间后被销毁
unit:keepAliveTime的计量单位
workQueue工作队列:新任务被提交时,如果没有空闲线程,先进入工作队列队尾
线程的生命周期,线程有几种状态
创建new:新建的线程
就绪runnable:调用start()方法后,等待cpu,谁抢占到cpu谁运行
运行running:获得了cpu后,开始执行
阻塞blocked:在运行态因为某种原因暂时停止运行,直到变为就绪态
销毁dead:执行结束或出现异常或被强制终止
线程间通信方式
线程间通信指的是线程之间发送信号,配合完成工作
共享变量:volitale修饰的变量具有内存可见性,其他线程会同步修改变量
等待通知:wait()等待,notify()唤醒随机一个,notifyall()唤醒全部
管道输入输出流
volatile和synchronized的区别
volatile当前线程更新数据后,刷新主内存,其他线程要读取主内存;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的
volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性
volatile禁止指令重排序,synchronized不禁止
volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。
JDK、JRE、JVM的区别和联系
JDK:java development kit java开发工具,提供给开发人员使用。
JRE:java runtime environment java运行时环境,提供给运行java程序的用户使用。
JVM:java virtual machine java虚拟机。
JDK包含JRE,JRE包含JVM。
.java文件经过javac编译成.class文件,.class文件可以到处运行,放到windows或者linux版本的jvm上,jvm调用lib里面的类库去解释.class文件,将.class文件翻译成机器码,映射到操作系统,然后调用。
Jvm内存结构
线程共享:
堆:存放对象
方法区:存放静态方法或变量(static修饰的),类加载器
线程私有:
栈:存放基本数据类型,和对象地址
本地方法栈:c++的native方法
程序计数器:线程当前运行的位置
内存泄露,内存溢出
内存泄露:该回收的垃圾对象没有被回收
内存溢出:创建的对象的大小大于可用的内存容量大小
垃圾回收算法
可达性分析:把栈、本地方法栈、方法区中的对象作为gcroot,查看直接或间接引用的对象,没有被引用的可以回收
算法:
垃圾清理:先标记需要清理的,再清理(内存碎片)
垃圾整理:先标记需要清理的,再清理,再整理(开销大)
复制:内存分为两半,先用1区,把没有被标记的复制到2区,在清理,交替(需要2倍内存)
实际:
内存分为young区,和old区,young区按8:1:1分为eden区,s0区,s1区
youngGC,新创建的对象在eden区,快满了把eden和s1复制到s0,然后清理eden和s1,交替
oldGC也叫fullGC,经历过15次youngGC的对象和大对象进入老年代,fullGC时java程序暂停,使用标记清理或标记整理来清理
python
计算机网络
tcp/ip协议
TCP/IP传输协议,即传输控制/网络协议,也叫作网络通讯协议。TCP/IP传输协议是保证网络数据信息及时、完整传输的两个重要的协议。分为数据链路层,网络层,传输层,应用层。
网络层的主要协议有IP。
传输层的主要协议有UDP、TCP。
应用层的主要协议有HTTP。
osi模型
物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。
网络层的主要协议有IP。
传输层的主要协议有UDP、TCP。
应用层的主要协议有HTTP。
物理层:传输比特。
数据链路层:传输帧。
网络层:传输数据包。
传输层:TCP传输段,UDP传输数据报。
会话层、表示层、应用层:传输报文。
http和tcp的关系
http在应用层,tcp在传输层,http要基于tcp,tcp建立连接,http用来收发数据
tcp
transmission control protocol传输控制协议,工作在传输层
ip internet protocol网络协议,工作在网络层
tcp:是面向连接,可靠的协议,传输之前要经过三次握手,不容易丢失数据,网络开销大
udp:是不面向连接,不可靠的协议,不需要对方确认就可以开始传输,容易丢失数据,网络开销小
三次握手:发送方发送syn,接收方发送ack,syn,发送方发送ack
四次挥手:发送方发送fin,接收方发送ack,接收方发送fin,发送方发送ack
如何应对大量访问,恶意攻击,dos,洪泛攻击
洪泛攻击就是攻击者发送大量的syn,服务器为每个syn分配一个特定的数据区,服务器返回ack后,攻击者不再进行确认,这个tcp连接就处于挂起状态
syn cookie,基本原理:完成三次握手之前服务器不分配数据区,而是根据syn计算出一个cookie值,发送方返回的ack如果与这个cookie值相同,才建立连接分配数据区
cp如何保证可靠传输
三次握手和四次挥手:syn,ack/syn,ack;fin,ack,fin,ack
超时重传:设置重传计时器,时限内没有收到确认帧,就重新发送数据
流量控制:控制发送方的发送速率,一对一
拥塞控制:控制发送方的发送速率,多对一
流量控制
让发送方发慢点,要让接收方来得及接收
利用滑动窗口机制:a给b发送数据,a有发送缓存,b有接收缓存,应用层所有需要发送的数据都放在发送缓存,发送窗口是发送缓存允许发送但尚未发送的部分,成功发送数据之后,发送窗口就会往后移动,b会告诉a自己的接收窗口大小,a根据b的接收窗口大小动态地调整自己的发送窗口大小,发送窗口取接收窗口和拥塞窗口的最小值
发送缓存分哪几个区域
已经发送并收到确认,已经发送未收到确认,允许发送但尚未发送,不允许发送
拥塞控制
慢开始和拥塞避免:拥塞窗口从1开始按照指数增长,达到门限值每次加1,出现拥塞以后门限值设置为当前拥塞窗口大小/2,拥塞窗口从1开始重复这个过程
快重传和快恢复:发送方收到连续三个重复确认就重传接收方没有收到的报文段,而不用等待重传计时器到期,然后把门限值减半,执行拥塞避免
拥塞控制对移动端、打游戏,游戏动作同步有什么影响
卡
游戏里面很多都是用UDP,你了解吗
对速度要求高
王者荣耀用UDP会有什么问题
丢包
但是它实际不会出现这个问题,为什么
本地的文件和逻辑
为什么视频网站用TCP,视频通话和直播用UDP
视频网站一般用TCP,因为对画面质量有要求,且允许缓冲等待
微信视频聊天和直播一般用udp,因为不希望画面卡顿,可以接受画面不太清晰
客户端和服务器
客户端:为客户提供本地服务的程序
服务器:网络中能对其他机器提供服务的计算机系统
http
hypertext transfer protocol超文本传输协议,工作在应用层
为什么基于tcp不基于udp,因为打开一个网页需要传输很多数据,tcp提供传输控制,按顺序组织数据,有错误纠正
服务器程序崩溃怎么解决
服务器超载:扩容
线程死锁:设置不同的线程优先级,回退等待,按顺序加锁,设置请求锁时限,超时则放弃请求并且释放自己占有的锁
从浏览器输入网址到出现网页发生了什么
1.从本地host文件查找域名对应的ip地址,如果本地没有,就从dns服务器查找,返回ip地址
2.tcp三次握手:浏览器发送syn,服务器返回ack/syn,浏览器返回ack
3.浏览器发送请求:发送方从应用层到物理层一层一层加包头,接收方从物理层到应用层一层一层解包
4.服务器处理请求
5.服务器向浏览器返回html文件:加包解包
6.tcp四次挥手:浏览器发送fin,服务器返回ack,服务器发送fin,浏览器返回ack
7.浏览器解析html文件,渲染页面
http1.0,1.1,2.0,https
http1.1
引入了更多的缓存控制策略,错误状态响应码,管道机制,持久连接:tcp连接默认不关闭,可以被多个请求复用
http2.0
二进制分帧,多路复用,数据流,首部压缩,服务端推送
https
在tcp和http之间加了一层用于加密解密的ssl(安全套接层)/tsl层(安全传输层)
ssl/tsl运行机制:客户端向服务器所要并验证公钥,用公钥生成秘钥,用秘钥加密传输
响应码
1xx 表示【临时响应】并需要请求者继续执行操作的状态代码
2xx 表示【成功】处理了请求的状态代码
3xx 表示要完成请求,需要进一步操作。通常,这些状态代码用来【重定向】
4xx 表示【请求可能出错】,妨碍了服务器的处理
5xx 表示【服务器】在尝试处理请求时发生内部错误。这些错误可能是服务器本身的错误,而不是请求出错
mysql
创建数据库
create database 数据库;
删除数据库
drop database 数据库;
选择数据库
use 数据库;
创建数据表
create table 表 (字段1,字段2......);
删除数据库
drop table 表;
插入数据
insert into 表(字段名1,字段名2........)
values 字段值;
查询数据
select 字段1,字段2...... //*表示返回所有
from 表
where 条件;
更新数据
updata 表 set 赋值语句
where 条件;
删除记录
delete from 表
where 条件;
like
like表示包含
select 字段1,字段2......
from 表
where 字段 like 具体的内容;
union
union表示合并
select 字段1,字段2...
from 表1
where 条件1
union
select 字段1,字段2...
from 表2
where 条件2
union去除重复值,union all不去除重复值,select中的字段必须相同
排序
select 字段1,字段2......
from 表
order by 字段x asc或desc
asc升序,desc降序
分组
select 字段1,字段2......
from 表
where 条件
group by 字段x;
可以按照字段x分组并统计每个组有多少条记录
连接
inner join内连接:获取两个表中字段匹配的记录
select a.字段1,a.字段2......,b.字段1,b.字段2......
from 表1 a inner join 表2 b
on 条件;
left join左连接:获取左表所有记录,获取右表中字段匹配的记录,空白显示null
select a.字段1,a.字段2......,b.字段1,b.字段2......
from 表1 a left join 表2 b
on 条件;
right join右连接:获取右表所有记录,获取左表中字段匹配的记录,空白显示null
select a.字段1,a.字段2......,b.字段1,b.字段2......
from 表1 a right join 表2 b
on 条件;
事务
用途:
用于处理数据量大、复杂度高的数据。
需要的引擎:
Innodb
酸碱性
酸性ACID
原子性,一致性,隔离性,持久性
碱性BASE
基本可用性,软状态,最终一致性
事务的四个特性:
原子性:事务中的操作,要么全部完成,要么全部不完成,不会停留在中间某个环节
一致性:事务开始之前和结束之后,数据库的完整性没有被破坏。写入的资料必须完全符合所有的预设规则
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改,隔离性可以防止多个事务并发执行时由于交叉执行导致的数据不一致
持久性:事务处理结束以后,对数据的修改是永久的,系统故障也不会丢失
事务的隔离级别
读未提交:能读到没有被提交的数据(脏读)
读提交:只能读到已经被提交的数据,防止脏读(不可重复读)
可重复读:读取了一条数据,这个事务不结束,别的事务就不可以改这条记录,防止不可重复读(幻读)
串行化:运行完一个事务的所有子事务之后才可以执行下一个事务,防止幻读
不是隔离级别越高越好,级别越高效率越低,mysql默认是可重复读
事务的并发问题
脏读:事务A读到了事务B还没有提交的数据
不可重复读:在一个事务里面读取了两次某个数据,读出来的数据不一致
幻读:在一个事务里面的操作中发现了未被操作的数据
提交是什么意思
事务已经成功执行,并且写入数据库
什么场景下要用到串行化
非常需要确保数据一致性且不要求高并发,因为效率低
索引
什么是索引
排好序的快速查找数据结构。
索引的用途
索引用来快速寻找那些具有特定值的记录。
索引会影响where后面的查找,和order by 后面的排序。
索引的缺点
更新表的时候速度慢,因为不仅要保存数据,还要保存索引文件。索引文件会占用磁盘空间。
索引的原理
就是把无序的数据变成有序的查询
1.把创建了索引的列的内容进行排序
2.对排序结果生成倒排表
3.在倒排表内容上拼上数据地址链
4.在查询的时候,先拿到倒排表内容,再取出数据地址链,从而拿到具体数据
数据结构是b+树
聚集索引和非聚集索引
都是b+树的数据结构
聚集索引:把索引和数据放在一起,并且是按照一定的顺序组织起来的,找到了索引也就找到了数据,数据的物理存放顺序和索引顺序是一致的
优点:
只需要一次查询,效率比较高
对于范围查询效率高,因为数据是按照大小排列的
适合用在排序的场合,因为数据是按照大小排列的
非聚集索引:将索引和数据行地址放在一起,找到索引之后根据数据行地址到磁盘查找数据
数据库索引类型
单列索引:普通索引:单个列,唯一索引:索引的列的值是唯一的,可以有空值,主键索引:索引的列的值是唯一的,不允许有空值
组合索引:多个列
全文索引:字段中是否包含指定的关键字,原理是将字段进行分词
主键索引和唯一索引
相同:索引的列的值是唯一的
不同:主键索引不可以有空值,唯一索引可以有空值
慢查询优化
将字段很多的表分解成多个表
分解关联查询
忘了写主键索引,但是已经有几万条数据,要怎么优化
导出表,清空表,建立索引,导入数据
java如何使用数据库,和数据库建立连接
jdbc,配置一些参数
或者用mybatis
缓存的作用
缓和较慢存储的高频请求,缓解数据库压力,提高响应速度
为什么可以提高响应速度
因为缓存是基于内存的,内存的读写速度比磁盘快得多
缓存的应用场景
cpu缓存:位于cpu和内存之间的临时存储器,容量比内存小,速度比内存快得多
浏览器缓存:缓存一些静态资源,比如图片,js,css
cdn缓存:客户端先检查浏览器的缓存,缓存过期则会向cdn送请求,cdn检查缓存数据没有过期,那么直接返回响应,如果已经过期,需要向web server发起请求,获得新的数据响应
数据库缓存:cache层,数据缓存在内存中,读写速度比磁盘快得多
如何读写缓存
判断是否有缓存数据,没有数据的话从数据库加载,如果查出数据不为null,则写入缓存,在把数据调回使用方
缓存的数据如何与数据库中的数据保持一致
先更新缓存,再更新数据库:不常用
先更新数据库,再更新缓存:常用
范式
1NF列不可分
2NF完全依赖
3NF消除传递依赖
BCNF消除主属性对主码子集的依
redis
key-value形式,基于内存
es
适合搜索
dubbo
响应时间:执行一个请求从开始到最后收到响应的时间
并发数:系统同时能处理的请求数量
包括连接数、请求数、用户数
吞吐量:单位时间内,系统能处理的请求数量
包括qps每秒请求数、tps每秒事务数
dubbo是一个高性能的rpc框架,屏蔽了底层的细节,速度快,主要用于分布式架构中应用之间的通信。分为服务提供者,服务消费者,注册中心,服务监控中心。
1.服务提供者启动服务,将服务注册到注册中心
2.服务消费者会定时拉去服务提供者列表
3.服务消费者生成一个动态代理对象,调用远程接口
4.cluster层获取服务提供者
5.cluster做负载均衡,选服务提供者
6.选协议格式
7.exchange将请求封装成request请求
8.发送请求
9.服务提供者监听指定的端口号,收到请求之后反序列化
10.exchange解析请求
11.动态代理对象调用接口
rocketMQ
mq是一种提供消息队列服务的中间件,提供对消息的生产,存储,消费。
主要作用有解耦,异步,削峰。
如何保证消息可靠传递?
消息生产阶段:
创建和发送消息必须同时成功或失败
收到消息后需要返回确认消息给发送方,发送方收不到或收到错误的响应,要重试发送
消息服务器:
持久化完成之后才返回确认消息
消息消费阶段:
消费消息失败后要重试,达到最大次数要放到死消息队列
linux
Ls查看文件及目录
ls -l详细
Ls -a显示隐藏文件及目录
Ls -A显示隐藏文件及目录,但不显示 "." (当前目录) 及 ".." (父目录)
Cd 进入目录
Cd . 进入当前目录
Cd ..进入父目录
Cd ../..进入父目录的父目录
Cd -进入上一个目录
Cd / 绝对目录
Pwd展示当前目录
Tab自动补齐
⬆️⬇️ 前一个/后一个命令
Cat book.txt展示文件内容
Head book.txt展示文件开头10行
head -n 2 book.txt展示文件开头2行
tail book.txt展示文件最后10行
tail -n 2 book.txt展示文件最后2行
tail -f book.txt 展示文件最后10行,实时更新
Less book.txt分页展示文件内容
⬆️⬇️ 换行
Q 退出
Vim book.txt编辑文件内容
⬆️⬇️⬅️➡️移动光标
i进入编辑模式
esc+wq 保存并退出
file book.txt查看文件类型
where book.txt查找文件位置
H=“hello”定义变量
echo abc打印abc
echo ${h} 打印h的值,即hello
Mv book.txt book1.txt重命名
for ff in week??
Do
Echo $ff
Done 打印week开头的文件
for ff in week??
Do
Echo chapter${ff#week}
Done 选择week开头的文件,加上chapter,去掉week
grep 123 book.txt 搜索123
Ps 查看进程
Ps aux查看所有进程的详细信息
Kill a 正常停止进程a
Kill -15 a 正常停止进程a
Kill -9 a 强制停止进程a
touch book.txt创建文件
vim book.txt创建文件
Mkdir dir1创建文件夹
rm book删除文件或目录
rm -i book删除前确认
rm -f book删除无需确认
Rm -r book将目录下的子目录和文件一起删除
Ssh root@computer01 以root用户远程登录computer01
脚本内容一般以.sh结尾,不加也可以
脚本内容以#/bin/sh或者#/bin/bash开头,指定解析器为bash
bash hello.sh 执行hello.sh脚本
打印文件的每一行的第一个单词,第一个单词以空格区分
awk '{print $1}' Desktop/test1
Shell编程应用:检查pom是否有snapshot
修改配置文件的内容,修改dubbo接口
tomcat
把war包放到webapps文件夹
postman
创建collection
创建request
jmeter
先启动一个线程组
线程数=用户数
循环次数=每个用户重复操作数
取样器,http请求
监听器,查看结果树
selenium
appnium
unitest
测试
测试流程
产品立项,产品写需求文档,需求评审(都在,了解需求,答疑,提出建议),开发工作(设计,开发,自测,提测),同时测试工作(测试计划,测试用用例,测试用例评审),提测(都在,主流程),搭建测试环境,准备测试数据,接口测试,功能测试,根据需求可能有性能测试、兼容性测试等等专项测试,记录bug,回归测试,验收测试(都在),测试报告,上线,线上验证(产品),关注日志和监控
接口测试流程
了解需求和设计,接口测试计划,接口测试计划评审
正常场景,用边界值等价类,查看返回结果是否和数据库一致
异常场景,传入错误的参数类型,数量等,看接口是否会崩溃
性能测试,包括响应时间、吞吐量、并发数、cpu内存占用率
安全测试,敏感数据和日志加密
兼容测试,用老接口的方式访问
准备测试数据,准备测试环境,用工具或写脚本,执行,记录bug,回归测试,测试报告
性能测试流程
了解需求和设计,性能测试计划,性能测试计划评审,准备测试数据,准备测试环境,用工具或写脚本,执行,调优,测试报告
性能测试做了什么工作,性能测试中需要关注什么部分,我从前端和后端分开来讲的
95%响应时间,error,吞吐量(每秒完成的请求数)
以百度首页输入框的功能为例,写测试用例(不需要说搜索之后的)
功能,性能,安全性,兼容性,易用性,界面
https://blog.csdn.net/weixin_49496731/article/details/121772403
实习或项目中去定位问题的思路,如何定位并解决的,举一个具体的例子
页面展示错误,先确定是前端还是后端,查看请求发现是后端,查看日志有没有报错,没有报错就看逻辑
如果请求了其他系统,看其他系统有没有错,没有错就看自己的代码逻辑。
项目
超市外卖
遇到什么问题,怎么解决
非技术
新项目,比较复杂,时间紧急
先找有经验的同事了解架构、重点,技术方面有mq和dubbo,然后自己看文档查资料,解决不了再问同事,写完的测试用例先给导师看,按照建议进行修改
印象深刻的bug
用户下单之后,履约系统会调用仓库系统的dubbo接口,接收发货位和集货位,然后交给下游系统进行一些计算。测试过程中没有问题,上线后发现履约系统有时候会卡在这一步,原因是仓库系统发货位和集货位被占用,调用接口没有返回发货位和集货位,重试达到了最大次数,停止重试了。
设计阶段因为不了解仓库系统的内部实现,没有预料到发货位和集货位会用完,而仓库系统在测试阶段都是线上模拟,没有实地作业,刚开业仓库工人业务不熟练,导致长时间占用位置,没有可用的空位置,导致重试达到最大次数。
改成了履约系统接收仓库系统的mq消息,解决了问题
经验是需要了解上下游系统的情况,有条件的话尽量模拟真实环境
上线效果
刚上线内部使用没有问题,正式上线平均100多单,后期运营通过特价+宣传达到日平均400单
招投标流程线上化
遇到什么问题,怎么解决
新项目,比较复杂,时间紧急
先找有经验的同事了解架构、重点,然后自己看文档查资料,解决不了再问同事,测试过程中保证主流程没有问题,有限保证上线时间,用户体验方面的问题配置了监控报警,后期优化
印象深刻的bug
供应商审核状态确认结点卡住,原因是供应商风险扫描节点执行通过后,又执行供应商审核状态确认结点,供应商数量多的情况可能并发更新数据库,导致更新失败,流程卡住。
解决方式是推动蜂利器团队优化功能,加入了失败重试的功能。
经验是测试的时候要考虑极端情况,就算是没有发生过的情况也要考虑。
上线效果
上线后没有发生阻塞流程的bug,都是类似文案错误或输入超长的报错,后期优化解决。使用情况是招投标流程平均时长缩短7天,且过程更公开透明。
自我介绍
面试官您好,我叫刘浩雨,毕业于湖南师范大学物联网工程专业,之前是在便利蜂做测试开发,工作了一年半左右的时间,主要负责供应链和物流业务的质量保证工作。web端和app端的测试都有做过,熟悉测试的流程,常用的工具和框架,能编写测试代码。工作期间的成果主要有,店仓一体的超市外卖业务,和招投标流程线上化,这两个项目都是从0到1全程参与的。很荣幸能参加今天的面试,非常希望能够加入到xxx公司。