接口自动化测试【完整版】

article/2025/8/29 11:47:10

1. 什么是接口测试

顾名思义,接口测试是对系统或组件之间的接口进行测试,主要是校验数据的交换,传递和控制管理过程,以及相互逻辑依赖关系。其中接口协议分为HTTP,WebService,Dubbo,Thrift,Socket等类型,测试类型又主要分为功能测试,性能测试,稳定性测试,安全性测试等。

在分层测试的“金字塔”模型中,接口测试属于第二层服务集成测试范畴。相比UI层(主要是WEB或APP)自动化测试而言,接口自动化测试收益更大,且容易实现,维护成本低,有着更高的投入产出比,是每个公司开展自动化测试的首选。

下面我们以一个HTTP接口为例,完整的介绍接口自动化测试流程:从需求分析到用例设计,从脚本编写、测试执行到结果分析,并提供完整的用例设计及测试脚本。

2. 基本流程

基本的接口功能自动化测试流程如下:

需求分析 -> 用例设计 -> 脚本开发 -> 测试执行 -> 结果分析

3. 需求分析

需求分析是参考需求、设计等文档,在了解需求的基础上还需清楚内部的实现逻辑,并且可以在这一阶段提出需求、设计存在的不合理或遗漏之处。

如:豆瓣电影搜索接口,我理解的需求即是支持对片名,演职人员及标签的搜索,并分页返回搜索结果。

4. 用例设计

用例设计是在理解接口测试需求的基础上,使用MindManager或XMind等思维导图软件编写测试用例设计,主要内容包括参数校验,功能校验、业务场景校验、安全性及性能校验等,常用的用例设计方法有等价类划分法,边界值分析法,场景分析法,因果图,正交表等。

针对豆瓣电影搜索接口功能测试部分,我们主要从参数校验,功能校验,业务场景校验三方面,设计测试用例如下:

 5. 脚本开发

依据上面编写的测试用例设计,我们使用python+nosetests框架编写了相关自动化测试脚本。可以完整实现接口自动化测试、自动执行及邮件发送测试报告功能。

5.1 相关lib安装

必要的lib库如下,使用pip命令安装即可:

pip install nose
pip install nose-html-reporting
pip install requests

5.2 接口调用

使用requests库,我们可以很方便的编写上述接口调用方法(如搜索q=刘德华,示例代码如下):

#coding=utf-8
import requests
import jsonurl = 'https://api.douban.com/v2/movie/search'
params=dict(q=u'刘德华')
r = requests.get(url, params=params)
print 'Search Params:\n', json.dumps(params, ensure_ascii=False)
print 'Search Response:\n', json.dumps(r.json(), ensure_ascii=False, indent=4)

在实际编写自动化测试脚本时,我们需要进行一些封装。如下代码中我们对豆瓣电影搜索接口进行了封装,test_q方法只需使用nosetests提供的yield方法即可很方便的循环执行列表qs中每一个测试集: 

class test_doubanSearch(object):@staticmethoddef search(params, expectNum=None):url = 'https://api.douban.com/v2/movie/search'r = requests.get(url, params=params)print 'Search Params:\n', json.dumps(params, ensure_ascii=False)print 'Search Response:\n', json.dumps(r.json(), ensure_ascii=False, indent=4)def test_q(self):# 校验搜索条件 qqs = [u'白夜追凶', u'大话西游', u'周星驰', u'张艺谋', u'周星驰,吴孟达', u'张艺谋,巩俐', u'周星驰,大话西游', u'白夜追凶,潘粤明']for q in qs:params = dict(q=q)f = partial(test_doubanSearch.search, params)f.description = json.dumps(params, ensure_ascii=False).encode('utf-8')yield (f,)

我们按照测试用例设计,依次编写每个功能的自动化测试脚本即可。

5.3 结果校验

在手工测试接口的时候,我们需要通过接口返回的结果判断本次测试是否通过,自动化测试也是如此。

对于本次的接口,我们搜索“q=刘德华”,我们需要判断返回的结果中是否含有“演职人员刘德华或片名刘德华”,搜索“tag=喜剧”时,需要判断返回的结果中电影类型是否为“喜剧”,结果分页时需要校验返回的结果数是否正确等。完整结果校验代码如下: 

class check_response():@staticmethoddef check_result(response, params, expectNum=None):# 由于搜索结果存在模糊匹配的情况,这里简单处理只校验第一个返回结果的正确性if expectNum is not None:# 期望结果数目不为None时,只判断返回结果数目eq_(expectNum, len(response['subjects']), '{0}!={1}'.format(expectNum, len(response['subjects'])))else:if not response['subjects']:# 结果为空,直接返回失败assert Falseelse:# 结果不为空,校验第一个结果subject = response['subjects'][0]# 先校验搜索条件tagif params.get('tag'):for word in params['tag'].split(','):genres = subject['genres']ok_(word in genres, 'Check {0} failed!'.format(word.encode('utf-8')))# 再校验搜索条件qelif params.get('q'):# 依次判断片名,导演或演员中是否含有搜索词,任意一个含有则返回成功for word in params['q'].split(','):title = [subject['title']]casts = [i['name'] for i in subject['casts']]directors = [i['name'] for i in subject['directors']]total = title + casts + directorsok_(any(word.lower() in i.lower() for i in total),'Check {0} failed!'.format(word.encode('utf-8')))@staticmethoddef check_pageSize(response):# 判断分页结果数目是否正确count = response.get('count')start = response.get('start')total = response.get('total')diff = total - startif diff >= count:expectPageSize = countelif count > diff > 0:expectPageSize = diffelse:expectPageSize = 0eq_(expectPageSize, len(response['subjects']), '{0}!={1}'.format(expectPageSize, len(response['subjects'])))

5.4 执行测试

对于上述测试脚本,我们使用nosetests命令可以方便的运行自动化测试,并可使用nose-html-reporting插件生成html格式测试报告。

运行命令如下:

nosetests -v test_doubanSearch.py:test_doubanSearch --with-html --html-report=TestReport.html

5.5 发送邮件报告

测试完成之后,我们可以使用smtplib模块提供的方法发送html格式测试报告。基本流程是读取测试报告 -> 添加邮件内容及附件 -> 连接邮件服务器 -> 发送邮件 -> 退出,示例代码如下: 

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipartdef send_mail():# 读取测试报告内容with open(report_file, 'r') as f:content = f.read().decode('utf-8')msg = MIMEMultipart('mixed')# 添加邮件内容msg_html = MIMEText(content, 'html', 'utf-8')msg.attach(msg_html)# 添加附件msg_attachment = MIMEText(content, 'html', 'utf-8')msg_attachment["Content-Disposition"] = 'attachment; filename="{0}"'.format(report_file)msg.attach(msg_attachment)msg['Subject'] = mail_subjetmsg['From'] = mail_usermsg['To'] = ';'.join(mail_to)try:# 连接邮件服务器s = smtplib.SMTP(mail_host, 25)# 登陆s.login(mail_user, mail_pwd)# 发送邮件s.sendmail(mail_user, mail_to, msg.as_string())# 退出s.quit()except Exception as e:print "Exceptioin ", e

6. 结果分析

打开nosetests运行完成后生成的测试报告,可以看出本次测试共执行了51条测试用例,50条成功,1条失败。 

 失败的用例可以看到传入的参数是:{"count": -10, "tag": "喜剧"},此时返回的结果数与我们的期望结果不一致(count为负数时,期望结果是接口报错或使用默认值20,但实际返回的结果数目是189。)

 

7. 完整脚本

下载完成之后,使用如下命令即可进行完整的接口自动化测试并通过邮件发送最终的测试报告:

python test_doubanSearch.py

小小助力

最后分享基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等配套的学习资源【点击文末小卡片免费领取】


 

 

 

 


http://chatgpt.dhexx.cn/article/KwYsh0CP.shtml

相关文章

接口自动化测试

接口自动化测试 1.基础知识1.接口测试原理2.接口测试点及用例设计方法3.接口测试要点4.常见HTTP状态码5.HTTP基础知识6.接口自动化测试工具7.token 2.抓包工具1.chrom抓包2.Fiddler抓包(PC端,手机端)1.原理2.下载安装3.抓取数据信息说明&…

接口自动化测试(Python+Requests+Unittest)

(1)接口自动化测试的意义、前后端分离思想 接口自动化测试的优缺点: 优点: 测试复用性。 维护成本相对UI自动化低一些。 为什么UI自动化维护成本更高? 因为前端页面变化太快,而且UI自动化比较耗时(比如等待页面元素的…

接口自动化测试,一看就会

引言 与UI相比,接口一旦研发完成,通常变更或重构的频率和幅度相对较小。因此做接口自动化的性价比更高,通常运用于迭代版本上线前的回归测试中。 手工做接口测试,测试数据和参数都可以由测试人员手动填写和更新。 因此我们在考…

Pytorch损失函数(nn.L1Loss、nn.SmoothL1Loss、nn.MSELoss 、nn.CrossEntropyLoss、nn.NLLLoss)

文章目录 nn.L1Lossnn.SmoothL1Lossnn.MSELossnn.CrossEntropyLossnn.NLLLoss 损失函数,是编译一个神经网络模型必须的两个参数之一,另一个是优化器。损失函数是指用于计算标签值和预测值之间差异的函数,常见的有多种损失函数可供选择&#x…

链表L->next

2020/10/26更新 #include <iostream> using namespace std;struct MyStruct {int data 0;MyStruct* next; }; int main() {MyStruct* L;MyStruct head ,firstNode;head.data 1;firstNode.data 2;head.next &firstNode;L &head;cout << L->next-&g…

L多样化

为了解决同质性攻击和背景知识攻击所带来的隐私泄露&#xff0c;Machanavajjhala等人提出了L-多样性(l-diversity)模型。简单来说&#xff0c;就是在公开的数据中&#xff0c;每一个等价类里的敏感属性必须具有多样性&#xff0c;即L-多样性保证每一个等价类里&#xff0c;敏感…

L'Hospital法则

1.LHospital法则利用柯西中值定理证明 2.该法则适用f与g同时为无穷小量或g为无穷大量的情况 3.注意该法则只给出了充分不必要条件 今天我们介绍一种函数求极限的方法——LHospital法则。它主要用在求解"待定型"极限 1 首先阐述定理: 我们证明这个定理: 微分中值定理…

李沐老师 d2l库画图在 pycharm 动态显示问题(已解决)

修改 d2l.Animator 类的部分代码 1. 在 Animator 类中的 add() 方法中添加两行代码 plt.draw() plt.pause(0.001) 2. 在 Animator 添加 show() 方法 def show(self):display.display(self.fig) 3. 在需要显示的时候调用 animator.show() 结果

L298N——真正的玄学驱动板

总结 L298N 电机就是不转问题&#xff01;&#xff01;&#xff01; 目录 前言 1、共地问题 PWM 不能直接控制电机转动&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;别把PWM直接接电机&#xff01;&…

QMC5883L说明文档

个人博客&#xff1a;http://brainware360.cn/ QMC5883L源于Honeywell的HMC5883L&#xff0c;是一款表面贴装的集成了信号处理电路的三轴磁性传感器&#xff0c;应用场景主要包括罗盘、导航、无人机、机器人和手持设备等一些高精度的场合。 外形如下图所示&#xff1a; Figur…

安装 d2l

1.下载whl &#xff1a;https://www.cnpython.com/pypi/d2l/download 下载后放在哪个目录下都行 2.切换到刚刚下载的这个文件的所在目录&#xff0c;打开cmd 3.如上图标示&#xff0c;打开cmd&#xff0c;在cmd窗口中输入安装命令&#xff1a;pip install whl文件的名字 4.…

L298n

一时兴起&#xff0c;把之前的东西整一下。L298N资料&#xff08;非原创&#xff0c;贴出来便于日后查阅&#xff0c;或许能给给初学者一点帮助&#xff09;

L9110电机驱动电路

我需要设计一个驱动电路去驱动这样一个电机。电机的两个端子的输入波形如图&#xff1a; 驱动的波形为50%占空比的方波&#xff0c;频率为5Hz&#xff0c;额定电压12V。 单片机IO口可以输出3.3V/5V的PWM波&#xff0c;不过电压不够&#xff0c;驱动能力也不够&#xff0c;电机…

canon l11121e驱动_佳能L11121e驱动

佳能L11121e驱动可以帮助用户解决同型号打印机无法被电脑识别或者打印异常的问题&#xff0c;如果你在使用该型号打印机时遇到了上述问题&#xff0c;可以来本站下载使用该驱动&#xff0c;正确安装一下即可解决问题&#xff0c;让打印机恢复正常工作&#xff01; 佳能L11121e驱…

A2L文件介绍

文章目录 一、概述二、图2中不同块的意义如下&#xff1a;三、 A2L块示例补充知识参考文章 一、概述 A2L文件定义了标定过程中&#xff0c;上位机与ECU之间的通信所需的信息&#xff0c;可以是XCPonCAN&#xff0c;XCPonUSB、XCPonSPI等。 A2L标准分为三个部分&#xff0c;分别…

目标检测:损失函数之SmoothL1Loss

fasterRCNN中的RPN的回归框的loss计算方法 再次深入的解读SmoothL1Loss损失函数&#xff1a; fasterRCNN中SmoothL1Loss的详解

s905l android5,魔百盒CM201-1-YS-S905L纯净安卓系统固件包

魔百盒CM201-1-YS-S905L纯净安卓系统固件包是一个魔百盒易视腾YS代工魔百盒cm201-1免拆线刷固件系统纯净包&#xff0c;盒子是广东移动宽带定制的&#xff0c;其他地方只要硬件相同&#xff0c;应该也能够。不过还是提醒一句&#xff0c;刷机有风险&#xff0c;动手需谨慎。 固…

L1和L2简单易懂的理解

一、正则化&#xff08;Regularization&#xff09; 机器学习中几乎都可以看到损失函数后面会添加一个额外项&#xff0c;常用的额外项一般有两种&#xff0c;一般英文称作ℓ1ℓ1-norm和ℓ2ℓ2-norm&#xff0c;中文称作L1正则化和L2正则化&#xff0c;或者L1范数和L2范数。 L1…

【编译原理】关于LL(1)文法的探索

文章目录 1 概念2 分析3 LL&#xff08;1&#xff09;文法判断 1 概念 第一个L代表从左向右扫描输入符号串&#xff0c;第二个L代表产生最左推导&#xff0c;1代表在分析过程中执行每一步推导都要向前查看一个输入符号——当前正在处理的输入符号。 LL(1)文法既不是二义性的&a…

【Linux修炼】4.Linux权限

每一个不曾起舞的日子&#xff0c;都是对生命的辜负。 Linux权限 shell命令以及运行原理Linux权限的概念Linux权限管理01. 文件访问者的分类&#xff08;人&#xff09;02.文件类型和访问权限&#xff08;事物属性&#xff09;03. 默认权限的初始值&#xff1a;04. umask05. 进…