接口自动化测试怎么做?该怎么学习

news2024/11/13 18:28:17

一. 什么是接口测试

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

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

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

二. 基本流程

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

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

1. 示例接口

接口名称:豆瓣电影搜索

接口文档地址:https://developers.douban.com/wiki/?title=movie_v2#search

接口调用示例:

1) 按演职人员搜索:https://api.douban.com/v2/movie/search?q=张艺谋

2) 按片名搜索:https://api.douban.com/v2/movie/search?q=大话西游

3) 按类型搜索:https://api.douban.com/v2/movie/search?tag=喜剧

三. 需求分析

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

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

四. 用例设计

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

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

五. 脚本开发

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

1 相关lib安装

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

pip install nose
pip install nose-html-reporting
pip install requests
2 接口调用

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


#coding=utf-8

import requests

import json


url = '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):


@staticmethod

def 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):

# 校验搜索条件 q

qs = [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,)

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

3 结果校验

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

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

 

class check_response():

@staticmethod

def 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 False

else:

# 结果不为空,校验第一个结果

subject = response['subjects'][0]

# 先校验搜索条件tag

if params.get('tag'):

for word in params['tag'].split(','):

genres = subject['genres']

ok_(word in genres, 'Check {0} failed!'.format(word.encode('utf-8')))


# 再校验搜索条件q

elif 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 + directors

ok_(any(word.lower() in i.lower() for i in total),

'Check {0} failed!'.format(word.encode('utf-8')))


@staticmethod

def check_pageSize(response):

# 判断分页结果数目是否正确

count = response.get('count')

start = response.get('start')

total = response.get('total')

diff = total - start


if diff >= count:

expectPageSize = count

elif count > diff > 0:

expectPageSize = diff

else:

expectPageSize = 0


eq_(expectPageSize, len(response['subjects']), '{0}!={1}'.format(expectPageSize, len(response['subjects'])))
4 执行测试

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

运行命令如下:

nosetests -v test_doubanSearch.py:test_doubanSearch --with-html --html-report=TestReport.html
5 发送邮件报告

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

 

import smtplib

from email.mime.text import MIMEText

from email.mime.multipart import MIMEMultipart


def 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_subjet

msg['From'] = mail_user

msg['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

六. 结果分析

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

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

最终发送测试报告邮件,截图如下:

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2047425.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《黑神话:悟空》媒体评分解禁 M站均分82

《黑神话:悟空》媒体评分现已解禁,截止发稿时,M站共有43家媒体评测,均分为82分。 部分媒体评测: God is a Geek 100: 毫无疑问,《黑神话:悟空》是今年最好的动作游戏之一&#xff…

linux系统安装mysql服务

linux系统安装mysql服务 1.下载安装包2.下载压缩文件解压安装3. 安装完启动服务4.查看安装密码5.使用上述密码登录6.修改密码7.创建一个root可以在任意主机远程连接数据库8.远程登录成功 1.下载安装包 https://downloads.mysql.com/archives/community/ mysql下载地址 2.下载…

【AI安防】YOLOv8 + OpenVINO2023 + QT5 电子围栏预警系统

引言 电子围栏是一种利用无线通信技术和地理信息系统实现的虚拟边界,用于监控和控制被监控对象的位置。它可以帮助我们实现对特定区域内的自定义对象进行实时检测、定位与跟踪。本文介绍了一种基于YOLOv8 OpenVINO2023 QT5 联合打造的实时高效、多线程、自定义对…

Keepalived简介以及常见用途

一、Keepalived 简介 Keepalived 是一个高可用性(HA)解决方案,主要用于实现 Linux 系统的负载均衡和故障转移。它最初设计用于与 LVS(Linux Virtual Server)一起使用,但也可以独立使用,主要功能…

0815,析构函数,拷贝构造函数,赋值运算符函数

来自同济医院的问候 目录 01:对象创建 001.cc 003size.cc 02:对象销毁 004pointer.cc 005destroytime.cc 03:本类型对象的复制 3.1 拷贝构造函数 006cp.cc 007cptime.cc 008recursion.cc 009rightleft.cc 3.2 赋值运算符函数 …

8.15 Day20 Windows服务器(Windows service 2008 R2)上域的搭建 (3)

1、域策略配置 1.1 DC服务端的策略配置 1.1.1 下放权限 由于各部门经理的电脑上并不存在对应的工具,即便授予权限也无法对各自部门进行管理 如果经理只有几个,管理员可以一一为其配置,但如果一个公司有几十个经理,则会变得相当冗…

测试用例的设计

*涉及概念来源于《软件测试的艺术》 目录 一、为什么要设计测试用例? 二、黑盒测试与白盒测试介绍 三、测试用例常见设计方法 1.黑盒测试(功能测试) 2.白盒测试(结构测试) 四、测试策略 五、测试用例怎么写 一、为什么要设计测试用例? 由于时间…

C语言传递指针给函数

C 语言允许您传递指针给函数,只需要简单地声明函数参数为指针类型即可。 下面的实例中,我们传递一个无符号的 long 型指针给函数,并在函数内改变这个值 实例1:获取系统的时间值 能接受指针作为参数的函数,也能接受数…

【Vue3】路由Params传参

【Vue3】路由Params传参 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗的日…

Vue2移动端(H5项目)项目基于vant封装图片上传组件(支持批量上传、单个上传、回显、删除、预览、最大上传数等功能)---解决批量上传问题

一、最终效果 二、参数配置 1、代码示例&#xff1a; <t-uploadfileList"fileList":showFileList"showFileList"showFile"showFile":showFileUrl"showFileUrl"/>2、配置参数&#xff08;TUpload Attributes&#xff09;继承va…

vulnhub系列:DC-1

vulnhub系列&#xff1a;DC-1 靶机下载 一、信息收集 nmap 扫描存活&#xff0c;根据 mac 地址寻找 IP nmap 192.168.23.0/24nmap 扫描端口 nmap 192.168.23.141 -p- -Pn -sV -Odirsearch 目录扫描 python3 dirsearch.py -u http://192.168.23.141/访问80端口 查看 wappa…

数据资产三次入表理论

数据资产三次入表理论 数据资产入表三大阶段详见图。 初次入表&#xff1a;底层资产入表 初次入表主要指的是企业将已实际形成的底层原始数据资源&#xff0c;按照《企业数据资源相关会计处理暂行规定》的要求&#xff0c;首次纳入会计层面的企业资产库。这一阶段工作的完成&am…

8.16 day bug

bug1 题目没看仔细 额外知识 在 Bash shell 中&#xff0c;! 符号用于历史扩展功能。当你在命令行中输入 ! 后跟一些文本时&#xff0c;Bash 会尝试从你的命令历史中查找与该文本相匹配的命令。这是一种快速重用之前执行过的命令的方法。 如何使用历史扩展 基本用法: !strin…

进程间通信—无名管道

gg shiftg快速对齐 加锁顺序问题时&#xff0c;如果解锁了&#xff0c;两个同时申请抢锁&#xff0c;谁抢到了运行谁&#xff0c;循环迭代时释放锁也是同时申请锁&#xff0c;循环部分如果没抢到锁就进入循环等待 总结: IPC 进程间通信 interprocess communicate //signal…

【阿卡迈防护分析】Vueling航空Akamai破盾实战

文章目录 1. 写在前面2. 风控分析3. 破盾实战 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python…

Elasticsearch新增和删除索引中的字段

在ES中&#xff0c;增加字段相对比较容易&#xff0c;因为ES支持动态映射&#xff08;Dynamic Mapping&#xff09;。 当索引中新增文档时&#xff0c;ES可以根据文档中的字段自动创建对应的映射关系。如果新字段类型与已有字段类型不同&#xff0c;ES会自动将已有字段类型转换…

2024-2025年最值得选的Java计算机毕业设计选题大全:800个热门选题

一、前言 博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ…

选择排序(附动图)

1.思路 基本思想&#xff1a; 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的数据元素排完 。 1.1双向选择排序&#xff08;升序&#xff09; 头尾指针&#xff08;索引&#xf…

Excel求和方法之

一 SUM&#xff08;&#xff09;&#xff0c;选择要相加的数,回车即可 二 上面的方法还不够快。用下面这个 就成功了 三 还有一种一样快的 选中之后&#xff0c;按下Alt键和键&#xff08;即Alt&#xff09;

三种生成模型

三种生成模型&#xff08;GAN,VAE,FLOW&#xff09; 什么是生成模型&#xff1f; 图像、文本、语音等数据&#xff0c;都可以看做是从一个复杂分布中采样得到的。 一个简单的分布随机分布,经过一系列复杂的变换(Generator)之后变成复杂分布. 从简单分布中随机采样一个z,经过G后…