测试/测试开发复习
程序员文章站
2022-03-06 17:02:21
...
(考虑做测试,因为太菜了,找了一些测试相关的笔试/面试经验,整理了一下知识点作为复习参考。
分类可能不是很准确(QAQ)
(纯测试的话主要看重测试用例的设计,测试开发就对计算机基础和算法代码这些要求更高QvQ)
测试用例:
- 登录的测试:用户名/密码输入,验证码输入/获取等
- 游戏商城的测试、抽卡的测试、副本的测试
- 收发邮件的测试
- 版本迭代设计新的测试用例
数据结构
- 红黑树/AVL树:
- AVL树是平衡二叉树,任何节点左子树和右子树的深度不超过1
- 红黑树是不严格的平衡二叉树只要求部分平衡(黑色完美平衡)
- 红黑树的读取效率略低于AVL,插入和删除效率则更高,维护开销较小,空间开销与AVL类似
- 内容多是优先选红黑树
- 链表
- 栈
- 堆
- 散列表,
- concurrent hash map, hashmap, hashset区别
- hashmap基于哈希表的map接口实现。储存键值对,一个key对一个value,键不可重复,使用put()添加元素;使用键对象计算hashcode;比较快,因为使用唯一的键获取对象。
- hashset实现set接口。仅仅储存对象,也就是没有key,只有value,且不可重复,使用add()添加元素;使用成员对象计算hashcode;比map慢。
- ConcurrentHashMap基于双数组和链表的Map接口的同步实现,key唯一,value可重复,不允许null值和null键;是无序的。由于hashmap是非线程安全的,多线程在使用HashMap的时候,就要用concurrent hash map 来解决同步问题
sql数据库(win默认大小写不敏感)
- 写sql语句
- mysql数据表salars中有一个字段是phone,有大量脏数据phone1,phone2,…,phone10000,随机分布在表里,现在需要将这些表清除,使用的mysql语句是什么
- Alter table salars drop phone;
- Delete from salars where like ‘phone%’
- 授权代码
- Grant insert on mydb.book to a_user
- 创建表
- Create table employee(id int, name varchar(40), sex char(4));
- 增删改查代码
- ( change column是列的重命名、修改属性)
- (alter column是用来设置或移除列的默认值)
- Alter table employee add image blob;(存图片)
- Alter table employee drop sex;
- Alter table employee modify name varchar(30);
- Rename table employee to user;
- Alter table user character set utf8;
- Alter table user change column name username vachar(100);
- Insert into user(id, username, image) value(…)
- Update user set id = 1(所有id为1)
- Updateuser set username = ‘ha’, id = 2 where username = ‘…’;
- Drop table user
- 数据库如何删除一个表,如何连接两个表
- 外连接 join(左右全)(不匹配bunull)
- 内连接(只显示匹配的)
- 交叉连接(笛卡尔积)
- 用SQL实现一个函数或储存过程
- 输入参数为Item_Name, Item_Type,输出Item_ID参数
- 如果Item_Name和Item_Type的组合在表中已存在,则返回原有Item_ID
- 如果不存在,在表中插入新的记录,并返回新插入记录的Item_ID
- Item_ID是唯一的序列编号
- 对Item_Name的判断不分大小写
- 需要考虑函数或储存过程被多个Session同时调用的问题
- mysql数据表salars中有一个字段是phone,有大量脏数据phone1,phone2,…,phone10000,随机分布在表里,现在需要将这些表清除,使用的mysql语句是什么
- 什么是主键/外键
- 主键:用于标识记录,不能重复/为空;复合主键指复合唯一
- 外键:用于与其他表建立联系,可重复,可能为空
- 索引
- 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。
- 两个行的索引不可一致
- Create index UserIndex on user (id)
- sql的数据库类型(关系型)
- 关系型数据库事务的特性
- 原子性:事务要不全完成,要不全不完成
- 一致性:数据库完整性不会被事务破坏,意味着写入的资料必须符合规则
- 隔离性:允许并发事务对数据读写修改,隔离性防止交叉执行导致的数据不一致
- 持久性:即时系统故障也不会丢失对数据的更改
- SQL四个安全性等级
- 客户机操作系统的安全性
- SQL 服务端的登录安全性
- 数据库的使用安全性
- 数据库对象的使用安全性
- 四种隔离级别
- 串行化:避免脏读、不可重复读和幻读
- 可重复度:避免脏读、不可重复读
- 读已提交:避免脏读
- 读未提交:无法保障
测试:
- 功能会议–测试用例编写–冒烟测试–详细测试–回归测试–checklist检查
- 冒烟测试:针对每个版本或每次需求变更后,在正式测试前,对产品或系统的一次简单的验证性测试。
- 详细测试前的环节,快速展开
- 属于高级别测试,通常站在系统的角度
- 集成测试版本前,确保测试版顺利集成
- 形成集成版本时,保障新的更改不破坏完整与稳定
- 后期缺陷修正,每个都要先冒烟,通过再发布
- 最好有自动化测试脚本,每次更新后执行脚本验证一下
- 详细测试
- 细致每个逻辑资源和配置
- 尽量模拟多个可能
- 测试异常情况
- 测试数据读取网络、存储等
- 测试新功能影响
- Checklist
- 利用记录在上线前再检查一遍
- 精准测试
- 一套测试辅助系统,测试分析系统
- 根据测试用例追踪模块和代码,大型调试器
- 弱网测试
- 信号差
- 高丢包
- 不同网络切换
- 断线重连
- 前后端数据一致检查
- 可能用到抓包工具如Wirehark和fiddle
- 性能测试(工具Loadrunner和Jmeter等)
- CPU
- 占用
- 内存
- 占用
- FPS(帧率)
- 耗电
- 流量
- CPU
- 压力测试
- 服务器cpu、内存
- TPS(每秒请求响应数,TPS=并发数/响应时间)
- 并发数
- 事务响应时间
- 系统吞吐量(单位时间系统传输数据总量)
- 事务成功率
- 兼容测试
- 安全测试
- 日志测试
- 接口测试是什么
- 接口:外部系统与系统之间以及内部各个子系统之间的交互点
- 接口分类:程序内部的接口,系统对外的接口
- 接口测试原理:
- 模拟前端/客户端向服务器发送/接受数据判断是否正常
- 接口测试可使用测试工具Jmeter(java)、Postman、Soapui等模拟发出http请求
- 可以使用python脚本模拟客户端发送http请求
- 常见的请求有POST和GET类型
- web端和移动端测试的了解
- b/s结构,响应时间,cpu,内存
- c/s结构,响应时间,cpu,内存,流量,电量等
- 工具测试
- sdk测试,用户数据、消费、渠道对接测试等
- 自动化测试工具
- App Appium
- Web Selenium
- JMeter
- 软件开发/bug生命周期
- Bug 0致命 1严重 2一般 3无关紧要
操作系统
- 解释死锁,四个必要条件,如何预防
- 死锁是因为争夺资源产生的僵持状态,饥饿指一个进程一直得不到资源
- 通过资源分配图检测
- 四个
- 互斥条件:一个资源只被一个进程使用
- 请求与保持条件:一个进程因为请求资源而阻塞时,对已获得的资源保持不放
- 不剥夺条件:在使用完之前,不强行剥夺进程已获得的资源
- 循环等待条件:若干(个数不限)进程之间存在一个循环等待链,链中每个进程已经获得的资源都被下一个进程所请求
- 只要系统死锁,四个必要条件必然成立,只要上述条件之一不满足就不会发生
- 合理分配资源,避免永久占据,防止进程在等待中占用资源等
- 进程
- 进程是可并发执行的程序在某个数据集合上的一次计算活动,一个可独立运行的程序单位,也是操作系统进行资源分配和调度的基本单位。
- 资源分配最小单位
- 有自己独立的地址空间,互相资源独立
- 将某些进程挂起(suspend),置于磁盘对换区,释放其所占资源,暂时不启用低级调度,起到平滑负载的目的。
- 开销大
- 进程组成:
- 进程控制块(PCB):感知的唯一标志
- 程序块
- 核心块
- 数据块
- 进程上下文
- 进程调度(剥夺:不让跑完,非剥夺:让跑完)
- 先来先到
- 短时间作业优先
- 时间片轮换
- 多级反馈
- 线程
- 程序执行最小单位,处理机调度最小单位
- 每个进程有相应的线程,执行程序就是是执行一系列线程
- 同进程的线程共享进程地址空间,互相共享进程资源
- 不能独立执行,要有应用程序提供线程执行控制
- 开销小
- sleep让资源,不释放锁,wait不让
- 并行和并发
- 并行要有多个处理器,同精确时刻有不同程序执行
- 并发是时间段内同时进行,(通过cpu调度等让其看起来像)
- 进程间通信,线程间通信
- 进程七种IPC
- 管道:半双工,数据在一个方向流动
□ 普通管道pipe(单工)流管道半双工
® 亲缘关系进程通信(父子、兄弟)
® 特殊的文件类型,不属于文件系统,只在内存里
□ 命名管道(FIFO)
® 一种文件类型
® 可以在无关进程通信 - 消息队列message queue
- 信号量semaphore
- 共享存储share memory
- Socket套接字
- 管道:半双工,数据在一个方向流动
- 线程(Java)
- 等待/通知
- Join
- volatile关键字
- threadLocal
- 进程七种IPC
- 进程&线程
- 三个状态:就绪(被CPU调度选中下一个执行)、运行、等待(阻塞)
- 五个状态
- 开始/新建
- 就绪
- 运行(正在占用处理器/资源)
- 阻塞
- 结束
- 多进程
- 多道技术让cpu变成多个虚拟的cpu
- 指计算机同时运行多个软件
- win开进程开销大,而linux开进程开销小(为什么服务器多用linux)
- 多线程开发
- 线程是进程的一个最小运行单元,一个进程有多个线程执行就是多线程
- 能够提升程序的效率
- 可应用与一些等待的任务上,如文件读取
- 越多线程耗内存越多,会影响性能,因为要在线程间来回切换(线程是异步的,但这是系统不断来回切换导致的,不是真的同时)
- 32/64位系统区别
- 支持的处理器不同
- 支持的最高内存不同(寻址能力)
- 与其他硬件的兼容性不同
Linux
-
Linux命令
- 进程查看 ps -IA所有 -aux详细 | grep + 名字查询具 -ef f查看进程和线程()树状
-
shell是linux的批处理
- 前缀:#!/bin/sh #!/bin/bash 而bat是 echo off
网络:
- IP协议 http、https协议
- http状态码
- 1 收到,请继续操作
- 2 成功接收并处理
- 3 资源被转移,重定向资源,需要进一步操作
- 4
- 403拒绝访问
- 。网页不存在
- 5 服务器
- TCP/IP模型分为网络接口层(数据链路+物理),网际层(网络),传输层,应用层
- 应用层:HTTP、FTP、smtp
- 传输层:TCP、UDP
- 网际层:IP、ARP、ICMP、路由协议等
- OSI模型分:物理,数据链路,网络,传输,会话,表示,应用
- tcp/ip协议
- 内容
- 头文件作用
- TCP/UDP传输协议
- 有/无连接
- 数据流/数据报
- TCP为什么三次握手四次挥手
- 三次握手
- 第一次握手客户端发送syn=j,等待确认
- 第二次握手服务器收到并确认,发ack=j+1,并且向客户端发syn=k,等待确认
- 第三次握手客户端收到并确认,发送ack=k+1,完成三次握手
- (两次握手可能出现死锁)
- 四次挥手
- 第一次挥手客户端发出连接释放FIN=1,进入终止等待状态,此时仍然接受服务端数据
- 服务器收到连接释放报文,发出确认,进入关闭等待状态,等完了后,发送连接释放报文FIN=1,并仍然接受客户端数据
- 客户端收到确认后,从终止等待进入二阶终止等待状态,
- 客户端等待并收到连接释放报文后发出确认,过一段时间后关闭
- 服务端受到确认后关闭
- 三次握手
- TCP如何保障连接可靠性
- 检验和(和UDP一样),分段反码相加
- ***(每个字节数据编号)
- 确认应答ack
- 超时重传
- 连接管理(三四)
- 流量控制(根据接收端处理能力调节数据发送速度)
- 拥塞控制(慢启动、拥塞窗口等)
- tcp快速重传(不管计时器,三次确认立刻重传)、滑动窗口(多个发送应答,提高效率)
- SYN攻击
- DOS攻击:拒绝服务,通过发送大量虚假请求,消耗服务器资源
- SYN攻击是一种DOS攻击,通过大量半连接请求消耗服务器资源
- DDOS:多台主机进行攻击
- 访问URL,URL加载过程,DNS解析
- 如何读取不同服务器的数据
Python:
- 怎么学习python
- 语言特性
- 简单
- 高级(语言)
- 免费开源
- 解释型,一边编译一边执行
- 可移植,运行在不同平台上
- 可拓展
- 丰富的库
- 面向对象
- 可嵌入型
- 类是一个文件的一段代码,模块是一个文件,包是多个文件
- 多进程fork创建新
- ord(a)求ASCII码,chr(ord(a))让ASCII码转回字符
- From urllib import request page = request.urlopen(url) html = page.read.decode() (内置模块)
- Import request第三方模块
- 多线程
- Import threading
- T = threading.Thread(target=,arg=)
- T.start()(thread简单,不能继承其他类)
- 常见数据结构
- 列表list
- List = [1, 2, ‘v’]
- List.append(a)
- List.insert(1, a)
- List.pop()
- List.remove()
- List.sort()
- Del list[1:3] 1到3都删掉
- 元组tuple
- Tuple = (1,2,3)
- Type(Tuple)
- 字典dict
- Dict = {}
- Dict = {‘a’:1}
- If (‘a’ in DIct)
- 集合set:
- Set = set()
- Set.add(6)
- 列表list
- == 和 is(一个比值,一个比对象)
- 用过什么基本库
- 单例:
- 保障一个类只有一个实例对象存在(例如配置文件)
- 使用模块实现
- Class XX(): def foo(self) : pass xx = XX()
- From a import xx
- 使用装饰器实现
- def XX(): _in = () def _XX(): return _in[] return _XX
- @XX
- Class A() :
- 使用类(多线程下需要加锁)
- 使用_new_方法,实例化一个对象时先执行new再执行init
- 如何提高效率
C++:
- 继承封装和多态是什么
- 封装把方法集中在一个对象里
- 继承保留基类的属性
- 公有继承让基类公有和保护成员被继承,并保留原有状态,私有成员不被访问
- 私有继承让基类公有和保护成员都不能被访问,子类也不可转换成基类
- 保护继承让基类公有和保护成员都作为保护成员被继承,只能被派生类或友元访问
- 同名方法有不同功能
- 实现STL的map/vector等会用什么底层结构
- vector底层为数组,支持快速随机访问
- list底层为链表,快速增删
- deque双向队列,快速访问并高效插入删除
- stack栈用list或deque
- queue用list或deque
- Priority_queue优先队列用vector
- set用红黑树,有序,不重复
- mutiset用红黑树,有序,可重复
- map用红黑树
- hashset用hash表
- hashmap用hash表
- 虚函数和纯虚函数
- c++没有抽象类的概念,提高纯虚函数来实现抽象类,存在纯虚函数的类就是抽象类,只能作为父类被继承
- 纯虚函数被实现后成为虚函数,但如果子类没有实现纯虚函数,那子类也变成抽象类
- 接口是一种特殊的抽象类
JAVA:
- 跨平台,比c++执行更慢,所有代码都在类里定义,没有指针,解释型而不是编译型
- Final 关键字:
- 修饰类时代表这个类不能被继承
- 修饰方法时该方法不能被修改/重写
- 泛型:创建对象/调用方法时才去明确的类型(类型安全,不用强制类型转换)
- 接口和抽象类的区别
- 抽象类要被子类继承,接口要被类实现
- String类的设计是不可变的,final类型,不能被继承,其值也不可变
- 同样的string指向同样的对象,字符串存在堆内存里,而指针在栈里
- concat()连接,+连接
- compareTo()比较
- charAt(i)取第i字符
- substring(begin,end=len)子串
- StringBuffer 可变
- 同样的string指向同样的对象,字符串存在堆内存里,而指针在栈里
- 增强for循环
- for(Ele e : arrayname){};
- Android的远程调用(就是跨进程调用)就是通过IBinder实现的,用于进程间通信
- 如何实现多线程
- Handler + thread
- 主线程包含一个消息队列,存msg和runnable等对象
- 用Handler向消息队列发送这两种对象并处理
- 新建Handler对象是会绑定创建它的线程
- handler会把对象存到消息队列里,并在他们出列时执行他们
- AsyncTask
- ThreadPoolExecutor
- IntentService
- Handler + thread
算法/代码:
-
位运算
-
随机数生成器
std::random_device rd; //(c++)
rd()是一个随机数
来自 http://c.biancheng.net/view/635.htmlimport random
print(random.randint(0,9))
来自 https://www.runoob.com/python3/python3-random-number.html -
排序算法(冒泡和快排各自的优点),哪些是稳定的,哪些是不稳定的(稳定是指相同数字互相顺序不变)(这里只写了时间复杂度,实际上也要考虑空间复杂度)
-
电梯算法(电梯调度算法)
- 先来先服务FCFS
- 按照乘坐顺序进行调度
- 最短寻找楼层时间优先(SSTF)
- 下一个服务对象是楼层离现在最近的对象
- 可能把人困在电梯
- 扫描算法(SCAN)
- 比SSTF稳定
- 一直在1楼到顶楼徘徊
- 非实时
- LOOK算法
- 改进的SCAN,当移动方向的前方没有请求时改变方向
- SATF算法
- 与SSTF相似,但不是找楼层的时间,而是最短访问时间
- 先来先服务FCFS
-
实时电梯调度算法
- 最早截止期优先调度EDF(任意寻找楼层,吞吐率低)
- SCAN-EDF
- 先EDF,同时限里SCAN
- PI
- 分优先级
- FD-SCAN
- 可行截止日期scan,已时限最早的作为scan方向
-
银行家算法
- 分配资源前计算安全性
- 假如满足当前进程资源需求后,属于资源还能满足剩下进程里需求最小那个,这就是安全的,分配资源,否则让她等待
-
实现斐波那契函数
- 递归方式
- f(n) = f(n - 2) + f(n -1), f(1) = 1, f(2) = 1.
-
判断单链表是否有环
-
Two sum
- 找出数组中和为目标值的两个元素,不能重复利用同样的元素(如3+3=6)
-
一个密码,有数字和大小写字母就是强密码,判断是否强
-
dp动态规划,背包问题等
-
二叉树照层输出
- DFS/BFS 深度/宽度优先搜索
- 宽度优先搜索:
Vector<vector<int>> levelOrder(TreeNode root) Vector<vector<int>> result); If (root == null ) return result; deque<TreeNode*> queue; queue.push_back(root) Nonull ++; Last_nonull = nonull; While(!queue.Empty()) vector<int> subList; Int this_null' While(this_null < last_nonull) This_null++; subList.push_back(queue.front()-val) If (queue.front()-left) Push_back(queue.front()-left) Nonull++; If (queue.front()-right) Push_back(queue.front()-right) Nonull++; Nonull--; Queue.pop_front(); result[row-1] = subList Return result;
-
knn算法
-
决策树和聚类
上一篇: iOS 动态热修补 JSPatch
下一篇: 分类模型之职员离职分析
推荐阅读