网络协议: 系统架构: B/S:browser/server浏览器和服务器 C/S:client/server客户端和服务器 手机app,pc端的游戏 网络协议: 什么是协议: 规则,标准,约定的集合 互联网中的协议: 1,http、https(重点) 2,tcp/ip 3,ftp 4,wifi协议 5,蓝牙 6,POP3,SMTP 七层网络模型: 物理层->数据链路层->网络层->传输层->会话层->表示层->应用层 tcp/ip四层模型: 数据链路层->网络层->传输层->应用层 tcp协议: 传输控制协议 工作方式: 建立连接 3次握手 终止连接 4次挥手 tcp协议和udp协议的区别: 是否连接:tcp是面向连接的,udp是非连接 可靠性:tcp是可靠的,udp是不可靠的 速度:udp速度快,tcp速度慢 http协议: 超文本传输协议 超文本:可以传输除文字以外的,包含图片,音频,视频等并解析 http协议的版本: http1.0 http1.1(目前使用的版本) http2.0 http协议包含的内容 请求 请求行 协议版本 请求方式 url地址 请求头 一些数据信息,数据格式,字符集,编码等 请求正文 发送的请求参数 返回 响应行 状态码、响应信息 响应头 和请求头差不多 响应正文 服务器返回的数据 cookie和session的区别: cookie是保存在浏览器 session是保存在服务器 url地址: 组成: http://106.52.182.140:80/fanwe?username=123&passwd=456 协议部分:http 域名或者ip:协议后面接域名或者ip地址(106.52.182.140) 端口:80(http默认端口) 资源部分/路径:从第一个斜杠开始到?结束 参数部分:从问号开始到结束,多个参数用&符号连接 锚部分:#home http状态码: 1xx:表示后台已经接收到请求,请继续发送 2xx:表示成功 3xx:重定向301和302 4xx:前端错误 5xx:服务器错误 http和https的区别: 端口: http:80 https:443 数据传输方式: http:明文传输 https:加密传输ssl 证书: http:不需要证书 https:需要ca证书 是否收费: http:免费 https:收费 http协议中的请求方式: get、post、delete、head、trace、option 常见的请求方式: get和post 区别: 1.提交的方式不一样 get是把请求参数放在url中进行发送,post则是放在请求体中进行发送 get参数类型只能是ascii码,post没有限制 2.传输的数据大小不一样 get是有长度限制的 post没有 3.安全性 post比get更加安全 4.效率 get请求效率要比post高一些 5.请求次数 get只请求一次 post请求2次 第一次发送请求头,第二次发送请求参数 接口 1,什么是接口 物理接口 插座和插线板 usb接口 网线接口 耳机的接口 都涉及到了2个设备,由一个物体提供给另外一个物体进行连接,触发它的接口功能 软件中的接口 具有一定的功能代码段 提供给前端进行调用的 用来建立前后端的数据交互 模块和模块之间的数据交互 系统和系统之间的数据交互 内部接口 外部接口-第三方接口 2,常见的接口 1,http接口-api 可以支持多种格式的数据传递 form-data json xml 2,webservice接口 支持xml格式的数据传递 不同之处: 协议不一样 报文格式不一样 相同之处 在测试的时候都需要利用工具去执行 3,接口测试怎么做 利用工具实现 jmeter,postman,soapui,loadrunner,fiddler,公司自己研发的工具 工具只是一种测试手段 在做接口测试的时候需要关注3个方面: 1,正常场景 2,异常场景 3,接口逻辑 4,接口测试的目的 1,验证功能的准确性 2,可以更早的发现系统bug 3,可以检查系统的异常处理能力和系统的安全性 4,可以绕过前端进行测试 5,前端改动比较频繁,接口相对稳定 6,相比ui自动化而言,接口自动化实现起来更加容易和稳定 5,接口测试的流程 1,先拿到接口需求文档-开发提供 2,分析接口功能 3,编写测试用例 4,利用工具执行用例 5,提交bug,跟踪bug 6,系统测试 在工作当中如果有新增的接口或者需求中对原有的接口有改动的话,开发都需要提供对应的接口文档 如果没有接口文档的时候,就需要自己去抓取接口信息 一般是在做接口自动化的时候 自己在整理接口信息的时候,需要整理以下信息: 例: fw登录接口: 请求地址:http://106.52.182.140/fanwe/index.php?ctl=user&act=dologin&fhash=wUMOwLBhuCnZLJqZFWaOzfALacogrvsZPXtMkQtKkbXrxIAjje 请求方式:post 请求参数: email: user_pwd: ajax:1 auto_login:0 返回数据 { "status":2, "info":"\u672c\u7ad9\u9700\u7ed1\u5b9a\u7b2c\u4e09\u65b9\u6258\u7ba1\u8d26\u6237\uff0c\u662f\u5426\u9a6c\u4e0a\u53bb\u7ed1\u5b9a", "data":null, "jump":"\/fanwe\/index.php", "jump1":"\/fanwe\/index.php?ctl=collocation&act=CreateNewAcct&user_type=0&user_id=45" } 6,接口文档包含的内容 1-接口的功能描述 2-接口的请求地址 3-接口的请求方式 4-接口的请求参数 5-请求参数的描述 6-请求参数的格式 7-返回码 8-响应信息 文本格式: 请求 请求行 请求方式:post 请求url 协议 :http ip:106.52.182.140 路径:/fanwe/index.php?ctl=user&act=dologin&fhash=wUMOwLBhuCnZLJqZFWaOzfALacogrvsZPXtMkQtKkbXrxIAjje 参数: email: kk001 user_pwd: QUNlRkRqU0xNQUhXV3p6WUdLdmFSc1pSaHFTYkVTcEJOVWhUeWR1WWpjeEJQVEpMbFMlMjV1NjVCOSUyNXU3RUY0MTIzNDU2YWJjJTI1dThGNkYlMjV1NEVGNg== auto_login: 0 ajax: 1 请求头: Accept: application/json, text/javascript, */*; q=0.01 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Connection: keep-alive Content-Length: 169 Content-Type: application/x-www-form-urlencoded; charset=UTF-8 Cookie: ECS[visit_times]=3; PHPSESSID=mepo8ekcbi42547mkueavhrd80 Host: 106.52.182.140 Origin: http://106.52.182.140 Referer: http://106.52.182.140/fanwe/ User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36 X-Requested-With: XMLHttpRequest 请求正文 email: kk001 user_pwd: QUNlRkRqU0xNQUhXV3p6WUdLdmFSc1pSaHFTYkVTcEJOVWhUeWR1WWpjeEJQVEpMbFMlMjV1NjVCOSUyNXU3RUY0MTIzNDU2YWJjJTI1dThGNkYlMjV1NEVGNg== auto_login: 0 ajax: 1 响应: 响应行 200 OK 响应头 Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Connection: Keep-Alive Content-Length: 268 Content-Type: text/html; charset=utf-8 Date: Tue, 15 Mar 2022 07:27:44 GMT Expires: Thu, 19 Nov 1981 08:52:00 GMT Keep-Alive: timeout=5, max=100 Pragma: no-cache Server: Apache/2.4.6 (CentOS) PHP/5.4.16 Set-Cookie: PHPSESSID=mepo8ekcbi42547mkueavhrd80; path=/; HttpOnly X-Powered-By: PHP/5.4.16 响应正文 { "status":2, "info":"\u672c\u7ad9\u9700\u7ed1\u5b9a\u7b2c\u4e09\u65b9\u6258\u7ba1\u8d26\u6237\uff0c\u662f\u5426\u9a6c\u4e0a\u53bb\u7ed1\u5b9a", "data":null, "jump":"\/fanwe\/index.php", "jump1":"\/fanwe\/index.php?ctl=collocation&act=CreateNewAcct&user_type=0&user_id=45" } 接口测试用例设计: 如果是新项目,设计到的接口比较多会要去编写对应接口测试用例。 思路: 1,在设计接口测试用例的时候优先考虑接口的正常场景。 接口中所有的参数都按照正常的情况去填写 2,异常场景 主要是接口中的参数异常情况 参数的类型 参数的长度 枚举值 必填非必填 多一个或者少一参数 参数和参数之间有关联的时候 3,接口的逻辑 例: 注册接口:如果能够重复注册说明接口逻辑有问题 订单的接口:已完成的订单去进行退款操作,如果能够进行退款说明接口逻辑有问题 jmeter环境搭建 1,下载安装包 可以到官网进行下载安装 也可以去网上找一些免安装的绿色版本 解压到非c盘目录,路径没有要求 2,配置jdk环境变量 1,安装jdk 注意版本匹配问题 5.x以上的jmeter版本需要1.8的jdk 安装的时候直接下一步到结束 默认会安装在C:\Program Files\Java\jdk1.8.0_181 2,配置jdk环境变量 右键我的电脑->属性->高级系统设置->环境变量->系统变量->在path变量中添加jdk的bin目录路径和lib目录的路径 3,检查环境是否配置好 在cmd中输入:java,不报错即可 3,配置jmeter环境变量 右键我的电脑->属性->高级系统设置->环境变量->系统变量->在path变量中添加jmeter的bin目录路径 关于jmeter的一些目录结构: bin目录:脚本和配置文件 jmeter.bat:启动脚本 jmeter.properties:jmeter配置文件 lib目录 一些封装好的jar包 jmetr修改成中文: 在jmeter安装目录下的bin目录中有个jmeter.properties文件, 修改第37行为language=zh_CN(前面的#号需要删除掉,#号是起注释作用) 修改完之后重启jmeter jmeter-线程组 添加方式: 在测试计划中点击右键添加线程组 setup线程组:最先执行的线程组 线程组:随机执行 teardown线程组:最后执行的线程组 对于一些特殊的场景需要结合起来一起使用,特别是在做自动化或者性能测试的时候 jmeter-http请求 在线程组中进行添加取样器-http请求 用于填写接口的基本信息,包括请求的url地址和参数 工作当中如何去开展接口测试 1,拿到接口文档 2,进行分析 根据接口的功能以及接口是否对数据库有操作 如果有的话还要去数据库检查数据的准确性,要知道是哪个表那个字段 3,编写测试用例 4,编写脚本 jmeter 1,添加线程组 2,添加http请求,填写接口信息 3,创建一个察看结果树,通过结果树去查看后台返回的数据是否和需求文档的一致 4,分析数据,检查数据是否和接口文档一致 对于查看结果树中的结果如何去分析 在测试接口的时候如果出现了问题,先不要急着提bug 1,先检查数据有没有发送错误 2,通过状态码去分析 4开头的就是前端问题 5开头的就是服务端问题 3,可以通过jmeter日志文件去分析 4,如果返回的状态码是200,只能说明请求是成功的。需要核对数据,检查数据 jmeter-录制功能 新接口是没办法录制的,只能录制前端的http请求 针对于一些没有接口文档的接口或者接口的请求参数非常多 或者做性能测试的时候也可以使用录制功能 录制http请求 添加一个非测试原件-代理服务器-选择目标控制器(用来存放录制的请求) 开启本地的代理服务器,端口和jmeter的端口保持一致(默认端口8888) 地址用http://localhost或者127.0.0.1 排除模式(requests.filtering) .*\.(js|css|PNG|jpg|ico|png|gif|jpeg).* 可以过滤一些无用的请求 录制https请求 1.选项->ssl管理器->选择jmeter证书(jmeter安装目录下的bin目录ApacheJMeterTemporaryRootCA.crt文件) 2.打开浏览器设置->搜索证书->进入到安全里面->选择管理证书->选择受信任的根证书颁发机构 3.如果弹出了输入密码的,输入:password jmeter-断言 可以代替人工去检查数据的结果准确性,尤其是在做接口自动化的时候,接口很多的情况,就需要使用断言去判断响应的结果内容 断言的类型: 响应断言 可以断言所有返回格式的数据,要知道需要断言的信息是在哪个位置,body还是headers json断言 只能断言返回的数据格式是json 当返回的信息有多层嵌套关系的时候,需要一层一层的去提取数据,如果是列表形式的需要通过下标取值 { } xpath断言 只能断言返回的数据格式是html格式的 通过斜杠来划分层级关系 绝对路径:/html/head/title 相对路径://*[@id='123'] 断言响应文本的时候需要找一些有意义的字段进行断言,对于一些会变化的字段就不需要进行断言处理了 例:返回码,返回状态 jmeter发送json格式的数据请求 需要通过消息体数据来进行传递 需要添加一个配置原件->http信息头管理器 名称:Content-Type 值:application/json 接口信息: 请求地址:http://192.168.3.131:8000 请求方式:get/post 请求参数: { "username":"kk001", "password":"123456" } 返回数据: "msg":"登录成功","token":"%s" jmeter-后置处理器-提取器 应用场景: 一般在做接口测试的时候,尤其是碰到下一个接口需要用到上一个接口的返回数据 接口和接口之间有关联关系的时候也需要用到提取器去进行提取数据 正则提取器 可以提取所有格式的数据 要知道的需要提取的信息是在哪个位置 正则表达式写法:(.+?)和(.*?) 边界提取器 可以提取所有格式的数据 要知道的需要提取的信息是在哪个位置 找到需要提取内容的左边界和右边界 json提取器 只能提取json格式的返回数据 xpath 只能提取返回格式为html的数据 取样器-调试取样器 用来查看提取的信息是否正确 jmeter-动态关联 同一个线程组种接口的关联 1,在做接口测试的时候遇到下一个接口的请求数据需要用到上一个接口的返回数据时,就需要做动态关联 2,一定要搞清楚这个接口的逻辑是需要用到哪个接口的哪个数据,是在响应信息里面还是响应头里面 对于cookie传递的2种方式: 配置原件: http信息头管理器: 名称:Cookie 值:PHPSESSID=${cookie} http cookie管理器 名称:PHPSESSID 值:${cookie} 域:ip地址或者域名 路径:接口路径或者用斜杠代替 fw-登录 请求地址:http://106.52.182.140/fanwe/index.php?ctl=user&act=dologin&fhash=LYkrQBURdekhEmeqfiAEJjNxqiGzJvKyHdPuZyYdyFLLatbpMT 请求方式:post 请求参数: email: kk001 user_pwd: Z3NuU1RHQVFRWGRvcGVjd2d3WVRRSWJlUUpFbEJFeFVBSXRmdXRpYUJKa2lOa25xVWMlMjV1NjVCOSUyNXU3RUY0MTIzNDU2YWJjJTI1dThGNkYlMjV1NEVGNg== ajax: 1 返回数据: {"status":2,"info":"\u672c\u7ad9\u9700\u7ed1\u5b9a\u7b2c\u4e09\u65b9\u6258\u7ba1\u8d26\u6237\uff0c\u662f\u5426\u9a6c\u4e0a\u53bb\u7ed1\u5b9a","data":null,"jump":"\/fanwe\/index.php","jump1":"\/fanwe\/index.php?ctl=collocation&act=CreateNewAcct&user_type=0&user_id=45"} fw-上传凭证 请求地址:http://106.52.182.140/fanwe/file.php 请求方式:post 请求参数: upload_type 0 localUrl C:\fakepath\1.png m File a do_upload 文件参数: D:\1.png imgFile image/png 返回数据: {"error":0,"url":"http://106.52.182.140/fanwe/public/attachment/202203/17/16/6232efb6627b8.png","public_url":"./public/attachment/202203/17/16/6232efb6627b8.png"} fw-线下充值 请求地址:http://106.52.182.140/fanwe/member.php?ctl=uc_money&act=incharge_done 请求方式:post 请求参数: check_ol_bl_pay: on money: 1000000 pingzheng: payment: 22 bank_id: CMB memo: bank_id: CMB 返回数据: 重定向到立即支付页面 Location: http://106.52.182.140/fanwe/index.php?ctl=payment&act=pay&id=4081 跨线程组的关联 设置全局变量: 利用函数助手:__setProperty,设置全局变量 把设置好的全局变量放在beanshell取样器中 其他线程组的请求在引用全局变量的时候需要用到另外一个函数 __property或者__P fw-新增收货地址 请求地址:http://106.52.182.140/fanwe/member.php?ctl=uc_consignee&act=save_consignee&fhash=LYkrQBURdekhEmeqfiAEJjNxqiGzJvKyHdPuZyYdyFLLatbpMT 请求方式:post 请求参数: consignee: 王小二 address: 湖南省长沙市芙蓉区湖南文化大厦1801 mobile: 13344223355 ajax: 1 id: 返回数据 {"status":1,"info":"\u4fdd\u5b58\u6210\u529f","jump":""} jmeter-上传文件 例: fw-上传凭证 请求地址:http://106.52.182.140/fanwe/file.php 请求方式:post 请求参数: upload_type 0 localUrl C:\fakepath\1.png m File a do_upload 文件参数: D:\1.png imgFile image/png 返回数据: {"error":0,"url":"http://106.52.182.140/fanwe/public/attachment/202203/17/16/6232efb6627b8.png","public_url":"./public/attachment/202203/17/16/6232efb6627b8.png"} 作业:(都需要进行断言,每个接口至少2个断言,做动态关联) (1)注册 (2)登录 (3)前台收货地址接口 (4)前台提现接口 需要先设置支付密码 绑定手机号码 (5)借款接口 (6)添加银行卡接口 (7)上传凭证接口 (8)线上充值接口 (9)后台新增会员接口 (思路:先获取验证码接口cookie,再传递给登录,再传递给新增会员接口 jmeter-参数化 参数化的目的: 减少维护成本,提高效率 jemter-参数化方式: 自定义变量:通过提取器提取出来的值保存的变量 函数助手: 全局变量的设置:__setProperty,设置全局变量 引用全局变量:__property或者__P 随机函数:__Random(随机数字)和__RandomString(随机字符串) 用户定义的变量:配置原件中 用户参数:前置处理器 csv文件参数化: 用于一些大量数据的参数化,一般都是在做性能测试的时候需要用到 通过脚本批量造数,然后找到对应的表把数据导出成一个文件(csv或者txt) 工作中可以找开发要对应的表名 配置原件-csv数据文件设置 例: fw-浏览接口 请求地址:http://106.52.182.140/fanwe/index.php 请求方式:get 请求参数: ctl=deal id=11 返回数据: 投资标的详情页面 数据库参数化 2个组件: 配置原件-JDBC Connection Configuration:用来连接数据库的 取样器-JDBC request:用来给数据库发送请求的 导入数据库驱动包 一定要主要版本匹配的问题 驱动包的版本要和数据库版本对应起来:mysql-connector-java-commercial-5.1.30-bin.jar 把驱动包放在jmeter安装目录的lib目录下,放入之后重启jmeter 或者在测试计划中进行导入驱动包 allowMultiQueries=true:允许执行多条语句 characterEncoding=UTF-8:解决中文乱码问题 数据库参数化的应用场景: 例: fw-设置支付密码 通过连接数据库来获取手机验证码 1,需要先发送验证码(让数据库更新为最新的验证码) 需要知道验证码是在哪个表中,哪个字段 fanwe_mobile_verify_code verify_code 2,再去设置新的支付密码 接口自动化 jmeter做接口自动化 在单接口的基础上添加断言,动态关联和参数化 动态关联和参数化的目的: 保证脚本的重复运行 减少维护成本,提高效率 场景:冒烟测试,回归测试,上线前,检查环境问题 先把一些简单做好 自动化框架: python+requests+pytest+allure python+selenium+pytest+allure 目的: 提高效率,节省人力成本,节省时间 自动化的重点,难点 1,用例的组织,管理,编写,维护 2,接口之间的关联 3,参数化的问题 4,断言 什么样项目适合做: 项目周期比较长 迭代比较频繁 抓包工具fiddler 抓包原理: 和jmeter录制功能的原理是一样的 把本机设置成一个代理服务器,当有请求发送的时候都会在工具上显示出来 fiddler汉化: 解压汉化包,把FdToChinese.dll文件放到fiddler安装目录的scripts下面 将FiddlerTexts.txt放置在fiddler的安装目录下即可 更多的应用场景是在做手机app测试的时候 也可以进行app的弱网测试 1,当页面的F12抓取不到请求参数的时候可以用抓包工具来实现 抓包目的: 1,抓取的内容:请求数据和响应数据 通过抓取到的内容来定位是前端bug还是后端bug 1,请求数据有问题:前端bug 2,返回数据有问题:后端bug 3,请求数据和返回数据都没问题:前端bug,可能是前端页面解析的问题 断点篡改数据: 请求断点: 拦截前端的请求信息,进行数据篡改,查看篡改后的数据后台处理是否正确 返回断点: 拦截后台返回的信息,进行数据篡改,查看篡改后的数据返回是否正常 查看信息是否加密 主要是看一些关键信息在传输过程中是否进行了加密传输