51Testing软件测试论坛

标题: 接口测试:从需求分析到用例设计到生成测试报告 [打印本页]

作者: lsekfe    时间: 2022-7-14 10:50
标题: 接口测试:从需求分析到用例设计到生成测试报告
1. 接口定义
  接口普遍有两种意思,一种是API(Application Program Interface),应用编程接口,它是一组定义、程序及协议的集合,通过API接口实现计算机软件之间的相互通信。而另外一种则是Interface,它是面向对象语言如java、c#等中一个规范,它可以实现多继承的功能。[url=]接口测试[/url]中的接口指的是API。
  为什么要使用接口:
  假如公司的产品前端开发还没开发完,接口开发好了。有天领导说,小王,你测下这个登录功能,要是你不懂接口的话就会对领导说这个功能测不了啊,页面没开发完。领导会把你……
  接口测试是不需要看前端页面的,可以更早的介入到测试工作中,提高工作效率。
  根据测试金字塔,越底层成本越低,一个底层的bug可能会引起上一层的多个bug,所以测试越底层,越能保证产品的质量,也越能节省测试的成本。而单元测试一般是由开发来完成的,所以对于测试来说,接口测试是非常必要的。
  对于自动化测试来说,UI的变动性最大,所以UI自动化测试的维护成本很高。而接口的改动很小,所以接口自动化测试是最实用,最节约成本的。
  2. 基本流程
  接口功能自动化测试流程如下:
  需求分析 -> 用例设计 -> 脚本开发 -> 测试执行 -> 结果分析。
  2.1 示例接口
  手机号码归属地
  **接口地址:**http://apis.juhe.cn/mobile/get
  **返回格式:**json/xml
  **请求方式:**get
  **请求示例:**http://apis.juhe.cn/mobile/get?phone=手机号&key=您申请的KEY
  3. 需求分析
[attach]139094[/attach]
需求分析是参考需求、设计等文档,在了解需求的基础上还需清楚内部的实现逻辑,并且可以在这一阶段提出需求、设计存在的不合理或遗漏之处。
  如:手机号归属地接口,输入不同号码段的手机号,查看手机号归属和手机号码属于哪个运营商。
  4. 用例设计
[attach]139095[/attach]
5. 脚本开发
  5.1 模块安装
  使用pip命令安装即可:
  1. pip install requests
复制代码
5.2 接口调用
  使用requests库,我们可以很方便的编写上述接口调用方法(如输入phone=手机号,示例代码如下):
  在实际编写自动化测试脚本时,我们需要进行一些封装。
  1. #!/usr/bin/python3

  2. import unittest
  3. import requests
  4. import json

  5. class Test_Moblie(unittest.TestCase):

  6.     # 封装公共的数据
  7.     def common(self, phone):
  8.         url = "http://apis.juhe.cn/mobile/get"
  9.         date = {
  10.             'key': "4391b7dd8213662798c3ac3da9f54ca8",
  11.             'phone': phone
  12.         }
  13.         self.response = requests.get(url, params=date)
  14.         return self.response

  15.     def test_1(self):
  16.         self.common("1857110")
  17.         print(self.response.text)

  18.     def test_2(self):
  19.         self.common("1868115")
  20.         print(self.response.text)

  21. if __name__ == '__main__':
  22.     unittest.main() 
复制代码
我们按照测试用例设计,依次编写每个功能的自动化测试脚本即可。
  5.3 结果校验
  在手工测试接口的时候,我们需要通过接口返回的结果判断本次测试是否通过,自动化测试也是如此。
  对于本次的接口,输入手机,我们需要判断返回的结果resultcode是不是等于200结果分页时需要校验返回的结果数是否正确等。完整结果校验代码如下:
  1. #!/usr/bin/python3

  2. import unittest
  3. import requests

  4. class Test_Moblie(unittest.TestCase):

  5.     # 封装公共的数据
  6.     def common(self, phone):
  7.         url = "http://apis.juhe.cn/mobile/get"
  8.         date = {
  9.             'key': "4391b7dd8213662798c3ac3da9f54ca8",
  10.             'phone': phone
  11.         }
  12.         self.response = requests.get(url, params=date)
  13.         return self.response

  14.     def test_2(self):
  15.         self.common("1868115")
  16.         print(self.response.json())
  17.         dict_2 = self.response.json()
  18.         # 打印值省份值为:200
  19.         resultcode = dict_2["resultcode"]
  20.         # 为演式错误的示例,将对比值改为200,正确值为200,可自行修改
  21.         self.assertEqual(resultcode, "200", msg='失败原因:%s != %s' % (resultcode, "200"))

  22. if __name__ == '__main__':
  23.     unittest.main()
复制代码
运行结果:
[attach]139096[/attach]
5.4 生成测试报告
  用例执行完之后,那就需要发报告给领导。
  那么我们使用HTMLTestRunner第3方模块插件生成html格式测试报告:
  1. from unittest import TestSuite
  2. from unittest import TestLoader
  3. import requests
  4. import json
  5. import HTMLTestRunner
  6. import unittest

  7. class Test_Moblie(unittest.TestCase):

  8.     # 封装公共的数据
  9.     def common(self, phone):
  10.         url = "http://apis.juhe.cn/mobile/get"
  11.         date = {
  12.             'key': "4391b7dd8213662798c3ac3da9f54ca8",
  13.             'phone': phone
  14.         }
  15.         self.response = requests.get(url, params=date)
  16.         return self.response

  17.     def test_1(self):
  18.      """判断状态码"""
  19.         self.common("1857110")
  20.         print(self.response.json())
  21.         # 返回数据为dict
  22.         print(type(self.response.json()))
  23.         dict_1 = self.response.json()
  24.         # 打印值省份值为:湖北
  25.         province = dict_1["result"]["province"]
  26.         self.assertEqual(province, "湖北", msg='失败原因:%s != %s' % (province, "湖北"))

  27.     def test_2(self):
  28.      """判断省份"""
  29.         self.common("1868115")
  30.         print(self.response.json())
  31.         dict_2 = self.response.json()
  32.         # 打印值省份值为:湖北
  33.         resultcode = dict_2["resultcode"]
  34.         # 为演式错误的示例,将对比值改为201,正确值为200,可自行修改
  35.         self.assertEqual(resultcode, "201", msg='失败原因:%s != %s' % (resultcode, "200"))

  36. if __name__ == '__main__':

  37.     report = "E:/report_path/result.html"
  38.     file = open(report,"wb")
  39.     # 创建测试套件
  40.     testsuit = unittest.TestSuite()
  41.     testload = unittest.TestLoader()
  42.     # 括号内传入的是类名,会自动找到以test开头全部的用例
  43.     # 用例以例表形式存储
  44.     case = testload.loadTestsFromTestCase(Test_Moblie)
  45.     testsuit.addTests(case)
  46.     run = HTMLTestRunner.HTMLTestRunner(stream=file,
  47.                                         title="接口自动化测试报告",
  48.                                         description="用例执行结果")
  49.     run.run(testsuit)
  50.     file.close()
复制代码
5.5发送邮件报告
  测试完成之后,我们可以使用zmail模块提供的方法发送html格式测试报告。
  基本流程是读取测试报告 -> 添加邮件内容及附件 -> 连接邮件服务器 -> 发送邮件 -> 退出,示例代码如下:
  1. #!/usr/bin/python3

  2. import zmail

  3. def send_mail():
  4.     # 定义邮件
  5.     mail = {"subject": "接口测试报告",# 任一填写
  6.             'content_text': '手机号归属地_API自动化测试报告',# 任一填写
  7.             # 多个附件使用列表
  8.             "attachments": "E:/report/result.html"
  9.             }
  10.     # 自定义服务器
  11.     # 如果不知道如何查看授权码,请查看这一篇博客:https://www.cnblogs.com/zzpython/p/13095749.html
  12.     server = zmail.server("发送人邮箱.com",
  13.                           "QQ邮箱是用授权码",
  14.                           smtp_host="smtp.qq.com",
  15.                           smtp_port = 465)
  16.     # 发送邮件
  17.     server.send_mail("收件人QQ邮箱", mail)

  18. try:
  19.     send_mail()
  20. except FileNotFoundError:
  21.     print("未找到文件")
  22. else:
  23.     print("发送成功")
复制代码
6. 结果分析
  打开完成后生成的测试报告,可以看出本次测试共执行了2条测试用例,1条成功,1条失败:
[attach]139097[/attach]
最终发送测试报告邮件,截图如下:
[attach]139098[/attach]














欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2