网络分层的模型
OSI–七层模型,国际标准组织提出的网络七层模型标准,只是标准,而非现实(下面括号中的)
TCP/IP–四层模型,将七层模型简化为四层模型,是一个实现的应用模型(下面括号外的)
两者的模型:网络接口层(物理层,数据链路层)–ethernet等,网络层(网络层)–ip协议,传输层(传输层)–tcp、udp协议,应用层(会话层,表示层,应用层)–http、smtp、ftp、telnet协议
MAC地址是唯一的
应用层:采用何种协议
表示层:数据格式和标准的格式转换(图片,文字,声音)
会话层:何时建立连接、连接保持多久
传输层:管理2个节点之间的数据传输,负责可靠传输
网络层:地址管理和路由选择,经过哪个路由更近更快的传递到目标地址
数据链路层:mac地址,负责数据帧和比特流之间的转换
物理层:功能:传输信息的介质规格、将数据以实体呈现并传输的规格、接头规格。该层包括物理联网媒介;检查电压,不提供纠错服务。
http协议:
http协议是一个简单的请求–>响应协议(一个请求(request)只能有一个响应(response),响应是被动的不能主动发起)
http默认端口为80,https默认端口为443
特点:无连接,无状态,简单灵活
http和https的区别:
http:无证书,明文传输,80端口,无身份验证,无完整性效验
https:有证书,密文传输,443端口,有身份认证,有完整性效验
请求报文:请求行,请求头,空行,请求正文
主要的请求方法有:get,post,put,delete
get方法
-提交数据不安全,数据置于请求行,浏览器地址栏可见;
-url长度每个浏览器限制数量不同,最好在2000字符以内
-get方法速度快
-默认的请求方法,不需要提交大量数据、无敏感、保密数据时使用
post方法
-提交数据安全性,数据置于消息主体内,浏览器地址栏不可见
-提交的数据大小没有限制
-post方法速度慢
-需要提交大量数据、有敏感、保密数据时使用
put方法–向全部资源位置上传其最新内容,上传文件
patch方法–局部信息更新上传
三次握手和四次挥手
三次握手:
客户端向服务器发送一个包
服务器收到客户端发送的包,进行确认
客户端收到确认,进行向服务器发送请求
四次挥手:
主动方发送一个包
被动方收到请求后进行确认
被动方在发送一个包
主动方发送第四次确认
ssl:
1.启动逻辑连接,建立安全能力
2.服务端发送消息
3.客户端发送信息(证书.交换秘钥)
4.客户端发送消息(连接结束)
fiddler下载安装
①.官网下载 版本比较新
②.除非有官网的汉化包,不要随意汉化工具
③.安装目录尽量选择英文(汉语拼音),目录中不要空格
④.安装完成后,没有快捷方式,生成快捷方式
安装教程:
http://vip.ytesting.com/qa01Controller.do?openArticle&id=a9001
抓包的目的:分析定位是前端问题还是后端问题
抓包的原理:代理服务器
代理服务器默认端口为:8888
判断端口是否被占用:cmd窗口中输入:netstat -ano | findstr “8888”
如果被占用在任务管理器中直接结束该任务,重启fiddler
抓包过程:
A.熟悉你的系统主机信息,抓取的业务网
B.调整好页面数据,
C打开你的抓取状态
D,进行关键步骤操作
E.关闭抓取开发,筛选,找出有你需要的参数的请求
请求前断言:
1.暂停抓包
2.设置界面数据
3.fiddler–>rules–>automatic breakpoints–>before requests
4.回到页面进行提交操作
5.fiddler记录到断点请求
6.在webform参数表中修改参数
7.点击 breakpoint on response
8.点击 run to completion
9.查看响应数据和界面提示
请求后断言:
步骤:
1.设置请求后断言,开启抓包功能
2.页面操作抓取数据
3.修改需要的请求中的textview中的数据信息(数据显示,结合json格式一起确认)
4.点击run to completion
5.回到界面查看
断言后的都是假的数据,只限于判断响应数据是否正确
自动应答
场景:前端工程师设计好界面后,想调试一下页面效果。但是后端工程师接口功能还未完成,无法调用。此时,前端工程师可以把某些请求设置为自动应答,响应返回本地测试数据。
步骤:
1.抓包请求
2.右击相应的请求,save–>response–>response body
3.以txt格式打开文件,修改内容
4.进入fiddler 启用 autoresponder
5.选中刚在的请求,add rules,添加保存的文件->抓包.,页面刷新
模拟器操作:接口测试
当你没有安装postman等工具,可以根据接口文档构造一个接口请求。
1.抓取相应的请求(参数),拖拽到compser界面,有绿色的边缘线即可放手
2.在request body中根据用例修改相应参数,
3.点击excute 查看响应信息
抓取HTTPS
1.工具–>选项–>htpps标签,
2.勾选允许抓取https,提示框,点击Yes,是那即可
3.导出证书到桌面(导出点击actions–>export root certificate to desktop)(①.双击安装,②.浏览器中设置–>安全–>证书管理–>受信任的根证书颁发机构中导入fiddler证书)
4.打开百度,用fiddler抓包
出现的问题:百度首页显示:该链接私密连接,高级(只针谷歌浏览器)
解决方案–打开google浏览器,一个标签打开百度,一个标签打开chrome://net-internals/#hsts
在chrome://net-internals/#hsts页面中左边选择最后一个,右边最下面输入框中输入www.baidu.com,点击delete按键
刷新百度页面,点击页面上高级–>继续访问,点击该按键能够抓到百度就表示https是可以的
不是所有的系统都可以用fiddler抓包,原因:
1.协议
2.系统的自身安全策略
手机怎么抓:
1.电脑设置一样,
2.手机和电脑要在一个局域网.模拟器自身就在一个网络
fiddler–>工具–>选项–>connections–>勾选allow remote computers toconnect
3.手机端设置–>wifi–>高级–>代理->手动
IP地址/主机地址:电脑的IPv4:port 如:192.168.101.38.8888
4.手机端能够访问网络,如果不能就安装证书(可以从电脑端传过去,证书安装:百度搜索关键字:XXX手机安装fiddler证书)
5.开启电脑fiddler抓取状态,可以继续抓包访问
—认为自己设置对的,但是还是不抓取的:
1.检查防火墙,必须要关闭.杀毒软件至少退出/卸载===>手机端能访问网络
2.电脑端可以正常抓包,手机端可以上网,那么==>手机端应该可以抓包
3.手机端的应用是否支持抓包操作 Android 7以上有可能抓不到,可以用模拟器学习
4.抓包状态,基础设置是否打开
ios抓包:
设置和Android基本差不多,
IOS证书安装后,有一个受信任的设置,点击云讯,受信任即可
cookie产生过程:
由服务器产生–典型例子:sessionID
具体过程如下:
(一)客户端的某次请求–>发送给服务器;
(二)服务器产生一个Cookie,附加在HTTP响应头中(Set-Cookie),传递给客户端浏览器–>浏览器保存cookie
(三)客户端之后的所有请求,都会把Cookies附加在HTTP请求头中,传递给服务器–>服务器校验有用的Cookie信息
cookie类型:
会话cookie和持久cookie
会话cookie是一种临时的cookie,用户关闭浏览器,cookie就会被删除
持久cookie会保留在硬盘中,重启电脑或重新打开浏览器,还会存在
例:记住密码
Cookie与缓存的区别
缓存只是对静态资源的处理;Cookie是一种动态机制;
缓存大小受资源和磁盘空间的限制
Cookie本身有大小限制,一般浏览器限制大小不能超过4Kb
缓存不会发送服务器,cookie会与请求一并自动发送
作用不一样,缓存浏览器就可以从本地磁盘显示文档,可以加速页面的阅览。Cookie是服务器辨别用户身份,维护通信传输状态。
Session 一定是服务端创建的
服务器创建的Session标识通过HTTP响应头中的set-Cookie发送给客户端
浏览器拿到Session标识后,会临时存储,因为它是一个会话Cookie,所以浏览器关闭,它就消失
cookie和seesion的区别
1)、cookie数据存放在客户的浏览器.上,session数据放在服务器上。
2)、cookie不是很安全,别人可以分析存放在本地的cookie并进cookie欺骗,考虑到安全应当使用session。
3)、session会在一定时间内保存在服务器上。当访问增多,会比较占用服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
4)、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存50个cookie.
5)、所以一般建议:将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中
token介绍:
token认证方式和session类似。为了防止客户端伪造session id。token采用时间戳+签名的方式一起作为token发送到服务器,服务器验证签名数据,通过则可以访问,验证失败则拒绝请求。
场景:基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录,实现无状态认证
客户端使用用户名跟密码请求登录,对账号和密码做一个签名,比如说我用HMAC-SHA256 算法,加上一个只有我才知道的密钥, 把这个签名和数据一起作为token
服务端用同样的HMAC-SHA256 算法和同样的密钥,对数据再计算一次签名, 和token 中的签名做个比较, 如果相同,验证成功后,返回响应;如果不相同, 数据部分肯定被人篡改过, 我就告诉发送者: 对不起,没有认证
总结:
cookie:保存在浏览器中,有大小限制,有状态;
session:保存在服务器中,服务器有资源开销,分布式、跨系统不好实现;
token:客户端可以将token保存在任何地方,无限制,无状态,利于分布式部署。
接口分类:程序内部接口(同一个项目)和程序对外的接口(项目与项目)
接口测试:测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程以及系统间的相互逻辑依赖关系等。
接口测试文档:接口说明,接口请求方法,调用的url,请求参数、参数类型、请求参数说明书,请求头,返回参数说明。
接口测试流程:
接口评审—接口分析—接口用例设计—执行测试用例—bug的定位与追踪—专项测试报告
接口用例设计
输入---->服务器进行逻辑处理---->返回响应(从这三方面进行接口测试用例的编写)
请求方法:post/get/put/delete
url的构建
三个符号:
#–代表网页的一个位置,就是锚点,后面的内容不会被发送到服务器,一般不会出现在接口文档里
?–连接的作用,url问号后面的术语叫的参数,英文名
&–不同参数的间隔符
json简介:
json是存储和交换文本信息的语法;比xml更小、更快,更容易解析;是独立于语言;具有自我描述性,更易理解。
接口–①.获取调用部分数据(一般来说);②.数据可以通过请求进行同步更新
为什么要做接口测试–1.资源;2.逻辑;3.相对比较单纯。
接口测试流程:接口文档评审(开发)–接口测试计划(并入测试计划中)–用例设计–执行测试(工具:postman)–bug(和开发沟通)–报告(专项测试报告)
接口分类:内部接口(模块与模块)和外部接口(系统和系统)
接口文档的内容:
1.请求名称:表述该接口功能
2.请求地址:URL
3.请求方式:post/get
4.请求参数:请求传输的数据,提取测试,测试用例
5.请求格式/响应格式:json/XML
6.响应参数:正向功能实现的预期结果
7.请求头:content-type 定义请求传输数据类型
接口测试的要点:
1.了解接口的功能、接口的提交方式(get还是post),接口的URL、接口参数(哪些是必填参数、哪些是可选参数)
2.明确接口正常请求,正常情况接口会返回那响应参数
3.通过性验证(首先肯定要保证这个接口功能是通的,也就是正常的通过性测试,按照接口文档上的参数,正常传参传参数值,是否可以返回正确的结果)
4.检查接口的容错性(例支持整数,传递的是小数和字符串呢)
5.接口测试的边界值(例传递的参数足够大或为负数时,是否可以正常处理)
6.接口的性能(接口处理数据的时间也是测试的一个测试方向)
7.接口的安全性(如果是外部接口的话,这点尤为重要)
接口测试工具:
postman-----只能做接口测试
Jmeter----即能做接口测试、又能做性能测试,偏向性能测试
soupUI
python写自动化测试代码进行测试
接口测试和功能测试的区别:
1.输入范围不同
功能:根据前端设置进行输入
接口:不限制类型和长度
2.UI:
功能是有UI
接口请求无界面
3.测试点:
功能:业务,流程,UI
接口测试偏向于对请求方法、url、请求参数和授权等
4.分类:
一个黑盒(功能),一个灰盒(接口)
接口测试用例设计:必填项(正常和异常)选填项(一般验证填写或者不填写,但是需求有明确的说明,那么就需要针对这个字段进行用例设计)
接口测试的响应:
1.内容
2.响应的时间 单位是毫秒 1000毫秒=1秒 默认时间200毫秒 (超过该事件有可 能存在性能问题)
3.数据正确/准确性验证
①.postman响应值
②.如果系统开发完成在系统的相应功能进行确认
③.如果有数据库的权限,数据验证
4.响应码(200),返回码(retcode:0)
5.时间
postman中数据类型:josn
1.对象:
特点:{}
元素的格式:键值对
2.数组:
特点:[]
元素的格式:[123,wus,数字]
3.数组和对象可以相互嵌套
4.逻辑值:true/false只有这两个结果
5.null–数据库中该字段没有值的时候,是以"null"显示
注意:不是所有的功能都要进行接口测试,根据开发提供接口文档来定
注意:发布的时候不要勾选collection discovery选项,避免让所有postman用户看到项目接口信息
fiidler:用于抓包定位bug用,当你出现一个bug无法确认该bug是前端还是后端问题的时候,就用fiddler抓包来进行分析,分析 :请求报文,请求参数是否正确,分析响应报文和响应数据是否准确
postman:用于接口测试,接口开发完成就可以测试
接口测试一般是在功能测试之前
接口测试也是可以和功能并行
用postman工具进行接口的用例执行
前提:服务器运行
步骤:
1.打开postman,新建collection,在集合下面新建文件夹(按照项目和功能分别建立)
2.打开接口文档(完整)
3.按照接口文档的内容进行数据设置,首先可以把参考数据直接使用
4.点击send按键,确认该接口可用
5.继续根据参数的说明和约束进行用例设计,和执行测试
6.根据要求需要进行相应结果确认
①.postman响应和接口文档
②.系统中进行确认(如果系统没有开发成功)
③.数据库进行确认
功能测试和接口测试的区别
功能测试:希望已经完成,看到这个教管系统,并能够登录操作,在这个基础上做的测试
接口测试:不管界面上怎么显示,请求响应是否和需求(接口文档)一致
业务流程:系统的业务或者功能流程,这个系统有哪些功能,这些功能是怎么走的
测试流程:测试方面流程设置,需求评审–>测试计划–>用例设计
全局变量
1.作用范围:针对postman中所有使用该变量的请求
变量:方便维护
举例:有一个系统,含有100个接口,所有的接口服务器地址,或者某一个参数都是一个固定的值,那么我就把这个值设置全局变量接口中调用,这样接口执行时都是全局的数据
2.设置方式:
①.界面设置
postman右上角设置按键–>globals–>设置全局变量,一次一个
在需要的接口上进行变量的调用 { {变量名}}
②.脚本设置
在预请求脚本中设置:
pm.globals.set(“变量名”:“参数值”)
需要调用的地方进行变量名的调用{ {变量名}}
执行后,会在全局变量中增加该变量和值
环境变量:
1.环境变量:作用到选择该环境下面的所有调用该变量名的请求
适用于测试环境变化
测试阶段:测试环境,正式环境,演示环境,预发布环境
2.设置方式:
①.界面设置
postman右上角–设置按键–add键,进入环境设置界面
设置环境变量的总名称,设置需要用到变量名和值,可以多个不重复
回到需要调用请求中用{ {变量名}}的方式调用,调用后执行前,选择环境变量的总名称
②.脚本设置
在预请求脚本中设置:
pm.globals.set(“变量名”:“参数值”)
需要调用的地方进行变量名的调用{ {变量名}}
执行后会在对应的环境变量中增加该数据变量
注意:如果环境变量中有一个name:susan,全局变量中也有一个name:苏三
请问调用环境变量的时候,name=? ==>susan(优先级环境变量>全局变量)
集合变量:集合中调用该变量的接口,一般用的不多(鼠标右击集合点击edit,点击variables然后添加变量)
本地变量:所有变量中优先级最高,只作用于当前请求
数据变量:用于集合测试中调用该请求,且一定环境中接口,要和断言一起使用,接口自动化
1.设计一个成功接口请求
2.针对参数进行用例设计,制造具体数据
3.数据放在text/csv格式文件中,标有字段名称行,数据行,中间用英文的逗号隔开,并保存
4.请求接口的参数中将参数值变量化{ {变量名}}
5.设置断言内容,一般有:响应响应状态码,响应体的正确性/包含内容,(参考断言课程录播)
6.点击->–>选择run,进入集合测试设置界面
7.根据循环系数,内容需求进行相关设置.建议勾选四个选项,注意循环次数的变更
8.点击执行按键,等待结果
例如:登陆循环请求
种变量的优先级:本地变量>数据变量>环境变量>集合变量>全局变量
预请求脚本和断言:
1.接口执行过程–预请求脚本–>接口–>断言
2.预请求脚本:
获取环境变量
var e=pm.environment.get(“test0703”).toString();–(tostring是指转化为字符串格式)
console.log(“获取的环境变量”+e);
获取全局变量
console.log(“获取的全局变量”+pm.globals.get(“token”));
获取变量
pm.variables.set(“var”, “局部变量”);
console.log(“获取局部变量var:”+pm.variables.get(“var”));
设置一个环境变量
pm.environment.set(“eszy0424”, “192.168.1.1”);
console.log(“设置环境变量:”+pm.environment.get(“eszy0424”));
设置全局变量
pm.globals.set(“gszy0424”, “1232423445435”);
console.log(“设置全局变量:”+pm.globals.get(“gszy0424”));
清除一个环境变量,具体的环境变量
pm.environment.unset(“eszy0911”);
console.log(“清除环境变量:”+pm.environment.get(“eszy0911”))
清除全局变量
pm.globals.unset(“gszy0424”);
console.log(“清除全局变量:”+pm.globals.get(“gszy0424”));
发送一个请求
const echoPostRequest = {
url: ‘http://localhost/api/mgr/loginReq’,
method: ‘POST’,
header: ‘Content-Type:application/x-www-form-urlencoded’,
body: {
mode: ‘urlencoded’,
urlencoded:‘username=auto&password=sdfsdfsdf’
}
};
pm.sendRequest(echoPostRequest, function (err, res) {
console.log(err ? err : res.json());
});
3.tests断言:
断言中的send request这方使用后,对于前面先登录,在查询课程怎么写
①.预请求中:先执行登录,界面上是查询课程接口,登录接口在脚本中
②.在断言中:界面上登录的请求,脚本中查询课程的请求
匹配响应码
pm.test(“Status code is 200”, function () {
pm.response.to.have.status(200);});
匹配响应体中包含字符串
pm.test(“验证过是否有1519课程”, function () {
pm.expect(pm.response.text()).to.include(“1519”);});
匹配响应体里json值验证
pm.test(“Your test name”, function () {
var jsonData = pm.response.json();
pm.expect(jsonData.retcode).to.eql(0);});
响应体值正确的----循环登录案例
pm.test(“Body is correct”, function () {
pm.response.to.have.body(’{“retcode”: 0}’);});
匹配响应头contenty-type
pm.test(“Content-Type is present”, function () {
pm.response.to.have.header(“Content-Type”);});
匹配响应时间是否少于200ms
pm.test(“Response time is less than 200ms”, function () {
pm.expect(pm.response.responseTime).to.be.below(200);});
成功的响应中是否包含
pm.test(“Successful POST request”, function () {
pm.expect(pm.response.code).to.be.oneOf([201,203,200]);});
状态码是否包含字符串
pm.test(“Status code name has string”, function () {
pm.response.to.have.status(“OK”);});
将响应的XML格式转化为json格式
var jsonObject = xml2Json(responseBody);
var str=JSON.stringify(jsonObject);
console.log(str);
为json数据使用tiny验证器
var schema = {“items”: {“type”: “boolean”}};
var data1 = [true, false];
var data2 = [true, 123];
pm.test(‘Schema is valid’, function() {
pm.expect(tv4.validate(data1, schema)).to.be.true;
pm.expect(tv4.validate(data2, schema)).to.be.true;});
用命令生成测试报告
①.知道命令具体内容
②.newman run login.json -g g.json -e e.json -d test.txt -n 6 --reporters html --reporter-html-export d:\log\reporter1.html
login.json:集合测试的json文件
-g:全局变量文件
-e:环境变量文件
-d:创造的数据变量文件
-n 循环的次数
–reporters html: 报告的格式是html格式
–reporter-html-export:导出html格式的报告
d:\log\reporter1.html:导出的目录地址,其中log是一个文件夹需要事先建立,reporter1.html不需要建立
newman run:
1.node js安装
中文下载地址:
http://nodejs.cn/download/
英文下载地址:
https://nodejs.org/en/download/
cmd窗口中输入:node -v==>显示版本号表示安装成功
2.在cmd窗口中输入npm install newman -global(或-g),回车
输入 newman -v 显示版本号表示成功
3.安装newman报告工具:
npm install -g newman-reporter-html
4.导出相关数据
将所有导出的文件,和数据文件放在同一个目录中.英文,不要空格
执行命令:cmd中切换目录到该目录下