第一章:接口概述
1.什么是接口?
官方解释: Application Programming Interface,应用程序接口,简称 API,程序中具体负责
在不同模块之间传输或接受数据的并做处理的类或者函数。简而言之,提供数据服务的类or函数。
硬件:USB接口,手机的type-C接口,电脑的充电接口,显示器HMDI接口。
软件:其实就是后台的一个函数,接口文档里面描述的接口参数其实就是函数的参数,接口的返回数据就是函数的返回值。比如注册,在系统里面就会对应一个注册的函数,这个函数比较特别,通过某些映射框架的处理可以让你通过一串接口地址访问到它。当然一般一个接口项目是需要先部署在一些web容器中,通过web容器发布web服务以后才能访问到的,常用的web
容器有Tomcat,Jboss,weblogic等等。
如下图所示:
可以简单粗暴的理解为接口其实就是没有UI层的功能模块
2.接口的作用
1、可以使项目分离,所有层都面向接口开发,提高开发效率;
2、接口使代码和代码之间的耦合度降低,变得可插拔,可以随意切换;
3、接口和抽象类都能完成某个功能,优先选择接口,因为接口可以多实现,多继承,并且一个类除了接口之外,还可以继承其它类。
3.接口测试的好处
1) 提高测试质量
软件开发的过程是一个持续集成和改进的过程,而每一次的改进都可能引进新bug,因此当软件的一部,或者全部修改时,都需要对软件产品重新进行测试。其目 的是要验证修改后的产品是符合需求的,而当没有自动化测试代码时,往往会由于各种各样的原因,回归不充分,导致bug遗漏。
2) 提高测试效率
软件系统的规模越来越大,功能点越来越多,开发人员的自测或者测试人员的人工测试非常耗时和繁琐,势必导致测试效率的低下,而自动化测试正好解决这些耗时繁琐的任务,在对外接口功能不变的情况下,达到了一次编写,永久使用的效果。
3) 提高测试覆盖率
通过手工测试很难测试到一些更深层次的异常和安全的问题,通过一些辅助的一些测试工具,能分析出代码的覆盖率,通过覆盖率的提高来提高测试的深度。
4) 更好地重现软件缺陷
由于每次执行都是相同的代码,一旦代码出错,必定回归出错。
5) 更好定位错误
由于接口测试是一种自下向上的测试,因此一量出错,非常容易定位出错,不像系统测试那样了,一旦有Bug,需要几层验证之后才能确定出错位置。
6) 降低修改bug的成本
接口测试基本和开发人员的编码平行工作,因此发现问题会比系统测试早很多,因此减少了修改bug的成本。
7) 增进测试人员和开发人员之间的合作关系,测试工程师为了更好地开展工作,需要对开发技术有深入的理解和实践,有了与开发工程师更多的交流。
8) 降低了项目不能按时发布的风险
由于接口测试很早就介入,在提交给系统测试前对项目代码的核心模块已经做了详尽的测试,必定加速系统测试的时间,由此来保证项目的按时发布。
9)提升测试人员的技能
做接口测试必须了解开发人员的开发流程和一些开发技能,也需要了解测试工具的一些使用方法和一些测试思想,提升了测试人员的技术附加值,提高了自身的竟争 力。
10)促使项目开发过程的规范化
要进行接口测试,需要完善的文档进行保障,没有测试文档,接口测试将寸步难行,接口测试将规范开发过程的文档输出,而规范化产出也保证了项目质量。
4.接口测试
1)根据接口文档,明确请求协议,域名,端口,路径。
2)明确请求方式,参数及值。
3) 在浏览器模拟请求,or使用工具postman、jmeter、LR、或自己进行编码去模拟请求。
4) 获取返回响应,校验返回内容的正确性
接口文档主要字段:
a 接口说明
该接口提供的服务,如获取笑话内容,获取媒资资源
b 各环境域名
显示服务器开发、测试、预生产、正式环境的域名,如test-joke.cloud:8000
c 接口路径
如/joke/getjokecontent,加上域名后,是请求服务器的完整路径。如test-joke.cloud:8000/joke/getjokecontent
d 请求参数与方式说明
如请求方式:POST Content-Type:application/json
请求参数模版示例
参数 | 类型(传入参数的类型) | 是否必选(该参数是否必须上传) | 说明 | 示例 |
test | String | 是或否 | 该字段的业务说明 | 你好 |
e 返回参数说明
返回参数模版示例
参数 | 类型(传入参数的类型) | 是否必选(该参数是否一定返回) | 说明 | 示例 |
code | int | 是或否 | 服务器返回状态码 | 200 |
f 请求体与响应体示例
h 常见错误码
a: 头部(headers):用于规范数据格式内容。表示在HTTP请求或响应中的用来传递附加信息的字段,修改所传递的信息的语义,或使其更加精确,属于http头的其中一类,它包含有与所要获取的资源或客户端自身相关的附加信息。
下表给出一些常见的request header
参数 | 意义/作用 |
Accept | 告诉服务器,客户机支持的数据类型 |
Accept-Encoding | 告诉服务器,客户机支持的数据压缩格式 |
Accept-Language | 浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到 |
Authorization | 授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中,一般用于保存Token |
Cache-Control | 缓存控制,服务器通过控制浏览器要不要缓存数据 |
Connection | 表示是否需要持久连接。如果Servlet看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间 |
Content-Length | 表示请求消息正文的长度 |
Content-Type | 表示请求的数据类型 |
Host | 访问的主机名和端口 |
Origin | 发送请求的主机名和端口 |
Pragma | 指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝 |
Referer | 包含一个URL,用户从该URL代表的页面出发访问当前请求的页面 |
User-Agent | 浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用 |
b: 身体(body):用于承载数据,一般用于POST请求中,主要定义向服务器提交的数据类型,提交数据方式有以下常见的几种。
Content-Type | 提交数据方式 |
application/x-www-form-urlencoded | Form表单提交 |
multipart/form-data | 表单文件上传提交 |
application/json | 系列化json数据提交 |
text/xml | XML数据提交 |
方法 | 描述 |
GET | 发送请求来获得服务器上的资源,请求体中不会包含请求数据,请求数据放在协议头中。另外get支持快取、缓存、可保留书签等。幂等 |
POST | 和get一样很常见,向服务器提交资源让服务器处理,比如提交表单、上传文件等,可能导致建立新的资源或者对原有资源的修改。提交的资源放在请求体中。不支持快取。非幂等 |
HEAD | 本质和get一样,但是响应中没有呈现数据,而是http的头信息,主要用来检查资源或超链接的有效性或是否可以可达、检查网页是否被串改或更新,获取头信息等,特别适用在有限的速度和带宽下。 |
PUT | 和post类似,html表单不支持,发送资源与服务器,并存储在服务器指定位置,要求客户端事先知道该位置;比如post是在一个集合上(/province),而put是具体某一个资源上(/province/123)。所以put是安全的,无论请求多少次,都是在123上更改,而post可能请求几次创建了几次资源。幂等 |
DELETE | 请求服务器删除某资源。和put都具有破坏性,可能被防火墙拦截。如果是https协议,则无需担心。幂等 |
CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。就是把服务器作为跳板,去访问其他网页然后把数据返回回来,连接成功后,就可以正常的get、post了。 |
OPTIONS | 获取http服务器支持的http请求方法,允许客户端查看服务器的性能,比如ajax跨域时的预检等。 |
TRACE | 回显服务器收到的请求,主要用于测试或诊断。一般禁用,防止被恶意攻击或盗取信息。 |
常见的状态码
200 : 请求成功
301 : 资源(网页等)被永久转移到其他URL
404: 请求的资源(网页等)不存在
500: 内部服务器错误
第二章:项目需求
1.UI图
2.需求描述
(1)用户登录成功后,显示用户的账号名、级别信息。
(2)点击next按钮会显示获取的笑话内容并显示出来,滚动显示。
3.开发实现流程图
4.接口文档
提供笑话文本内容信息服务
测试环境地址:https://5863279ha5.goho.co:443/getJoke/
预生产环境地址:未准备
正式环境地址:未准备
/getJoke/
a: 请求方式:post
b: header:Content-Type:application/json
c: 请求参数说明
参数 | 类型(传入参数的类型) | 是否必选(该参数是否必须上传) | 说明 | 示例 |
userName | String | 是 | 用户名字信息 | 张三 |
versionCode | int | 是 | 应用版本号 | 1.0 |
androidVersion | int | 是 | 安卓设备系统版本号 | 9.0 |
d: 返回参数说明
参数 | 类型(传入参数的类型) | 是否必选(该参数是否必须上传) | 说明 | 示例 |
code | int | 是 | 服务器状态码 | 200 |
msg | String | 是 | 笑话文本内容 | 一个漫画家想宣传戒酒,就画了一个骷髅仰面喝酒的漫画。一日,他逛街看到自己的漫画贴在宣传栏上了。他想看看效果,遂问身旁的人这幅画什么意思。那人立即回答:“喝酒就要往死喝。”又一个人说:“不对,是死也要喝完酒。”又有一个。。。 |
e: 请求与响应体示例
请求体:
{"userName":"张三",
"versionCode":2.0,
"androidVersion":9.0}
响应体:
{"code": 200,
"msg": "一个漫画家想宣传戒酒,就画了一个骷髅仰面喝酒的漫画。一日,他逛街看到自己的漫画贴在宣传栏上了。他想看看效果,遂问身旁的人这幅画什么意思。那人立即回答:“喝酒就要往死喝。”又一个人说:“不对,是死也要喝完酒。”又有一个人说:“才不是呢,是死也要做一个酒鬼。”第四个人开口说:“你们都错了,这是一个酒的广告,是说:好酒喝死也值得。”"}
第三章:接口测试
参数解释以及实际测试值
userName:用户名字,从登录接口获取,实际测试值:用户信息数据库中的用户名字
versionCode:当前app的版本号 实际测试值:已经上线的当前app的各种版本号,通过BI或其他数据方式获取
androidVersion: 安卓系统版本号,实际测试值:安卓当前主流的版本号,5.0-11.0。
测试集设计原则:
正面测试集
负面测试集
以当前接口为例
userName 参数是用户名字信息,是一个穷举的参数。
正面测试集:
我们从用户信息数据库中获取一批数据保存本地,然后每次随机获取一个。
负面测试集:
空数据,数据类型错误,该参数类型是字符串,我们传入int,boolean等类型的
versionCode 参数是app版本号
正面测试集
穷举所有的版本号,包括边界,最新和最旧的版本号
负面测试集:
空数据,数据类型错误,数据小数点位数错误等
androidVersion 参数是安卓系统版本号
正面测试集
穷举所有的版本号,包括边界,最新和最旧的版本号
负面测试集:
空数据,数据类型错误,数据小数点位数错误等
返回参数校验的关注点
以当前接口response为例
code 状态码
msg 笑话文本信息实际内容
2.如何做接口测试
比较简单,可以参考地址 " https://zhuanlan.zhihu.com/p/161793399 " ,介绍postman如何使用
先看下安卓app这里是如何实现模拟发送这个http请求的,如下图所示
然后会做json解析,如下图所示
然后控件加载解析后的数据呈现
知道了app端是如何实现整个请求后,我们要做的编码是通过python实现http请求,动态化加载测试数据,然后校验返回内容。
这里需要你有python基础,可以参考链接 "https://www.runoob.com/python/python-basic-syntax.html " ,你需要了解基础的语法,变量,函数,判断和循环语句 。
然后根据app端的流程,我们的代码流程如下
这里测试集数据比较少,我们就直接通过声明一个list来作为测试集,如下图所示:
这里我们会用到requests库(模拟请求)/json库(json类型转换)/time(获取处理时间)库,
然后我们定义一个函数,把username,versionCode,androidVerison作为传入参数,如下图所示:
先看下完整的response
{'code': 200,
'msg': '一晚上,一孩子烧纸钱,嘴里默念:“爷爷啊,你在那边还好吗?给你烧的纸钱里我放了几个数学试卷,,你没事多做做题,对脑子好,如果你有不懂的,把我们班主任带走,她教您。”'}
python解析json数据时,先通过函数json.loads() 转换为python的字典类型
然后通过字典的取值方式,来做解析,如getjokeRequest()函数,返回的值已经是字典类型
解析代码如下:
打印结果如下
如图所示,我们已经拿到解析的code和msg内容。
对于username,versionCode,androidVerison三个参数每次的测试结果,我们把它保存到excel中(备注:也可以保存到数据库中)
这里我们会用到 openpyxl这个库。
该库参考地址 "https://www.cnblogs.com/programmer-tlh/p/10461353.html "
先看下我们期望保存excel的各列显示
每一行的数据就是我们测试的传入参数和对应的返回结果的值。
这里我们写一个类,在初始化的时候示例化对应的库,然后写入首行的值,然后定义一个函数,调用时写入结果到excel,代码和注释如下图:
在这里我们通过遍历前边声明的对应的传入参数list变量来实现送入测试集,然后调用保存函数保存结果到excel。
需求是我们要满足list参数username里边每一个值测试的时候,随机去username里边的值,然后遍历androidVersion的值。代码与注释如下:
实际生成excle内容,如下图所示:
根据业务,首先筛选code不为200的数据,然后筛选msg为空或者内容有误的话,当然这些也可以直接在代码中通过判断来写入一个测试结果的列,如判断code,代码大致逻辑如下:
if(code == 200):
对应excle列存入pass
else:
对应excle列存入failed
留言与评论(共有 0 条评论) “” |