驱虫师之软件测试——全网最长篇
计算机基础知识
-
B/S 浏览器和服务器架构 广域网,用户广,安全性低
-
C/S 客户端和服务桥架构 局域网,用户稳定,安全性高
OSI 七层结构
-
物理层
-
数据链路层
-
网络层
-
传输层
-
会话层
-
表示层
-
应用层
TCP/IP协议
-
传输层
-
应用层
-
网络互连层
-
网络接口层
DOS常规操作
-
arp -a ip地址与物理地址的对应关系
-
cls 清屏
-
盘符 切换到对应的盘
-
cd 切换到对应的文件夹
-
dir 显示对应的目录
-
cd .. 返回上一级的目录
-
cd / 返回根目录
-
md 创建新目录
软件测试理论
软件测试流程
-
1.需求分析
-
2.测试用例(根据需求文档,摘抄测试点,编写测试用例)
-
3.评审测试用例
-
4.搭建测试环境
-
5.等待测试包
-
6.部署测试包
-
7.冒烟测试
-
8.执行测试用例
-
9.跟踪bug,进行回归测试
测试流程
-
需求评审
-
测试计划
-
测试用例
-
用例评审
-
冒烟测试
-
测试执行
-
验收测试
-
风险评估
-
上线\观察
-
问题跟进
-
测试报告
-
复盘会议
测试方法
-
按阶段:单元测试、集成测试、系统测试、验收测试
-
按手段:黑盒测试、白盒测试、灰盒测试
-
其他:冒烟测试、回归测试
测试用例设计方法
-
黑盒测试用例设计:等价类划分法、边界值分析法、错误推测法、因果图法、正交试验分析法、流程分析法
-
白盒测试:语句覆盖、判定覆盖、条件覆盖、条件组合覆盖、判定/条件覆盖、路径覆盖
设计一个登录页面的用例
-
功能测试:正确输入、为空输入、字符类型校验、长度校验、密码是否加密显示、大写提示、跳转页面是否成功、登出后用另一个账号登录
-
UI测试:界面布局合理、风格统一、界面文字简洁好理解、无错别字
-
性能测试:打开登录页面需要几秒、点击登录跳转首页需要几秒、多次点击、多人点击
-
安全性:用户名额密码是否加密发送给服务器、错误登录次数限制(防止暴力破解)、一台机器登录多个用户、一个用户多方登录、检查元素能否看到密码
-
兼容性测试:不同浏览器、不同平台(Windows、Mac)、移动设备能否工作
-
易用性:输入框可否tab键切换、回车能否登录等
App的兼容性如何测?App的接口测试如何测?
-
系统兼容(ios、安卓)、机型兼容(iPhone、华为、小米、三星、vivo、OPPO)、分辨率兼容、软件本身向前向后兼容
-
接口测试:获取接口文档、使用fiddler抓包工具获取接口的请求方式、url、请求参数、返回参数、然后使用postman、jmeter进行测试
Web端测试和App端测试有何不同(常见)
-
系统结构方面
-
Web项目,b/s架构,基于浏览器的;Web测试只要更新了服务器端,客户端就会同步更新;
-
App项目,c/s结构的,必须要有客户端;App修改了服务端,则客户端用户所有核心版本都需要进行回归测试一遍;
-
-
兼容方面
-
Web项目:
-
浏览器(火狐、谷歌、IE等)
-
操作系统(win7、win10、Linux等)
-
-
App项目:
-
设备系统:ios(ipad、iphone)、Android(三星、华为、联想等)、Windows(Win7、Win8)、OSX(Mac)
-
手机设备可根据手机型号、分辨率不同
-
-
-
性能方面:
-
Web项目:需检测 响应时间、CPU、Memory
-
App项目:除了检测 响应时间、CPU、Memory外、还要检测流量、电量等
-
-
相对与Web项目,App有专项测试
-
干扰测试:中断、来电、短信、关机、重启等
-
弱网络测试(模拟2g、3g、4g、wifi网络状态以及丢包情况);网络切换测试(网络断开重连、3g切换至4g/wifi等)
-
安装、更新、卸载
-
安装:需要考虑安装时的中断、弱网、安装后删除安装文件等情况
-
卸载:需要考虑 卸载后是否删除App相关的文件
-
更新:分强制更新、非强制更新、增量包更新、断点续传、弱网状态下更新
-
-
-
界面操作:关于手机端测试,需注意手势、横竖屏切换、多点触控、前后台切换
-
安全测试:安装包是否可反编译代码、安装包是否签名、权限设置、例如:访问通讯录等
-
边界测试:可用存储空间少、没有SD卡/双SD卡、飞行模式、系统时间有误、第三方依赖(QQ、微信登录)等
-
权限测试:设置某个App是否可以获取改权限,例如是否可以访问通讯录、相册、照相机、话筒、位置等
测试常用的工具
-
需求问题跟进、测试计划、风险评估登记、测试报告、复盘会议:Wiki
-
测试用例:Xmind编写、Testlink管理
-
测试执行:ELK、Xshell等
-
Bug管理:Jira、bugfree、禅道等
-
接口测试相关:Chares、Fiddler、Postman、JMeter等
-
自动化相关:Selenium、Appium、pytest、Locust、JMeter等
工具对用例进行管理
-
Testlink管理用例的一般步骤:新建计划、新建版本、上传xml文件、添加测试用例到测试计划中、分配测试用例给开发、查看用例执行报告
-
Xmind
-
Excel:用例编号ID、测试项目(单元、模块)、测试标题、优先级、预置条件、测试输入、操作步骤、预期结果、【作者】、【创建时间】、【修改时间】、测试结果
使用ELK定位日志
-
查看产品推送是否成功。产品从A平台推送到B平台,根据A平台的链接id,搜索对应的日志。搜索不到,则为A平台推送失败。搜索到了,查看推送的状态,可进一步判断问题所在
-
使用官方文档,可以进一步了解ELK日志查看
埋点测试如何测试?使用什么工具?数据要不要入库?
-
使用Charles、Fiddler抓包,查看对应的来源记录、事件等必要参数是否正确,查看数据库记录是否正确
Fiddler和Postman的区别
-
Fiddler主要是抓包,Postman主要进行接口请求
使用Postman进行多个接口请求
-
将多个接口请求归纳到一个集合里,在集合的右上角点击展开箭头,点击Run
日常工作中JMeter的使用
-
接口测试:通过对指定接口进行请求访问,验证数据出入的准确性与安全性
-
性能测试:编写对应的测试集,通过脚本控制线程数,实现逐步加压等
软件测试质量模型(ISO9216)
-
1.功能性
-
2.可靠性
-
3.易用性
-
4.效率
-
5.可维护性
-
6.可移植性
软件测试质量体系(SQA)
-
1.保证计划的进行
-
2.保证遵循步骤和需求
-
3.及时通知开发人员
-
4.高管可以接触到软件的内部
-
5.软件质量需要测试工作来保证
功能测试用例基本结构规范
-
正常逻辑测试
-
正常流程
-
用户正常的操作测试
-
-
辅助提示
-
操作成功、失败提示——操作成功提示、操作失败提示后返回,原始数据不清除、输入框长度提醒等
-
-
数据去向
-
操作对象、数据库数据值校验——数据落地保存、缓存数据库保存、字段长度等
-
-
-
容错性测试
-
数据校验
-
长度、类型、格式——1、姓名、年龄、手机号码、身份证、营业执照等长度、类型、格式校验、必要时进行正则验证;2、涉及金额相关需要进行范围性校验及二次确认,在范围外做好提示二次校验或者禁止提交等
-
-
必录项
-
必录项控制校验——必录项 为空或null等测试
-
-
功能次序
-
混乱测试容错性测试——1、前端界面次序混乱测试;2、接口层面次序混乱测试
-
-
功能鉴权
-
容错性接口测试——接口字段缺省,字段值为空,错误类型(int传string)、字段长度(超过数据库设置)等
-
-
辅助测试
-
输入控制提示,必录项控制提示,系统设置提示——1、必录项提示后保留已输入数据;2、APP输入手机号码等纯数字时,键盘跳转至数字键盘。
-
-
-
数据来源
-
编码项
-
编码项可选来源过滤——1、前端过滤;2、接口过滤
-
-
系统权限过滤
-
审批权限、其他权限等——权限开通关闭数据库落地,权限变更时系统提示重新登录等
-
-
状态、关键字过滤
-
敏感字、关键字过滤——流程性状态过滤
-
-
-
页面元素测试
-
页面位置
-
每个页面位置叙述——根据用户习惯输入先后顺序,输入框尺寸
-
-
查询条件项
-
查询条件筛选,条件数据项——模糊查询、条件选择性测试
-
-
列表项
-
查询结果字段——列表排序
-
-
详情页面项
-
详情链接页面数据项——位置合理性
-
-
分页功能项
-
查询结果列表分页——分页查询,每页显示条数自由选择或合理性判断
-
-
页面初始值
-
新增、修改、查询页面数据项的初始值——修改初始值读取原数据
-
-
-
数据流
-
基本数据流
-
主干数据流:业务功能的最大集合
-
-
备选数据流
-
选择数据流:主干条件分支
-
-
WEB功能测试——页面控件模型
普通文本输入框控件
-
校验为空
-
校验等于最大值-1长度
-
校验等于最小值-1长度
-
校验对齐方式
-
校验前空格
-
校验后空格
-
校验中间空格
-
校验等于最大值长度
-
校验等于最大值+1长度
-
校验等于最小值长度
-
校验是否禁用HTML代码
-
校验高危字敏感字过滤
-
校验特殊字符
单选下拉选择框控件
-
校验默认选项
-
校验刷新页面
-
校验对齐
-
校验滚动条
-
校验为空
-
校验内容长度
-
校验排序
时间选择框控件
-
校验支持为空
-
校验不支持为空
-
包装日历组件
-
校验显示格式
-
检验支持全角字符
-
校验包装日历支持手工输入
-
校验默认日期
-
校验输入日期中带有特殊字符
-
校验输入小时中带有特殊字符
-
校验输入分钟中带有特殊字符
-
校验输入秒钟中带有特殊字符
-
校验输入年份中带字母
-
校验输入月份中带字母
-
校验输入日期中带字母
-
校验输入秒钟中带字母
-
校验输入年份中带汉字
-
校验输入月份中带汉字
-
校验输入日期中带汉字
-
校验输入小时中带汉字
-
校验输入分钟中带汉字
-
校验输入秒钟中带汉字
-
校验修改日期字段正确生效
-
校验修改小时字段正确生效
-
校验修改分钟字段正确生效
-
校验修改秒钟字段正确生效
WEB功能测试——页面动作模型
翻页动作
-
校验页面内容显示
-
校验上翻按钮功能
-
校验下翻按钮功能
-
校验首页按钮功能
-
校验末页按钮功能
-
校验在首页点击上翻按钮
-
校验在末页点击下翻按钮
-
校验页数输入特殊符号
-
校验页数输入字母
-
校验页数输入0时处理结果
-
校验页数输入汉字时处理结果
-
校验页数输入大于最大页数
-
校验新增记录后查询结果显示是否正确
-
校验查询的最大记录数、显示时间
-
翻页后的页面定位是新开窗口还是原页面体跳转
-
翻页按钮是否在显眼地方,是否符合用户习惯
-
翻页新页面显示时间是否能接受
文件上传动作
-
校验为空
-
校验支持文件类型
-
校验不支持文件类型
-
校验等于文件最大容量
-
校验大于文件最大容量
-
校验支持文件为空
-
校验不支持为空
-
校验文件不存在
-
校验刷新页面
-
校验前空格
-
校验后空格
-
校验中间空格
-
上传成功后,是否正确显示上传文件路径
-
上传失败后,是否有友好的提示信息
-
必填项的标示是否正确
-
上传最大大小的文件需要的时间是否可以接受
文件下载动作
-
校验链接可点
-
校验链接不可点
-
校验下载方式
-
右键另存为是否正确下载文件,是否记录下载次数
-
工具下载是否正确,是否记录下载次数
-
返回按钮是否回到上一个页面
-
下载路径对应的硬盘空间不足时
-
后台设置了下载权限的文件是否在前台可以找到且下载
-
当前位置的提示是否显示正确
-
下载最大大小的文件需要的时间是否可以接受
-
按钮文字正确性
-
必填项的标示是否正确
表单清空/提交动作
-
校验前台数据清空
-
校验后台数据清空
-
校验刷新页面
-
校验错误目标页
-
校验正确目标页
-
校验支持单次提交
-
校验表单验证
全选/反选动作
-
是否实现了全选当前页的功能
-
全选按钮勾选状态变更是否正确
-
全选按钮勾选后,其他记录勾选变更是否正确
-
全选按钮是否在显眼的地方,是否符合用户习惯
-
全选后所有记录勾选上显示时间是否能接受
-
是否实现了反选当前页的功能
-
反选按钮勾选状态变更是否正确
-
反选后所有记录勾选上显示时间是否能接受
重置动作
-
默认值为空的数据项进行重置
-
默认值为已存在值的数据项进行重置
-
修改所有值数据项的值后进行重置
-
修改某个值数据项的值后进行重置,再重置
-
修改某个值数据项的值后刷新,再重置
-
修改某个值数据项的值后进行相关的操作(查询之类),在重置
-
修改多个值数据项的值后进行相关的操作(查询之类),在重置
WEB功能测试——基本操作模型
单个查询操作
-
分别对条件进行精确查询
-
输入长度的校验、输入允许的最大值进行查询,是否支持
-
两个查询条件是否是2选1,来回选择是否出现页面错误
-
输入字符
-
输入特殊字符
-
输入汉字
-
输入数字
-
条件中含有空格
-
输入超长字符
-
输入全角字符
-
输入单引号
-
输入单引号引起来的数据
-
输入双引号
-
输入双引号引起来的数据
-
查询结果按照什么顺序排序
-
查询结果是否根据字段显示排序功能
-
查询结果是否有分页,如果有,每页最多多少记录
-
查询结果是否匹配
-
查询结果是否与数据库一致
-
查询结果是精确查询还是模糊查询
-
输入框大小、文字大小是否合适
-
查询处理时间是否能接受
-
数据库存在大量数据时,查询处理时间是否能接受
-
多个用户同时查询时,输入相同或不同的条件查询后系统响应是否及时
级联查询操作
-
所有条件输入空查询
-
只输入一个关键条件查询
-
随机组合条件查询
-
输入所有关键条件查询
-
所有条件都输入查询
-
查询结果按什么顺序排序
-
查询结果是否根据字段显示
-
查询结果是否与数据库一致
新增操作
-
初始化数据正确性
-
进入功能后未修改任何数据项运行新增功能
-
清空功能中所有可删除的数据项后运行新增功能
-
录满功能中所有数据
-
服务器磁盘空间不足,不能新增
-
主键同名,唯一性验证
-
创建时间以服务器的时间为准
-
是否在任何情况下,都可以取消保存
-
如果存在重置功能,重置后是否正常保存
-
提交成功后有返回结果,成功失败页面或实时刷新列表
-
新增提交时间如果长,应出现进度显示表
-
新增的数据是否与数据库一致
-
系统是否有提供数据回显,那么回显数据与新增数据是一致的
-
如果新增数据后有返回到列表,则一般是新增的数据排在首页首行
修改操作
-
修改一条记录
-
是否支持同时修改多条记录
-
多用户同时修改同一记录
-
点击“取消”或“返回”是否给予提示
-
提交成功后有返回结果,成功失败页面或实时刷新列表
-
修改提交时间如果长,应出现进度显示
-
修改的数据是否与数据库一致
删除操作
-
删除一条记录
-
是否支持同时删除多条记录
-
一个用户 修改,一个用户删除同样的记录
-
无选择记录时删除是否控制
-
提交成功后有返回结果,成功失败页面或实时刷新列表
-
如果节点没有被其他功能关联,可以删除,反之不行
-
级联删除是否成功
数据导入操作
-
是否完成数据正常导入功能
-
导入文件的部分数据异常进行导入
-
导入文件的全部数据异常进行导入
-
导入文件的关键字段值在数据中不存在进行导入
-
导入文件的数据格式不符合进行导入
-
数据导入后列表中的显示是否正确
-
数据导入后在数据库中的显示是否正确
APP与WEB测试的主要区别:
APP特有的测试场景
-
默认键盘(如输入手机号码等场景时默认调用数字键盘)
-
九宫格、全键盘
-
多点触控
-
屏幕分辨率
-
安装卸载、覆盖安装、杀进程在启动、清理缓存(安卓)
-
手机权限(如相机、图片、本地文件、麦克风、通讯录、短信等)
-
手机自带按钮(如Android的后退、home键、IOS的home键)
-
机型、系统、分辨率等适配
-
emoji表情输入
-
GPS定位
-
电量、内存、CPU、流量等专项测试
-
调用其他app(如支付宝、微信支付等功能)
-
网络切换
web特有的测试场景
-
多浏览器登录、退出
-
浏览器缓存(如cookie清理,表单数据缓存)
-
浏览器前进、后退
-
浏览器兼容性
-
浏览器最大化、还原、页面自适应
-
输入全角、半角
-
js渲染
HTML理论
标签
<p>段落标签</p>
</br>回车换行标签
<em>倾斜强调标签</em>
<del>删除线标签</del>
<img src=" 路径" alt="图片不能加载的时候显示出来的文字">(图片)
<a href="超链接网址" target="_blank"(打开新的窗口)> </a>
<form(表格) action="后台管理" method="post"(加密传输) get(不加密传输)>
<input type="类型" name="名字" id="编号" placeholder="提示的信息"/>
</form>
CSS基础
单选按钮
<input type="radio" name="xb" id="nan" checked="checked"/> <label for="nan">男</label>
注意 : 添加name属性实现单选效果
添加label标签实现选男也可以实现单选效果,前提是for属性与对应的单选按钮的id属性值一致
设置默认选中状态,要给单选按钮添加checked="checked"属性
下拉菜单
<select name="">
<optgroup label="鹤山">
<option>沙坪</option>
<option selected="selected">古劳</option>
</optgroup>
</select>
注意:selected="selected"默认选中状态
文本域
<textarea width='' " height=" " placeholder=""></textarea >
注意不能用cols rows 来设置宽高,要用width,height设置 placeholder设置提醒文字
多选框
<input type="checkbox">
设置与单选框一致
按钮
<input type="reset">重置按钮
<input type="sumbit">提交按钮
设置autofocus="autofocus"设置第一个文本框上,默认选中状态
CSS基础语法
放在head标签之间
<style type="text/css">
标签选择器 p{Text-indent:2em;}
id选择器 #id名
类选择器 .class名(经常用,可以重用,并且可以可以添加多个样式)
选择器的权重 id选择器 >类选择器 >标签选择器
后代选择器 Div span
并级选择器 Div,span
标签选择器 div.类名
</style>
<div></div>大容器 (可以在一行显示)
<span></span>小容器 ( 可以在一行显示)
CSS的引入方式
内嵌式 电商首页必须用
外链式 使用<link />(标签) 实现代码分离
行内式(权重最高)
内嵌式和外链式权重一样,先写会被后写覆盖
CSS常用属性
font-weight 设置字体的粗细 normal 代表不加粗 bold代表加粗
font-style 设置字体倾斜 italic 代表倾斜 normal代表不倾斜
text-decoration 设置线 none 没有线 underline 下划线 overline 上划线
line-through 贯穿线 删除线
world-break:breal-all 强制换行
:hover 代表鼠标悬停状态的样式
line-height 行高
边框属性
Border:1px solid(实线) red; dashed(虚线) 四个方向border-left (right top right bottom )只有实线和虚线兼容
CSS盒子模型
padding 内边距 margin 外边距
html5 新标签 建议pc端不要用,手机段可以用
header 头部
nav 导航
aside 侧导航
article 文章块
footer 底部
测试用例设计
开发模式
-
瀑布模式过程:需求分析——设计——编码——实现——软件测试——完成——维护优点:各个阶段比较清晰,适用于需求比较稳定的产品,强调早期计划和调查改良:过程中加入少量的迭代过程(重复工作 [例如再一次和产品经理等人确认需求] )
-
快速原型模型过程:快速分析——需求说明——构造原型——原型——运行原型——评价原型——修改意见优点:适合于不确定需求的系统
-
螺旋模型(瀑布模型重复进行)不建议使用
测试模型
-
V模型过程:需求分析-概要设计-详细设计-编码-单元测试(单一模块)-集成测试(所有模块)-系统测试(功能,性能,兼容)
-验收测试(α测试(测试人员测 许多bug) β测试(用户测试)γ gamma测试)优点:底层测试:单元测试 高层测试:系统测试 阶段清晰,便于把控
缺点:错误不能及时发现 线性关系,返工量大,灵活性低
改良:步骤添加少量的迭代
-
W模型
优点:开发和测试同时进行,趁早找出缺陷 分阶段工作,便于项目管理
缺点:线性模型,返工量大,灵活性低 没有文档,w基本不适用 实现难,对技术人员要求高
-
H模型基本不用
测试分类
随机测试:以前发现重大bug,新功能,重要功能,特殊情况进行二次测试,结合回归测试。
测试方法
等价类划分(黑盒测试方法)
分为:有效等价类和无效等价类(特殊情况: 中文,英文,特殊字符,空,空格 )
-
等价类的细节
-
输入长度
-
输入类型
-
组成规则
-
是否为空
-
是否区分大小写
-
是否重复
-
是否去除空格
-
-
边界值方法注意边界二端的数值
-
因果图输入条件相互制约,相互依赖的情况
-
判定表(因果图而来)组成部分:条件桩(所有条件) 动作桩(所有结果) 条件项(所有条件桩的取值) 动作桩(所有动作桩的取值)
-
场景法(冒烟测试) 流程分析法(需要上面的方法完善)根据业务流程检测
-
错误推断法根据自己的经验
正交表、混合正交表、缺陷管理
正交表
使用:1.根据取值和控件选择一个合适的正交表(没有符合的正交表,选择同类型正交表,并且优先选择用例多)
n:代表列数
:代表测试用例所有的情况 m:代表取值 k:代表控件
2.列举取值并进行编号,生成取值表
3.取值表与对应的正交表进行映射
混合正交表工具
适用于因素(控件)和水平(取值)不同的场景
1.在excel制作取值表
2.将取值表复制到文本文档(txt),将txt文件复制到allpairs.exe所在(混合正交工具)文件夹下
3.通过cmd命令,cd命令运行allpairs.exe所在的路径,输入 apppairs.exe 刚建的txt文件>运行结果的txt文件(不需要自己建)
测试用例方法的选择
-
要测试功能和流程,使用场景法(冒烟测试)
-
要测试输入数据,使用等价类方法,加上边界法
-
要测试条件组合数据,要利用因果图构造判断表
-
配置类软件,组合比较多,使用正交表法
-
测试用例达到覆盖标准,自己添加用例
-
依靠自己经验追加测试用例(错误推断法)
软件缺陷
-
软件未达到规格说明书表明的功能
-
软件出现了规格说明书指明不会出现的错误
-
软件功能超出了规格说明书指明的范围
-
软件未达到规格说明书虽未指明但应该达到的目标
-
软件测试人员或用户觉得不好
缺陷的表现形式
-
功能、特性没有实现或者部分实现
-
设计不合理,功能不明确,逻辑不清楚或者矛盾
-
实际结果和期望结果不同
-
没有达到规格说明书的性能标准
-
运行出错,崩溃,中断,界面混乱
-
数据不准确,精度不够,不完整和格式不统一
缺陷的严重性Severity
-
blocker:即系统无法执行,崩溃,或严重资源不足,应用模块无法启动或异常退出,无法测试,造成系统不稳定。常见的有严重花屏、内存泄漏、用户数据丢失或破坏、系统崩溃/死机/冻结、模块无法启动或异常退出、严重的数值计算错误、功能设计与需求严重不符、其它导致无法测试的错误, 如服务器500错误
-
critical:即映像系统功能或操作,主要功能存在严重缺陷,但不会映像到系统稳定性。常见的有:功能未实现,功能错误、系统刷新错误、数据通讯错误、轻微的数值计算错误、影响功能及界面的错误字或拼写错误
-
major:即界面、性能缺陷、兼容性,常见的有:操作界面错误,边界条件错误,提示信息错误,长时间操作无进度提示,系统未优化,兼容性问题
-
minor/trivial:即易用性及建议性问题
缺陷的优先级Priority
-
immediate:即马上解决
-
urgent:急需解决
-
high:高度重视,有时间要马上解决
-
low:在系统发布前解决,或确认可以不用解决
软件缺陷的分类
-
系统缺陷
-
数据缺陷
-
数据库缺陷
-
接口缺陷
-
功能缺陷
-
安全性缺陷
-
兼容性缺陷
-
性能缺陷
-
界面缺陷
-
建议
缺陷报告的注意事项
-
缺陷可以重现
-
一个缺陷只写一个缺陷报告
-
需要写期望结果
Linux基础
Linux基础
/ (根文件夹)分为 root 和 home/
cd命令
cd ~ 回到家文件夹下(home的下一级文件夹)
cd .. 回到上一级文件夹
cd /home/ 从跟文件夹开始 绝对路径
cd admin-a 相对路径
cd - 回看功能
pwd 当前文件夹的绝对路径
ls命令 查看文件夹的目录的命令
ls 查看文件夹的目录
ls -a 查看文件夹的所有目录
ls -l 查看文件夹的目录的详细信息
ls -lh 查看文件夹的目录的详细信息(变得更人性化)
ls -l === ||
ll -ha 查看文件夹的所有目录的详细信息(变得更人性化)
ll *txt 查看以txt结尾的文件
mkdir 创建目录命令
mkdir a b 在当前目录下创建两个文件夹
mkdir /home/admin/fung/666 888 -p 在绝对路径下创建文件夹,即使上一级目录不存在,也 会先自动创建上一级目录
mkdir /home/admin/fung/666/{888,168} 在绝对路径下,创建两个文件夹
mkdir .688 创建隐藏文件
rm命令 删除文件或文件夹
rm 文件名字 或者隐藏文件
rm 文件夹名字 -r
rm * -r
touch 创建txt文件命令
touch 1.txt 在当前目录下创建
gedit 1.txt 用记事本的方式打开
权限的表示
d rwx rwx -x d第一个字母代表文件夹,-代表txt文件
r 读的权限 w 写的权限 x 执行的权限 -x只有执行的权限
第一个rwx代表用户的权限 第二个代表用户组的权限 第三个代表其他用户的权限
eg:chmod +x install.sh 可执行权限
chmod +777 install.sh 所有权限,一步到位
cp 复制文件命令
cp 源文件 新文件 一般txt类型
cp 源文件 新文件 -r 文件件类型
重定向命令
ls >txt文件 ls命令输出的结果复制到txt文件中,会覆盖之前的数据
ls >>txt文件 ls命令输出的结果复制到txt文件中,不会覆盖之前的数据
cat 查看文件夹命令
cat 1.txt 把文件夹的内容显示在屏幕上
cat 1.txt 2.txt > 3.txt 把1.txt和2.txt的内容复制到3.txt文件夹中,并且查看文件夹
tail -f 实现实时监控动态更新的txt文件
more 分页查看命令
more 1.txt 空格键翻页,按b键回翻,q是退出
| 管道命令
ls la | more 把左边的命令完成的结果交给右边的命令处理
Linux技能篇
工作中常用的Linux命令
awk、sed、vim、iotop、dstat、cp、top、ifconfig、pwd、cd、ll、ls、cat、tail、grep、mv、rm、mkdir、df、du
可以帮助Linux执行Windows上传的脚本
-
改变编码格式
-
vim test.sh
-
:set ff?//显示dos的话
-
:set ff=unix:wq
Linux三剑客
-
grep命令
-
根据用户指定的模式 pattern 对目标文本进行过滤,显示被模式匹配到的行;
-
grep [options] pattern [file]
-
常用参数:
-
-v 显示不被pattern匹配到的行
-
-i 忽略字符的大小写
-
-n 显示匹配的行号
-
-c 统计匹配的行数
-
-o 仅显示匹配到的字符串
-
-E 使用ERE,相当于egrep(可以识别更多的正则表达式式规则)
-
-
-
sed命令
-
流编辑器,用来处理一行数据。将一行数据存储在模式空间中——>用sed命令处理——>送入屏幕——>清空空间
-
常用参数
-
-h 显示帮助
-
-n 仅显示script处理后的结果
-
-e 指定的脚本来处理输入的文本文件
-
-f 以指定的脚本文件来处理
-
-
常用动作:
-
a: 新增 sed -e '4 a newline'
-
c: 取代 sed -e '2,5c No 2-5 number'
-
d: 删除 sed -e '2,5d'
-
i: 插入 sed -ed '2i newline'
-
p: 打印 sed -n '/root/p'
-
s: 取代 sed -e 's/old/new/g'
-
g: 代表全局
-
-
-
awk命令
-
把文件逐行的读入,以空格为默认分隔符将每行切片。把行作为输入,并赋值给0——>将行切段,从1开始——>对行匹配正则/执行行动作——>打印内容
-
awk 'pattern + action' [filenames]
-
常用语法:
-
filename awk 浏览的文件名
-
begin 处理文本前要执行的操作
-
end 处理文本之后要执行的操作
-
fs 设置输入域分隔符,等价于命令行-F选项
-
nf 浏览记录的域的个数(列数)
-
nr 已读的记录数(行数)
-
-
常用参数:
-
ofs 输出域分隔符
-
ors 输出记录分隔符
-
rs 控制记录分隔符,换行标志
-
$0 整条记录
-
$1 第一条分隔后的记录
-
-
定位Linux服务器下的日志的命令
-
如果要监控日志,那么使用 tail -f |grep XXX 命令,过滤需要的字段
-
如果在完整日志中查看内容,使用 cat XXX.log | grep XXXXX | awk '{print $1}' 等命令过滤自己需要的内容;
简述项目中的环境搭建和维护
-
结合自身经验先从系统安装开始,如常用的 CentOS 和 Ubuntu 说起,系统安装主要是磁盘分区和磁盘阵列问题;
-
基础环境依赖,如 MySQL、Redis、Jenkins、Docker、项目中用到的其他依赖环境等;
-
维护方便主要从遇到的错误说起,如无法远程连接、服务器加固等;
数据库基础
查询语句
select * (字段名) from 表名
删除语句
deleect from 表名
更新语句
update 表名 set 字段名=?
增加数据语句
insert into 表名 values(),()... 可以插入多个值
insert into 表名(字段名) values (),()... 可以插入多个值
模糊查询(like)
% (任意字符)_(一个字符) 例子: select * from student where name like '王%' 查询姓王的所有人的信息 select * from student where name like '王_' 查询姓王却只有一个字
范围查询(in)
in
例子 :select * from student where hometown in('北京','广州','上海') (查询家乡 是北京或者是广州或者是上海的学生的信息)
select * from student where age between 18 and 20 (查询年龄18-20的学生的信 息)
select * from student where card is not null (查询card填写了的学生的信息)
select *from student where card='' (查询card没有填写的学生的信息)
排序查询(默认升序asc)
例子:select * from student order by age asc,student_NO desc(按照age的升序,student_NO 的降序查询学生的信息)
聚合函数
select max(age),min(age),sum(age), avg(age),count(age)(统计总数的功能) from student
分组排序
select sex count(*) from student group by sex having sex='男' (按照sex分组,having是筛选,筛选男的)
分页查询
select * from student limit 0,3 (从第零条开始,查询三天数据) distinct 过滤掉重复的数据 primary key 主键 auto_increment 自增 unsigned (没有定义)理解为没有负数的定义 tinyint 一个字 节 int 四个字节 不用限制位数,因为已经有取值范围 decimal (5,2) 五位数,有二位是小数
数据库基础知识
多表查询(可以用where进行连接)
内连接(多表的交集查询) 语法:(链接左表)inner join(链接右表) on条件(对应的表一样的字段) 左链接 (不改变左表内容,对相应的表进行配对) 语法:(链接左表)left join(链接右表) on条件(对应的表一样的字段) 右链接 (不改变右表内容,对相应的表进行配对) 语法:(链接左表)right join(链接右表) on条件(对应的表一样的字段)
关键字查询
any some all
自关联(等于多表查询)
注意需要修改表的名字
存储过程
delimiter // 定义用上面执行语句 create procedure 存储过程的名称 begin sql语句 end // delimiter ; call 存储过程名称(调出语句)
视图
create view 视图名 as select语句
事务
begine; 执行语句 缓冲区 commit; rollback; (回滚最开始)
索引
create index 索引名称 on 表名(字段名称(字段长度注意字段长度要与原字段的长度保持一致
查看日志文件
show variables like 'general%' 打开日志文件 set global general_log=1(打开) 等于0是关闭状态 Linux 动态查看日志文件 例如:网页操作的时候动态显示数据库的执行情况 tail -f 日志文件名称
什么时候用到数据库
-
对于一些重要的数据(金额),看有没有写进数据库里
-
对于一些数据修改它们的状态,方便测试
什么时候用到Linux
-
查看日志 tail -f 日志文件
-
埋点测试(对于按钮使用的次数,分析用户的喜爱)
什么时候用到fiddler
-
看重要的数据有没有加密
-
进行断点的时候,修改数据,看数据能否正常的运行(例如:电商项目,把价格发送到服务器的时候进行断点,修改价格,能否正常传输)(例如:电商项目,服务器把价格发送到前端的时候进行断点,修改价格,能否正常传输)
区分是前端还是后端的bug
-
可以通过抓包分析,设置断点,看发送的数据或者信息,返回的数据或者信息来判断是前端还是后端的bug
MySQL常用命令大全
命令行指令
1.启动MySQL net start mysql 2.连接与断开服务器 mysql -h 地址 -p 端口 -u 用户名 -p 密码
数据库操作
1.查看当前数据库 select database; 2.显示当前时间,用户名,数据库版本 select now(),user(),version(); 3.创建库 creat database [if not exists] 数据库名 数据库选项 其中数据库选项: CHARACTER SET charset_name COLLATE collation_name 4.查看已有库 show databases; 5.查看当前库信息 show create database 数据库名 6.修改数据库选项信息 alter databases 库名 选项信息 7.删除库 drop database [if exists] 数据库名
表操作
1.创建表 create [temporary] table [if not exists] [库名.]表名 (表结构定义)[表选项] 1).每个字段必须有数据类型,最后一个字段后不能有逗号 2).temporary表示临时表,会话结束时表自动消失 3).对于字段的定义如下: 字段名 数据类型 [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [UNIQUE [KEY] |[PRIMARY] KEY] [COMMENT ‘string’] 4).表选项 a.字符集 CHARSET = charset_name 如果表没有设定,则使用数据库字符集 b.存储引擎 ENGINE = engine_name
数据库篇
工作中常用的SQL语法
-
create table
-
create view
-
select from where
-
insert into
-
update set values
-
delete
-
alter
-
order by
-
having
数据库存储过程
-
一组数据库操作命令,当作是自己写的一个方法,一系列步骤自己去封装
SQL常见查询语句编写
-
查询所有学生的数学成绩,显示学生姓名name,分数,由高到低
SELECT a.name,b.score FROM student a,grade b WHERE a.id = b.id AND kemu = '数学' ORDER BY score DESC;
-
统计每个学生的总成绩(由于学生可能有重复名字),显示字段:学生id、姓名、总成绩
SELECT a.id,a.name,c.sum_score from student a,(SELECT b.id,sum(b.score) as sum_score FROM grade b GROUP BY id) c WHERE a.id = c.id ORDER BY sum_score DESC;
-
列出各门课程成绩最好的学生,要求显示字段:学号,姓名,科目,成绩
SELECT c.id,a.name,c.kemu,c.score FROM grade c,student a,(SELECT b.kemu,MAX(b.score) as max_score FROM grade b GROUP BY kemu) t WHERE c.kemu = t.kemu AND c.score = t.max_score AND a.id = c.id;
计算机网络篇
输入URL到网页显示出来的全过程
-
输入网址
-
DNS解析
-
建立TCP链接
-
客户端发送HTTP请求
-
服务器处理请求
-
服务器响应请求
-
浏览器展示HTML
-
浏览器发送请求获取其他在HTML中的资源
HTTP和HTTPS的区别
-
HTTPS里面是有证书的,HTTP并没有证书。证书的作用就是证明你是这个网站的拥有者。谁去证明?最顶级的CA去帮你证明,这些顶级的CA都是浏览器、操作系统本身就自动帮你集成,而且自动添加到设置信任里面去;
-
HTTPS要兼顾安全+性能的方面,由于对称式加密虽然速度很快,但是安全性特别低,因为双方要规定对称式加密的钥匙,别人都无法知道,但你怎么能确保别人不知道你的密钥呢,因此需要有非对称式加密去保证安全,但非对称式加密速度又很慢,如果客户端和服务器端都用非对称式加密,网络得卡死了。所以当双方建立好了非对称式加密后,子啊约定一个随机数,等大家都非对称解密之后呢,就能拿到只有对方知道的唯一随机数(密钥),就可以用密钥来进行对称式加密和解密了
HTTP的报文结构
-
HTTP请求报文:一个HTTP请求报文由请求行、请求头部、空行和请求数据4个部分组成
-
HTTP响应报文:HTTP响应由三个部分组成,分别是:状态行、消息报头、响应正文
HTTP常见的响应状态码
-
200 请求以成功,请求所希望的响应头活数据体将随此响应返回
-
201 请求已经被实现,而且有一个新的资源已经依据请求的需要而建立,且其URI已经随Location头信息返回
-
202 服务器已经接受请求,但尚未处理
-
301 (永久移动)请求的网页已永久移动到新位置。服务器返回此响应(对GET或HEAD请求的响应)时,会自动将请求者转到新位置
-
302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求
-
303 (查看其他位置)请求者应当对不同的位置使用单独的GET请求来检索响应时,服务器返回此代码
-
304 (未修改)自从上次请求后,请求的网页为修改过。服务器返回次响应时,不会返回网页内容。
-
305 (使用代理)请求者智能使用代理访问请求的网页。如果服务器返回此响应,还表示请求者应使用代理
-
307 (临时重定向)服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求
-
401 当前请求需要用户验证。如果当前请求已经包了Authorization证书,那么401响应代表着服务器验证已经拒绝了那些证书
-
403 服务器已经理解请求,但是拒绝执行它。与401响应不同的是,身份验证并不能提供任何帮助,而且这个请求也不应该被重复提交
-
404 请求失败,请求所希望得到的资源未被在服务器上发现
-
500 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器的程序码出错时出现
-
501 服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求
-
502 作为网关或者代理工作的服务器长是执行请求时,从上游服务器接到无效的响应
-
503 由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况只是临时的,并且将在一段时间以后恢复
cookie和session机制的区别
-
cookie数据保存在客户端,session数据保存在服务器端
-
cookie可以减轻服务器压力,但是不安全,容易进行cookie欺骗
-
session较安全,但占用服务器资源
TCP和UDP的区别
-
TCP:面向连接,可靠的,速度慢,效率低
-
UDP:无连接、不可靠、速度快、效率高
TCP为什么是三次握手和四次挥手
-
三次握手能保证数据可靠传输又能提高传输效率。若握手是两次:如果只是两次握手,至多只有连接发起的其实序列号能被确认,另一方选择的序列号则得不到确认;
-
要保证双方都关闭了连接。因为TCP是全双工的,就是要等到两边都发送fin包确认双方都没有数据传输后菜关闭;
TCP为什么最后挥手后会有time_wait
-
为了保证可靠的断开TCP的双向连接,确保足够的时间让对方收到ACK包。若客户端回复的ACK丢失,server会在超时时间到来时,重传最后一个fin包,处于TIME_WAIT状态的client可以继续回复fin包,发送ACK。
-
保证让迟来的TCP报文段有足够的时间被识别和丢失,避免新旧连接混淆。有些路由器会缓存没有收到的数据包,如果新的连接开启,这些数据包可能就会和新的连接中的数据包混在一起。连接结束了,网络中的延迟报文也应该被丢弃掉,以免影响立刻建立的新连接。
简要说明HTTP请求中的Post和Get有哪些区别
-
请求头多了content—length和content—type字段
-
Post 可以附加body,可以支持form、json、xml、binary等各种数据格式
-
行业通用规范
-
无状态变化的建议使用 Get
-
数据的写入与状态的修改建议使用 Post
-
基于HTTP协议:都是请求返回数据,Get将请求体放在头上,只发一次请求,Post将请求体放在内部,需要发送两次请求
-
GET 在浏览器回退时是无害的,而 POST会再次提交请求
-
GET请求会被浏览器主动cache,而POST不会,除非手动设置
-
GET请求只能进行URL编码,而POST支持多种编码方式
-
GET请求在URL中传送的参数是有长度限制的(2048字符 IE浏览器 2083字符),而POST没有
-
对参数的数据类型,GET只接受ASCII字符,而POST没有限制
-
GET比POST更不安全,因为参数直接暴漏在URL上,所以不能用来传递敏感信息
如果一个请求,返回的状态码是200,但是没有内容,可能发生了什么?
-
请求头缺失或错误
-
参数length不符
Python 编程篇
python中类方法、类实例方法、静态方法的区别
-
实例方法:由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self;
-
类方法:由类调用;至少一个cls参数;执行类方法时,自动将调用改方法的类复制给cls;
-
静态方法:由类调用;无默认参数;
dict 和tuple 及 list 的区别(这里列的时主要区别)
-
tuple是不可变对象,list 和 dict 都是可变对象,这里的不可变指的是指向地址不可变;
-
list 是有序的,dict 是无序的,不可存放有序集合;
-
dict 查找速度快,不管有多少个元素时间都一样,list 查找速度慢,需要有序查找;
-
dict 的key 为不可变对象,且不可重复,list 则可以重复,存放任意对象
JSON 和 dict的区别
-
JSON 是一种数据格式,纯字符串。dict 是一种完整的数据结构;
-
dict 是一个完整的数据结构,是对Hash Table这一数据结构的一种实现,是一套从存储到提取都封装好了的方案。它使用内置的哈希函数来规划key对应value的存储位置,从而获得O(1)的数据读取速度;
-
JSON的 key 只能是字符串,python的 dict 可以是任何可hash对象(不可变对象);
-
JSON的 key 可以是有序、可重复的;dict 的 key 不可重复,且无序;
-
JSON任意 key 存在默认值 ndefined,dict 认没有默认值;
-
JSON访问方式可以是 [],也可以是 . ,遍历方式分 in、of ;dict的value仅可以下标访问;
-
dict 可以嵌套 tuple, JSON里只有数组;
python 会不会出现内存泄漏
-
当对象之间互相引用的时候在删除的时候,可能会造成无法释放对象的情况,出现泄露;
python的同步和异步
-
直接得到最终结果的结果,就是同步调用
-
不直接得到的最终的结果,就是异步调用
-
同步与异步区别在于:调用者是否得到了想要的最终结果
常用手撕代码题
-
两个列表提取作为字典
dict(zip(list1,list2))
-
字符串反转输出
str = '123456'print(str[::-1])
l = list(str)l.reverse()print('',join(l))
-
实现斐波那契数列
def Fibonacci(loop): if loop == 0: return '无效参数' elif loop == 1: return 0 l = [0,1] for i in range(2,loop): l.append(l[i-1] + l[i-2]) return 1
-
找出驼峰数组的最大值
li = [1,2,10,10,2,1]print([v for v in li if v == max(li)])
-
水仙花数
sxh = []for i in range(100,1000): s = 0 for j in str(i): s += int(j)**3 if i == int(j)**3: sxh.append(i)print(sxh)
-
完全数
a = []for i in range(1,1000): s = 0 for j in range(1,i): if i % j == 0 and j < i: s += j if s == i: a.append(i)
-
幂的递归
def mi(a,n): if n == 0: return 1 else: return a * mi(a,n-1)
-
目录遍历
import os
def get_file(path,rule=''): files = [] for fpath,dirs,fs in os.walk(path): for f in fs: if os.path.join(fpath,f).endswith(rule): files.append(f) return files
自动化测试
自动化代码中,用到的设计模式
-
单例模式
-
工厂模式
-
PO模式
-
数据驱动模式
断言
-
检查一个条件,如果它为真,就不做任何事,用例通过。如果它为假,则会抛出AssertError并且包含错误信息。
UI自动化测试中,设置集群
-
Selenium Grid ,分布式执行用例
-
Appium 使用STF管理多设备
-
Docker+K8S 管理集群
对含有验证码的功能进行自动化测试
-
万能验证码
-
测试环境屏蔽验证
-
其他操作不推荐
优化和提高 Selenium脚本的执行速度
-
尽量使用 by_css_selector() 方法
-
by_css_selector() 方法的执行速度比 by_id() 方法的更快,因为源码中 by_id() 方法会被自动化转成 by_css_selector() 方法处理;
-
使用等待时,尽量使用显示等待,少用 sleep() , 尽量不用隐式等待;
-
尽量减少不必要的操作:可以直接访问页面的,不要通过点击操作访问;
-
并发执行测试用例:同时执行多条测试用例,降低用例间的耦合;
-
有些页面加载时间长,可以中断加载;
接口测试能发现的问题
-
可以发现很多在页面上操作发现不了的bug;
-
检查系统的异常处理能力;
-
检查系统的安全性、稳定性;
-
前端随便变,接口测好了,后端不用变;
-
可以测试并发情况,一个账号,同时(大于2个请求)对最后一个商品下单,或不同账号,对最后一个商品下单;
-
可以修改请求参数,突破前端页面输入限制(如金额);
Selenium中隐藏元素的定位
-
如果单纯的定位的话,隐藏元素和普通不隐藏元素定位没啥区别,用正常定位方法就行了
-
元素的属性隐藏和显示,主要是 type = 'hidden' 和 style = 'display:none;' 属性来控制的,接下来在元素里面让它隐藏,隐藏元素可以正常定位到,只是不能操作(定位元素和操作元素是两码事),操作元素是 click,clear,send_keys 这些方法 ;
-
JS操作隐藏元素;
判断一个页面上元素是否存在
-
方法一:用 try......except......
-
方法二:用 elements 定义一组元素方法,判断元素是否存在,存在返回 True,不存在返回 False
-
方法三:结合 WebDricerWait 和 expected_conditiions 判断(推荐)
提高脚本的稳定性
-
不要右键复制 xpath(不稳定),自己写相对路径,多用id为节点查找;
-
定位没问题,第二个影响因素那就是等待了,sleep等待尽量少用(影响执行时间);
-
定位元素方法重新封装,结合 WebDriverWait 和 expected_conditions 判断元素方法,自己封装一套定位元素方法;
定位动态元素
-
动态元素有2种情况,一个是属性动态,比如 id 是动态的,定位时,那就不要用 id 定位就是了;
-
还有一种情况动态的,那就是这个元素一会在页面上方,一会在下方,飘忽不定的动态元素,定位方法也是一样,按F12,根据元素属性定位(元素的tag、name的步伐属性是不会变的,动的只是class属性和styles属性);
通过子元素定位父元素
-
使用element.parent方法
平常遇到的问题,解决方法
-
可以把平常遇到的元素定位的一些坑说下,然后说下为什么没定位到,比如动态id,有iframe、没加等待等因素
一个元素明明定位到了,点击无效(也没报错),解决方法
-
使用 JS 点击,Selenium有时候点元素是会失效
测试数据存放位置
-
对于账号密码,这种管全局的参数,可以用命令行参数,单独抽出来,写在配置文件里(如 ini);
-
对于一些一次性消耗的数据,比如注册,每次注册不一样的数,可以用随机函数生成;
-
对于一个接口有多组测试的参数,可以参数化,数据放YAML、Text、JSON、Excel都可以;
-
对于可以反复使用的数据,比如订单的各种状态需要造数据的情况,可以放到数据库,每次数据初始化,用完后在清理;
-
对于邮箱配置的一些参数,可以用 ini 配置文件;
-
对于全部是独立的接口项目,可以用数据驱动方式,用 excel / csv 管理测试的接口数据;
-
对于少量的静态数据,比如一个接口的测试数据,也就2—3 组,可以写到py脚本的开头,十年八年都不会变更的;
数据驱动,实现参数化
-
参数化的思想是代码用例写好了后,不需要改代码,只需维护测试数据就可以了,并且根据不同的测试数据生成多个用例;
其他接口都需要登录接口的信息,怎么去让这个登录的接口只在其他接口调用一次
-
使用单例模式
-
使用自定义缓存机制
-
使用测试框架中的 setup 机制
-
pytest 中 fixture 机制
接口产生的垃圾数据如何清理
-
造数据和数据清理,需用python连数据库,做增删改查的操作测试用例其那只条件,setup 做数据准备后置操作,tearDown做数据清理。
用接口案例去覆盖业务逻辑
-
考虑不同的业务场景,一个接口走过的流程是什么样的,流程的逻辑是什么样的,什么样的参数会有什么样的结果,多场景覆盖;
性能
性能测试指标包括:
-
最大并发用户数,HPS(点击率)、事务响应时间、每秒事务数、每秒点击量、吞吐量、CPU使用率、物理内存使用、网路流量使用等
-
前端需主要关注的点:
-
响应时间:用户从客户端发出请求,并得到响应,以及展示出来的整个过程的时间
-
加载速度:通俗的理解为页面内容显示的快慢
-
流量:所消耗的网络流量
-
-
后端需主要关注的点:
-
响应时间:接口从请求到响应、返回的时间
-
并发用户数:同一时间点请求服务器的用户数,支持的最大并发数
-
内存占用L也就是内存开销
-
吞吐量(TPS):Transaction Per Second,每秒事务数。在没有遇到性能瓶颈时:TPS=并发用户数*事务数/响应时间
-
错误率:失败的事务数/事务总数
-
资源使用率:CPU占用率、内存使用率、磁盘I/O、网络I/O
-
从性能测试分析度量的角度来看,主要可以从如下几个大的维度来收集考察性能指标:
-
系统性能指标
-
资源性能指标
-
稳定新指标
-
-
如果一个需求没有明确的性能指标,要如何开始进行性能测试
-
先输出业务数据,如 pv 、pu、时间段等,计算出大概的值,然后不断加压测到峰值
JMeter 聚合报告内容包括:
-
请求名、线程数、响应时间(50 95 99 最小 最大)、错误率、吞吐量
如果有一个页面特别卡顿,设想一下可能的原因
-
后台:接口返回数据慢,查询性能等各种问题
-
前端:使用Chorme工具调试,判断 JS 执行久或是其他问题
-
网路问题
JMeter 和 LoadRunner 的区别
-
相对来说LoadRunner的笨重、昂贵、闭源、理念和生态都落后,而 JMeter 是开源的、可定制化开发、功能强大易用,并且子啊互联网大厂都已经有非常成熟的落地方案(主流的互联网公司基本都在使用 JMeter + ELK + Grafana + Influxdb 这套架构)
反问面试官
职责
-
团队中初级和高级人员如何平衡
-
针对员工有哪些培训和提升计划
技术
-
公司内部的技术栈
-
产品的架构
-
版本控制及迭代
-
服务器管理权限,本地计算机管理权限
团队
-
团队和团队之间如何沟通
-
遇到了分歧如何解决
-
团队正在经历的尚未解决的挑战是什么
-
绩效考核是如何算的
公司
-
晋升机会
-
是否有自己的学习资源
-
假期、加班工资等
测试开发
tdp和udp都是哪一层的,有什么应用场景ftp、dns分别用的是哪个?
-
传输层,ftp用tcp,dns用tcp和udp,区域传输用udp,当区域内的辅助dns服务器向主dns服务器请求数据进行更新时就是区域传输
和equal区别
-
判断地址是否相同,equal判断地址指向的内存空间中的值是否相同
深拷贝和浅拷贝
-
浅拷贝值增加一个新指针,指向已有的内存空间;
-
深拷贝增加新指针并申请新的内存空间
session和cookie
-
会话(Session)跟踪时web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术时Cookie与Session。
-
Cookie通过在客户端记录信息确定用户身份
-
Session通过服务端记录信息确定用户身份
-
cookie不属于HTTP协议范围,由于HTTP协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生。
-
cookie的工作原理:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器自动带上cookie,这样服务器就能通过cookie的内容来判断这个是“谁”了。
-
cookie虽然在一定程度上解决了“保持状态”的需求,但是由于cookie本身最大支持4096字节,以及cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是session。问题来了,基于http协议的无状态特征,服务器根本就不知道访问者是“谁”。那么上述的cookie就起到桥接的作用。
我们可以给每个客户端的cookie分配一个唯一的id,这样用户在访问时,通过cookie,服务器就知道来的人是“谁”。然后我们再根据不同的cookie的id,在服务器上保存一段时间的私密资料,如“账号密码”等等。
-
总结而言:cookie弥补了http无状态的不足,让服务器知道来的人是“谁”;但是cookie以文本的形式保存在本地,自身安全性较差;所以我们就通过cookie识别不同的用户,对应的在session里保存私密的信息以及超过4096字节的文本。
进程与线程,线程由哪几种模式?
三种模式:
-
继承thread
-
实现runnable接口,实现Callable接口通过FutureTask包装其来创建Thread线程
-
使用ExecutorService、Callable、Future实现由返回结果的线程
----- 继承Thread类创建线程 ----
1】d定义Thread类的子类,并重写该类的run()方法,该方法的方法体就是线程需要完成的任务,run()方法也称为线程执行体。 2】创建Thread子类的实例,也就是创建了线程对象 3】启动线程,即调用线程的start()方法
----- 实现Runnable接口创建线程 ----- 1】定义Runnable接口的实现类,一样要重写run()方法,这个run()方法和Thread中的run()方法一样是线程的执行体 2】创建Runnable实现类的实例,并用这个实例作为Thread的target来创建Thread对象,这个Thread对象才是真正的线程对象 3】第三部依然是通过调用线程对象的start()方法来启动线程
----- 使用Callable和Future创建线程 ----- 1】创建Callable接口的实现类,并实现call()方法,然后创建该实现类的实例(从java8开始可以直接使用Lambda表达式创建Callable对象)。 2】使用FutureTask类来包装Callable对象,该FutureTask对象封装了Callable对象的call()方法的返回值 3】使用FutureTask对象作为Thread对象的target创建并启动线程(因为FutureTask实现了Runnable接口) 4】调用FutureTask对象的get()方法来获得子线程执行结束后的返回值
写sql,所有课程成绩大于80分的学生名字
1 distinct:去重 select distinct name from table 2 where:语法:SELECT 列表名 FROM 表名称 WHERE 列 运算符 值 select name from table where grade > 80 3 order by:SELECT Company,OrderNumber FROM Orders ORDER BY Company,OrderNumber
先顺序排序company,然后在同样的company之间顺序排序ordernumber以逆字母顺序显示公司名称,并以数字顺序显示顺序号:
1 SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC 2 group by:SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer
having和where的区别
聚簇索引和非聚簇索引
-
聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据;
-
非聚簇索引:见数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,myisam通过key_buffer把索引先缓存到内存中,当需要访问数据时(通过索引访问数据),在内存中直接搜索索引,然后通过索引找到磁盘相应数据,这也就是为什么索引不在key buffer命中时,速度慢的原因。
主键和唯一键
-
当一个属性声明为主键时,它将不接受NULL值。另一方面,当声明为Unique额属性时,它可以接受一个NULL值;
-
表中只能由一个主键,但可以有多个唯一键;
-
定义主键时自动创建聚簇索引。相反,Unique键生成非聚簇索引
http 与 https 区别
-
https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用
-
http时超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议
-
http和https使用的时完全不同的连接方式,用的端口也不一样,前者是80,后者是443
-
http的连接很简单,是无状态的;https协议是由SSL+HTTP构建的可进行加密传输、身份认证的网络协议,比http协议安全
tcp/ip 三次握手
-
含义理解:TCP/IP协议不仅仅指的是TCP和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇,只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议
-
三次握手
-
客户端发送一个带SYN标志的TCP报文到server。这是三次握手过程中的报文1
-
server端回应client的,这是三次握手中的第2个报文。这个报文同一时间带ACK和SYN标志。因此它表示对刚才clientSYN报文的回应。同一时间又标志SYN给client,询问client是否准备好进行数据通讯
-
客户必须再次回应服务端一个ACK报文,这是第3个报文
-
连接终止协议(四次握手)
-
乐观锁和悲观锁
-
悲观锁:悲观锁原理是每次获取数据的时候,都会担心自己数据被修改,所以每次获取数据的时候都会进行加锁,确保在自己使用的过程中数据不会被别人修改,使用完成后再进行数据解锁。由于数据进行加锁,期间对该数据进行读写的其他线程都会进行等待。在Java中,synchronized的思想也是悲观锁。(如:同一个数据库表A用户在操作时B用户不能进行操作)适合写入较频繁场景,如出现大量的读取操作,每次读取都会进行加锁,这样会增加大量的锁的开销,降低了系统的吞吐量。
-
乐观锁:适合读取操作比较频繁的场景,如果出现大量的写入操作,数据发生冲突的可能性就会增大,为了保证数据的一致性,应用层需要不断的重新获取数据,这样会增加大量的查询操作,降低了系统的吞吐量。 (如:A用户操作一个表,B用户同时操作这个表,乐观锁认为不会冲突,但实际会造成冲突)
左连接、右连接和全连接
-
左连接:左边有的,右边没有的为null
-
右连接:左边没有的,右边有的为null
-
内连接:显示左边右边共有的
数据库中 sum 和 count 的区别及使用
-
count:统计查询出来的数据记录条数 select count(*) from 学生表;
-
sum:求和 select sum(garde成绩) from 学生表 where name="zhangsan"
JMeter跟踪重定向和自动重定向的区别
-
跟踪重定向通俗的理解就是跟踪请求执行的过程,并记录一些信息给开发者看到,我们一般可以在结果日志和监控中看到
-
自动重定向是不用跟踪请求执行过程,也不用记录
自动化测试selenium显示等待和隐式等待
显示等待就是有条件的等待
隐式等待就是无条件的等待
-
显示等待:设置等待时间WebDriverWait(driver,3,0.5)传入三个参数第一个是浏览器驱动第二个是等待多少秒第三个是每隔多少秒监控一次原理指定一个等待条件和一个最长等待时间,程序回判断在等待时间内条件是否满足,如果满足则返回,如果不满足会继续等待,超过时间就会抛出异常
-
隐式等待browser.implicitly_wait(10)直接等待10秒钟当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间在查找DOM,默认的时间是 0
pytest如何管理测试用例
-
掌握案例规则,如以test_开头,类以Test命名等
-
案例文件执行单个py如何执行,多个文件夹的管理方式
软件测试通过的标准
-
ISO90001—ISO90004标准
-
通过案例执行完成,bug验收通过,完成功能测试,集成测试
Linux如何实现凌晨定时执行脚本
Linux中,周期执行得任务一般由cron这个守护进程来处理。cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间。cron得配置文件称为“crontab”,是“cron table”得简写。
java如何实现多线程?线程得状态有哪些?
Java实现多线程得两种方法:
-
继承Thread类
-
实现Runnable接口
这两种方法的共同点:
不论用哪种方法,都必须用Thread(如果是Thread子类就用它本身)产生线程,然后在调用start()方法
两种方法得不同点:
-
继承Thread类有一个缺点就是单继承,而实现Runnable接口则弥补了它得缺点,可以实现多继承
-
继承Thread类如果产生Runnable实例对象,就必须产生多个Runnable实例对象,然后再用Thread产生多个线程;而实现Runnable接口,只需要建立一个实现这个类的实例,然后用这一个实例对象产生多个线程。即实现了资源的共享性。
线程共有6种状态:
NEW 、RUNNABLE 、BLOCKED、 WAITING 、TIMED_WAITING 、TERMINATED
分别对应:
新建、运行、阻塞、等待、带超时的等待、终止
查询数据库比较慢可能的原因:
-
没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)
-
I/O吞吐量小,形成了瓶颈效应
-
没有创建计算列导致查询不优化
-
内存不足
-
网络速度慢
-
查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)
-
锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)
-
sp_lock,sp_who,活动的用户查看,原因是读写竞争资源
-
返回了不必要的行和列
-
查询语句不好,没有优化
get 和 post 的区别
1、post用于修改,get是用于资源的获取,读取数据
-
其实这个是最根本的区别,也是http定义get和post的基本,但是并不是绝对的,不少公司也会用post获取数据,get提交数据,都是可行的;
2、post发送的数据更大,get有长度限制
-
其实这里有个误区,会觉得get的URL会有长度限制,有的人回说是1024字节,其实是不对的,http协议从未规定get/post的请求长度限制是多少,限制URL长度的通常是浏览器或者是web服务器,而且每个浏览器的限制长度都不相同;
-
post请求也不是完全没有限制,也是需要依赖于web服务器或者是依赖的服务,比如Tomcat默认限制大小就是2M,当然可以取消这个限制,只要你对你的网络传输有着足够的信心。
3、get的参数通常方式URL上,post的参数通常方式body里
-
当然这个是常规做法,post的参数要放URL上,也是可以的,只是看服务端想怎么取了。
4、get比post更快
-
post请求包含更多的请求头,因为post需要在请求的body部分包含数据,所以会多了几个数据描述部分的首部字段(如:content-type),但这个是微乎其微的
-
post在真正接收数据之前会先将请求头发送给服务器进行确认,然后才真正发送数据。这个就需要对TCP有一定了解,说的简单的,post会有一次服务器返回100 Continue响应
-
get可以将数据缓存起来,而post不会
-
post不能进行管道化传输
post 比 get 更加安全
-
post 数据不会缓存,也不会保存在服务器日志以及浏览器记录中
-
post 能发送更多的数据类型和各种编码或者进行非对称加密,而get只能发送ASCII字符
-
post 不能进行管道化传输以及post在真正接收数据之前会先将请求头发送给服务器进行确认
HTTP协议
-
HTTP协议是一种无状态协议。然而当用户访问服务器资源时,都需要判断你是谁,你有没有操作权限,这就需要一种会话状态维护机制,这时就设计了一套cookie、session、token用于状态维护。
cookie
场景:会话状态由客户端维护
-
例如你的身份信息(例如:账号和密码)存在客户端,每次请求时一并发送至服务器;根据你的身份返回响应信息。
步骤:
-
1、客户端发起访问请求
-
2、服务器生成cookie,并发送给客户端
-
3、浏览器保存返回的cookie数据
-
4、下面每次请求,浏览器都会将cookie数据连同请求一并发向服务器
cookie缺点
-
cookie大小不能超过4K,且受到浏览器本身对cookie个数限制,大约不超过50个。如果将大量用户数据存在cookie中,尤其是账号、银行卡号、密码等,存在被截取和篡改安全隐患。为了解决这些问题,提出session机制。
Session
场景:会话状态由服务端控制
-
session时一种服务端机制,请求时由服务端存储会话状态,解决了cookie中大小限制和敏感数据的安全性问题。session可以存储在内存或者数据库中。
步骤:
-
1、登录,用户提交用户名和密码发送HTTP请求;
-
2、服务端验证用户发来的用户名密码。如果正确,则生成一个session。返回一个sessionid设置到响应cookie中,例如jsessionid=222212122111;
-
3、用户收到HTTP响应后,响应头cookie中sessionid存储到浏览器中。在此后的请求中发送该cookie给服务器;
-
4、服务端收到此后的HTTP请求后,首先验证sessionid,如果通过,根据该id从服务器中取出对应的用户对象,执行请求的业务逻辑。
session缺点
-
因为由session的数据存储在服务端,当大用户并发的情况下,开销会很大;同时如果在分布式架构下,就存储session共享的问题,需要做好共享和控制设计开发工作。为了考虑跨应用访问,就有了token令牌机制。
Token
token认证方式与session类似。为了防止客户端伪造sessionid。token采用时间戳+签名的方式一起作为token发送到服务端,服务端验证签名数据,通过则可以访问,验证失败,则拒绝请求。
场景:跨平台应用(单点登录)
-
例如莫平台集成QQ登录,登录时只需要跳转至QQ平台,登录QQ账号后,将QQ对应该平台该用户的token值返回(有的也可以返回一些其他用户数据,例如名称、QQ号),平台根据QQ返回的token和数据生成对应的账户。
步骤:
-
1、用户登录请求验证,成功后返回token给客户端;
-
2、客户端收到token数据后保存在客户端;
-
3、客户端每次访问请求时,一并携带token到服务器端;
-
服务端校验成功,返回请求数据。
总结
-
cookie:保存在客户端浏览器中,有大小限制,大小不能超过4k,且受到浏览器本身对cookie个数限制,大约不超过50个,有时效和状态限制。
-
session:保存在服务端中,可以存储在内存或者数据,分布式、跨系统不好实现。
-
token:token保存在客户端任何地方,适用于分布式部署。
**此篇文章内容有些源于网络,相关版权归原作者所有!**

浙公网安备 33010602011771号