欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

测试/测试开发复习

程序员文章站 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同时调用的问题
  • 什么是主键/外键
    • 主键:用于标识记录,不能重复/为空;复合主键指复合唯一
    • 外键:用于与其他表建立联系,可重复,可能为空
  • 索引
    • 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。
    • 两个行的索引不可一致
    • Create index UserIndex on user (id)
  • sql的数据库类型(关系型)
  • 关系型数据库事务的特性
    • 原子性:事务要不全完成,要不全不完成
    • 一致性:数据库完整性不会被事务破坏,意味着写入的资料必须符合规则
    • 隔离性:允许并发事务对数据读写修改,隔离性防止交叉执行导致的数据不一致
    • 持久性:即时系统故障也不会丢失对数据的更改
  • SQL四个安全性等级
    • 客户机操作系统的安全性
    • SQL 服务端的登录安全性
    • 数据库的使用安全性
    • 数据库对象的使用安全性
  • 四种隔离级别
    • 串行化:避免脏读、不可重复读和幻读
    • 可重复度:避免脏读、不可重复读
    • 读已提交:避免脏读
    • 读未提交:无法保障

测试:

  • 功能会议–测试用例编写–冒烟测试–详细测试–回归测试–checklist检查
  • 冒烟测试:针对每个版本或每次需求变更后,在正式测试前,对产品或系统的一次简单的验证性测试。
    • 详细测试前的环节,快速展开
    • 属于高级别测试,通常站在系统的角度
    • 集成测试版本前,确保测试版顺利集成
    • 形成集成版本时,保障新的更改不破坏完整与稳定
    • 后期缺陷修正,每个都要先冒烟,通过再发布
    • 最好有自动化测试脚本,每次更新后执行脚本验证一下
  • 详细测试
    • 细致每个逻辑资源和配置
    • 尽量模拟多个可能
    • 测试异常情况
    • 测试数据读取网络、存储等
    • 测试新功能影响
  • Checklist
    • 利用记录在上线前再检查一遍
  • 精准测试
    • 一套测试辅助系统,测试分析系统
    • 根据测试用例追踪模块和代码,大型调试器
  • 弱网测试
    • 信号差
    • 高丢包
    • 不同网络切换
    • 断线重连
    • 前后端数据一致检查
      • 可能用到抓包工具如Wirehark和fiddle
  • 性能测试(工具Loadrunner和Jmeter等)
    • CPU
      • 占用
    • 内存
      • 占用
    • FPS(帧率)
    • 耗电
    • 流量
  • 压力测试
    • 服务器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
  • 进程&线程
    • 三个状态:就绪(被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)
  • == 和 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 可变
  • 增强for循环
    • for(Ele e : arrayname){};
  • Android的远程调用(就是跨进程调用)就是通过IBinder实现的,用于进程间通信
  • 如何实现多线程
    • Handler + thread
      • 主线程包含一个消息队列,存msg和runnable等对象
      • 用Handler向消息队列发送这两种对象并处理
      • 新建Handler对象是会绑定创建它的线程
      • handler会把对象存到消息队列里,并在他们出列时执行他们
    • AsyncTask
    • ThreadPoolExecutor
    • IntentService

算法/代码:

  • 位运算

  • 随机数生成器
    std::random_device rd; //(c++)
    rd()是一个随机数
    来自 http://c.biancheng.net/view/635.html

    import random
    print(random.randint(0,9))
    来自 https://www.runoob.com/python3/python3-random-number.html

  • 排序算法(冒泡和快排各自的优点),哪些是稳定的,哪些是不稳定的(稳定是指相同数字互相顺序不变)(这里只写了时间复杂度,实际上也要考虑空间复杂度)
    测试/测试开发复习

  • 电梯算法(电梯调度算法)

    • 先来先服务FCFS
      • 按照乘坐顺序进行调度
    • 最短寻找楼层时间优先(SSTF)
      • 下一个服务对象是楼层离现在最近的对象
      • 可能把人困在电梯
    • 扫描算法(SCAN)
      • 比SSTF稳定
      • 一直在1楼到顶楼徘徊
      • 非实时
    • LOOK算法
      • 改进的SCAN,当移动方向的前方没有请求时改变方向
    • SATF算法
      • 与SSTF相似,但不是找楼层的时间,而是最短访问时间
  • 实时电梯调度算法

    • 最早截止期优先调度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算法

  • 决策树和聚类

相关标签: 软件测试