前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >“摸得着”的接口自动化

“摸得着”的接口自动化

作者头像
用户5521279
发布2019-12-10 16:08:00
6340
发布2019-12-10 16:08:00
举报
文章被收录于专栏:搜狗测试搜狗测试

“摸得着”的接口自动化

基于Python的接口自动化介绍与实践

结果可视化

可持续集成

做接口自动化的同学,基本都会追求结果可视化、项目可持续集成。小编这里就从开头写起,从一个接口测试脚本封装成一个自动化case,最后搭起接口自动化整体的框架。

这里,标准版我们会用到Python、requests、unittest、HTMLTestRunner,简捷版用到开源的utx(utx对Python unittest的功能进行了扩展,更友好、更便捷)。

下面小编就举个例子,看一个脚本走向自动化的路线是怎样的。

最前面,先看下这个例子得到的“摸得着”的结果: 一个接口做成自动化后输出的报告样例。

被测接口: http://notify.mse.sogou.com/weather?city=xxxx

01脚本转自动化case

接口测试层面现在已经有很多工具支持导出测试脚本,比如在测接口时经常使用的Postman。然后需要做的就是使用unittest框架增加判断,目的是基于断言机制来判断接口相应状态、格式、字段类型等和期望输出结果是否一致,如果一致则认为该case通过,不一致则说明该case不通过。

这个例子只判定了最简单的接口状态,判断接口response的status_code是否是200。由脚本添加了断言后的代码如下。

import requests
import unittest

class WeatherInterface(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        print("this is a classmethod: setUpClass")

    def testWeather(self):
        '''天气接口请求状态'''
        url = "http://notify.mse.sogou.com/weather"
        querystring = {"city": "北京"}
        headers = {
            'User-Agent': "PostmanRuntime/7.20.1",
            'Accept': "*/*",
            'Cache-Control': "no-cache",
            'Postman-Token': "04af47a4-dad3-45d3-befc-8062a57cf1bb,e1e29236-292b-4672-8aca-febb9037d31a",
            'Host': "notify.mse.sogou.com",
            'Accept-Encoding': "gzip, deflate",
            'Cookie': "IPLOC=CN1100",
            'Connection': "keep-alive",
            'cache-control': "no-cache"
        }
        response = requests.request("GET", url, headers=headers, params=querystring)
        print(response.status_code)
        self.assertEqual(200, response.status_code)

    @classmethod
    def tearDownClass(cls) -> None:
        print("this is a class method: tearDownClass")

这样我们就有了一条接口的case. 这条case判断了天气接口是否正确地响应200。

unittest

unittest还支持类级别方法,用例级别的方法。

classmethod(setUpClass, tearDownClass)用来准备、初始化整个类执行前的资源/数据 & 结束后的释放、销毁资源/数据。用例层面的方法(setUp, tearDown)用来准备、初始化每条case执行前的资源/数据 & 结束后的释放、销毁资源/数据。

02case加载→执行→生成报告

小编这里整理了两种自动化方案,其一是中规中矩的使用unittest进行case加载、运行并结合HTMLTestRunner生成测试报告;其二使用封装了unittest和HTMLTestRunner的utx。

2.1标准版 - HTMLTestRunner

这里小编使用unittest来加载测试用例,用HTMLTestRunner生成报告。

  1. 通过unittest.TestSuite()实例化测试套件对象
  2. 使用TestSuite的addTest()方法对测试类内部的测试用例进行添加
  3. 定义报告命名、报告存储位置
  4. 利用HTMLTestRunner根据测试套件中的用例生成报告内容
import time
import unittest

from HTMLTestRunner import HTMLTestRunner
from case import test_weather

if __name__ == "__main__":
    suite = unittest.TestSuite()
    suite.addTest(unittest.makeSuite(test_weather.WeatherInterface))
    file_name = "Interface-Auto-Result_" + time.strftime("%Y-%m-%d-%H_%M_%S", time.localtime(time.time()))
    file_path = "TestReports\\" + file_name +".html"
    file_result = open(file_path, 'wb')
    runner = HTMLTestRunner(stream=file_result, title="天气接口自动化测试报告", description="用例执行情况")
    runner.run(suite)
    file_result.close()

运行之后就可以看到测试报告了,小编在运行这个自动化case的时候还碰巧发现了一次接口的404。

2.2简捷版 - utx

前面的unittest + HTMLTestRunner的框架存在一定缺点:

  1. 不支持case按照顺序执行(会按照方法名排序后的顺序执行)
  2. 报告内容简单,不美观
  3. 不支持区分不同类型的case,如smoke级case,全部case等
  4. 需扩展的功能要二次开发,工作量大
  5. ……

后来小编调研到,有一个开源框架,封装了unittest同时还优化了报告的样式——就是开篇介绍到的简捷版中使用的utx了。

utx支持用例执行顺序和编写顺序一致,能够支持对case打标签定义为不同级别的case,能收集测试代码中的print信息输出到测试报告中,能够显示case的执行进度……

utx可谓是优点多多,使用也很简单,按照样例,步骤如下。

  1. 首先确定要执行的用例范围(全部、smoke级别、自定义的标签级别等)
  2. 根据说明、实例,通过setting类设置一些基本内容,如用例名长度、执行顺序、报告样式等
  3. 实例化utx封装的TestRunner
  4. 指定case的存放路径
  5. 指定报告的title
  6. 执行

这里小编提供了一个简单的示例,运行后就可以拿到新的样式的测试报告了。目前utx是支持两个样式的测试报告。

from utx import *

if __name__ == "__main__":
    setting.run_case = {Tag.ALL}  # 运行全部测试用例

    setting.check_case_doc = False  # 关闭检测是否编写了测试用例描述
    setting.full_case_name = True
    setting.max_case_name_len = 80  # 测试报告内,显示用例名字的最大程度
    setting.show_error_traceback = True  # 执行用例的时候,显示报错信息
    setting.sort_case = True  # 是否按照编写顺序,对用例进行排序
    setting.create_report_by_style_1 = True  # 测试报告样式1
    setting.create_report_by_style_2 = True  # 测试报告样式2
    setting.show_print_in_console = True

    runner = TestRunner()
    runner.add_case_dir(r"case")
    runner.run_test(report_title='接口自动化测试报告')

【结果样式1】

【结果样式2】

是不是报告更好看了一些?内容也丰富了许多呢?utx还支持更多的设置、功能,而且也在不断更新迭代中,值得一直做自动化测试的、有unittest使用需求的同学尝试应用。

03写在最后

本文仅以入门的“姿势”介绍了如何用Python、requests、unittest、HTMLTestRunner、utx搭建一个入门的接口自动化框架。

实际我们在进行接口自动化搭建、完善过程中是需要支持更多维度的内容,比如接口参数的校验、返回的校验、用例的自动转化等等。测试的路漫漫其修远兮,自动化测试的路更是修远远远远远兮。逐渐将整个项目搭建起来,就可以部署到jenkins上面完成持续继承了,一个自动化可持续集成的接口自动化就初具形态了。

有了本文的介绍,动手用起来吧,在自己的项目中尝试一下接口自动化的乐趣吧~

参考资料

更多学习资料小编敬上:

utx github主页: https://url.cn/5ubYvhk

用Postman生成接口测试脚本: 《小白的极简接口“自动化”》

Python unittest(PyUnit)测试框架攻略: https://url.cn/5XOctlp

HTMLTestRunner改写为Python3版本: https://url.cn/51XrhYk

Python3改写的HTMLTestRunner的下载地址: https://url.cn/5WP3m9M

其他接口测试相关公众号文章 《接口测试&管理续集》《接口测试之文件重定向法》

【END】

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 搜狗测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
持续集成
CODING 持续集成(CODING Continuous Integration,CODING-CI)全面兼容 Jenkins 的持续集成服务,支持 Java、Python、NodeJS 等所有主流语言,并且支持 Docker 镜像的构建。图形化编排,高配集群多 Job 并行构建全面提速您的构建任务。支持主流的 Git 代码仓库,包括 CODING 代码托管、GitHub、GitLab 等。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档