自己记录备注

100-继续
200-成功。客户端请求已成功。

304-走缓存,未修改。
301-永久重定向。
302-临时重定向,A访问B
307-访问转发,A调用B

401-鉴权失败,需要正确账号密码
403-权限限制,禁止访问 SSL IP地址 客户端证书
404-文件或资源未找到。
405-HTTP请求方法错误
406-客户端浏览器不接受所请求页面的MIME类型。
407-要求进行代理身份验证。

500-服务器内部错误 asp错误 服务器占用率 文件权限
501-页眉值指定了未实现的配置
502-网关问题
503-服务器节点不可用
504-网关超时。
505-HTTP版本不受支持

项目推动能力,推动项目 和 推动规范
用例覆盖率和执行覆盖率
线上bug数
每日测试进度同步
代码变更行覆盖率
迭代bug分析
迭代后补充业务文档

减少信息误差,及时沟通
及时反馈问题,持续改进
停止推脱抱怨,响应变化

敏捷迭代
冲刺会、站立会、总结会
三方会议才有效
风险意识、过程管理、项目控制

web服务层 Nginx openresty
web应用服务层 tomcat

持续集成CI:频繁地 (一天多次) 将代码集成到主干,经过让产品可以快速迭代,同时还能保持高质量
代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。

持续交付CD : 频繁地将软件的新版本,交付给质量团队或者用户,以供测试
持续部署 代码在任何时刻都是可部署的,可以进入生产阶段。

性能的常用指标包括页面的白屏时间,首屏时间,资源占用,页面渲染时间,帧率

content-type
x-www-form-urlencoded是浏览器默认的编码格式,如果参数值中需要&,则必须对其进行编码
form-data 不会对参数编码

SVN
集中式版本控制系统,版本库是集中存放在中央服务器的,工作的时候,用的是自己的电脑,所以,我们首先需要
从中央服务器上拉取最新的版本,然后开始工作,等工作完了,再把自己的工作提交到中央服务器。

Git
分布式版本控制系统没有中央服务器的概念,我们使用相关的客户端提取的不只是最新的文件,而是把代码仓库完整
地镜像下来,相当于每个人的电脑都是一个完整的版本库,这样的话,任何一处协同工作的服务器出现故障,都可以
用任何一个镜像出来的本地仓库恢复。并且,即便在网络环境比较差的情况下也不用担心,因为版本库就在本地电脑

GitHub开源免费,私有仓库收费,适合开源项目
GitLab私有仓库也免费。允许免费设置仓库权限;

多态的实现
在程序中定义的引用变量所指向的具体类型 和 该引用变量的生成对象调用在编程的时候并不确定,当处于运行期间才确定。
父类的引用指向子类的对象。接口的引用指向实现类的对象

maven是一个项目管理工具,基于项目对象模型,maven主要是用来解决导入java类依赖的jar,编译java项目主要问题。
负责版本,构建,输出,依赖关系 文档和构建结果 项目关系 移植性管理
maven的生命周期 - 编译、测试、打包、集成、验证、部署
约定优于配置 - 默认值,尽量不去修改

pom中依赖
groupId 必须 团体标识 com.
artifactId 必须 项目的唯一标识符 tomcat
version 必须
scope 作用域限制
type 一般在pom引用依赖时候出现,其他时候不用
optional 是否可选依赖

常用的mvn依赖
fastjson
easyexcel
lombok 省去setter getter

Apache
Apache是Web服务器,Tomcat是Java应用服务器。
优点:处理静态文件速度快,适合静态HTML和图片。
缺点:配置相对复杂,自身不支持动态页面。不支持动态请求如:CGI、Servlet/JSP、PHP、ASP等;

Tomcat
是Java开发的一个符合JavaEE的Servlet规范的JSP服务器(Servlet容器),是 Apache 的扩展。
优点: 基于java-Servlet容器。 处理动态请求,静态HTML 动态 JSP Servlet 都能处理。
缺点: 只能用作java容器,效率没有Apache高。
8080:建立http连接 用,如浏览器访问
8005:关闭tomcat通信接口
8009:与其他http服务器通信接口,用于http服务器集合

Nginx
优点:nginx常用做静态内容服务和反向代理服务器,直接外来请求转发给后面的应用服务器,
负载均衡、反向代理、处理静态文件优势。Nginx 处理静态请求的速度高于Apache。
Nginx有动态分离机制,静态请求直接就可以通过Nginx处理,动态请求才转发请求到后台交由Tomcat进行处理。
缺点:Nginx 只适合静态和反向代理。

将服务器接收到的请求按照规则分发的过程,称为负载均衡。

RPC Remote Procedure Call远程过程调用 ,像调用本地服务一样调用服务器的方法, 基于TCP/IP传输层协议, 架构包括 客户端,客户端存根,服务端存根,服务端
HTTP服务主要是基于HTTP协议的,遵从RESTFUL风格,以URI对网络资源进行唯一标识,响应端根据请求端的不同需求,通过无状态通信,对其请求的资源进行表述。
RPC存在效率优势。HTTP协议是在传输层协议TCP之上的,HTTP优点就是简单、直接、开发方便
RPC服务主要是针对大型企业的,而HTTP服务主要是针对小企业的,因为RPC效率更高,而HTTP服务开发迭代会更快

七层协议
第一层:应用层。定义了用于在网络中进行通信和传输数据的接口; HTTP
第二层:表示层。定义不同的系统中数据的传输格式,编码和解码规范等;
第三层:会话层。管理用户的会话,控制用户间逻辑连接的建立和中断;
第四层:传输层。管理着网络中的端到端的数据传输; TCP/IP
第五层:网络层。定义网络设备间如何传输数据;
第六层:链路层。将上面的网络层的数据包封装成数据帧,便于物理层传输;
第七层:物理层。这一层主要就是传输这些二进制数据。

三次招手和四次挥手 因为HTTP是一个基于TCP的协议,而TCP是一种可靠的传输层协议.TCP(Transmission Control Protocol) 传输控制协议
在HTTP/1.1中,keep-alive能够复用TCP连接,减少TCP三次握手的次数,从而提升性能.

TCP三次握手过程
第一次握手:主机A通过向主机B 发送一个含有同步序列号的标志位SYN的数据段给主机B,请求建立连接。 firefox > nginx [SYN] 在么
第二次握手:主机B 收到主机A的请求后,用一个带有确认应答(ACK)和同步序列号(SYN)标志位的数据段响应主机A。 nginx > firefox [SYN, ACK] 在
第三次握手:主机A收到这个数据段后,再发送一个确认应答,确认已收到主机B 的数据段: firefox > nginx [ACK] 知道了

四次挥手
第一次: 当主机A完成数据传输后,将控制位=1,提出停止TCP连接的请求 ; firefox > nginx [FIN] 我要关闭连接了
第二次: 主机B收到控制位后对其作出响应,确认这一方向上的TCP连接将关闭,将ACK=1; nginx > firefox [ACK] 知道了,等我发完包先
第三次: 由B端再提出反方向的关闭请求,将FIN=1 ; nginx > firefox [FIN] 我也关闭连接了
第四次: 主机A对主机B的请求进行确认,将ACK=1,双方向的关闭结束. firefox > nginx [ACK] 好的,知道了

HTTP 超文本传输协议
HTTP服务主要是基于HTTP协议的,遵从RESTFUL风格,以URI对网络资源进行唯一标识,响应端根据请求端的不同需求,通过无状态通信,对其请求的资源进行表述。
无状态协议,对于事务处理没有记忆能力,比如被人访问2次,是同一个人还是不同人不会记录。

支持 B/S 及 C/S 模式。
灵活的数据类型,content-type
客户端和服务器端建立连接 -客户端发送请求数据到服务器-服务器端接收到请求后处理,然后将处理结果响应客户端–关闭客户端和服务器端的连接(HTTP1.1 后不会立即关闭)
请求行、请求头、请求数据
请求行包括 请求方法,协议,url,端口号
get 请求方式 post 请求方式

HTTP1.1 持续连接,增减缓存-cache-control ,断点传输
Http2.0 连接共享,头部压缩,服务器推送
https 基于HTTP协议,通过SSL或TLS提供加密处理数据、验证对方身份以及数据完整性保护

1、SSL 证书费用:开启 HTTPS 要申购 SSL 证书,每年要在证书上花费不菲的费用。
2、HTTPS 连接服务器端资源占用高
3、HTTPS 协议握手费时:多几次握手,网络耗时变长,用户从 HTTP 跳转到 HTTPS 还要一点时间。

HTTPS和HTTP的区别是什么
1、HTTPS是加密传输协议,HTTP是明文传输协议;
2、HTTPS需要用到SSL证书,而HTTP不用;
3、HTTPS比HTTP更加安全,对搜索引擎更友好,利于SEO;
4、HTTPS标准端口443,HTTP标准端口80;如果使用80端口访问HTTPS协议的服务器可能会被拒绝。
5、HTTPS基于传输层,HTTP基于应用层;
6、HTTPS在浏览器显示绿色安全锁,HTTP没有显示;

HTTP请求的方法:
HTTP/1.1协议中共定义了八种方法(有时也叫“动作”),来表明Request-URL指定的资源不同的操作方式
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法

Restful 更简洁,更有层次,更易于实现缓存等机制。
1、每一个URI代表1种资源;
2、客户端使用GET、POST、PUT、DELETE4个表示操作方式的动词对服务端资源进行操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源;
3、通过操作资源的表现形式来操作资源;
4、资源的表现形式是XML或者HTML;
5、客户端与服务端之间的交互在请求之间是无状态的,从客户端到服务端的每个请求都必须包含理解请求所必需的信息。 [1]

Mysql
事务:把一组密不可分的操作系列集合在一起,这些操作要么全部执行,要么全部不执行。
1.原子性:事务是内的操作是一个整体,是不可分割的。
2.一致性:同一个事务,多次读取数据库中的同一个数据,读取的内容应该是一致的,不变的。
3.隔离性:不同事务之间相互独立,互不干扰。
4.持久性:事务提交后,事务内的操作对数据库的修改被永久保存在数据库文件中。

mysql索引
无索引:从头到尾扫描一遍,所以查询速度很慢
有索引:
不使用磁盘临时表,减少了存储引擎需要扫描的数据量,加快查询速度
B+树的存储结构,通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,
没有用索引的时候,需要遍历双向链表来定位对应的页,而有了索引,则可以通过一层层“目录”定位到对应的页上。
也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。

B+ Tree 索引会降低新增、修改、删除的速度,改变了原有数据结构。

索引分类
1.普通索引index :加速查找
2.唯一索引
主键索引:primary key :加速查找+约束(不为空且唯一)
唯一索引:unique:加速查找+约束 (唯一)
3.联合索引
-primary key(id,name):联合主键索引
-unique(id,name):联合唯一索引
-index(id,name):联合普通索引
1.添加PRIMARY KEY(主键索引) mysql>ALTER TABLE table_name ADD PRIMARY KEY ( column )
2.添加UNIQUE(唯一索引) mysql>ALTER TABLE table_name ADD UNIQUE ( column )
3.添加INDEX(普通索引) mysql>ALTER TABLE table_name ADD INDEX index_name ( column )
4.添加FULLTEXT(全文索引) mysql>ALTER TABLE table_name ADD FULLTEXT ( column)
5.添加多列索引 mysql>ALTER TABLE table_name ADD INDEX index_name ( column1, column2, column3 )

mysql锁
全局锁
加全局读锁的方法,命令是Flush tables with read lock。当需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞
表级锁
表锁的语法是lock tables … read/write。可以用unlock tables主动释放锁,也可以在客户端断开的时候自动释放。lock tables语法除了会限制别的线程的读写外,也限定了本线程接下来的操作对象
行锁
行锁就是针对数据表中行记录的锁。比如事务A更新了一行,而这时候事务B也要更新同一行,则必须等事务A的操作完成后才能进行更新
死锁
在并发系统中不同线程出现循环资源依赖,涉及的线程都在等待别的线程释放资源时,就会导致这几个线程都进入无限等待的状态,称为死锁
当出现死锁以后,有两种策略:
一种策略是,直接进入等待,直到超时。这个超时时间可以通过参数innodb_lock_wait_timeout来设置
另一种策略是,发起死锁检测,发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务得以继续执行。将参数innodb_deadlock_detect设置为on,表示开启这个逻辑
主动死锁监测在发生死锁的时候,是能够快速发现并进行处理的,但是它有额外性能负担的。每当一个事务被锁的时候,就要看看它所依赖的线程有没有被别人锁住,如此循环,最后判断是否出现了循环等待,也就是死锁

慢查询
1.避免全表扫描,
2、应考虑在 where 及 order by 涉及的列上建立索引。
3. where 子句中使用!=或<>操作符,放弃了使用索引,进行了全表扫描。
4、避免where is null,设置默认值
5、避免使用 or 、in、like
6/索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,

InnoDB 支持事务,支持外键,是聚集索引,索引数据存一起。支持行级锁,高并发。批量执行。

为主键时,count(主键)最快
非主键时, count(1)最快》 count()
如果只有1个字段,count(
)最快
count(1)和count(*)返回全部行数, count(字段)去除null的

外键的默认作用有两点:
  1.对子表的作用:子表在进行写操作的时候,如果外键字段在父表中找不到对应的匹配,操作就会失败。
  2.对父表的作用:对父表的主键字段进行删和改时,如果对应的主键在子表中被引用,操作就会失败。
外键的定制作用----三种约束模式:
   district:严格模式(默认), 父表不能删除或更新一个被子表引用的记录。
   cascade:级联模式, 父表操作后,子表关联的数据也跟着一起操作。
   set null:置空模式,前提外键字段允许为NLL, 父表操作后,子表对应的字段被置空。
使用外键的前提:
1. 表储存引擎必须是innodb,否则创建的外键无约束效果。
2. 外键的列类型必须与父表的主键类型完全一致。
3. 外键的名字不能重复。
4. 已经存在数据的字段被设为外键时,必须保证字段中的数据与父表的主键数据对应起来。

ES
ES是一个分布式文档数据库,其中每个字段均可被索引,而且每个字段的数据均可被搜索,在极短的时间内存储、搜索和分析大量的数据。通常作为具有复杂搜索场景情况下的核心发动机。
ES是、不支持事务
存储和读取方式: Gateway,代表ES索引的持久化存储方式。ES默认先把索引存储在内存中,然后当内存满的时候,再持久化到Gateway里。当ES集群关闭或重启的时候,它就会从Gateway里去读取索引数据。
原理: 搜索的时候,要依靠倒排索引;排序的时候,需要依靠正排索引

拥有灵活的结构。文档不依赖于预先定义的模式。是层次型的。ES中,每个文档,其实是以json形式存储的
索引(Index) ES将数据存储于一个或多个索引中,索引是具有类似特性的文档的集合。 索引由其名称(必须为全小写字符)进行标识,并通过引用此名称完成文档的创建、搜索、更新及删除操作。一个ES集群中可以按需创建任意数目的索引。
类型(Type) 类型是索引内部的逻辑分区 一个索引内部可定义一个或多个类型(type)。一般来说,类型就是为那些拥有相同的域的文档做的预定义。
分片(Shard)一个索引中的数据保存在多个分片中,相当于水平分表。一个分片便是一个Lucene 的实例,它本身就是一个完整的搜索引擎。我们的文档被存储和索引到分片内,但是应用程序是直接与索引而不是与分片进行交互
节点(Node) 一个运行中的 Elasticsearch 实例称为一个节点,而集群是由一个或者多个拥有相同cluster.name配置的节点组成, 它们共同承担数据和负载的压力。
cluster:包含一个或多个拥有相同集群名称的 node,其中包含一个master node。

term 精确查找 查询一个字段
terms 精确查找 查询多个字段, 数组

match_phrase 模糊查找 包含词的全部。
match 模糊查找,分词查找。 包含词的任何一个字

Redis
是一种非关系型持久化数据库,Key-value类型 ---- 缓存,热数据
数据类型多 - 支持Strings、Lists类型(有序)Sets类型(无序)完成排序(SORT)
性能极高 – Redis能支持超过 100K+ 每秒的读写频率。 因为存储在内存中,数据结构简单,所以快。
原子性 - 所有操作都是原子性的
R目前还只能作为小数据量存储(全部数据能够加载在内存中) ,海量数据存储方面并不是redis所擅长的领域
对于Redis,半支持事务,语法错误会回滚,而运行错误则不会
查询比较多的,且数据不是变化频繁的。先查redis,再查数据库,缓解数据库查询压力。
可以允许丢失的数据都可以使用redis做存储方案,例如session、缓存、队列数据、临时中专数据、等等

mongodb
是一个面向文档的NoSQL数据库 mongodb对海量数据的访问效率提升,提供数据分析。 ------ 文档结构存储,热数据
MongoDB不支持事务操作,多线程读写出错
MongoDB占用空间过大
易扩展 - 去掉了关系型数据库的关系型特性
灵活的数据模型 - 不需要为事先存储的数据建立字段
大数据 - 具有非常高的读写性能

查看当前数据库: db
查看所有的数据库: show dbs 或者 show databases
切换数据库: use db_name
删除当前数据库:db.dropDatabase()
db.createCollection(name,options) ,
db.stu.insert({name:‘gj’,gender:1})
db.集合名称.save(document)
db.集合名称.find()
db.集合名称.update( ,{multi: })

RabbitMQ
是一个实现了高级消息队列协议(AMQP)的开源消息中间件.低延迟和高可靠性
broker:消息中间件处理节点,每个节点运行的服务程序,功能为维护该节点的队列的增删以及转发队列操作请求。
以broke为中心,采用推push,需要确认。
负载均衡需要单独的loadbalancer进行支持。
master queue:每个队列都分为一个主队列和若干个镜像队列。
mirror queue:镜像队列,作为master queue的备份。
在master queue所在节点挂掉之后,系统把mirror queue提升为master queue,负责处理客户端队列操作请求。注意,mirror queue只做镜像,设计目的不是为了承担客户端读写压力。
优点:
消息实时性比较高 对于消费者来说,消息一旦到达mq,mq会立即推送给消费者

不足:
1.消息量比较大时,对消费者性能要求比较高;由于master queue单节点,若消费者机器资源有限,可能会导致压力过载,引发宕机的情况。
2.对消费者可用性要求比较高:当消费者不可用时,会导致很push失败,在mq方需要考虑至少推送成功一次,这块的设计下章节会做说明。

Kafka
是一种高吞吐量的分布式发布订阅消息系统
具有高性能、持久化、多副本备份、横向扩展能力、高吞吐量
以Consumer为中心,采用拉pull,无确认
负载均衡搭配zk,对broke和consumer管理
Producer 消息生产者,向Broker发送消息的客户端
Consumer 消息消费者,从Broker读取消息的客户端
一个Kafka 集群包括很多Broker 消息中间件处理节点,一个Kafka节点就是一个broker
Topic 主题,Kafka根据topic对消息进行归类,发布到Kafka集群的每条消息都需要指定一个topic
Zookeeper:kafka集群依赖zookeeper来保存集群的的元信息,来保证系统的可用性。
持久化消息 7天过期。非持久化消息最多4次。

zk - zookeeper
分布式协调服务中间件,文件系统+监听通知机制。 特点:消息广播,崩溃恢复 ,主从选举,watch监听
能提供服务注册、配置管理、容灾备份功能,主leader 从follow管理
主要是它的树形节点来实现的。当有数据变化的时候或者节点过期的时候,会通过事件触发通知对应的客户端数据变化了,然后客户端再请求zk获取最新数据,采用push-pull来做数据更新。
消息广播:集群中zk在数据更新的时候,通过leader节点将将消息广播给其他follower节点,采用简单的两阶段提交模式,先request->ack->commit,当超过一半的follower节点响应可以提交就更新代码。
崩溃恢复:当leader挂了,或者超半数follower投票得出leader不可用,那么会重新选举,这段期间zk服务是不可用的。通过最新的 xid来选举出新的leader,选举出来后需要将新的leader中的数据更新给超过半数的follower节点才能对外提供服务。

分布式
一个业务分拆多个子业务,部署在不同的服务器上。

TestNg https://blog.youkuaiyun.com/df0128/article/details/83243822
配置TestNG.xml 设置某些文件执行 ?
@setup @Test @teardown
@BeforeGroups @AfterGroups
@BeforeSuite @AfterSuite
@BeforeClass @AfterClass
@BeforeTest @AfterTest
@DataProvider 数据驱动, 二维数组 Object [] [] 或 Iterator<Object[]>

@Test(enabled = false) 忽略这个case不执行
@Test(timeOut = 5000) 性能测试 超时失败
@Test(groups=“group2”) 此用例归属某个组 可以有多个 @Test(groups = {“mysql”,“database”})
@Test(dependsOnMethods= {“TestNgLearn1”}, alwaysRun=true) 依赖某个方法 dependsOnGroups

顺序
@BeforeSuite->@BeforeTest->@BeforeClass->{@BeforeMethod->@Test->@AfterMethod}->@AfterClass->@AfterTest->@AfterSuite

testNG的参数化测试有两种方式:xml和dataprovider
使用参数
1 注解,然后xml中读取参数

@Test(enabled=true)
@Parameters({“param1”, “param2”})

2 @DataProvider使用参数
@DataProvider(name = “xx”)
@Test(dataProvider = “xx”)

TestNG.xml文件

<?xml version="1.0" encoding="UTF-8"?>
    报告名称        命令行输出详细程度     串行并行 none           parallel为并行才有用

parallel = tests,
TestNG 会在相同的线程中运行相同标记下的所有方法, 但每个下的方法会运行在不同的线程下。
应用:可以将非线程安全的类放在同一个标签下,并且使其可以利用TestNG多线程的特性的同时,让这些类运行在相同的线程中。

parallel = methods
TestNG 会在不同的线程中运行测试方法,除非那些互相依赖的方法。那些相互依赖的方法会运行在同一个线程中,并且遵照其执行顺序。

parallel = classes
TestNG 会在相同线程中相同类中的运行所有的方法,但是每个类都会用不同的线程运行
包含
不包含

suite中类执行顺序, preserve-order=true时,按照顺序执行。
preserve-order=false时,按照字母的哈希值执行
同一类中多个方法执行顺序,是按照方法名的首字母升序排序执行的,也可以使用priority指定执行顺序(默认值为0),数值越小,越靠前执行

获取class名:
Thread.currentThread().getStackTrace()[1].getClassName();
获取方法名:
Thread.currentThread().getStackTrace()[1].getMethodName();
获取行号:
Thread.currentThread().getStackTrace()[1].getLineNumber();
获取文件名(带后缀):
Thread.currentThread().getStackTrace()[1].getFileName();

测试环境查看
kubectl get pod -n citest| grep kic-crm-commercial

查看具体容器日志
kubectl logs -n citest --tail=200 -f

简便命令 写到 ~/.bash_profile这个文件中
kp 查pod kl+服务器 查日志
aliap kp=“kubectl get pods -n citest|grep kic-crm-”
alias kl="kubectl logs -n citest --tail=200 -f "

Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。

Kubernetes k8s是Google开源的一个容器编排引擎
它支持自动化部署、可弹性运行、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。
在Kubernetes中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,
实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。

xxl XXL-JOB
是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。
xxl-job环境依赖于mysql,不用ZooKeeper,与SpringBoot有非常好的集成.
对于企业维护起来成本不高,还有失败的邮件告警

QPS
QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,单位时间处理流量的能力
服务系统一定时间内接收客户端请求的一个并发处理能力。

原理:每天80%的访问集中在20%的时间里,这20%时间叫做峰值时间
公式:( 总PV数 * 80% ) / ( 每天秒数 * 20% ) = 峰值时间每秒请求数(QPS)
机器:峰值时间每秒QPS / 单台机器的QPS = 需要的机器
问:每天300w PV 的在单台机器上,这台机器需要多少QPS?
答:( 3000000 * 0.8 ) / (86400 * 0.2 ) = 139 (QPS)
问:如果一台机器的QPS是58,需要几台机器来支持?
答:139 / 58 = 3

TPS 每秒传输的事物处理个数 单位时间处理事务的能力
TPS是对服务系统请求的响应能力。测试人员会主动按一定tps的量来主动发起接口请求,比如tps=50,就是每秒请求50次,获取一个平均的响应时间(单位一般都是毫秒ms)。
压力测试人员口中的TPS50 200ms返回,就是指每秒测试人员主动发起50次请求,这些请求会在平均200ms返回。

1、这个服务,在多长时间段,多少人会访问
2、页面的渲染时间+资源文件的载入时间+接口的获取时间需要保证1s~2s内完成。
页面访问的2、5、8原理(用户进入服务2s内要展示完所有内容,超过5秒用户就无法忍受了,超过8秒就没有人再等了,直接关闭服务)
3、接口获取时间 200ms以内(考虑到你页面也要2s打开,还要给其他工作留时间)

总请求数 = 用户数2w * 请求数 2次 = 4w
每秒要求处理的请求数=总请求数/时间(120秒) 即约350

接口幂等
通俗的说就是一个接口, 多次发起同一个请求, 必须保证操作只能执行一次,比如:
订单接口, 不能多次创建订单
支付接口, 重复支付同一笔订单只能扣一次钱
支付回调接口, 可能会多次回调, 必须处理重复回调
普通表单提交接口, 因为网络超时等原因多次点击提交, 只能成功一次

悲观锁
这是一种对数据的修改持有悲观态度的并发控制方式。总是假设最坏的情况,
每次读取数据的时候都默认其他线程会更改数据,因此需要进行加锁操作,当其他线程想要访问数据时,都需要阻塞挂起。
select … for update (写锁、排它锁)

乐观锁
假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,
如果发现冲突了,则返回给用户错误的信息,让用户决定如何去做。乐观锁适用于读操作多的场景,这样可以提高程序的吞吐量。
select * from user where id = 123

网关
网关是作为一个 API 架构,用来保护、增强和控制对于 API 服务的访问。
API 网关是一个处于应用程序或服务(提供 REST API 接口服务)之前的系统,用来管理授权、访问控制和流量限制等,
这样 REST API 接口服务就被 API 网关保护起来,对所有的调用者透明。因此,隐藏在 API 网关后面的业务系统就可以专注于创建和管理服务,
而不用去处理这些策略性的基础设施。

CDN
内容分发网络(Content Delivery Network,简称CDN)是建立并覆盖在承载网之上,由分布在不同区域的边缘节点服务器群组成的分布式网络。
假设通过CDN加速的域名为www.a.com,接入CDN网络,开始使用加速服务后,
当终端用户(北京)发起HTTP请求时,处理流程如下:
当终端用户(北京)向www.a.com下的指定资源发起请求时,首先向LDNS(本地DNS)发起域名解析请求。
LDNS检查缓存中是否有www.a.com的IP地址记录。如果有,则直接返回给终端用户;如果没有,则向授权DNS查询。
当授权DNS解析www.a.com时,返回域名CNAME www.a.tbcdn.com对应IP地址。
域名解析请求发送至阿里云DNS调度系统,并为请求分配最佳节点IP地址。
LDNS获取DNS返回的解析IP地址。
用户获取解析IP地址。
用户向获取的IP地址发起对该资源的访问请求。
如果该IP地址对应的节点已缓存该资源,则会将数据直接返回给用户,例如,图中步骤7和8,请求结束。
如果该IP地址对应的节点未缓存该资源,则节点向源站发起对该资源的请求。获取资源后,结合用户自定义配置的缓存策略,将资源缓存至节点,例如,图中的北京节点,并返回给用户,请求结束。

(1)CDN的加速资源是跟域名绑定的。
(2)通过域名访问资源,首先是通过DNS分查找离用户最近的CDN节点(边缘服务器)的IP
(3)通过IP访问实际资源时,如果CDN上并没有缓存资源,则会到源站请求资源,并缓存到CDN节点上,这样,用户下一次访问时,该CDN节点就会有对应资源的缓存了。

DDL (Data Definition Language 数据库定义语言): 用于定于数据库的三级结构,包括外模式、概念模式、内模式及相互之间的映像,定义数据的完整性、安全控制等约束。DDL不需要commit。
DDL包括:CREATE、ALTER、DROP、TRUNCATE、COMMENT、RENAME

DML (Data Manipulation Language 数据操作语言): 分为交互型DML和嵌入型DML,需要commit。
DML包括:INSERT、UPDATE、DELETE、MERGE、CALL、EXPLAIN PLAN、LOCK TABLE

DCL (Data Control Language 数据库控制语言): 用于授权、角色控制
DCL包括:GRANT授权、REVOKE取消授权

TCL (Transaction Control Language 事务控制语言): 事务操作
TCL包括:SAVEPOINT事务中设置保存点可用于回滚、ROLLBACK回滚、SET TRANSACTION改变事务、COMMIT保存完成的工作

进程是资源分配最小单位,线程是程序执行的最小单位,在执行程序时,实际上是执行相应的一系列线程。
进程有自己独立的地址空间,每启动一个进程,系统都会为其分配地址空间,线程没有独立的地址空间,同一进程的线程共享本进程的地址空间。
进程之间的资源是独立的;同一进程内的线程共享本进程的资源。
进程可以独立运行,线程不能独立执行
进程执行开销大,线程执行开销小。

线程
1、继承Thread类,重写run方法,创建子类对象,调用start方法
2、new Thread(new Runable).start
3、new Thread(FutureTask.Callable接口) 对象.get()

ExecutorService线程池
a. 重用存在的线程,减少线程对象创建、消亡的开销,性能更好。
b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。
c. 提供定时执行、定期执行、单线程、并发数控制等功能。

核心线程数,总线程数
ThreadPoolExecutor(int corePoolSize, // 1 核心线程池大小
int maximumPoolSize, // 2 最大线程池大小
long keepAliveTime, // 3 线程最大空闲时间
TimeUnit unit, // 4 时间单位
BlockingQueue workQueue, // 5 线程等待队列
ThreadFactory threadFactory, // 6 线程创建工厂
RejectedExecutionHandler handler ) { //7 拒绝策略
等待队列
BlockingQueue是双缓冲队列。BlockingQueue内部使用两条队列,允许两个线程同时向队列一个存储,一个取出操作。在保证并发安全的同时,提高了队列的存取效率。
ArrayBlockingQueue(int i):规定大小的BlockingQueue,其构造必须指定大小。其所含的对象是FIFO顺序排序的。
LinkedBlockingQueue()或者(int i):大小不固定的BlockingQueue,若其构造时指定大小,生成的BlockingQueue有大小限制,不指定大小,其大小有Integer.MAX_VALUE来决定。其所含的对象是FIFO顺序排序的。
PriorityBlockingQueue()或者(int i):类似于LinkedBlockingQueue,但是其所含对象的排序不是FIFO,而是依据对象的自然顺序或者构造函数的Comparator决定。
SynchronizedQueue():特殊的BlockingQueue,对其的操作必须是放和取交替完成。

拒绝策略
AbortPolicy 默认 丢掉这个任务并且抛出RejectedExecutionException异常
DiscardPolicy 直接丢掉这个任务并且不会有任何异常
DiscardOldestPolicy 丢弃最老的。
CallerRunsPolicy 添加到线程池失败,那么主线程会自己去执行该任务,不会等待线程池中的线程去执行

自定义 只要实现RejectedExecutionHandler接口

//可缓存线程池
ExecutorService ThreadPool1 = Executors.newCachedThreadPool();
//可重用固定个数的线程池
ExecutorService ThreadPool2 = Executors.newFixedThreadPool(2);
//定长线程池 支持定时及周期性任务执行——延迟执行
ScheduledExecutorService ThreadPool4 = Executors.newScheduledThreadPool(5);
//延迟1s,每3s执行1次
ThreadPool4.scheduleAtFixedRate(new Runnable() {
public void run() {
System.out.println(“延迟1秒后每3秒执行一次”);
}
}, 1, 3, TimeUnit.SECONDS);

//单线程化的线程池
ExecutorService ThreadPool5 = Executors.newSingleThreadExecutor();
ThreadPool5.execute

adb start-server 启动adb服务
adb kill-server 杀掉进程
adb devices 查看当前连接的设备
adb version 查看版本
adb get-serialno 获取手机的序列号
adb shell wm size 查看手机屏幕分辨率
adb shell cat /proc/cpuinfo 显示手机的cpu信息
adb shell pm list packages 显示手机里面所有应用的包名
adb shell am start -n package_name/activity_name 通过ADB命令来启动应用

性能测试的目的
评估系统的能力----测试中得到的负荷和响应时间数据可被用于验证所计划的模型的能力,并帮助作出决策。
识别体系中的弱点----受控的负荷被增加到一个极端水平,并突破它,从而修复体系的瓶颈或薄弱的地方。
系统调优—重复运行测试,验证调整系统的活动得到了预期的结果,从而改进性能。
验证稳定性,可靠性—在一个生产负荷下执行测试一定的时间是评估系统稳定性和可靠性是否满足要求的唯一方法。

前后端通信流程
1、app客户端(浏览器)发起请求
2、nginx收到请求,然后转发给后端服务
3、后端某个服务节点收到请求,处理请求,返回给nginx
4、nginx收到回复返回给客户端(app 或者浏览器)

服务器的日志的文件,每个月生成一个日志文件,
例如:log_202003.txt,记录的内容如下: 时间戳 \t 登录人 \t 登录IP \t
操作 20200301 08:05:01\tzhangsan\t100.1.1.1\tip route show
统计一下上一天的登录次数最多的用户,输出该用户当天的所有操作?

JVM内存区域
1、JAVA堆:new出来的对象或者数组,内存垃圾回收的部分
2、JAVA栈:基本类型的变量和变量的引用。
3、方法区:用于存储已经被JVM加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
4、常量池: 方法区的一部分,存储常量信息,例如字符串常量
5、本地方法栈: 主要为native方法运行提供内存环境
6、程序计数器:当前线程执行字节码的行号指示器,线程私有
7、直接内存:并不是JVM运行时数据区的一部分, 可直接访问的内存, 比如NIO会用到这部分。

所以除了程序计数器不会抛出OOM外,其他各个内存区域都可能会抛出OOM。

OOM
java.lang.OutOfMemoryError
JVM因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出. 这个问题已经严重到不足以被应用处理

具体原因大致为两方面:
自身原因:比如虚拟机本身可使用的内存太少。
外在原因:如应用使用的太多,且用完没释放,浪费了内存。此时就会造成内存泄露或者内存溢出。

内存泄露:申请使用完的内存没有释放,导致虚拟机不能再次使用该内存,此时这段内存就泄露了,因为申请者不用了,而又不能被虚拟机分配给别人用。
内存溢出:申请的内存超出了JVM能提供的内存大小,此时称之为溢出。

常见OOM情况:

  1. java.lang.OutOfMemoryError: Java heap space ------>java堆内存溢出,
    此种情况最常见,一般由于内存泄露或者堆的大小设置不当引起。对于内存泄露,需要通过内存监控软件查找程序中的泄露代码,而堆大小可以通过虚拟机参数-Xms,-Xmx等修改。

  2. java.lang.OutOfMemoryError: PermGen space ------>java方法区溢出
    一般出现于大量Class或者jsp页面,或者采用cglib等反射机制的情况,因为上述情况会产生大量的Class信息存储于方法区。
    当出现此种情况时可以通过更改方法区的大小来解决,使用类似-XX:PermSize=64m -XX:MaxPermSize=256m的形式修改。注意,过多的常量尤其是字符串也会导致方法区溢出。

  3. java.lang.StackOverflowError ------> 不会抛OOM errorJAVA虚拟机栈溢出。
    一般是由于程序中存在死循环或者深度递归调用造成的,栈大小设置太小也会出现此种溢出。可以通过虚拟机参数-Xss来设置栈的大小。

linux命令
ls命令
list的缩写,通过ls 命令不仅可以查看linux文件夹包含的文件,而且可以查看文件权限(包括目录、文件夹、文件权限)查看目录信息等等

ls -l 查看权限。 w写4 r读2 x执行1

cd命令
(changeDirectory) 说明:切换当前目录至dirName
进入根目录 cd /
进入home目录 cd ~
回退到上一级目录 cd …
进入相对路径子目录 cd ./xxx
进入上一次目录 cd -

pwd命令
查看当前工作目录路径

mkdir命令
make directory 创建文件夹

rm命令
rm -i 删文件,在删除前需要确认
rm -f, 删文件,强制删除。忽略不存在的文件,不提示确认
rm -r, 删除目录及其内容
rm -rf 强制删除目录
-f不是即使文件属性为只读也能删除,-r就可以删除目录以及其下所有文件了,
为了防止有保护文件而无法删除所以才用-rf组合

rmdir命令
删除空文件夹

mv命令
移动文件或修改文件名
mv a.txt test 把a移动到test中
mv dir1 dir2 移动dir1到dir2中
mv a.txt b.txt 把a的名字改成b
mv -i a.txt b.txt 把a的名字改成b 如果b已经存在,给出询问

cp命令
将源文件复制至目标文件,或将多个源文件复制至目标目录。

cat命令
一次显示整个文件:cat file
显示行号查看 cat -n file
把a和b文件加上行号扔到c cat -b a.log b.log c.log

more命令
功能类似于cat, more会以一页一页的显示方便使用者逐页阅读
确定键 下一行
b键 上一页 space 下一页
q键 退出
more -5 test.log 每次显示5行
cat test.long | more -5 每次显示5行

less命令
less 与 more 类似
除此之外, 可以还可以利用上下键来卷动文件。当要结束浏览时,下按Q键即可。

head命令
head 用来显示档案的开头至标准输出中,默认head命令打印其相应文件的开头10行。
head -n 20 a.log 展示前20行

tail命令
用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件。
tail -n 5 查看最后5行
tail -f 循环读取日志文件 ctrl + c 退出

env命令
查看所有环境变量及对应值
查看当前PATH配置:echo $PATH

which命令
查看可执行文件的位置,是在PATH就是指定的路径中,搜索某个系统命令的位置,并返回第一个搜索结果。
which ls
which which
which cd(显示不存在,因为cd是内建命令,而which查找显示是PATH中的命令)

whereis命令
只能用于程序名的搜索,而且只搜索
二进制文件(参数-b)、
man说明文件(参数-m)
源代码文件(参数-s)。
whereis monitor.log

whereis及locate都是基于系统内建的数据库进行搜索,因此效率很高,而find则是遍历硬盘查找文件。

find命令
用于在文件树中查找文件,并作出相应的处理
find 路径 -name 要求
在当前目录查找 以.log结尾的文件。 find . -name ‘.log’
查看对应规则文件 1ab.log/1abc.log find . -name '[0-9][a-z].log’
查找.目录下 权限为 777的文件 find . -perm 777
查找48小时内修改过的文件 find -atime -2
查找大于1K的文件 find -size +1000c

grep命令
grep(Global Regular Expression Print)全局正则表达式搜索
grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。
grep ‘hello’ a.txt hello/ helloworld

grep -i pattern files :不区分大小写地搜索。默认情况区分大小写,
grep -i ‘hello’ a.txt hello/ HEllo/HELLO

grep -w pattern files :只匹配整个单词,而不是字符串的一部分 如匹配‘magic’,而不是‘magical’
grep -w ‘hello’ a.txt hello

grep pattern1 | pattern2 files :显示匹配 pattern1 或 pattern2 的行,
grep pattern1 files | grep pattern2 :显示既匹配 pattern1 又匹配 pattern2 的行。

以下为正则表达式部分规则

grep ‘^he’ 查找he开头的
grep ‘llo’ 查看llo结尾的 grep '^he…llo

查看llo结尾的grep
′h
e…llo’ 查看he开头,然后2个字符,llo结尾的字符串
但是 grep 只能识别一些简单的正则,深入的扩展正则表达式不允许使用,例如+/{5,}
此时一定要换成egrep命令使用
egrep ‘^ [a-z]{5,}$’ 查找至少5个小写字母的字符串

 ^  #锚定行的开始 如:'^grep'匹配所有以grep开头的行。   
 $  #锚定行的结束 如:'grep$'匹配所有以grep结尾的行。   
 .  #匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。   
 *  #匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。   
 .*   #一起用代表任意字符。  
 []   #匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。   
 [^]  #匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。   
 \(..\)  #标记匹配字符,如'\(love\)',love被标记为1。   
 \<      #锚定单词的开始,如:'\<grep'匹配包含以grep开头的单词的行。   
 \>      #锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。   
 x\{m\}  #重复字符x,m次,如:'0\{5\}'匹配包含5个o的行。   
 x\{m,\}  #重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。   
 x\{m,n\}  #重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。  
 \w    #匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。  
 \W    #\w的反置形式,匹配一个或多个非单词字符,如点号句号等。  
 \b    #单词锁定符,如: '\bgrep\b'只匹配grep。

grep -A 5 foo file 显示foo及后5行
grep -B 5 foo file 显示foo及前5行
grep -C 5 foo file 显示file文件里匹配foo字串那行以及上下5行

chmod命令
用于改变linux系统文件或目录的访问权限。用它控制文件或目录的访问权限。该命令有两种用法。一种是包含字母和操作符表达式的文字设定法;另一种是包含数字的数字设定法。
权限范围:
u :当前的用户
g :当前用户的群组
o :除了当前用户之外的用户
a :所有的用户及群组
权限代号:
r :读权限,用数字4表示
w :写权限,用数字2表示
x :执行权限,用数字1表示
- :删除权限,用数字0表示
s :特殊权限
参数
-c 当发生改变时,报告处理信息
-R 处理指定目录以及其子目录下所有文件

(增加)文件t.log所有用户可执行权限 chmod a+x t.log
使拥有者(只有)可读权限,并输出处理信息 chmod u=r t.log -c
给file的user=分配读、写、执行(7)的权限,group=分配读、执行(5)的权限,给others=分配执行(1)的权限 chmod 751 t.log -c 或 chmod u=rwx,g=rx,o=x t.log -c
将test目录及其子目录所有文件添加可读权限 chmod u+r,g+r,o+r -R text/

tar命令
打包功能,用来压缩和解压文件
tar本身不具有压缩功能,有关压缩及解压是调用其它的功能来完成。

压缩 tar -cvf tar名 文件 tar -cvf log.tar 1.log,2.log
解压 tar -xvf /tmp/etc.tar

压缩成gz文件 tar -czvf hello.tar.gz
解压gz文件 tar -zxvf hello.tar.gz

chown命令
chown将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID;组可以是组名或者组ID;文件是以空格分开的要改变权限的文件列表,支持通配符

-c 显示更改的部分的信息
-R 处理指定目录及子目录

要修改文件hh.c的所有者.修改为sakia的这个用户所有

chown sakia hh.c
将目录 /tmp/sco 这个目录的所有者和组改为sakia和组net

chown -R sakia:net /tmp/sco
df命令
显示磁盘空间使用情况。获取硬盘被占用了多少空间,目前还剩下多少空间等信息,如果没有文件名被指定,则所有当前被挂载的文件系统的可用空间将被显示。默认情况下,磁盘空间将以 1KB 为单位进行显示
-a 全部文件系统列表
-h 以方便阅读的方式显示信息
-i 显示inode信息
-k 区块为1024字节
-l 只显示本地磁盘
-T 列出文件系统类型

显示磁盘使用情况 df -h
以易读方式列出所有文件系统及其类型 df -haT
du命令
是对目录磁盘使用的空间的查看

显示文件夹内大小 du -h scf/
以易读方式显示文件夹及子文件夹文件大小 du -ah scf/

top命令
动态连续显示当前系统正在执行的进程的相关信息,包括进程ID、内存占用率、CPU占用率等

查找端口号的使用
lsof -nP -iTCP -sTCP:LISTEN
lsof -i :9999

top命令
top查看进程和cpu占用

kill命令
发送指定的信号到相应进程。不指定型号将发送SIGTERM(15)终止指定进程。如果任无法终止该程序可用“-KILL” 参数,其发送的信号为SIGKILL(9) ,将强制结束进程,使用ps命令或者jobs 命令可以查看进程号。root用户将影响用户的进程,非root用户只能影响自己的进程。

先使用ps查找进程pro1,然后用kill杀掉
kill -9 $(ps -ef | grep pro1)
kill -9 pid

查看linux下面的端口号
netstat -anp tcp、udp、net|grep 端口号

ps命令
ps(process status),用来查看当前运行的进程状态,一次性查看,如果需要动态连续结果使用top
ps -ef|grep 相应的进程名称
显示当前所有进程 ps -A

查询指定进程的PID
ps -ef | grep zookeeper

使用ps查询指定进程名或者PID的占用情况
ps -aux | grep zookeeper
ps -aux | grep 2181

查看更详细的内存占比
cat /proc/10997/status

free -h 适于可读方式显示内存信息

面试相关

一面(60分钟)
1、自我介绍
2、项目相关知识(什么是过拟合,过拟合怎么办,什么是CNN)
3、算法题(微信发红包,随机产生金额)
4、测试用例(水瓶)
5、http 响应状态码
6、http为什么需要四次挥手
7、问数据库如何提高搜索效率(答数据库索引,问还有什么)
8、问海量数据怎么存
9、一道sql题(有关学生成绩表)

二面( 60分钟)
1、深挖项目,问的真的很细
2、为什么做测试
3、你认为测试的工作是什么
4、你认为测试工作中最重要的是什么
5、算法题(合并排序链表)
6、算法题(滑动窗口的最大值)
7、python的中的字符串编码
8、unicode和utf-8的区别
9、平时怎么优化代码(提示考虑CPU聚集型和非CPU聚集性)
10、给定一个数组,由0~9组成,个数不限,如何进行数组压缩
11、进程和线程的关系
12、说说线程间通信
13、堆排序的原理
14、python如何实现多进程
15、测试用例(刷视频刷不出来)

三面(60分钟)
1、还是深挖项目
2、讲一讲实习经历,自己的角色
3、实习的时候有没有收到测试的反馈bug,如何解决(实习偏算法开发)
4、实习的时候如何安排工作进度(不能按时完成怎么办)
5、测试用例(微信发红包)(不断引导着捋思路,一共说了三面)
6、针对微信发红包,给你三个bug等级,如何分等级
7、python装饰器
8、redis和mysql
9、优点和缺点
10、最优压力的事情,如何处理
11、职业规划


业务
之前公司业务
项目排期3周,要压缩到2周,测试可以做哪些来保证上线
微信红包用例
水瓶用例
水笔用例

其他能力
http 响应状态码
前后端通信流程
QPS和TPS
性能测试的目的
HTTPS和HTTP的区别是什么
TCP三次握手过程和四次挥手
Git常用命令
Kafka、RabbitMQ、mongodb、Redis、ES
testng注解顺序
拦截器 获取class名,方法名
suite中方法执行顺序
同一类中多个方法执行顺序
testng注解顺序
testng文件决定线程执行方式的属性=parallel
@DataProvider2种数据传输方式
linux命令

java
悲观锁和乐观锁
i++和 ++i
方法重载和方法重写
static关键字
==和equals
垃圾回收机制 System.gc()
编译时期异常和运行时期异常,处理方式
集合
OOM

数据库
mysql和其他nosql区别
Mysql四大特性
索引为什么快

微信红包用例
功能测试
发给单个好友
金额
值正确、错误 留言有、无 表情有、无
边界值
内容限制
金额修改
留言
内容限制
长度和内容
复制粘贴
内容修改
表情
自己的表情包
diy表情
微信的表情库
塞钱
零钱
银行卡
新卡
添加银行卡功能
红包金额大于 小于 等于
指纹确认付款
密码确认付款
正确、错误
扣减金额
无人领取时
有人领取时
查看
退款
领取人
红包展示 金额、留言、表情
第一次点击
未领取再点击
正常领取
领取后点击
不领取退款
帮助中心
群红包
为拼手气红包时,群中每个人收到的金额随机,但加起来为红包的总金额。
为普通红包时,群中每个人收到的金额相同
红包个数(1-100):0,小数,中文、英文、特殊字符、表情或者他们的组合
1,2,
大于群成员人数
小于群成员人数
等于群成员人数
99,100,101,
红包没有被抢完时
首次点击该红包的人可以抢到一定金额的红包
不是首次点击该红包的人只能查看该红包的信息
红包抢完时,所有人只能查看该红包的信息。
在24小时后红包的金额被完全抢完
金额最多的人会显示为最佳手气(若有两个人取得红包的最大值时,则只有一个人会显示为最佳手气);
若没有被完全抢完,余额会退还到原账户
群中所有人均可以抢红包(包括自己),每个人最多只有一次抢该红包的机会
测试当红包个数使得每个红包分到钱小于0.01,即总金额为0.02,而红包个数为3时的情况

兼容性测试
1)苹果手机和安卓手机
2)苹果手机的不同版本
3)安卓手机不同的机型
4)不同分辨率

性能测试
1)打开红包的响应时间不能超过三秒,高并发场景下不能超过5秒
2)耗电量
3)消耗流量的多少
4)所占内存等
UI测试&易用性测试
1)界面的设计风格是否统一
2)界面中文字是否简洁,没有错别字
3)是否易操作,易学习,易理解
中断测试:
前后台切换,网络异常,低电量,断电,来电,短信等
网络测试
1)网络兼容性:2g/3g/4g,WiFi,热点,移动/联通/电信
2)无网测试
3)弱网:延时&丢包

水瓶用例
功能测试 装水、喝水
 1)检查水瓶在装少量水、半瓶水、装满水的情况下是否会漏水;
 2)检查水瓶在装少量水、半瓶水、装满水的情况下能否喝到水;
 3)在瓶盖拧紧不漏水的情况下,分别让成年男性、成年女性和小孩尝试拧开瓶盖,看是否成功;

外观测试 水瓶的大小、水瓶外观设计
 1)瓶子的高度、底座是否符合设计要求;
 2)瓶子的口径是否符合设计要求;
 3)瓶身上的字体颜色、大小是否符合设计要求,是否有错别字;
 4)瓶身上的纹路是否符合设计要求;
 5)瓶身上图标位置、间距是否符合设计要求;
 6)瓶子是否有异味;

性能测试 抗摔、抗压、抗高低温
1)将空瓶、半瓶水、满瓶水分别从不同的高度摔下来,看瓶子是否摔坏;
  2)成年人从各种角度按压空瓶,看瓶子是否漏水或破裂;
  3)将空瓶和半瓶水、满瓶水分别放置于冰箱、室内和太阳光下一段时间,观察瓶子是否漏水,瓶身是否破裂;

安全性测试 使用时是否会伤害到人、是否产生对人体有害物质
 1)用手去抚摸瓶身的内壁和外壁,是否感觉光滑舒适不刺手;
 2)用矿泉水瓶喝水,并转动瓶口,感受瓶口是否圆滑;
 3)空瓶长时间放置一段时间,看是否产生塑化剂或细菌;
 4)矿泉水瓶分别装满不同液体(水、碳酸饮料、果汁等),放置一段时间,看瓶身是否与液体之间发生化学反应,是否产生有毒物质或细菌;
 5)矿泉水瓶中装入热水(或放入微波炉),观察瓶子是否变形,是否有异味产生

易用性测试
 1)用手轻拿装满水的瓶子,看是否轻易掉落,是否有防滑措施;
 2)矿泉水瓶分别装入不同温度的水,用手感受瓶身温度,看是否会烫手;
 3)分别将水瓶放在手中、口袋、包包、车上等不同位置,看是否方便携带

兼容性测试
 1)瓶中分别装入碳酸饮料、果汁、咖啡、茶水等液体,方式一段时间后看是否变味;
 2)瓶中是否可以装入固体

水笔用例
功能性:
笔是不是能正常写出字
笔芯是否可以正常更换
是否可以正常关上笔帽
正放和倒放是不是会漏墨水
书写的线条是否均匀

性能:
一支笔正常可以使用多久

压力测试:
使劲用该笔写字是否会断裂
弹簧圆珠笔,如果以极快的速度按压弹簧,该笔是否会损坏

极限测试:
上述压力测试,加压到笔断了为止,获得极限指标。

容量测试:
一次性加满墨水后,该笔最多能画多长的直线?

安全性测试:
该笔从桌子上自由落体,是否会爆炸?
是否会爆墨水?
该笔从二十楼的高度落下呢?
该笔放在一定倾角的桌面上是否会滑落?

适配性测试:
该笔是否可以装入常规的笔袋里面?是否适合孩子和老人使用?左撇子呢?

兼容性测试:
该笔是否可以适应多种不同品牌的墨水
该笔是否可以在各种纸面上流利书写,墙面

易用性+用户体验:
该笔的颜色和图案是否美观、有没有毛刺、掉漆?
该笔的粗度如何,手感如何,握感如何?
用户在不经过任何教程说明的情况下,是否可以正确使用?
不同使用群体是否简单易用,好上手,比如老人、孩子、孕妇、盲人等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值