接口自动化测试完整版(文档+视频)

devtools/2024/12/30 17:59:12/

1. 什么是接口测试

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

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

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

2. 基本流程

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

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

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=刘德华,示例代码如下):

  1. #coding=utf-8

  2. import requests

  3. import json

  4.  

  5. url = 'https://api.douban.com/v2/movie/search'

  6. params=dict(q=u'刘德华')

  7. r = requests.get(url, params=params)

  8. print 'Search Params:\n', json.dumps(params, ensure_ascii=False)

  9. print 'Search Response:\n', json.dumps(r.json(), ensure_ascii=False, indent=4)

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

  1. class test_doubanSearch(object):

  2.  

  3.     @staticmethod

  4.     def search(params, expectNum=None):

  5.         url = 'https://api.douban.com/v2/movie/search'

  6.         r = requests.get(url, params=params)

  7.         print 'Search Params:\n', json.dumps(params, ensure_ascii=False)

  8.         print 'Search Response:\n', json.dumps(r.json(), ensure_ascii=False, indent=4)

  9.  

  10.     def test_q(self):

  11.         # 校验搜索条件 q

  12.         qs = [u'白夜追凶', u'大话西游', u'周星驰', u'张艺谋', u'周星驰,吴孟达', u'张艺谋,巩俐', u'周星驰,大话西游', u'白夜追凶,潘粤明']

  13.         for q in qs:

  14.             params = dict(q=q)

  15.             f = partial(test_doubanSearch.search, params)

  16.             f.description = json.dumps(params, ensure_ascii=False).encode('utf-8')

  17.             yield (f,)

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

5.3 结果校验

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

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

  1. class check_response():

  2.     @staticmethod

  3.     def check_result(response, params, expectNum=None):

  4.         # 由于搜索结果存在模糊匹配的情况,这里简单处理只校验第一个返回结果的正确性

  5.         if expectNum is not None:

  6.             # 期望结果数目不为None时,只判断返回结果数目

  7.             eq_(expectNum, len(response['subjects']), '{0}!={1}'.format(expectNum, len(response['subjects'])))

  8.         else:

  9.             if not response['subjects']:

  10.                 # 结果为空,直接返回失败

  11.                 assert False

  12.             else:

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

  14.                 subject = response['subjects'][0]

  15.                 # 先校验搜索条件tag

  16.                 if params.get('tag'):

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

  18.                         genres = subject['genres']

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

  20.  

  21.                 # 再校验搜索条件q

  22.                 elif params.get('q'):

  23.                     # 依次判断片名,导演或演员中是否含有搜索词,任意一个含有则返回成功

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

  25.                         title = [subject['title']]

  26.                         casts = [i['name'] for i in subject['casts']]

  27.                         directors = [i['name'] for i in subject['directors']]

  28.                         total = title + casts + directors

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

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

  31.  

  32.     @staticmethod

  33.     def check_pageSize(response):

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

  35.         count = response.get('count')

  36.         start = response.get('start')

  37.         total = response.get('total')

  38.         diff = total - start

  39.  

  40.         if diff >= count:

  41.             expectPageSize = count

  42.         elif count > diff > 0:

  43.             expectPageSize = diff

  44.         else:

  45.             expectPageSize = 0

  46.  

  47.         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格式测试报告。基本流程是读取测试报告 -> 添加邮件内容及附件 -> 连接邮件服务器 -> 发送邮件 -> 退出,示例代码如下: 

  1. import smtplib

  2. from email.mime.text import MIMEText

  3. from email.mime.multipart import MIMEMultipart

  4.  

  5. def send_mail():

  6.     # 读取测试报告内容

  7.     with open(report_file, 'r') as f:

  8.         content = f.read().decode('utf-8')

  9.  

  10.     msg = MIMEMultipart('mixed')

  11.     # 添加邮件内容

  12.     msg_html = MIMEText(content, 'html', 'utf-8')

  13.     msg.attach(msg_html)

  14.  

  15.     # 添加附件

  16.     msg_attachment = MIMEText(content, 'html', 'utf-8')

  17.     msg_attachment["Content-Disposition"] = 'attachment; filename="{0}"'.format(report_file)

  18.     msg.attach(msg_attachment)

  19.  

  20.     msg['Subject'] = mail_subjet

  21.     msg['From'] = mail_user

  22.     msg['To'] = ';'.join(mail_to)

  23.     try:

  24.         # 连接邮件服务器

  25.         s = smtplib.SMTP(mail_host, 25)

  26.         # 登陆

  27.         s.login(mail_user, mail_pwd)

  28.         # 发送邮件

  29.         s.sendmail(mail_user, mail_to, msg.as_string())

  30.         # 退出

  31.         s.quit()

  32.     except Exception as e:

  33.         print "Exceptioin ", e

6. 结果分析

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

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

7. 完整脚本

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

python test_doubanSearch.py

http://www.ppmy.cn/devtools/146384.html

相关文章

【Golang 面试题】每日 3 题(八)

✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…

设计模式之外观模式:从电脑组装到系统架构的简化之道

~犬📰余~ “我欲贱而贵,愚而智,贫而富,可乎? 曰:其唯学乎” 一、外观模式概述 \quad 在软件开发中,我们经常会遇到一些复杂的系统,这些系统可能包含许多子系统和组件。直接使用这些子…

网络安全公司150强

本清单主要列出专门或主要专注于网络安全的公司。 公司名称 业务描述 1Password 企业密码安全管理 A10 Networks 安全云应用服务 Abnormal Security 云原生邮件安全 Absolute 终端防护平台 Agari 电子邮件和网络钓鱼威胁防护 Aqua Security 云原生应用保护 Arcse…

Express.js 有哪些常用的中间件?

在使用 Express.js 开发应用程序时,中间件(Middleware)是处理请求和响应的关键组件。它们可以执行各种任务,如解析请求体、添加HTTP头部、记录日志等。以下是一些常用的中间件: body-parser 用于解析传入的请求体。它…

光滑曲线弧长公式的推导

前言 本文将介绍如何用定积分计算空间中一段光滑曲线的弧长。首先我们会给出光滑曲线以及曲线弧长的定义,然后从定义出发,用求黎曼和的思想推导出弧长的计算公式。 光滑曲线的定义 设平面曲线的参数方程为 { x x ( t ) , y y ( t ) , t ∈ [ T 1 , …

css一道光闪过动效

展示效果 <div class"box">slogan </div> css部分 .box {position: relative;width: 183px;height: 22px;border-radius: 6px 0 6px 0;background-color: #005ed9;overflow: hidden;display: flex;align-items: center;justify-content: center;font-s…

机动车授权签字人考试题库及答案

一、多选题 70、可申请资质认定并开展检验检测活动的其他组织包括(  )。 A、依法取得《营业执照》的企业法人分支机构; B、私营独资企业 C、特殊普通合伙企业 D、经民政部门登记的民办非企业(法人)单位。 答案&#xff1a; A - B - C - D 71、申请取得…

以太网(Ethernet)和无线局域网(Wireless Local Area Network, WLAN)

当然&#xff0c;下面我将详细介绍以太网&#xff08;Ethernet&#xff09;和无线局域网&#xff08;Wireless Local Area Network, WLAN&#xff09;&#xff0c;包括它们的定义、技术标准、优缺点以及应用场景等方面。 一、以太网&#xff08;Ethernet&#xff09; 1. 定义…