刚接触接口测试的同学会很困惑,不是叫接口测试吗怎么又叫Web API
呢,很多人对Web
接口测试这一方面概念非常的模糊好多名词搞混淆了,我们第一件事就是要搞清楚一些名词的概念,省的交流的时候产生很多困惑。
很多同学听过下面这些术语,比如:
纷乱的术语
- 接口
- Web服务(Web Service)
- API
- Web API
- REST API
- SOAP
凡是接触到接口测试这一块的大家会把这些名词的概念经常的搞混,我们今天有必要把这些名词给大家梳理一下,不然在以后接口测试的时候他说一个名词你说一个名词的互相交流起来对名词理解上有障碍
什么是接口测试
要理解什么是接口测试,首先我们需要理解什么是“接口”,接口的英文是“interface”,接口是某个对象和外界交互的部分,拿应用程序来说,它可能有很多接口。比如一个软件产品,可能有如下几种和外界交互的部分:
提供用户界面给用户使用
这个用户界面称之为用户接口UI,是应用和用户交互的部分。可能是图形化的界面,叫做图形用户接口(英文名成为GUI),也可能是非图形的命令行接口,这个也是用户接口UI,可以叫command UI,这些接口测试一般是人手工操作。提供消息交互接口和其他应用程序交互
比如diameter,radius(比如电信鉴权网关),基于SOAP的Web Service(比如股价查询服务器),Rest API(比如阿里云对象存储服务OSS API)这些接口的测试一般是开发测试工具,收发相应的消息。提供编程接口,供开发者的程序调用
比如:为了更方便的使用阿里云OSS,他们提供了开发包,对其OSS接口封装了编程语言库。其他
对账系统:他们有的是提供了文件接口,直接把文件放在一个固定的ftp服务器上给别的系统来取。数据服务产品:比如一些数据库、缓存、消息队列服务:他们直接提供的对外接口是Socket、共享内存、管道等,这些测试,也需要开发测试工具。
综上可知:上面的所有和外界交互的部分都是接口,对上述接口的测试都可以称之为接口测试。其泛义上理解的话,所有的测试都可以称之为接口测试,UI测试是UI接口;消息测试是测试消息接口;编程库的开发包测试是测试编程接口。实际上我们很多人经常挂在嘴边的说的“接口测试”,或者“API”测试,其实是第二种里面Web服务器提供访问的接口,简称Web服务接口。
-从接口测试说起
- 应用程序可能有很多接口
- 消息交互接口
- diameter,radius -socket tcp(比较底层一点,直接是基于tcp协议)
基于HTTP目前使用最多的、最主流的就是下面两种 - 基于SOAP的Web Service - HTTP
- REST API - HTTP
- diameter,radius -socket tcp(比较底层一点,直接是基于tcp协议)
- 消息交互接口
Web服务接口
- 互联网产品对外提供的服务接口,我们称之为:Web服务接口、Web service接口、Web API,这三个词是一个概念,所以经常说的“接口测试”、“API测试”就是对Web服务接口的测试,包括APP服务端接口。所以我们这里说的呢就是基于HTTP的Web API接口,有的人会有疑问既然是Web API,是不是就是网站上的才是Web啊,不一定的只要是基于Web技术的都可以,比如移动应用就是手机上的应用这个接口也可以称为Web API接口,只要是基于Web的HTTP这种通长也叫作Web API这个大家了解下,注意手机上不是所有的游戏有一些就不是,大部分都是通过HTTP的Web API。
目前来说Web API接口主要有两种类型的规范目前比较多一种是基于SOAP的Web Service另一种是REST 接口。
基于SOPA的Web Service是之前的相对比较老旧的技术,目前已经用的越来越少了,大家看到更多的是基于REST API的接口,我们要知道基本上目前的REST类型的接口基本上都是基于HTTP协议的。
API测试的特点
- 测试方法
- 使用市场上现有的工具软件
- 使用变成语言进行开发
- Web API测试和Web UI测试的区别
UI测试他通常是人直接操作这个软件系统就可以了,比如直接操作浏览器直接操作手机啊,不需要额外的工具。但是Web API接口测试是需要工具的,没有工具是没有办法发送消息的。
有一个问题,我们拿到一个产品比如一个网站,网站有客户端(手机)和浏览器,可以通过手机对这个系统进行操作也可以通过浏览器,那我们做测试的时候要做哪些测试呢,UI测试肯定要做的,还一个问题手机和浏览器作为客户端和系统的服务器之间他们之间的接口就是我们所说的Web API接口,那这个接口我们要不要对他就行测试呢,对于我们测试人员来说需不需要对这个接口进行测试,有一个原则可以确定,这个接口是不是暴露给外部系统的,是不是外部接口,如果是外部接口就需要测试,内部就不需要。假如这个接口不是暴露给外部的他就是一个纯的内部接口公司的总监让你测试,照理说你是没有义务去测试内部接口,如果你测就相当于帮开发人员测,帮他去做接口的联调了,举个简单的例子你就发现测试内部接口会有什么问题:比如我们举个简单的用户注册的用例,用户注册要输入用户名,输入用户名系统明文规定了输入用户名的长度最长不许超过20个字符,你绕过前端对接口进行测试,输入21个字符的用户名进行注册,服务端没有进行检查注册成功了,我们就要报bug了,开发人员就来怼你了,你这个bug就不应该提因为我们前端人员进行了限制,你只要在手机里输入在浏览器里输入前端就会限制掉,你为什么直接绕过前端进行测试?这样就不好了。
HTTP协议简介
虽然REST和SOAP Web Service 并没有一定说接口消息用HTTP协议传输,但实际上,几乎所有号称RESTful的系统和SOPA Web Service 都是基于HTTP的,所以,要进行Web接口测试首先大家了解HTTP协议。
是什么?有什么用
Http全称Hypertext Transfer Protocol超文本传输协议。最初发明它是用来在浏览器和web服务器之间传输超文本信息的,泛义上属于应用层的协议。由于现在传输层和网际层基本都是TCP、IP协议,所以其示意图可以如下:
由于HTTP协议清晰明了,应用范围非常广泛,很多其他应用(比如移动应用)都会使用它作为底层的传输协议。HTTP有很多版本:0.9,1.0,1.1,2。目前使用最广泛的是HTTP/1.1版本。新学习web的人经常混淆的两个名词就是HTTP和HTML,都是H开头的,但是两个概念完全不同。HTML是一种用来定义网页的文本语言,会HTML就可以编写网页;HTTP是在网络上传输信息(当然也包括HTML)的协议,通常用于浏览器和服务器通信。
举个例子,我们到京东买手机,手机需要包装到快递纸盒中,然后一路送到我们手里。手机实际的内容相当于HTML。包装且运输的方法相当于HTTP。web浏览器和web服务器之间是通过HTTP协议进行交互的,而浏览器和服务器之间的交互,都是通过N次和HTTP事务(transaction)进行的。一次HTTP事务包括浏览器发出的http请求(request)和服务器回应的http响应(response)组成。
HTTP请求格式
http通长是一种事务型协议,所谓事务型的协议就是有请求有响应,就是一个请求对应一个响应,请求是由客户端发起HTTP请求给服务端的,服务端返回一个HTTP响应,通常这个称之为一次HTTP的事务。
首先我们来看请求消息
首先第一行内容,术语成为请求行,请求行里面主要包含什么信息呢?表示这次要做操作什么资源,比如GET
请求是用来获取信息的,表示从/images目录下请求logo.gif这个文件,协议版本是HTTP/1.1
比如我们看一个具体的百度上面,注意浏览器去访问一个服务的时候按F12
就可以打一个开发者工具栏的一个东西,然后点击Network
,就会把我们访问网站所搜发的信息都可以存储下来,比如我们点击百度,界面如下
其中红色框子中的每一行对应一次http的transaction,包括请求和响应。我们点击其中第一条记录,看看其中的内容,注意,我们要点击右边窗口的headers标签,看到的内容如下:
大家注意web浏览器和服务器之间是通过HTTP协议进行交互的。而浏览器和服务器之间的交互,都是通过N次HTTP事务(transaction)进行的,一次HTTP事务包括浏览器发出的http请求(request)和服务器回应的http响应(response)组成。比如我们上图中General部分显示的就是这次HTTP事务的大概信息:浏览器发出http请求,请求的URL是https://www.baidu.com/,表示浏览器告诉服务器,我们想获取这个url对应的网络资源的信息,而服务器,执行web服务器代码发现这个url对应的是个html的网页内容,于是就将其内容在http响应中返回给浏览器。200 OK表示响应成功。我们可以在Request标签中看到html的内容。如果我们想查看具体的http请求和响应的信息,可以点击Request Headers和Response Headers边上的“view source”看到的内容如下
请求行有请求的urlRequest URL: https://www.baidu.com/
,有请求的方法Request Method: GET
这些都是在请求行里面的
下面这部分就是请求头
这两行是一个http请求,是一个获取信息的请求
GET
一个POST请求消息例子如下(注意请求头和消息体之间的空行)
他的请求是
POST
,POST请求通常是传递消息的,他不是要获取消息而是要提交信息给服务端,通常http请求除了请求行里面的第一行的信息还有请求头,就是下面的这些信息请求头也包含了请求所带的一些信息比如我这个请求要访问的目标网站的地址foo.com
,请求头里面还可以包含很多其他类型的请求头比如Content-Type:
请求头是提供请求一些额外的信息,比如请求消息体有多少个字节这些
-消息体
请求行和请求头是必须有的,空行和消息体可能有也可能没有。假如请求有消息体的话,请求头和消息体之间会有一个空行,没有消息体就不用了。
请求行
请求行在第一行,包含:
- 请求的方法
请求的方法常见的有GET、POST、PUT、DELETE、HEAD等
GET:请求获取Request-URI所标识的资源
POST:在Request-URL所标识的资源后附加新的数据
PUT:请求服务器存储一个资源,并用Request-URI作为其标识(修改)
DELETE:请求服务器删除Request-URI所标识的资源
HEAD:请求获取由Request-URI所标识的资源的响应消息报头 - 请求的URL(除去主机名部分)
这个例子中表示我们要访问的资源是/index.html - http 协议版本
这个例子中表示我们使用的HTTP/1.1
请求头字段
http的请求头用来表示请求的其他信息。比如Host表示请求发往的目标机器主机名或者IP地址。还有Content-Length表示请求消息体的长度。http还有很多其他的请求头字段,我们后面会相应的讲解他们的含义。像这种Content-Length、Content-Type都是http协议标准里面提供的一些请求头,更多的协议标准协议头https://tools.ietf.org/html/rfc4229
除了这些标准的请求头之外我们还可以自定义头,有兴趣的可以自己了解下
请求消息体
很多时候,http请求是需要请求消息体的,尤其是POST、PUT等请求,请求消息体中保存了要提交给后台的数据信息。比如我们要上传一个文件。使用POST方法的HTTP请求发送文件数据。这些文件内容数据就在请求的消息体中。消息体存放资源信息的。
通常GET请求是没有消息体的,因为它是用来获取数据的,获取数据他请求本身不需要带数据。所以他没有消息体。除了POST请求其他请求也可以带PUT、DELETE、也可以带消息体,比如PUT修改一些信息,修改的信息修改新的信息是什么呢?比如修改用户名那新的用户名是什么呢,通常也可以放在消息体里面。
再比如说用POST上传一个文件,那可能HTTP消息体里面这个消息体是什么?就是你上传文件的内容了,消息体里面是存放资源信息的。。
请求的消息体有的时候有各种格式,大家记住Content-Type
字段,后面的笔记我们会详细讲解,Content-Type就定义了请求消息体里面的数据的格式,我们常见的格式
比如大家看到的www-form-urlencoded
格式
还有大家熟悉的XML
、Json
HTTP响应
HTTP的响应消息包含如下内容
- 状态行
- 响应头
- 空行
- 消息体
状态行和响应头是必须要有的。空行和消息体可能有也可能没有。
HTTP响应消息的一个例子如下
这个例子包含里面包含状态行和几个响应头,一个空行和相应的消息体(消息体是一个html文档)
状态行:
状态行在第一行,包含协议版本状态码和描述状态的短语,比如
HTTP/1.1 200 OK
表示客户端的请求成功响应;
状态码的第一个数字代表当前响应的类型:
- 1XX 消息——请求已被服务器接收,继续处理
- 2XX 成功——请求已被服务器接收、理解、并接受
- 3XX 重定向——需要后续操作才能完成这一请求
- 4XX请求错误——请求含有词法错误或者无法被执行
- 5XX服务器错误——服务器在处理某个正确请求是发生错误
响应头字段
http的响应头用来表示响应的其他信息,比如Date表示响应消息发送的日期时间,还有Dcontent-Length表示请求消息体的长度,Content-Type响应消息的格式,我们例子里面是html
,响应的消息体就是html格式,http还有很多其他的响应头字段,我们后面会相应的讲解他们的含义
响应消息体
很多时间http响应是需要消息体的,比如请求一个网页的内容,那么我们网页的html内容就在响应的消息体中给出。再比如,一个REST API请求一个产品的价格信息,那么价格信息通常也是在HTTP响应消息的消息体中给出。