WebApi接口测试

 API接口测试:

  什么是接口:通过API接口实现计算机软件之间的相互通信

  为什么要做接口测试:

    不通过前端UI界面或者UI界面还没有设计出来

    需要对功能做测试,这也是测试工程师尽早介入测试的一个点

    业务的逻辑,数据的资源,安全,需要通过接口去进行测试

  接口测试的流程

    需求评审-接口评审

    需求分析-接口分析

    接口用例设计

    执行测试用例

    Bug的定位与追踪

    专项测试报告

  接口分类

    接口对象

      内部接口-集成测试,灰盒,一般开发去做

      外部接口-联调测试,方案,联调测试通过准则

    协议分类

      Web Service接口-SOAP协议

      Http Api接口-HTTP协议

    接口文档

      接口名称-功能描述

      接口地址URL

      支持的格式(xml/json)-请求数据格式

      请求方式-get/post

      请求参数-参数名称,类型,是否必填,参数说明请求头等,测试用例设计

      返回参数-返回码,返回值信息,返回json或xml信息-预期结果

  接口测试

    excel表存储接口测试用例

    postman进行接口测试

    记录测试结果,提交bug

    接口测试过程中,如果系统已经完成,验证地方:

      接口响应值

      系统对应的功能数据

      数据库的数据验证

  http协议

    http协议原理

      超文本传输协议,服务器传输文本到本地浏览器的传送协议

      基于TCP/IP通信协议传输的

    网络型协议

      OSI七层模型

        物理层

        数据链路层

        网络层

        传输层

        会话层

        表示层

        应用层

      TCP/IP四层模型

        网络接口层

        网络层IP协议

        传输层TCP/UDP协议

        应用层http、smtp、telnet协议

    http协议特点

      无连接、无状态、简单灵活

    http与https的区别

      https-有证书,密文传输,443端口,有身份证验证,完整性检验

      http-无证书,明文传输,80端口,无身份证校验,无完整性校验

    http请求报文

      请求行-包含请求方法,请求路径,请求协议/版本组成

      请求头-键值对,如数据类型,版本

      空行

      请求正文

    http响应报文

      状态行-包含协议/协议版本,状态码,状态描述符

      响应头

      空行

      响应内容

    请求方法

      GET

        向指定资源发出请求

        大小有限制,2千字符以内,提交的数据直接显示URL中,提交数据不安全

      POST

        向指定资源提交请求数据,如提交表单,上传文件

        提交的数据没有限制,数据在请求体中,数据安全,速度慢

      PUT

        向指定资源位置上上传其新内容上传文件

      DELETE

        请求服务器删除Request-URL所标识的资源

      PATCH

        更新部分资源

    响应状态码

      200-客户端请求成功

      301-永久性重定向

      302-临时重定向

      403-服务器收到请求,拒绝访问

      404-请求的资源不存在

      500-服务器发生不可预期的错误

    SSL通信过程

      SSL安全套接层,基于对称密钥与非对称密钥传递数据

      浏览器访问https网站,要求与web服务器建立SSL连接

      服务器根据客户端发的请求信息确定是否重新生成新的主密钥,若需要服务器响应给客户的信息将包含生成密钥所需信息

      客户根据收到服务器响应信息,产生一个主密钥,并用服务器的公开密钥加密后传给服务器

      服务器回复该主密钥,并返回给客户一个用主密钥认证的信息,以此让客户认证服务器

  Cookie、Session、Cache缓存、Token

      Cookie

        什么是Cookie

          状态的保持,辨别用户身份,保持通信状态

          Cookie保存于浏览器,来自于服务器

        Cookie包含的信息

          Key_Value值

          Path路径

          Exprises过期时间

          Secure传输格式

          HttpOnly防止XSS攻击

        Cookie类型

          持久Cookie

          会话Cookie

      Session

        服务器创建的,保存于服务器内存中

        Session标识是全局唯一的

        使用场景:记住用户名和密码登录,购物车功能

      Browser Cache浏览器缓存

        节约网络的资源加速浏览,浏览器在用户磁盘上对最近请求过的文档存储

        当再次请求这个页面时,浏览器就可以从本地磁盘显示文档,这样就可以加速页面的浏览

      Token

        客户端可以将Token保存到任何地方

        无限制,无状态,利于分布式部署

  Cookie与Session的区别

    cookie数据存放在客户的浏览器,session数据存放在服务器

    cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应使用session

    session在一定时间内保存在服务器上,当访问增多,会占用服务器性能,考虑到减轻服务器性能方面,应使用cookie

    单个cookie保存的数据不能超过4k,很多浏览器都限制一个站点最多保存50个cookie

    一般建议,将登录信息等重要信息存放在session,其他信息如果需要保留,可以放在cookie

  Cookie与缓存的区别

    缓存只是对静态资源的处理,Cookie是一种动态机制

    缓存大小受资源和磁盘空间的限制

    Cookie本身有大小限制,一般浏览器限制大小不能超过4Kb

    缓存不会发送服务器,cookie会与请求一并发送

    作用不一样,缓存浏览器就可以从本地磁盘显示文档,可以加速页面的阅览。Cookie是服务器辨别用户身份,维持通信传输状态。

  JSON

    什么是json

      存储和交换文本信息的语法

      更快,更小,易解析

    json格式

      {“key”:"value"}

      [{},{}]

  接口测试用例

    正常场景

      功能是否按照接口文档要求实现

    异常场景

      参数为空

      参数多填

      参数少填

      参数类型错误

      参数数值取值范围错误

      异常场景下是否有正确的处理逻辑和响应提示

    必填参数

      对于必填参数要设计传参数和不传参数,接口的返回情况

      必填参数传参数

        必填参数都正确

        必填参数类型错误(非法、特殊字符)

        必填参数数值范围错误(超过边界)

        必填参数空格(前面、中间位置、尾部)

      必填参数不传参数

        必填参数全部为空

        必填参数部分为空

    选填参数

      一般接口对于非必填参数都不会做非正常性传值的判断,所以只要测试接口返回的内容是否正确即可

      如果有接口文档说明对非必填参数做了非正常的验证的话,也要对其验证

      覆盖所有参数,正向用例

      覆盖所有必填参数,正向用例

      某一必填参数为空,逆向用例

      必填参数基础上,少传一个参数

      多传一个参数,逆向用例

      必填参数数据类型错误,数据值错误,逆向用例(例如整型变字符串)

      任意组合可选参数,正向用例

      与业务逻辑相关的,用户身份认证为空或者错误,逆向用例

      字段的唯一性校验,如插入数据字段不能重复,发送两次请求,查看第二次返回结果

  Postman工具使用

    创建Collection

      Add Folder

      Add Request

    常用变量

      局部变量Variables

        对于单个请求

        比较少用

      数据变量

        txt/csv文件存储数据

        参数化,批量执行接口测试

      环境变量Environment

        一般用户测试环境的区分

        正式环境,预发布环境

      集合变量Collection

        针对于集合

        集合下edit-Varables设置集合变量

      全局变量Golable

    变量的优先级及格式

      引用格式:{{变量名}}

      局部变量--数据变量--环境变量--集合变量--全局变量

    传参脚本

      获取token及传参

var data = JSON.parse(responseBody);
pm.globals.set("token",data.token);

      获取响应信息中的ID及传参

/获取前面请求的客户ID
var data = pm.response.json(responseBody);
pm.globals.set("Cid",data.obj.id);
console.log("客户ID:"+pm.globals.get("Cid"));

    常用变量的脚本

      备注详情

//1.设置环变量
pm.environment.set("hosttest", "192.168.1.1");
//获取环境变量
var env = pm.environment.get("hosttest");
console.log("1.获取设置的环境变量env:"+env);
//2.设置全局变量
pm.globals.set("glo", "设置全局变量glo");
//获取全局变量
console.log("2.获取设置的全局变量:"+pm.globals.get("glo"));
//3.设置局部变量
pm.variables.set("var","设置的局部变量var");
//获取局部变量
console.log("获取设置的局部变量var:"+pm.variables.get("var"));
//4.集合变量在集合下edit--Varibles设置集合变量
//5.清除全局变量
pm.globals.unset("teID");
//6.清除环境变量
pm.environment.unset("env");
//7.创建请求,发送请求,登录操作
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());
});
View Code

    常用断言脚本

      备注详情

常用断言:
//1.状态码断言
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
//2.查看响应体中是否包含的内容
pm.test("Body matches string", function () {
pm.expect(pm.response.text()).to.include("成功");
});
//3.响应值中JSON值的验证
pm.test("Your test name", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.code).to.eql("0000");
});
//4.查看响应体中包含的内容
pm.test("Body is correct", function () {
pm.response.to.have.body("responsebodystring");
});
//5.查看响应头 Conten-Type 是否存在
pm.test("Content-Type is present", function () {
pm.response.to.have.header("Content-Type");
});
//6.查看响应时间是否小于200毫秒
pm.test("Response time is less than 200ms", function () {
pm.expect(pm.response.responseTime).to.be.below(200);
});
//7.成功的响应状态码是否包含
pm.test("Successful POST request", function () {
pm.expect(pm.response.code).to.be.oneOf([200,202]);
});
//8.状态码包含的字符串
pm.test("Status code name has string", function () {
pm.response.to.have.status("OK");
});
//9.xml格式转换json的格式
var jsonObject = xml2Json(responseBody);
//10.为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;
});
View Code

    postman到处报告

      本地导出

        执行结合-->run-->export result

      newman run 命令导出

        安装Node.js

          node -v命令显示版本即可

        安装newman

          安装命令:npm install newman -global

               newman -v 显示版本即可

        安装html报告格式库

          安装命令:npm install -g newman-reporter-html

               执行命令:

              

newman run c.json(执行的集合文件) -g d.json(全局变量文件) -e e.json(环境变量文 件) -d csv.txt(数据文件) -n 6(迭代次数) --reporters html --reporter-html-export d: 2020webapi
eporter.html(报告文件路径) 
View Code

  

  Fiddler工具使用

    Fiddler抓包工作原理

      就是客户端和服务器之间建立一个代理服务器,默认地址127.0.0.1,端口:8888

      浏览器发送请求会先发送到fiddler,fiddler再发送到服务器

      服务器的响应也是先发送到fiddler,fiddler在发送到客户端

    Rules--Automatic Breakpotins

      请求前断点Before Request

        步骤

          暂停抓包,进入响应的界面输入数据

          回到页面进行数据提交

          回到fiddler,webform修改请求数据

          点击break on response -->run to completion 继续执行

        使用场景

          假设前台页面限制某个输入框只能输入20个字符

          需要测试接口该输入框长度超过20个字符接口是怎么处理的

      请求后断电After Response

        步骤

          设置请求后断点,页面操作,抓取数据

          修改相应内容

          run to completion 继续执行

          查看页面数据

        使用场景

          假设你测试某个UI功能,其中某个字段的长度最大值是200,但是你的请求获取到的内容都很小

          无法看到字段长度很长时界面的展示情况,那么,你可以修改响应报文,把返回的内容自行修改

    AutoResponder自动响应

      步骤

        抓包请求

        选择请求右击save-->response-->save response body

        修改保存数据

        启动autorespnseder

        把刚才的请求add rule-->添加刚才修改的json文件-->save

        刷新页面

      使用场景

        前端工程师设计好界面后,想调试一下页面效果,但是后端工程师接口功能还未完成,无法调试

        此时,前端工程师可以把某些请求设置为自动应答,响应返回本地测试数据

    Composer模拟器使用

      步骤

        开启抓包,发送请求(该请求要有参数)

        拖动请求到compser中,绿色状态松开即可

        修改请求参数

        执行,会有新的请求加载,点击查看inspector中响应信息

      使用场景

        模拟后端,查看相应结果

    Filters过滤器,域名过滤

      只显示特定域名记录,Filters--勾选Use Filters--Hosts

      选择Show only the following Hosts--输入需要显示的域名--点击actions生效

    https抓包设置

      tools-->option-->https-->左边选项进行勾选操作

      tools-->option-->https-->action-->export 导出证书--浏览器导入证书

    手机抓包设置

      tools-->option-->connections-->设置好端口--勾选allow remote computers to connect--点击ok

      手机设置

        设置--无线局域网WIFi--代理设置--设置代理服务器电脑的ip(就是打开fiddler那台电脑的IP)--端口

        手机浏览器--输入代理服务器电脑的ip+端口:如:192.168.3.8:8888

        下载安装证书即可

      手机弱网测试

        Rules-->Customize Rules-->查找(ctrl+f)300数值--数值向上增加改值保存

        启动Rules-->Performance-->勾选Simulte Modem Speeds

        执行发送请求,弱网测试,看响应时间

 

      

参考地址:

https://www.processon.com/view/5e9fdf9ff346fb177b8b7627#map

原文地址:https://www.cnblogs.com/hofmann/p/12956571.html