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

 

一. 什么是接口测试

顾名思义,接口测试是对系统或组件之间的接口进行测试,主要是校验数据的交换,传递和控制管理过程,以及相互逻辑依赖关系。其中接口协议分为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=刘德华,示例代码如下):

  1. #coding=utf-8

  2. import requests

  3. import json

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

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

  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)

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


  
  1. class test_doubanSearch(object):

  2. @staticmethod

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

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

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

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

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

  8. def test_q(self):

  9. # 校验搜索条件 q

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

  11. for q in qs:

  12. params = dict(q=q)

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

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

  15. yield (f,)

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

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. # 再校验搜索条件q

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

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

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

  24. title = [subject['title']]

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

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

  27. total = title + casts + directors

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

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

  30. @staticmethod

  31. def check_pageSize(response):

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

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

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

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

  36. diff = total - start

  37. if diff >= count:

  38. expectPageSize = count

  39. elif count > diff > 0:

  40. expectPageSize = diff

  41. else:

  42. expectPageSize = 0

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


  
  1. import smtplib

  2. from email.mime.text import MIMEText

  3. from email.mime.multipart import MIMEMultipart

  4. def send_mail():

  5. # 读取测试报告内容

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

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

  8. msg = MIMEMultipart('mixed')

  9. # 添加邮件内容

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

  11. msg.attach(msg_html)

  12. # 添加附件

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

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

  15. msg.attach(msg_attachment)

  16. msg['Subject'] = mail_subjet

  17. msg['From'] = mail_user

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

  19. try:

  20. # 连接邮件服务器

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

  22. # 登陆

  23. s.login(mail_user, mail_pwd)

  24. # 发送邮件

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

  26. # 退出

  27. s.quit()

  28. except Exception as e:

  29. print "Exceptioin ", e

六. 结果分析

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

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

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

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

相关推荐

  1. Python怎么单元测试

    2024-06-18 04:42:02       6 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-18 04:42:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-18 04:42:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-18 04:42:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-18 04:42:02       20 阅读

热门阅读

  1. C++240617

    C++240617

    2024-06-18 04:42:02      8 阅读
  2. 数据库修复实例2(副本出入口修复)

    2024-06-18 04:42:02       7 阅读
  3. Leetcode 415. 字符串相加-大数相加

    2024-06-18 04:42:02       9 阅读
  4. Docker使用心得

    2024-06-18 04:42:02       8 阅读
  5. 富格林:细心发现虚假确保安全

    2024-06-18 04:42:02       8 阅读
  6. 解析文字示例

    2024-06-18 04:42:02       11 阅读
  7. 计算机系统结构期末复习

    2024-06-18 04:42:02       8 阅读
  8. C#中[StructLayout(LayoutKind.Sequential, Pack = 1)]解释

    2024-06-18 04:42:02       8 阅读
  9. MySQL 保姆级教程(八):创建计算字段

    2024-06-18 04:42:02       9 阅读