认识接口自动化测试

news2024/11/18 15:37:51

目录

1. 什么是接口测试

2. 基本流程

3. 需求分析

4. 用例设计

5. 脚本开发

6. 结果分析

7. 完整脚本


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

2

3

pip install nose

pip install nose-html-reporting

pip install requests


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

1

2

3

4

5

6

7

8

9

#coding=utf-8

import requests

import json

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

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

= 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中每一个测试集:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

class test_doubanSearch(object):

    @staticmethod

    def search(params, expectNum=None):

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

        = 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 in qs:

            params = dict(q=q)

            = partial(test_doubanSearch.search, params)

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

            yield (f,)

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

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 in subject['casts']]

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

                        total = title + casts + directors

                        ok_(any(word.lower() in i.lower() for 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格式测试报告。

运行命令如下:

1

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


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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

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:

        # 连接邮件服务器

        = 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。下载地址:https://github.com/lovesoo/test_demo/tree/master/test_douban

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

1

python test_doubanSearch.py

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

2023超详细的Python接口自动化测试进阶教程合集,真实模拟企业项目实战

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

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

相关文章

企业想过等保,其中2FA双因素认证手段必不可少

随着信息技术的飞速发展,网络安全问题日益凸显。等保2.0时代的到来,意味着企业和组织需要更加严格地保护自身的信息安全。而在这个过程中,双因素认证的重要性逐渐得到广泛认可。本文将探讨 2FA 双因素认证的重要性。 在了解 2FA 双因素认证的…

FRM-10102 错误解决办法

去服务器此路径 /u01/test/app/fs2/EBSapps/appl/au/12.0.0/resource 把缺失的文件拿到本地库即可

电压放大器在心电图中的作用是什么

心电图是一种常用的临床检测方法,用于评估心脏的电活动。在进行心电图检测时,为了保证测量结果的准确性和可靠性,需要使用一种特殊的电压放大器,即心电放大器,来增强心电信号并抑制噪音和干扰。 心电图信号具有微弱的幅…

“传统文化宣传片+虚拟人动捕设备”前景如何?

在数字化时代的发展下,动捕设备的加入,让传播传统文化的虚拟人更具生动表现,拉近人们与传统文化的距离,通过虚拟人动作捕捉动画宣传片,引起更多人对传统文化的关注与传承。 *图片源于网络 深圳文博会创意短片《嗨ICIF…

一文生成猫眼电影热榜词云

1.爬取猫眼电影热榜数据 此次爬取的是电影票房的热榜电影名称,具体网站网址为猫眼电影热榜,经过实验观察后发现,此处的数据是通过ajax异步加载的,如果不相信可以使用request对当前网站网址发送请求,会发现无法获取电影…

基于springboot实现职称评审管理系统演示【项目源码+论文说明】分享

基于springboot实现职称评审管理系统项目演示 摘要 不管是从事哪个行业、对于职称是对一个对个人的最高荣誉,有通过科技手段、农业、工业、教育等都有评职称,开发一套职称评审管理系统就很有必要了。职称评审管理系统是以实际运用为开发背景&#xff0c…

移远通信EG916Q-GL Cat 1 bis模组亮相MWC Las Vegas 2023

9月27日,在MWC Las Vegas 2023期间,全球领先的物联网整体解决方案供应商移远通信宣布,面向全球市场推出更具性价比的Cat 1 bis模组EG916Q-GL。该模组基于高通QCX216 LTE物联网调制解调器,非常适用于全球范围内的各种应用场景&…

人机言语交互模型的评估要素

智能客服中的言语交互模型评估要素,主要包括以下几个方面: 有效性:指模型能否准确识别和理解用户的言语意图,以及生成正确和合适的回答。可以通过比较模型生成的回答与人工回答的准确率来评估。流畅性:指模型在回答问…

力扣第572题 另一棵树的子树 c++深度(DFS)注释版

题目 572. 另一棵树的子树 简单 给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。 二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有…

ES6 class类关键字super

super关键字 在 JavaSCript 中,能通过 extends 关键字去继承父类 super 关键字在子类中有以下用法: 当成函数调用 super() 作为 "属性查询" super.prop 和 super[expr] super() super 作为函数调用时,代表父类的构造函数。 ES6 要求…

如何设计一条大型PLC生产线系统

今日话题,如何设计一条大型PLC生产线系统,设计一条大型PLC生产线系统实际上涉及通用系统设计的问题。以机床为例,它的核心架构包括数控面板和多台伺服机,这些伺服机具有很强的通用性,它们作为从站响应数控面板的信号。…

在原生html中使用less

引入less <link rel"stylesheet/less" href"./lessDemo.less" /><script src"./js/less.min.js"></script> less.min.js文件下载地址:https://github.com/less/less.js 注意&#xff1a;less文件在前&#xff0c;js文件在后…

Langchain-Chatchat项目:1-整体介绍

基于Langchain与ChatGLM等语言模型的本地知识库问答应用实现。项目中默认LLM模型改为THUDM/chatglm2-6b[2]&#xff0c;默认Embedding模型改为moka-ai/m3e-base[3]。 一.项目介绍 1.实现原理   本项目实现原理如下图所示&#xff0c;过程包括加载文件->读取文本->文本…

记一个src中危-图像大小与请求参数可修改

公众号&#xff1a;掌控安全EDU 分享更多技术文章&#xff0c;欢迎关注一起探讨学习 漏洞描述 服务器生成了一个具有客户端指定尺寸的图像&#xff0c;如果未实施任何限制&#xff0c;则可能导致拒绝服务攻击。 漏洞危害 攻击者不需要在此类攻击中投入资源&#xff0c;但服务器…

迅为RK3588开发板添加 RIL 驱动程序库

将 Quectel 提供的相应 RIL 库文件放入 Android 系统的以下路径。作者拷贝到了源码的android_build/device/fsl/imx8m/evk_8mm/lib 目录下&#xff0c;如下图所示&#xff1a; 然后将 apns-conf.xml 拷贝到 android_build/device/fsl/imx8m/evk_8mm/下&#xff0c;如下图所示&a…

设计模式 - 七大软件设计原则

目录 一、设计模式 1.1、软件设计原则 1.1.1、开闭原则 1.2.2、单一职责原则 1.2.3、里氏替换原则 1.2.4、迪米特原则 1.2.5、接口隔离原则 1.2.6、依赖倒转原则 1.2.7、合成/聚合复用原则 一、设计模式 1.1、软件设计原则 1.1.1、开闭原则 开闭原则&#xff1a;对扩…

chromedriver下载与安装方法

下载与安装: 1.查看Chrome浏览器版本 首先&#xff0c;需要检查Chrome浏览器的版本。请按照以下步骤进行&#xff1a; 打开Chrome浏览器。 点击浏览器右上角的菜单图标&#xff08;三个垂直点&#xff09;。 选择“帮助”&#xff08;Help&#xff09;。 在下拉菜单中选择“…

Swagger2的配置

Swagger2的配置&#xff1a; 1.要用到的依赖包&#xff1a; <!-- swagger2 依赖 --><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.7.0</version></dependency>…

网络是什么?(网络零基础入门篇)

1.如何理解局域网和广域网&#xff1f; 2.路由器和交换机是怎么样工作的&#xff1f; 3.三层交换机能不能代替路由器&#xff1f; -- 局域网 广域网 -- 企业网架构&#xff0c;运营商架构&#xff0c;数据中心架构 -- 局域网 通过 交换机连接的 转发 相同的ip地址…