接口测试

以下接口来源:http://doc.nnzhp.cn/  账号:xiaohei  密码:123456  

切玩且珍惜

目录

一、接口基础

二、接口测试

三、接口测试工具

四、总结

接口基础

接口是什么?

  说白了就是从数据库内取数据/插入数据。前端展示出的浏览网页,所看到的数据都是在数据库内,那么正要展示给用户,前后端交互就要借助接口。

接口分类

  接口一般来说有两种,一种是程序内部的接口,一种是系统对外的接口。

  系统对外的接口:比如你要从别的网站或服务器上获取资源或信息,别人肯定不会把数据库共享给你,他只能给你提供一个他们写好的方法来获取数据,你引用他提供的接口就能使用他写好的方法,从而达到数据共享的目的,比如说咱们用的app、网址这些它在进行数据处理的时候都是通过接口来进行调用的。

  程序内部的接口:方法与方法之间,模块与模块之间的交互,程序内部抛出的接口,比如bbs系统,有登录模块、发帖模块等等,那你要发帖就必须先登录,要发帖就得登录,那么这两个模块就得有交互,它就会抛出一个接口,供内部系统进行调用。

  

  现在我们最常用的两种接口就是 webservice 接口和 http api 接口,概念这里就不赘述了,知道有这两种接口和怎么测试就可以了。
  webService 接口是走 soap 协议通过 http 传输,请求报文和返回报文都是 xml 格式的,我们在测试的时候都用通过工具才能进行调用,测试。
  http api 接口是走 http 协议,通过路径来区分调用的方法,请求报文都是 key-value 形式的,返回报文一般都是 json 串,有 get 和 post 等方法,这也是最常用的两种请求方式。

前端和后端

  前端是什么呢,对于web端来说,咱们使用的网页,打开的网站,这都是前端,这些都是html、css写的;对于app端来说呢,它就是咱们用的app,android或者object-C(开发ios上的app)开发的,它的作用就是显示页面,让我们看到漂亮的页面,以及做一些简单的校验,比如说非空校验,咱们在页面上操作的时候,这些业务逻辑、功能,比如说你购物,发微博这些功能是由后端来实现的,后端去控制你购物的时候扣你的余额,发微博发到哪个账号下面,那前端和后端是怎么交互的呢,就是通过接口。
  说的通俗点,前端负责貌美如花,后端负责养家糊口

接口测试

  仨问题:什么是接口测试,为什么做,怎么做?

 什么是接口测试

  刚刚我们讲过,接口就是连接前后端的,那么接口测试可以简单理解为脱离了前端的功能测试。那么一个一个的接口就对应功能测试内一个一个的功能(但是要注意,一个功能有可能不是一个接口就能实现),那么接口测试和功能测试的区别在哪呢?其实功能测试就是在页面上输入我们的参数值,点点点;而接口测试没有前端,而是通过接口文档上的调用地址、请求参数等,校验返回的结果值。

  那么,从某种意义程度上讲,接口测试的难度是小于功能测试的,因为功能测试还得考虑前端显示问题,比如字体显示,颜色,兼容性等……

 为什么要做接口测试

   刚刚咱们提到过,接口测试就是没有前端的功能测试,那么既然我们要进行功能测试,为什么还要做接口测试???这样做是不是进行了重复测试呢?

  思考一个问题,假如现在在京东app上买东西,支付订单,订单金额是500元,支付的话,那肯定要调用支付接口,你在页面上操作的话,订单金额是修改不了的,那如果你想测试一下服务端有没有校验订单的金额,我想把订单金额改成5元,那在页面上点是测试不了的,这个时候我们就可以直接用接口来调用,修改一下订单金额的值,然后再发请求就可以了。

  或者另一种情况,前端咱们限制了输入的内容,或者说是下拉框选择的情况,那么这样是前端测试不了的。我们只能借助接口测试传不同的参数来进行测试
  当然这只是我举几个例子,接口测试当然不只是这一点原因,总的来说还是为了更好的提高我们产品的质量。

  接口测试必要性,总结:

  1. 可以发现很多在页面上操作发现不了的bug
  2. 检查系统的异常处理能力
  3. 检查系统的安全性、稳定性
  4. 前端随便变,接口测好了,后端不用变

 怎么做接口测试

接口测试流程

  1. 需求评审,熟悉业务和需求
  2. 开发提供接口文档
  3. 编写接口测试用例
  4. 用例评审
  5. 提测后开始测试
  6. 提交测试报告

接口测试规范文档

既然我们要测试接口,那我们根据什么来测试呢?
那就是接口规范文档,也是我们测试最重要的一个依据
接口文档是干嘛的呢,接口文档说简单点,就是这个接口的使用文档。
接口文档至少包括:

  1. 接口说明
  2. 调用url
  3. 请求方法(getpost)
  4. 请求参数、参数类型、请求参数说明
  5. 返回参数说明

怎么来测试接口—— http 接口

前面我们已经有了接口文档,那么我们就要根据接口文档来拼接参数调用接口,那么怎么调用呢?
接口请求报文拼接
1、url?param=value&param2=value
这种是最简单的一种,问号前面是请求url,后面是请求的参数名和参数值,多个参数用&来连接
https://api.douban.com/v2/book/search?q=邹伟伟
2、还有一种就是入参是json串的,那就不能拼接参数了,需要借助工具来完成比如postman

GET和POST请求:

如果是get请求的话,直接在浏览器里输入就行了,只要在浏览器里面直接能请求到的,都是get请求,如果是post的请求的话,就不行了,就得借助工具来发送。
GET请求和POST请求的区别:
1、GET使用URL或Cookie传参。而POST将数据放在BODY中。
2、GET的URL会有长度上的限制,则POST的数据则可以非常大。
3、POST比GET安全,因为数据在地址栏上不可见。
4、一般get请求用来获取数据,post请求用来发送数据。
其实上面这几点,只有最后一点说的是比较靠谱的,第一点post请求也可以把数据放到url里面,get请求其实也没长度限制,post请求看起来参数是隐式的,稍微安全那么一些些,但是那只是对于小白用户来说的,就算post请求,你通过抓包也是可以抓到参数的。

HTTP状态码

每发出一个http请求之后,都会有一个响应,http本身会有一个状态码,来标示这个请求是否成功,常见的状态码有以下几种:

  • 200 2开头的都表示这个请求发送成功,最常见的就是200,就代表这个请求是ok的,服务器也返回了。
  • 300 3开头的代表重定向,最常见的是302,把这个请求重定向到别的地方了,
  • 400 400代表客户端发送的请求有语法错误,401代表访问的页面没有授权,403表示没有权限访问这个页面,404代表没有这个页面
  • 500 5开头的代表服务器有异常,500代表服务器内部异常,504代表服务器端超时,没返回结果

怎么来测接口—— webservice接口

webservice接口怎么测试呢,他不需要你在拼报文了,会给一个webservice的地址,或者wsdl文件,直接在soapui导入,就可以看到这个webservice里面的所有接口,也有报文,直接填入参数调用,看返回结果就可以了。
天气预报wsdl地址:http://www.webservicex.net/globalweather.asmx?wsdl

接口测试用例设计

  用例设计思路:等价类分析+边界值分析+错误推断+安全+性能

 (一)通过性验证:首先肯定要保证这个接口功能是好使的,也就是正常的通过性测试,按照接口文档上的参数,正常传入,是否可以返回正确的结果。

 (二)接口安全:

  1. 绕过验证,比如说购买了一个商品,它的价格是300元,那我在提交订单时候,我把这个商品的价格改成3元,后端有没有做验证,更狠点,我把钱改成-3,是不是我的余额还要增加?
  2. 绕过身份授权,比如说修改商品信息接口,那必须得是卖家才能修改,那我传一个普通用户,能不能修改成功,我传一个其他的卖家能不能修改成功
  3. 参数是否加密,比如说我登陆的接口,用户名和密码是不是加密,如果不加密的话,别人拦截到你的请求,就能获取到你的信息了,加密规则是否容易破解。
  4. 密码安全规则,密码的复杂程度校验

 (三)异常验证:
  异常的,也就是我不按照你接口文档上的要求输入参数,来验证接口对异常情况的校验。比如说必填的参数不填,输入整数类型的,传入字符串类型,长度是10的,传11,总之就是你说怎么来,我就不怎么来,其实也就这三种,必传非必传、参数类型、入参长度。

 (四)根据业务逻辑来设计用例

  根据业务逻辑来设计的话,就是根据自己系统的业务来设计用例,这个每个公司的业务不一样,就得具体的看自己公司的业务了,其实这也和功能测试设计用例是一样的。
  举个例子,拿bbs来说,bbs的需求是这样的:

  1. 登录失败5次,就需要等待15分钟之后再登录
  2. 新注册的用户需要过了实习期才能发帖
  3. 删除帖子扣除积分
  4. ......

  像这样的你就要把这些测试点列出来,然后再去造数据测试对应的测试点。

接口测试用例模板

下面,做一个测试用例设计模板:

项目 模块 用例 ID 用例描述 请求 URL 请求方式 请求数据 预期结果 请求报文 返回报文 测试结果 测试人员 备注
                         

上表内,是我们的测试用例设计,并且可以根据该表格生成测试结果:返回报文,测试结果,测试人员都可将结果写入,这个在以后再进行研究,前面的那些列就是设计用例的模板

接口测试工具

   一般来讲,小白要做接口自动化,工具就是三种:Postman、Jmeter、SoapUI。这里我们只介绍前两种,个人更喜欢 Jmeter ,毕竟可以用 Beanshell ,也可以导入开发写的 jar 包,方法可直接调用,减少不必要的人工浪费。那么我们先介绍这两种工具,只介绍其中简单的用法,能够做接口测试即可。

Postman

(一)安装

  安装 Postman 不要太简单,一种是进入 Chrome 浏览器的应用内,下载 Postman ,打开即可使用:

 另一种方式就是去下载了:https://www.getpostman.com/downloads/,下载完成安装即可,这里不赘述。

 打开后界面如下:

 那么,这两种安装方式有何不同呢?

  这么说,我个人更倾向第一种方式,经过实践,第一种方式安装的 Postman ,可以安装一个 Interceptor ,同时在 Chrome 浏览器也安装一个该插件。

  那么这个小插件有啥用呢?其实就是把 Chrome 的 cookie 传递到 Postman 内,这样的话,Postman 内就没必要去 Header 内手动添加 cookie ,在 Chrome 进行登录就 OK,那么下载安装的 Postman ,是不能安装 Interceptor 的,所以说会稍显繁琐。

(二)使用

  刚刚说完安装,接下来讲述一下如何使用 Postman 进行简单的接口测试呢?那么我们知道,接口测试就是去访问后端的接口,得到相应的返回结果,进行校验,验证接口是否 OK。那么就涉及到几个问题:

  1. 怎么发请求
  2. 怎么验证结果

1)Postman 脚本编写

  一般来讲,有两种请求是我们经常要用的:GET/POST。那么POST 请求内又分为 Form-Data 、Json、上传文件 三类,具体用什么方式去请求,看接口文档的要求。

GET 请求:

  比如我们就按照 "获取学生信息" 接口,用 Postman 实现

  1. 选择请求方式
  2. 依据接口文档描述,输入 URL 
  3. 如果需要 Header ,在Headers 内进行添加
  4. 点击 Send 
  5. 查看结果


POST请求:

1、Key - Value 形式

2、Json 形式

  Body 内选择 raw,选择 Json 形式,将请求内容粘贴。

  要注意的是,请求选择为 JSON 形式,Headers 内会自动新增一条 Content-Type 为 application/json ,这代表是要发送 JSON 的数据类型,不要手贱删掉

3、上传文件

  类型要选择成 File ,Value 内可选择本地文件

2)校验数据

  关于 Postman 返回数据校验,预想是根据我们的测试用例文档, 去取相对应的预期结果比对。那么这个以后再补充,我们这里就简单介绍一个类似于 Jmeter 断言的内容:

  比如说,我们的登录接口,会返回一个 "userId" ,那么我们校验它是否为 16040

   在 Testers 内,我们可以点击 "Response body:contains string",就会出现如下内容

tests["Body matches string"] = responseBody.has("string_you_want_to_search");

  我们进行替换就好,结果如下:

  结果:userId 为 PASS ,代表校验通过 userId 通过

JMeter 

  Jmeter是apache公司基于java开发的一款开源压力测试工具,体积小,功能全,使用方便,不像loadrunner那样体积大,是一个比较轻量级的测试工具,使用起来非常的简单,深受测试人员的喜爱,但是它的测试报告没有loadrunner的那么详细,看起来没有那么的直观。因为它是java开发的,所以运行的时候必须要安装jdk才可以,jmeter是免安装的,拿到安装包之后直接解压就可以使用了,它也是跨平台的在linux、windows、macos上都可以使用。

  那么,我们怎么用 jmeter 做接口测试呢?

  1. 添加线程组
  2. 添加http请求
  3. 在http请求中写入接口url、路径、请求方式、参数
  4. 添加查看结果树
  5. 调用接口、查看返回值
  6. 对接口的返回值利用响应断言校验返回数据

这里具体的 jmeter 各组件使用以及详细说明不进行赘述,在另一片博文内,我会进行介绍,等待完成贴链接

(一)安装

  安装分两步:

  1. 安装好 jdk:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html ,配置好环境变量
  2. 下载好 Jmeter 安装包:https://jmeter.apache.org/download_jmeter.cgi,解压(环境变量可自行配置,在接口自动化内不大影响,但是性能测试内不配置可能会影响某些插件运行)
Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

C:UsersAdmin>java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

 出现以上界面,代表 Jmeter 安装完成,可进行接口测试

 这里题提两个小坑,关于 Jmeter 乱码的,修改配置文件 jmeter.properties :

A、解决jmeter返回有乱码

  1. 在jmeter.properties文件中最下面加入 sampleresult.default.encoding=UTF-8
  2. 重启jmeter

B、bodydata里面中文显示不出来

  1. 在jmeter.properties文件中最下面加入 jsyntaxtextarea.font.family=Hack
  2. 重启jmeter

(二)使用

  这里测试计划,线程组等概念就不再赘述,直接讲如何进行脚本制作

  先添加一个 http 请求默认值,http 请求内就不用再重复写协议以及服务器的 ip,端口我们是默认的(http 为 80,https 为 443),不用写也成

1、GET 请求

 

 在察看结果树内,可以查看到结果:

2、POST 请求的form-data 形式:

3、POST 请求的 JSON 形式

4、文件上传

  文件名称填写文件的绝对路径;参数名称需要改为接口文档内规定的参数,我们参数名是 file ;如果接口请求不成功就把 MIME 类型写成文件的格式类型

(三)参数化

为什么要参数化呢?

  假如传的参数有唯一性校验,比如手机号等,那么就需要传不同的参数

参数化有很多种方式,这里我们介绍其中几种,工作中比较实用的

1、函数助手

  ${__Random(00,99,tel)}  ## 函数助手定义一个随机值,范围在 00~99 之间,把这个函数直接当一个参数,在本线程组内粘贴直接使用即可(这样还是有可能取到重复值)

  ${__time(,)}  ## 取当前时间戳,默认 13 位 。${__time(yyyyMMddhhmmss,)} 这个就形成了时间戳的年月日时分秒格式化

2、CSV 文件

  将数据造在 excel/csv/txt 等文件内,把数据造在 excel 取值比较特殊,之前整理过解决方案:https://www.cnblogs.com/xiaowenshu/p/9935362.html

3、其他方案

  1、其实可以在 setup 线程组内建立一个 jdbc 请求,取出数据库内当前数值的最大值存为一个全局变量,然后用一个计数器组件,在这个变量基础上一直往后 +1 ,这样就避免了数值取重复的而且不会有数据区间的浪费

  2、如果数据不需要我们造,来源于数据库,我们就连接数据库存参数,逐一取值即可,这里我们之前有整理过:https://www.cnblogs.com/xiaowenshu/p/9949836.html

(四)关联

关联就是将上一个或者几个接口的响应结果分别存为变量,传递给下一个接口使用。

那么我们的 Jmeter 关联如果是接口测试,一般是用 JSON 提取器;在需要提取的 http 请求上右击==>JSON  提取器 ,就可以建立。如果返回值不为 json 串,那么就用正则提取器等。

问题:怎么测试 json 提取结果?

  解决:在我们的察看结果树内,有一个结果的显示规则,我们选择为:JSON Path Tester,可以在 Json Path Expression 内写 json 提取的表达式进行测试,那么具体的 json 提取我们之前也有过整理:

  https://www.cnblogs.com/xiaowenshu/p/10024689.html

(五)检查点

  用于校验接口的响应结果。也就是断言

  我们请求的是接口,返回的数据是 json 数据,所以个人建议用 json 断言

  如果不能用 json 断言,再考虑用响应断言,响应断言可以对线程组内的参数进行判定,这个相对来讲也是比较准确的

(六)Jmeter 操作数据库——以 Mysql 为例

  我们在做性能测试过程中,有时经常要对数据库的性能进行测试,比如说查询语句,插入以及更新语句,那么jmeter能不能做连接数据库的脚本对数据库进行这些操作呢?答案当然是 ok,这里我们就来介绍下,jmeter 怎么连接数据库并对其操作。

  分为两部分:JDBC Connection Configuration+JDBC Request,前者是配置数据库连接池,后者是对数据库进行操作脚本编写的 jdbc 请求。另外,要有连接数据库的 jar 包,放入 jmeter 的 lib 目录下即可,或者在请求所在的线程组内,添加 jar 包的绝对路径(这里推荐放在 lib 目录下,如果脚本在 linux 虚拟机上运行,该目录下肯定没有该 jar 包)

  这里列举几种 jar 包的获取方式:

Mysql:进入官网https://www.mysql.com/,点击"Downloads",拉到最下,选择社区版"Community (GPL) Downloads",找到"MySQL Connectors",点击"DOWNLOAD",点击"Connector/J",点击"MySQL Connector/J Installation Instructions"再点击"Maven repository",然后 Download下来就ok。如果发现在jmeter内运行脚本提示 version 不匹配的,那么就是你的 jar 包版本不对了,自己下其他的吧,jmeter 3 版本用 jdbc 5 左右就ok咯

  • JDBC Connection Configuration

  需要配置的玩意:

Variable Name for created pool:自己拟定一个数据库连接池名称(别手贱写中文)

Database URL:jdbc:mysql://ip:port/DatabaseName?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true  ## 标红的区域是需要修改的,修改为你要连接的 mysql ip,端口,以及数据库名称,注意,该语句前后不能加空格!!!

JDBC Driver class:下拉框选择:com.mysql.jdbc.Driver

Username:连接数据库的用户名

Password:连接数据库的密码

  • JDBC Request

  这里,如果想 insert 或者 update 语句跟 select 语句一起运行的话,则需要选择 Callable Statement

 (七)聚合报告

  介绍一下聚合报告值的意义:

  • Samples  ## 事务数
  • Average  ## 平均响应时间,如果运用了事务控制器,那么就是一个事务的响应时间
  • Median  ## 一半的请求的响应时间是这个值
  • 90% Line  ## 响应时间从小到大排列,90% 的响应时间是这个值,也就是说其余的 10% 请求都超过这个值
  • 95% Line  ## 响应时间从小到大排列,95% 的响应时间是这个值,也就是说其余的 10% 请求都超过这个值
  • 99% Line  ## 响应时间从小到大排列,99% 的响应时间是这个值,也就是说其余的 10% 请求都超过这个值
  • Min  ## 最小的响应时间
  • 最大值  ## 最大的响应时间
  • Error%  ## 错误的事务所占总失误比例
  • Throughput  ## tps
  • Received KB/s  ## 每秒从服务器端接收到的数据量
  • Send KB/s  ## 每秒发送给服务器端的数据量

  注意,在压测过程中,察看结果树以及聚合报告等是不能添加在脚本内的,为什么呢?因为这个其实是日志收集的组件,会对负载机本身造成影响,组件只是调试脚本使用,能不用组件,尽量不用。

(八)No-Gui

  为什么要 no - gui 呢?其实是官方给的建议,压测过程用 no - gui 进行压测。实际上,我们的脚本就是个 jmx 形式的文件,给负载机执行这个脚本而已,那么有没有界面其实不重要,关于no - gui 压测的部署,我们不多说,之前的博客是有整理的:

  https://www.cnblogs.com/xiaowenshu/p/10076707.html

  https://www.cnblogs.com/xiaowenshu/p/9905516.html

(九)分布式负载

  老规矩,上博客链接:

  https://www.cnblogs.com/xiaowenshu/p/9979839.html

  https://www.cnblogs.com/xiaowenshu/p/9925169.html

四、总结

1、面试中会问:为什么要做接口测试?接口测试怎么做?接口测试有什么优势?在文中是有简单提及。

2、接口测试常用工具:postman 和 jmeter,以及辅助工具:fiddler & f12 大法

3、思考一下,jmeter 持续集成的手段以及 postman 的持续集成手段。这样才能真真自动化,jmeter 可以用 jmeter + ant + jenkins。还有个问题,如果我们将测试用例写在 Excel 内维护,那么测试结果那一项,jmeter 如何往文件内写入内容?以此判断测试用例是否通过。

原文地址:https://www.cnblogs.com/xiaowenshu/p/10541007.html