已上岸字节,整理一波测开面经_笔经面经_牛客网
http 和 https 的区别
- https 协议需要到 CA(Certificate Authority,证书颁发机构)申请证书,一般免费证书较少,因而需要一定费用。
- http 是超文本传输协议,信息是明文传输,https 则是具有安全性的 ssl 加密传输协议。
- http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。
- http 的连接很简单,是无状态的。Https 协议是由 SSL+Http 协议构建的可进行加密传输、身份认证的网络协议,比 http 协议安全。(无状态的意思是其数据包的发送、传输和接收都是相互独立的。无连接的意思是指通信双方都不长久的维持对方的任何信息。)
linux 命令,找出关键字出现的次数
- 语法:grep 字符串 文件名 | wc -l ,grep 输出,wc -l 按行统计
- 例子:
- 统计 task-hbase-transform.log 中 NullPointerException 出现的次数:
grep NullPointerException task-hbase-transform.log|wc -l
。 - 如果是多个字符串出现次数,可使用:
grep 'objStr1\|objStr2' filename|wc -l
#直接用 | 链接起来即可。
- 统计 task-hbase-transform.log 中 NullPointerException 出现的次数:
数据库查找,学生成绩单里两门成绩>80 的学生名字
浏览器中输入一个 URL 后,按下回车后发生了什么
-
浏览器查找域名的 IP 地址
2. 浏览器与目标服务器建立 TCP 连接
- http 协议建立在 tcp 协议之上,http 请求前,需先进行 tcp 连接,形成客户端到服务器的稳定的通道。俗称 TCP 的三次握手。
- tcp 连接完成后,http 请求开始,请求有多种方式,常见的有 get,post 等。
- http 请求包含请求头,也可能包含请求体两部分,请求头中包含我们希望对请求文件的操作的信息,请求体中包含传递给后台的参数。
- 服务器收到 http 请求后,后台开始工作,如负载平衡,跨域等,这里就是后端的工作了。
- 文件处理完毕,生成响应数据包,响应也包含两部分,响应头和相应体,响应体就是我们所请求的文件。
- 经过网络传输,文件被下载到本地客户端,客户端开始加载。
-
html 页面的解析与渲染
-
客户端浏览器加载了 html 文件后,由上到下解析 html 为 DOM 树(DOM Tree)。
- 遇到 css 文件,css 中的 url 发起 http 请求。
- 这是第二次 http 请求,由于 http1.1 协议增加了 Connection: keep-alive 声明,故 tcp 连接不会关闭,可以复用。
- http 连接是无状态连接,客户端与服务器端需要重新发起请求 -- 响应。在请求 css 的过程中,解析器继续解析 html,然后到了 script 标签。
- 由于 script 可能会改变 DOM 结构,故解析器停止生成 DOM 树,解析器被 js 阻塞,等待 js 文件发起 http 请求,然后加载。这是第三次 http 请求。js 执行完成后解析器继续解析。
- 由于 css 文件可能会影响 js 文件的执行结果,因此需等 css 文件加载完成后再执行。
- 浏览器收到 css 文件后,开始解析 css 文件为 CSSOM 树(CSS Rule Tree)。
- CSSOM 树生成后,DOM Tree 与 CSS Rule Tree 结合生成渲染树(Render Tree)。
- Render Tree 会被 css 文件阻塞,渲染树生成后,先布局,绘制渲染树中节点的属性 (位置,宽度,大小等),然后渲染,页面就会呈现信息。
- 继续边解析边渲染,遇到了另一个 js 文件,js 文件执行后改变了 DOM 树,渲染树从被改变的 dom 开始再次渲染。
- 继续向下渲染,碰到一个 img 标签,浏览器发起 http 请求,不会等待 img 加载完成,继续向下渲染,之后再重新渲染此部分。
- DOM 树遇到 html 结束标签,停止解析,进而渲染结束。
无效链接
- 死链接(Dead Links)指的是无效链接,也就是那些不可到达的链接。通俗地理解是以前可以通过点击这个链接到达网站页面,后续可能由于网站迁移、改版或操作不当等原因,使得链接指向的目标页面不存在而无法访问所遗留的链接,即称为死链接。
- 访问死链接时,一般会出现 “抱歉,您所访问的页面不存在” 的提示信息或者 404 状态页面。
进程和线程
-
区别:
- 进程是资源分配的最小单位,线程是程序执行的最小单位(资源调度的最小单位)
- 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此 CPU 切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。
- 线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC) 进行。不过如何处理好同步与互斥是编写多线程程序的难点。
- 但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。
-
进程与线程的资源
-
线程共享:进程代码段、进程的公有数据 (利用这些共享的数据,线程很容易的实现相互之间的通讯)、进程打开的文件描述符、信号的处理器、进程的当前目录和进程用户 ID 与进程组 ID。
- 线程独有:栈(保存其运行状态和局部自动变量)、程序计数器。
-
进程与线程的同步
-
进程:无名管道、有名管道、信号、共享内存、消息队列、信号量
- 线程:互斥量、读写锁、自旋锁、线程信号、条件变量
-
僵尸进程
-
定义:一个进程使用 fork 创建子进程,如果子进程退出,而父进程并没有调用 wait 或者 waitpid 获取子进程的状态信息,那么子进程的进程描述符等一系列信息还会保存在系统中。这种进程称之为僵死进程。
- 危害:在 Unix 系统管理中,当用 ps 命令观察进程的执行状态时,经常看到某些进程的状态栏为 defunct,这就是所谓的 “僵尸” 进程。“僵尸” 进程是一个早已死亡的进程,但在进程表(processs table)中仍占了一个位置(slot)。由于进程表的容量是有限的,所以,defunct 进程不仅占用系统的内存资源,影响系统的性能,而且如果其数目太多,还会导致系统瘫痪。
- 处理方法:
- 改写父进程,在子进程死后要为它收尸。具体做法是接管 SIGCHLD 信号。子进程死后,会发送 SIGCHLD 信号给父进程,父进程收到此信号后,执行 waitpid () 函数为子进程收尸。这是基于这样的原理:就算父进程没有调用 wait,内核也会向它发送 SIGCHLD 消息,尽管默认处理是忽略,如果想响应这个消息,可以设置一个处理函数。
- 把父进程杀掉。父进程死后,僵尸进程成为” 孤儿进程”,过继给 1 号进程 init,init 始终会负责清理僵尸进程.它产生的所有僵尸进程也跟着消失。
-
孤儿进程
-
父进程运行结束,但子进程还在运行 (未运行结束) 的子进程就称为孤儿进程。孤儿进程最终会被 init 进程 (进程号为 1) 所收养,因此 init 进程此时变成孤儿进程的父进程,并由 init 进程对它们完成状态收集工作。(linux 下,init 是内核启动的第一个用户级进程,init 有许多很重要的任务,比如像启动 getty(用于用户登录)、实现运行级别、以及处理孤立进程。)
Linux 命令
- "|": 管道符 “|” 将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。连续使用管道意味着第一个命令的输出会作为第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推。
- grep:-v 不显示匹配上的内容;-n 显示匹配上的内容
- grep -v down,显示不包含 down 的内容。
- grep -n down,显示包含 down 的内容。
- du:(disk use)显示每个文件和目录的磁盘使用空间。
- df:(disk free)显示磁盘分区上可以使用的磁盘空间。
单例模式
- 什么情况下会用到:假如有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppConfig 对象的实例,这就导致系统中存在多个 AppConfig 的实例对象,在配置文件内容很多的情况下会严重浪费内存资源。类似 AppConfig 这样的类,我们希望在程序运行期间只存在一个实例对象。
- 优点:速度快、在使用时不需要创建、直接使用即可。
- 缺点:可能存在内存浪费
GET 和 POST 的区别
- GET 在浏览器回退时是无害的,而 POST 会再次提交请求。
- GET 产生的 URL 地址可以被 Bookmark,而 POST 不可以。
- GET 请求会被浏览器主动 cache,而 POST 不会,除非手动设置。
- GET 请求只能进行 url 编码,而 POST 支持多种编码方式。
- GET 请求参数会被完整保留在浏览器历史记录里,而 POST 中的参数不会被保留。
- GET 请求在 URL 中传送的参数是有长度限制的,而 POST 么有。
- 对参数的数据类型,GET 只接受 ASCII 字符,而 POST 没有限制。
- GET 比 POST 更不安全,因为参数直接暴露在 URL 上,所以不能用来传递敏感信息。
- GET 参数通过 URL 传递,POST 放在 Request body 中。
APP 是用多进程安全还是用多线程安全
- 写网页 (html,js,css) 的,写的很随意,导致 chrome 渲染的时候出现 bug,整个 chrome 崩掉,我 google 再 nb 的程序员也写不出来 0 bug 的浏览器,单个页面不行就算了,我越界到别人地址上了,大家一块崩溃吧,
- 插件也是参差不齐,插对了没问题,插错了不但是把自己弄坏,整个进程崩了,其他线程也别活了。
- 别有用心者,我是黑客要努力的超越漏洞,我从页面 a 刺穿到别人的页面上(安全性问题).
- 原因:多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。
序列化和反序列化
- 定义:
- Java 序列化就是指把 Java 对象转换为字节序列的过程。Java 反序列化就是指把字节序列恢复为 Java 对象的过程。
- 作用
- 序列化:在传递和保存对象时,保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。
- 反序列化:根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。
- 总结
- 核心作用就是对象状态的保存和重建。
TCP 和 UDP 的区别、特点
- TCP 的主要特点是:
- 面向连接。
- 每一条 TCP 连接只能是点对点的(一对一)。
- 提供可靠交付的服务 (无差错,不丢失,不重复,且按序到达)(校验和、重传控制、序号标识、滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。)。
- 提供全双工通信。
- 面向字节流。
- UDP 的主要特点是:
- 无连接。
- 尽最大努力交付 (不保证可靠交付)。
- 面向报文。
- 无拥塞控制。
- 支持一对一、一对多、多对一和多对多的交互通信。
- 首部开销小(只有四个字段:源端口、目的端口、长度、检验和)。
采用 TCP,一旦发生丢包,TCP 会将后续的包缓存起来,等前面的包重传并接收到后再继续发送,延时会越来越大。
UDP 对实时性要求较为严格的情况下,采用自定义重传机制,能够把丢包产生的延迟降到最低,尽量减少网络问题对游戏性造成影响。
Integer 和 int 的区别
- Integer 是 int 的包装类,int 则是 java 的一种基本数据类型
- Integer 变量必须实例化后才能使用,而 int 变量不需要
- Integer 实际是对象的引用,当 new 一个 Integer 时,实际上是生成一个指针指向此对象;而 int 则是直接存储数据值
- Integer 的默认值是 null,int 的默认值是 0
判断一个类是否 “无用”,则需同时满足三个条件:
- 该类所有的实例都已经被回收,也就是 Java 堆中不存在该类的任何实例;
- 加载该类的 ClassLoader 已经被回收
- 该类对应的 java.lang.Class 对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。
ARP 协议
-
工作过程
- 第一步:首先,每个主机都会有自己的 ARP 缓存区中建立一个 ARP 列表,以表示 IP 地址和 MAC 地址之间的对应关系
- 第二步:当源主机要发送数据时,首先检测 ARP 列表中是否对应 IP 地址的目的主机的 MAC 地址
如果有,则直接发送数据。如果没有,就向本网段的所有主机发送 ARP 数据包,内容:我是 IP 地址,mac 地址,谁是 IP 地址,mac? - 第三步:当本网络的所有主机收到该 ARP 数据包时,首先检查数据包中的 IP 地址是否是自己的 IP 地址,如果不是,则忽略该数据包。如果是,则首先从数据包中取出源主机的 IP 和 mac 地址写入到 ARP 列表中,如果以存在,则覆盖。然后将自己的 mac 地址写入 arp 响应包中,告诉源主机自己是它想要找的 mac 地址
- 第四步:源主机收到 ARP 响应包后,将目的主机的 IP 和 mac 地址写入 arp 列表,并利用此信息发送数据
如果源主机一直没有收到 arp 响应数据包,表示 arp 查询失败。 -
为什么要使用 ARP 协议
-
OSI 模型把网络工作分为七层,彼此不直接打交道,只通过接口(layer interface)。IP 地址工作在第三层,MAC 地址工作在第二层。当协议在发送数据包时,需要先封装第三层 IP 地址,第二层 MAC 地址的报头,但协议只知道目的节点的 IP 地址,不知道目的节点的 MAC 地址,又不能跨第二、三层,所以得用 ARP 协议服务,来帮助获取到目的节点的 MAC 地址。
-
ARP 协议是第几层协议
-
工作在二层,是三层协议。
-
ARP 在生成环境产生的问题及解决办法:
-
ARP 病毒,ARP 欺骗。
- 高可用服务器对之间切换时要考虑 ARP 缓存的问题。
- 路由器等设备无缝迁移时要考虑 ARP 缓存的问题,例如:更换办公室的路由器。
关系型数据库与 NOSQL
- 关系型数据库
- Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL
- 非关系型数据库 NOSQL (Not Only SQL)
- NOSQL 特点:
- 易扩展,数据之间没有关系的。
- 大数据量,高性能。高性能读写非常灵活的。
- 灵活的数据模型。不需要事先对存储数据建立字段。
- 高可用。
- NOSQL 主要主流产品
- Redis、CouchDB、mongoDB、Cassandra。NOSQL 中比较火的三个数据库 Redis、Memchache、MongoDb。
- NOSQL 特点:
红黑树
- 结点是红色或黑色
- 根结点始终是黑色
- 叶子结点(NIL 结点)都是黑色
- 红色结点的两个直接孩子结点都是黑色(即从叶子到根的所有路径上不存在两个连续的红色结点)
- 从任一结点到每个叶子的所有简单路径都包含相同数目的黑色结点
MySQL 中 char、varchar 和 text 三者的区别
在 MySQL 中,char、varchar 和 text 类型的字段都可以用来存储字符类型的数据,char、varchar 都可以指定最大的字符长度,但 text 不可以。
它们的存储方式和数据的检索方式也都不一样。
数据的检索效率是:char > varchar > text
-
具体说明:
- char:存储定长数据很方便,CHAR 字段上的索引效率级高,必须在括号里定义长度,可以有默认值,比如定义 char (10),那么不论你存储的数据是否达到了 10 个字节,都要占去 10 个字节的空间(自动用空格填充),且在检索的时候后面的空格会隐藏掉,所以检索出来的数据需要记得用 trim 之类的函数去过滤空格。
- varchar:存储变长数据,但存储效率没有 char 高,必须在括号里定义长度,可以有默认值。保存数据的时候,不进行空格自动填充,而且如果数据存在空格时,当值保存和检索时尾部的空格仍会保留。另外,varchar 类型的实际长度是它的值的实际长度 + 1,这一个字节用于保存实际使用了多大的长度。
- text:存储可变长度的非 Unicode 数据,最大长度为 2^16-1 个字符。text 列不能有默认值,存储或检索过程中,不存在大小写转换,后面如果指定长度,不会报错误,但是这个长度是不起作用的,意思就是你插入数据的时候,超过你指定的长度还是可以正常插入。
-
关于存储空间:
在使用 UTF8 字符集的时候,MySQL 手册上是这样描述的: -
基本拉丁字母、数字和标点符号使用一个字节;
- 大多数的欧洲和中东手写字母适合两个字节序列:扩展的拉丁字母(包括发音符号、长音符号、重音符号、低音符号和其它音符)、西里尔字母、希腊语、亚美尼亚语、希伯来语、阿拉伯语、叙利亚语和其它语言;
- 韩语、中文和日本象形文字使用三个字节序列。
-
结论:
-
经常变化的字段用 varchar;
- 知道固定长度的用 char;
- 超过 255 字节的只能用 varchar 或者 text;
- 能用 varchar 的地方不用 text;
- 能够用数字类型的字段尽量选择数字类型而不用字符串类型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接回逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了;
- 同一张表出现多个大字段,能合并时尽量合并,不能合并时考虑分表
App 测试和 Web 测试的区别
首先从系统架构来看的话,Web 测试只要更新了服务器端,客户端就会同步会更新。而且客户端是可以保证每一个用户的客户端完全一致的。但是 App 端是不能够保证完全一致的,除非用户更新客户端。如果是 App 下修改了服务端,意味着客户端用户所使用的核心版本都需要进行回归测试一遍。
-
性能方面
- web 页面可能只会关注响应时间。
- App 则还需要关心流量、电量、CPU、GPU、Memory 这些了。
-
兼容方面
-
Web 是基于浏览器的,所以更倾向于浏览器和电脑硬件,电脑系统的方向的兼容,不过一般还是以浏览器的为主。而浏览器的兼容则是一般是选择不同的浏览器内核进行测试(IE、chrome、Firefox)。
- App 的测试则必须依赖 phone 或者是 pad,不仅要看分辨率,屏幕尺寸,还要看设备系统。系统总的来说也就分为 Android 和 iOS,不过国内的 Android 的定制系统太多,也是比较容易出现问题的。
-
相比较 web 测试,app 更是多了一些专项测试:
-
一些异常场景的考虑以及弱网络测试。这里的异常场景就是中断,来电,短信,关机,重启等。
- 而弱网测试是 App 测试中必须执行的一项测试。包含弱网和网络切换测试。需要测试弱网所造成的用户体验,重点要考虑回退和刷新是否会造成二次提交。需要测试丢包,延时的处理机制。避免用户的流失。
-
安装、卸载、更新:
-
web 测试是基于浏览器的所以不必考虑这些。而 app 是客户端的,则必须测试安装、更新、卸载。除了常规的安装、更新、卸载还要考虑到异常场景。包括安装时的中断、弱网、安装后删除安装文件,更新的强制更新与非强制更新、增量包更新、断点续传、弱网,卸载后删除 App 相关的文件等等。
- 界面操作
-
现在 app 产品的用户都是使用的触摸屏手机,所以测试的时候还要注意手势,横竖屏切换,多点触控,事件触发区域等测试。
-
设计用例的方法、依据有那些
- 白盒测试
- 白盒测试用例设计有如下方法:语句覆盖、判定覆盖、条件覆盖、判定 / 条件覆盖、条件组合覆盖和路径覆盖。依据就是代码结构。
- 黑盒测试
- 黑盒测试用例设计方法:基于用户需求的测试、等价类划分方法、边界值分析方法、错误推测方法、因果图方法、判定表驱动分析方法、正交实验法、场景法。依据是用户需求规格说明书,详细设计说明书。
软件测试的流程
- 测试需求分析阶段:阅读需求,理解需求,主要就是对业务的学习,分析需求点,参与需求评审会议
- 测试计划阶段:主要任务就是编写测试计划,参考软件需求规格说明书,项目总体计划,内容包括测试范围(来自需求文档),进度安排,人力物力的分配,整体测试策略的制定。风险评估与规避措施有一个制定。
- 测试设计阶段:主要是编写测试用例,会参考需求文档(原型图),概要设计,详细设计等文档,用例编写完成之后会进行评审。
- 测试执行阶段:搭建环境,执行冒烟测试(预测试)- 然后进入正式测试,bug 管理直到测试结束
- 测试评估阶段:出测试报告,确认是否可以上线
- 测试流程:了解用户需求 --> 参考需求规格说明书 --> 测试计划(人力物力时间进度的安排)--> 编写测试用例 --> 评审用例 --> 搭建环境 --> 测试包安排预测(冒烟测试)- 正式测试 - bug - 测试结束出报告 --> 版本上线 --> 面向用户
Android 中造成 APP 闪退的原因总结
- 弱网络情况下,服务端响应不及时,可能倒是闪退。(网络异常引起的)
- 应用版本太低,会导致不兼容,造成闪退。(有些 API 在老版本中有,在新版本中没有,造成对象为空引起闪退)
- APP 的 SDK 和手机的系统不兼容。
- 缓存垃圾过多:由于安卓系统的特性,如果长时间不清理垃圾文件。会导致越来越卡,也会出现闪退情况。
- 设计不合理,1 个接口,拉取的数据量太大,请求结果会很慢,且占用大量内存,APP 会闪退(比如,我们现在做的记录仪,进入相册列表时候,要拉取所有图片,拉取太慢了,就闪退了)
- 不同 APP 间切换,交互测试,可能会出现闪退。
- 权限问题。
网页很卡的原因
- 带宽不足、硬件配置低、CPU 或者是内存被占满。
- http 请求次数太多。
- 接收数据时间过长,如下载资源过大。
- JS 脚本过大,阻塞了页面的加载。
- 网页资源过多、接受数据时间长、加载某个资源慢。
- DNS 解析速度。
单元测试、集成测试、系统测试
-
粒度不同:
- 单元测试粒度最小,集成测试粒度居中,系统测试粒度最大。
-
测试方式不同:
-
单元测试一般由开发小组采用白盒方式来测试,集成测试一般由开发小组采用白盒加黑盒的方式来测试,系统测试一般由独立测试小组采用黑盒方式来测试。
-
测试内容不同:
-
单元测试主要测试单元是否符合 “设计”,集成测试既验证 “设计”,又验证 “需求”,系统测试主要测试系统是否符合 “需求规格说明书”。
-
使用阶段不同:
-
单元测试为开发人员在开发阶段要做的事情,集成测试和系统测试为测试人员在测试周期内级层做的工作。
聊天功能设计测试用例
- 发送对象(普通用户、公众号、群、其他特殊主体)
- 衍生功能(转发、语音转文字、删除等)
- 消息发送 --- 单聊、群聊、语音、文字、图片、表情、链接、字符及长度
- 消息管理 --- 发布通知、接受通知、发文件、消息提醒、通知提醒、声音、震动、好友请求、请求处理
- 发送内容(空白、正常文字、超长文字、以前曾经引起过崩溃的特殊内容、特殊字符、表情、图片、多媒体、红包、语音等)
- 消息推送 --- 在线、离线、收发、时序
- 权限管理 --- 开放群(任何人入群),半开放群(验证入群),验证加好友,不需验证加好友
- 隐私管理 --- 黑名单,允许好友查看动态,允许陌生人查看动态,允许通过手机号查找,允许真实姓名查找
- 成员管理 --- 加人,被加,退出,被动退出,编辑,删除
- 群组管理 --- 创建群,消息设置,申请入群,扫二维码入群,退群,通知提醒,头像编辑,名称编辑,简介编辑,权限编辑,成员编辑
- 好友管理 --- 扫二维码加人,加好友,查好友,好友推荐,群组推荐,联系人导入,拉黑名单,解除好友,备注名
- 动态管理 --- 发动态,发投票,点赞,表情,评论,增加,删除,分享,隐藏,编辑
- 登录退出 --- 忘记密码,更换账号
- 文件管理 --- 接收,离线接收,预览,删除,分享,转存,文件格式,大小
- 语音聊天 --- 接通 / 挂断、通话质量、耳机插拔、音量调解、话筒 / 扬声器切换、打开 / 关闭麦克风、后台挂起
- 视频聊天 --- 接通 / 挂点 / 切换语音、视频质量、耳机插拔、音量调解、话筒 / 扬声器切换、前置后置摄像头切换、视频框切换、后台挂起
- 功能
- 在红包钱数,和红包个数的输入框中只能输入数字
- 红包里最多和最少可以输入的钱数 200 0.01
- 拼手气红包最多可以发多少个红包 100、超过最大拼手气红包的个数是否有提醒
- 当红包钱数超过最大范围是不是有对应的提示
- 当发送的红包个数超过最大范围是不是有提示
- 当余额不足时,红包发送失败
- 在红包描述里是否可以输入汉字,英文,符号,表情,纯数字,汉字英语符号,是否可以输入它们的混合搭配
- 输入红包钱数是不是只能输入数字
- 红包描述里许多能有多少个字符 10 个
- 红包描述,金额,红包个数框里是否支持复制粘贴操作
- 红包描述里的表情可以删除
- 发送的红包别人是否可以领取、发的红包自己可不可以领取 2 人
- 24 小时内没有领取的红包是否可以退回到原来的账户、超过 24 小时没有领取的红包,是否还可以领取
- 用户是否可以多次抢一个红包
- 发红包的人是否还可以抢红包 多人
- 红包的金额里的小数位数是否有限制
- 可以按返回键,取消发红包
- 断网时,无法抢红包
- 可不可以自己选择支付方式
- 余额不足时,会不会自动匹配支付方式
- 在发红包界面能否看到以前的收发红包的记录
- 红包记录里的信息与实际收发红包记录是否匹配
- 支付时可以密码支付也可以指纹支付
- 如果直接输入小数点,那么小数点之前应该有个 0
- 支付成功后,退回聊天界面
- 发红包金额和收到的红包金额应该匹配
- 是否可以连续多次发红包
- 输入钱数为 0,"塞钱进红包" 置灰
- 性能
- 弱网时抢红包,发红包时间
- 不同网速时抢红包,发红包的时间
- 发红包和收红包成功后的跳转时间
- 收发红包的耗电量
- 退款到账的时间
- 兼容
- 苹果,安卓是否都可以发送红包
- 电脑端可以抢微信红包
- 界面
- 发红包界面没有错别字
- 抢完红包界面没有错别字
- 发红包和收红包界面排版合理,
- 发红包和收到红包界面颜色搭配合理
- 安全
- 对方微信号异地登录,是否会有提醒 2 人
- 红包被领取以后,发送红包人的金额会减少,收红包金额会增加
- 发送红包失败,余额和银行卡里的钱数不会少
- 红包发送成功,是否会收到微信支付的通知
- 易用性 (有点重复)
- 红包描述,可以通过语音输入
- 可以指纹支付也可以密码支付
微信朋友圈的点赞功能
- 是否可以点赞、取消点赞
- 多次点赞会出现什么情况
- 多人点赞时的顺序是否按照时间顺序进行排列
- 点赞是否显示头像和名称
- 点赞之后能否进行评论
- 点赞之后退出该页面,再次进入朋友圈点赞消息是否还存在
- 多用户点赞,再次打开朋友圈是是否可以按照顺序看到是谁谁谁赞了我
- 弱网络的情况下点赞能否实时更新
- 点赞时有短信或电话进来,能否显示点赞情况
- 点赞的人是否在可见分组里
- 点赞之后共同好友的点赞和评论是否会提醒你
基础题
-
Java
- 重写与重载
- java 集合
- hashmap 和 hashtable 的区别
- arraylist 和 linkedlist 的区别
- map 的 put 方法
- Java gc 机制
- 垃圾回收算法:复制算法、标记 - 清除算法、标记 - 整理算法。
- 抽象类和接口的区别
- 线程的实现方式有哪些 extend Thread、implement runnable、implement callable
- Integer 和 int 的区别
- String、StringBuilder 与 StringBuffer
- 内存溢出和内存泄露
- protected,private,public
-
数据库
-
事务的特性:原子性、一致性、隔离性、持久性。
- 联合主键:设置多个字段同时为主键(PRIMARY KEY (Name, Age))
- 复合主键:多个主键联合形成一个主键组合。(成绩表中的学号、课程标号)
- mysql 怎么优化
- 数据库的备份是如何实现的
- mysql 创建一个学生表,包含 id(int)和 name(string),主键的创建:
CREATE TABLE stu(id INT (5), name VARCHAR (100), PRIMARY KEY (id));
- mysql 建立索引
CREATE INDEX index_name ON table_name (column_list) CREATE INDEX idx_c4 ON t(c4);
- 数据库查询 10-20 行内容:
select * from stu limit 10, 10;
- 创建数据库:
CREATE DATABASE database_name;
- 查找 135 开头的电话:
select * from table where tel like '135%';
- left join, right join 和 inner join 的影响性能的因素。
-
操作系统
-
死锁的条件、原因,死锁的必备条件
- 程序与进程 https://blog.csdn.net/Alexwym/article/details/83146459
- 进程通信的方式 管道适用什么场景
- 并发和并行区别
- 并行 (parallel):指在同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看,二者都是一起执行的。
- 并发 (concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。
-
网络
-
tcp 三次握手和四次挥手
- 网络七层有哪些,tcp,udp,arp,TCP/IP 都在哪一层 http,tcp,ip 协议
- tcp 和 udp 的区别、特点
- http 请求方式有哪些:GET、POST、HEAD、PUT、DELETE、CONNECT、OPTIONS、TRACE。
- 拥塞控制和快重传
- TCP 和 UDP 区别、怎么让 udp 实现可靠连接
- socket 编程
- session 与 cookies 区别,以及分别存储在什么地方
- 常见的状态码:502 网关错误 (Bad gateway)、504 Gateway Time-out。
- CDN
-
数据结构
-
索引提到了 B 树
- 数组和链表的区别,树是用什么存储的,可不可以用数组存储
- 快排的时间复杂度(NlogN)、最坏情况(N^2)
- 数据结构上的堆和栈有什么区别、底层结构是什么
- 红黑树
- 最大的 K 个数用什么排序算法,复杂度、同样是 NlogN, 快排和堆排序有什么区别。
-
python
-
() 代表 tuple 元祖数据类型,元祖是一种不可变序列。 [] 代表 list 列表数据类型,列表是一种可变序列。
- lamda 表达式:
a = lambda x,y,z:(x+8)*y-z
- 闭包
- Linux
- VI 显示所有行的行号:vi set number
- 找到共用 80 端口的线程
- linux 基本指令 awk、find、grep
- shell 脚本:统计一个文件中重复的行和重复次数
- linux 如何将文件从一台服务器转移到另一台服务器
- 如何查找出现频率最高的 100 个 ip 地址
测试
- 微信发红包测试用例。
- 测试一个月饼礼盒。
- 测试的维度。
- 对收信发信进行测试
- 怎么测试微信的搜索功能。
- 测试朋友圈发布视频功能
- 如果有一部分用户反馈 APP 的视频加载不出来,你会从哪里方面去定位问题
- 在一个产品的周期中,你会怎么安排测试工作
- 怎么测试小程序的并发性的
- 对页面的测试、对杯子、电梯系统、三角形这些常规的测试用例,总结一下
- 对聊天进行测试
- 对朋友圈点赞进行测试
- 测试微信朋友圈评论功能
- 熟悉的软件测试的方法
- 电梯的测试用例 https://blog.csdn.net/qq_22795513/article/details/82592415?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
- 测试商场的支付功能,设计测试用例
- 黑盒白盒测试
- 项目的测试用例
- 游戏的测试维度
- varchar (256) 变为 varchar (1024) 测试
- 对抖音的界面进行测试
- 测试微博的刷新功能
- 用户登录页面的测试
- 抖音页面怎么测试
- 微信发红包怎么测试
- 登录测试?弱网测试,无网测试怎么做?
- 测试一瓶水、测试一个矿泉水瓶
- 如何测试用户登录界面
- 测试中如何模拟网络环境不好的条件 fiddler
- 如何测试一个登陆案例
- 设计一个测试方案,生产好的矿泉水瓶要放到流水线上生产的测试方案。
- 一个手机小程序,只能输入 1-100 的数字,还有一个提交按钮,设计测试用例
- 为微信的点赞功能设计测试用例,假如点赞了但是点赞数没有加一,可能报错在哪里?网络良好的情况下,发现数据传输过程出现 404 的情况,你认为是什么问题。
- 给抖音的评论功能设计测试用例
- 给你一个 QQ 登录界面 有一个登录按钮一个自动记住密码的复选框 账号密码输入框,你怎么设计测试用例?
- 一个发帖功能(可以发文字、图片、定位),你会测试哪些方面 功能测试,网络测试,平台测试
- 然后问我如果想要上新一个新尺寸的视频,我会想要测试什么。
问题查找
- 让你设计一个俄罗斯方块怎么设计
- web 页面空白有哪些原因
- 测试工具 loadrunner,postman,selenium 用来测什么
- 分析一下少量联通用户反映刷抖音无法显示原因
算法题
- 写代码,类似高考成绩,一个表中有很多数据(无序的),给你一个成绩,查出在表中的排名
- 找出这两个链表是否有相交的点
- 判断链表有没有环,环起点在哪儿。
- 手撕 topk,时间复杂度是多少。
- 写个算法,实现抢红包随机获取金额的过程参考
- 链表反转
- 两数之和( leetcode 第一题~、~)
- 判断一个字符串是否为另一个字符串子串(暴力写的)
- 股票最大利润
- 实现单链表前后交叉排序:1,2,3,4,5,6 变成 1,4,2,5,3,6
- 因式分解
- 有序二叉树,一种遍历方法使之有序,中序遍历。
- 非递归实现先序遍历
- 找无序数组中第 k 个数(一开始说用堆实现、后来我又想着用快排的 partation 实现)
- 算法题:从字符串 S 变到 T,插入消耗 2、删除消耗 2、替换消耗 3、求最小消耗
- 算法题:两个栈实现一个队列(实现 push、pop、count 三个函数)(简单)
- strcpy 的实现
- 给出两个链表,找出相同的链接。a->b->c->d->f、b1->a1->c1->d->f
- 二叉树的遍历方式,手写先序遍历 (参考代码:https://www.cnblogs.com/anzhengyu/p/11083568.html)
- 两个字符串的最长公共子串 (参考代码:https://www.cnblogs.com/anzhengyu/p/11166708.html)
- 查找二叉树最大深度
- 二叉树遍历
- 写代码判断 IP 地址 (https://blog.csdn.net/u014259820/article/details/78833196?utm_source=distribute.pc_relevant.none-task)
- 在字符串中找出不重复字符的个数
- 找出两个只出现一次的数字,其余的数字都出现了两次
- 给 n 元钱,m 个人,写个随机分钱的函数
- 两个栈实现一个队列
- 给个数组求连续子序列最大和
- 写一个程序;给一个数组,a【2 -2 3 3 6 -9 7】输出 a【2 -2 3 -9 3 6 7】输入正负数都有数组,输出数组正负交替出现,多的那一类都放在后面;
- 给定一个数组 输出和为 k 的两个数的位置 a【2 7 3 5 11】k=9 输出 0 1 https://leetcode-cn.com/problems/two-sum/solution/liang-shu-zhi-he-by-leetcode-2/
- 算法题:实现两个 String 字符串寻找最大公共子字符串
- 让写一个洗牌的函数,写完问我为啥那样写、再写一个打印牌的函数,问我洗完牌之后 345 不连在一起的概率 如何模拟一副扑克牌的洗牌过程
- 查找字符串中重复的子串,并输出重复的次数 https://blog.csdn.net/zouheliang/article/details/80649584
- 判断是否为平衡二叉树
- 找出一个字符串的最长不重复子串 (https://www.cnblogs.com/linghu-java/p/9037262.html)
智力题
-
10 个堆,每堆 10 个苹果,其中 9 个堆里苹果是 50g / 个,一个堆里苹果是 40g / 个,有一杆秤只能称一次,所称重量为 x, 求 40g 苹果所在堆。
- 将堆编码为 1-10;然后每堆拿出 k 个,最后少了 k*10 克,则知道是第几堆的苹果。
-
5L 和 6L 水桶,得到三升水。
-
1、6L 的水桶装满水,倒满 5L 的桶。 2、将 5L 桶里的水倒了,将 6L 桶里剩余的 1L 放入 5L 桶。 3、6L 的桶装满水,倒满 5L 桶里,6L 桶里还剩 2L (6-4) 水。 4、 将 5L 桶里的水倒了,将 6L 桶里剩余的 2L 水放入 5L 桶里。 5、将 6L 桶装满水,倒满 5L 的桶,这时 6L 的桶里还剩 3L 水。
-
两个一小时蚊香怎么得到 15 分钟的记时
-
同时点燃 AB 两只蚊香,其中 A 蚊香点燃两头,等 A 蚊香烧完后(30 分钟),点燃 B 蚊香的另一头。
-
4 分钟沙漏和 7 分钟沙漏怎么漏出 9 分钟
-
4 分钟的和 7 分钟的同时开始,4 分钟的完后又倒过来开始。7 分钟的沙漏完后立马倒过来,(4 分钟的沙漏还剩 1 分钟)。等 4 分钟的沙漏完后,将 7 分钟的又立马倒过来,等漏完就是 9 分钟。
-
八个球,其中有一个是其余球重量的 1.5 倍,有什么方案找出来
-
2 次。 第一次左右各三个,如果平衡,第二次把剩下的两个称下可以找出重的那个。如果不平和,第二次把重的那端的三个球任意取两个,不平衡的话重的那头就是要找的,平衡的话则是另外一个。
-
桌上 100 个球,每次可以拿一到五个,现在我们两个人依次拿球,你先拿,使用怎样的拿球策略,可以使你最终能拿到最后一个球?
-
第一次拿四个,后来每个你拿球的时候只要保证剩下的球是 6 的倍数就行了如果他拿 n 个球 ,你就拿 6-n 个球。
-
有 10 个石头,每人每次可以拿 1-2 个,轮流拿,最后一个拿的人算输,有什么必赢的方案。
-
对方先拿、保证两个人每一轮回拿满 3 个(对方拿一个,我拿两个、对方拿两个,我拿一个)。
-
一亿数据获取前 1000 个最大值 https://zhuanlan.zhihu.com/p/73233544
-
把一亿个数字的前 100 个 首先放入数组。 然后把最小值放在 ary [0]。然后再循环 100 到一亿之间的。 每次循环判断当前数字是否大于 ary [0] 当大于时,当前数字放入 ary [0] 并再次重构数组最小值进入 ary [0] 以此类推 。当循环完这一亿个数字后。 最大的前 100 个数字就出来了。
- 经典智力题:飞机加油问题
其他
- 冲突解决办法
- 如果 UI 和开发消极怠工,怎么办
- 如果开发认为测试出来的问题不是他的问题,怎么办
- leader 出错,同伴不配合怎么办
- 对测开的理解
- 对测试工作有什么期望
- 为什么想做测试
- 你了解的测试有哪些
- 测试与开发本质区别
- 测试主要运用哪种语言
- 对测试开发的理解
- 你对测试职位的理解 https://www.nowcoder.com/discuss/374134