什么是接口测试,我们如何实现接口测试?

1. 什么是接口测试

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

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

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

2. 基本流程

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

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

2.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=喜剧

3. 需求分析

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

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

4. 用例设计

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

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

5. 脚本开发

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

5.1 相关lib安装

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

 
  1. pip install nose

  2. pip install nose-html-reporting

  3. pip install requests

5.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,)

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

5.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'])))

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

6. 结果分析

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

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

7. 完整脚本

豆瓣电影搜索接口的完整自动化测试脚本,我已上传到的GitHub。下载地址:test_demo/test_douban at master · lovesoo/test_demo · GitHub

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

python test_doubanSearch.py

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

oracle plsql如何debug触发器

进入测试窗口 Test Window 写以下代码 declarebegininsert into tableA values();end; 如果tableA有insert触发器,插入数据的时候,就能进入触发器的代码里面

【区块链+基础设施】区块链服务网络 BSN | FISCO BCOS应用案例

BSN(Blockchain-based Service Network,区块链服务网络)是一个跨云服务、跨门户、跨底层框架,用于部 署和运行各类区块链应用的全球性基础设施网络,旨在为开发者提供低成本和技术互通的区块链一站式服务。 2019 年 12…

Android LayoutInflater 深度解析

在 Android 开发中,LayoutInflater 是一个非常重要的工具。它允许我们从 XML 布局文件中动态地创建 View 对象,从而使得 UI 的创建和管理更加灵活。本文将深入解析 android.view.LayoutInflater,包括它的基本用法、常见问题以及高级用法。 什…

stm32学习笔记---DMA直接存储器存取(代码部分)DMA数据转运/DMA+AD多通道

目录 第一个代码:DMA数据转运 扩展知识 DMA的配置步骤 DMA的库函数 DMA_DeInit DMA初始化和DMA结构体初始化函数 DMA_Cmd DMA_ITConfig DMA_SetCurrDataCounter DMA_GetCurrDataCounter 四个获取标志位状态函数 代码实现 MyDMA.c 第一步,开…

网站提示不安全怎么办

当您访问一个网站时,如果浏览器提示该网站不安全,这通常意味着以下几个问题之一,以及相应的解决办法: 一、未启用HTTPS协议: 解决方法:确保网站启用了HTTPS协议。这意味着您需要为您的网站部署一个有效的…

鸿蒙:this传递参数到子组件中无法实现

this指代当前组件的某个变量,当把这个变量当作参数传递给子组件时,子组件中没有这个变量,属于使用不了这个变量 解决方法:在变量后面加.bind(this)将当前组件的变量一起绑定过去

电脑ip地址在哪里看?3个方法全解析,找到地址不迷路

ip地址,就像网络世界中的身份证,是每个设备在网络上的唯一标识。无论是浏览网页、在线聊天还是远程办公,都离不开它的指引。那么,电脑ip地址在哪里看?别担心,本文将带你踏上寻找ip地址的冒险之旅&#xff0…

#HDC2024 心得分享#主题演讲学习-加入鸿蒙生态正当时

一、主题演讲学习心得 通过本次主题演讲的聆听与学习,我们在猜出中和不太确定的相关内容纷纷呈现。比如鸿蒙内核与HarmonyOS Next获得行业内最高等级的安全认证;盘古大模型、小艺智能体、意图理解与分发框架等构筑的AI、AIGC能力对HarmonyOS Next及原生…

ABeam×StartUp | ABeam德硕中国新创部门拜访通用机器人初创公司 :逐际动力,就具身智能机器人的发展展开交流

近日,ABeam中国新创部门有幸拜访了深圳逐际动力科技有限公司(以下简称:逐际动力)。作为一家通用机器人公司,其在人形机器人、四轮足机器人等领域具有深厚的学术与技术储备。 现场合影 左:ABeam中国新创部门…

Golang | Leetcode Golang题解之第202题快乐数

题目: 题解: func isHappy(n int) bool {cycle : map[int]bool{4: true, 6: true, 37: true, 58: true, 89: true, 145: true, 42: true, 20: true}for n ! 1 && !cycle[n] {n step(n)}return n 1 }func step(n int) int {sum : 0for n > …

交友系统定制版源码| 相亲交友小程序源码全开源可二开_打造独特的社交交友系统

交友系统源码的实现涉及到多个方面,包括前端页面设计、后端逻辑处理、数据库设计以及用户交互等。以下是一个简单的交友系统源码实现的基本框架和关键步骤: 1.数据库设计:用户表:存储用户基本信息,如用户ID、用户名、密码、头像、性别、年龄、地理位置等…

无人机的起源

无人机起源于20世纪初的早期实验阶段,并随着技术进步逐步发展。无人机,作为现代科技领域中的一项重要创新,已经在全球范围内展现出其巨大的潜力和应用价值。 无人机的历史可以追溯到1917年,美国人艾德温.奥斯特林发明了“飞行训练…

Spring企业开发核心框架-下

五、Spring AOP面向切面编程 1、场景设定和问题复现 ①准备AOP项目 项目名:Spring-aop-annotation ②声明接口 /*** - * / 运算的标准接口!*/ public interface Calculator { int add(int i, int j); int sub(int i, int j); int mul(int i, in…

每日一题——Python实现PAT乙级1096 大美数(举一反三+思想解读+逐步优化)3千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 时间复杂度分析 空间复杂度分析 总结 哲学和编程思想 1. 抽象与具体化 …

svn切换分支

现在有一个场景: 在svn中有一个b分支,是基于a分支拉出来的,并且我的b分支在本地已经有了改动,a分支在远端也有了改动, 我想把远端a分支的改动同步到我的本地b分支上,如何操作 目前已知的方法 项目右键-&g…

动手学深度学习(Pytorch版)代码实践 -计算机视觉-49风格迁移

49风格迁移 读入内容图像: import torch import torchvision from torch import nn import matplotlib.pylab as plt import liliPytorch as lp from d2l import torch as d2l# 读取内容图像 content_img d2l.Image.open(../limuPytorch/images/rainier.jpg) plt.…

J019_选择排序

一、排序算法 排序过程和排序原理如下图所示&#xff1a; 二、代码实现 package com.itheima.sort;import java.util.Arrays;public class SelectSort {public static void main(String[] args) {int[] arr {5, 4, 3, 1, 2};//选择排序for (int i 0; i < arr.length - 1…

django西餐厅管理系统-计算机毕业设计源码10873

摘要 在现代餐饮行业中&#xff0c;高效的管理系统对于西餐厅的成功运营至关重要。为了满足西餐厅日益增长的管理需求&#xff0c;设计并实现了一款基于 Python 的西餐厅管理系统。 Python作为一种简洁而易读的编程语言&#xff0c;具有广泛的应用领域&#xff0c;包括Web开发。…

MySQL5.7安装初始化错误解决方案

问题背景 今天在给公司配数据库环境时,第一次报initializing database 数据库初始化错误? 起初没管以为是安装软件原因,然后就出现以下错误:如下图 点开log,我们观察日志会发现 无法识别的参数 ‘mysqlx_port=0.0’,???,官方的安装程序还能出这问题?

docker的安装与基本使用

一.docker的安装卸载 1.先安装所需软件包 yum install -y yum-utils2.设置stable镜像仓库 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 3.安装DOCKER CE yum -y install docker-ce docker-ce-cli containerd.io 4.验…