简单实现接口自动化测试(基于python+unittest)

简介

本文通过从Postman获取基本的接口测试Code简单的接口测试入手,一步步调整优化接口调用,以及增加基本的结果判断,讲解Python自带的Unittest框架调用,期望各位可以通过本文对接口自动化测试有一个大致的了解。

引言

为什么要做接口自动化测试?

在当前互联网产品迭代频繁的背景下,回归测试的时间越来越少,很难在每个迭代都对所有功能做完整回归。但接口自动化测试因其实现简单、维护成本低,容易提高覆盖率等特点,越来越受重视。

为什么要自己写框架呢?

使用Postman调试通过过直接可以获取接口测试的基本代码,结合使用requets + unittest很容易实现接口自动化测试的封装,而且requests的api已经非常人性化,非常简单,但通过封装以后(特别是针对公司内特定接口),可以进一步提高脚本编写效率。

一个现有的简单接口例子

下面使用requests + unittest测试一个查询接口

接口信息如下

请求信息:

Method:POST

URL:api/match/image/getjson

Request:

{
"category": "image",
"offset": "0",
"limit": "30",
"sourceId": "0",
"metaTitle": "",
"metaId": "0",
"classify": "unclassify",
"startTime": "",
"endTime": "",
"createStart": "",
"createEnd": "",
"sourceType": "",
"isTracking": "true",
"metaGroup": "",
"companyId": "0",
"lastDays": "1",
"author": ""
}

Response示例:

{
"timestamp" : xxx,
"errorMsg" : "",
"data" : {
"config" : xxx
}

Postman测试方法见截图:

测试思路

1.获取Postman原始脚本

2.使用requests库模拟发送HTTP请求**

3.对原始脚本进行基础改造**

4.使用python标准库里unittest写测试case**

原始脚本实现

未优化

该代码只是简单的一次调用,而且返回的结果太多,很多返回信息暂时没用,示例代码如下

import requestsurl = "http://cpright.xinhua-news.cn/api/match/image/getjson"querystring = {"category":"image","offset":"0","limit":"30","sourceId":"0","metaTitle":"","metaId":"0","classify":"unclassify","startTime":"","endTime":"","createStart":"","createEnd":"","sourceType":"","isTracking":"true","metaGroup":"","companyId":"0","lastDays":"1","author":""} headers = { 'cache-control': "no-cache", 'postman-token': "e97a99b0-424b-b2a5-7602-22cd50223c15" } response = requests.request("POST", url, headers=headers, params=querystring) print(response.text) 

优化 第一版

调整代码结构,输出结果Json出来,获取需要验证的response.status_code,以及获取结果校验需要用到的results['total']

#!/usr/bin/env python
#coding: utf-8
'''
unittest merchant backgroud interface
@author: zhang_jin
@version: 1.0
@see:http://www.python-requests.org/en/master/
'''import unittest
import json import traceback import requests url = "http://cpright.xinhua-news.cn/api/match/image/getjson" querystring = { "category": "image", "offset": "0", "limit": "30", "sourceId": "0", "metaTitle": "", "metaId": "0", "classify": "unclassify", "startTime": "", "endTime": "", "createStart": "", "createEnd": "", "sourceType": "", "isTracking": "true", "metaGroup": "", "companyId": "0", "lastDays": "1", "author": "" } headers = { 'cache-control': "no-cache", 'postman-token': "e97a99b0-424b-b2a5-7602-22cd50223c15" } #Post接口调用 response = requests.request("POST", url, headers=headers, params=querystring) #对返回结果进行转义成json串 results = json.loads(response.text) #获取http请求的status_code print "Http code:",response.status_code #获取结果中的total的值 print results['total'] #print(response.text) 

优化 第二版

接口调用异常处理,增加try,except处理,对于返回response.status_code,返回200进行结果比对,不是200数据异常信息。

#!/usr/bin/env python
#coding: utf-8
'''
unittest merchant backgroud interface
@author: zhang_jin
@version: 1.0
@see:http://www.python-requests.org/en/master/
'''import json
import traceback import requests url = "http://cpright.xinhua-news.cn/api/match/image/getjson" querystring = { "category": "image", "offset": "0", "limit": "30", "sourceId": "0", "metaTitle": "", "metaId": "0", "classify": "unclassify", "startTime": "", "endTime": "", "createStart": "", "createEnd": "", "sourceType": "", "isTracking": "true", "metaGroup": "", "companyId": "0", "lastDays": "1", "author": "" } headers = { 'cache-control': "no-cache", 'postman-token': "e97a99b0-424b-b2a5-7602-22cd50223c15" } try: #Post接口调用 response = requests.request("POST", url, headers=headers, params=querystring) #对http返回值进行判断,对于200做基本校验 if response.status_code == 200: results = json.loads(response.text) if results['total'] == 191: print "Success" else: print "Fail" print results['total'] else: #对于http返回非200的code,输出相应的code raise Exception("http error info:%s" %response.status_code) except: traceback.print_exc() 

优化 第三版

1.该版本改动较大,引入config文件,单独封装结果校验模块,引入unittest模块,实现接口自动调用,并增加log处理模块;
2.对不同Post请求结果进行封装,不同接口分开调用;
3.测试用例的结果进行统计并最终输出

#!/usr/bin/env python
#coding: utf-8
'''
unittest interface
@author: zhang_jin
@version: 1.0
@see:http://www.python-requests.org/en/master/
'''import unittest
import json import traceback import requests import time import result_statistics import config as cf from com_logger import match_Logger class MyTestSuite(unittest.TestCase): """docstring for MyTestSuite""" #@classmethod def sedUp(self): print "start..." #图片匹配统计 def test_image_match_001(self): url = cf.URL1 querystring = { "category": "image", "offset": "0", "limit": "30", "sourceId": "0", "metaTitle": "", "metaId": "0", "classify": "unclassify", "startTime": "", "endTime": "", "createStart": "", "createEnd": "", "sourceType": "", "isTracking": "true", "metaGroup": "", "companyId": "0", "lastDays": "1", "author": "" } headers = { 'cache-control': "no-cache", 'postman-token': "545a2e40-b120-2096-960c-54875be347be" } response = requests.request("POST", url, headers=headers, params=querystring) if response.status_code == 200: response.encoding = response.apparent_encoding results = json.loads(response.text) #预期结果与实际结果校验,调用result_statistics模块 result_statistics.test_result(results,196) else: print "http error info:%s" %response.status_code #match_Logger.info("start image_query22222") #self.assertEqual(results['total'], 888) ''' try: self.assertEqual(results['total'], 888) except: match_Logger.error(traceback.format_exc()) #print results['total'] ''' #文字匹配数据统计 def test_text_match_001(self): text_url = cf.URL2 querystring = { "category": "text", "offset": "0", "limit": "30", "sourceId": "0", "metaTitle": "", "metaId": "0", "startTime": "2017-04-14", "endTime": "2017-04-15", "createStart": "", "createEnd": "", "sourceType": "", "isTracking": "true", "metaGroup": "", "companyId": "0", "lastDays": "0", "author": "", "content": "" } headers = { 'cache-control': "no-cache", 'postman-token': "ef3c29d8-1c88-062a-76d9-f2fbebf2536c" } response = requests.request("POST", text_url, headers=headers, params=querystring) if response.status_code == 200: response.encoding = response.apparent_encoding results = json.loads(response.text) #预期结果与实际结果校验,调用result_statistics模块 result_statistics.test_result(results,190) else: print "http error info:%s" %response.status_code #print(response.text) def tearDown(self): pass if __name__ == '__main__': #image_match_Logger = ALogger('image_match', log_level='INFO') #构造测试集合 suite=unittest.TestSuite() suite.addTest(MyTestSuite("test_image_match_001")) suite.addTest(MyTestSuite("test_text_match_001")) #执行测试 runner = unittest.TextTestRunner() runner.run(suite) print "success case:",result_statistics.num_success print "fail case:",result_statistics.num_fail #unittest.main() 

最终输出日志信息

Zj-Mac:unittest lazybone$ python image_test_3.py
测试结果:通过.测试结果:不通过
错误信息: 期望返回值:190 实际返回值:4522.
----------------------------------------------------------------------
Ran 2 tests in 0.889s OK success case: 1 fail case: 1 

后续改进建议

1.unittest输出报告也可以推荐使用HTMLTestRunner(我目前是对结果统计进行了封装)

2.接口的继续封装,参数化,模块化

3.unittest单元测试框架实现参数化调用第三方模块引用(nose-parameterized)

4.持续集成运行环境、定时任务、触发运行、邮件发送等一系列功能均可以在Jenkins上实现。

简单实现接口自动化测试(基于python+unittest)相关推荐

  1. [python自动化]简单实现接口自动化测试(基于python+unittest)

    简介 本文通过从Postman获取基本的接口测试Code简单的接口测试入手,一步步调整优化接口调用,以及增加基本的结果判断,讲解Python自带的Unittest框架调用,期望各位可以通过本文对接口自 ...

  2. python自动化测试-简单实现接口自动化测试(基于python)

    原标题:简单实现接口自动化测试(基于python) 一.简介 本文从一个简单的登录接口测试入手,一步步调整优化接口调用姿势,然后简单讨论了一下接口测试框架的要点,最后介绍了一下我们目前正在使用的接口测 ...

  3. 简单实现接口自动化测试(基于python)

    一.简介 本文从一个简单的登录接口测试入手,一步步调整优化接口调用姿势,然后简单讨论了一下接口测试框架的要点,最后介绍了一下我们目前正在使用的接口测试框架pithy.期望读者可以通过本文对接口自动化测 ...

  4. python appium自动化测试框架unittest_Appium基于Python unittest自动化测试 自动化测试框架 -- PO并生成html测试报告...

    基于python单元测试框架unittest完成appium自动化测试,生成基于html可视化测试报告 代码示例: #利用unittest并生成测试报告 class Appium_test(unitt ...

  5. 如何简单实现接口自动化测试(基于 python)

    GitChat 作者:饿了么技术社区 原文:如何简单实现接口自动化测试(基于 python) 关注微信公众号:GitChat 技术杂谈 ,这里一本正经的讲技术 一.简介 本文从一个简单的登录接口测试入 ...

  6. python写web自动化_Web接口开发与自动化测试——基于Python语言

    目 录∣ V 目 录 第1 章 Python 学习必知 ........................................................................ ...

  7. jemeter python接口自动化测试平台_WEB接口开发与自动化测试基于PYTHON语言PDF_Python教程...

    资源名称:WEB接口开发与自动化测试 基于PYTHON语言 PDF 内容简介: <Web接口开发与自动化测试--基于Python语言>以接口测试为主线,以Web开发为切入点,全面介绍了We ...

  8. python接口自动化测试书籍_Web接口开发与自动化测试——基于Python语言

    Web接口开发与自动化测试--基于Python语言电子书 本书特色: * Django Web发,通过发发布会签到系统,全面了解Django MTV模型. * Django单元测试,在Web应用中如何 ...

  9. pythonunittest接口测试_基于python+unittest +requests接口测试

    2019独角兽企业重金招聘Python工程师标准>>> 谈到接口测试,大家都不会感到陌生.接口测试的工具和实现方式也有很多,比如ant+jmeter+jemkins.postman. ...

最新文章

  1. oracle sqlstate 22023,DB2 开发常遇到一些错误
  2. 【转】启动 Eclipse 弹出“Failed to load the JNI shared library jvm.dll”错误的解决方法!...
  3. 基于机器学习的捡球机器人设计与实现(探索)第3篇——opencv基础知识学习(2019-02-02)
  4. centos08-Linux服务器上发布java项目
  5. 各大计算机公司 笔试及面试 题目 - 人民搜索
  6. 使用MyBatis集成阿里巴巴druid连接池(不使用spring)
  7. 翼方健数邓振:“DRG+AI”助力实现医院精细化管理
  8. fckeditor异常总结---1.NoClassDefFoundError: org/slf4j/LoggerFactory和NoClassDefFoundError: org/apache/log
  9. jQuery方式追加div覆盖
  10. 《乔布斯传.神一样的传奇》读后感
  11. php商城拍卖逻辑,thinkphp商城购物车逻辑思路
  12. 计算机里怎么添加桌面,电脑上怎么把我的电脑添加到桌面上
  13. distpicker.js 三级联动,修改地址时设置默认值
  14. 名词用作动词举例_[名词的活用] 名词的活用例子
  15. Rust 有问有答之 crate 是什么
  16. 微信小程序订阅信息之Java实现详解
  17. zte android截屏快捷键,中兴红牛V5手机怎么截屏 中兴红牛V5截图技巧图解
  18. 【在线研讨会-倒计时】12月12日Softing工业物联网解决方案 助力工业4.0
  19. 健康生活每日“8禁忌”
  20. 基于yoloV7-pose添加任意关键点 + 多类别分类网络修改

热门文章

  1. 4款很棒的手机APP,千万别错过
  2. UML 太极建模口诀(建模向导与助手)
  3. B2C的核心竞争力是什么?
  4. 【大数据】Spark与Flink的优劣
  5. 【精华】搭建个人Web服务器_NGHG
  6. linux ext3 ext4 查看,技术|Linux 中管理 EXT2、 EXT3 和 EXT4 健康状况的 4 个工具
  7. android 手机屏幕旋转机制与使用说明
  8. 落魄的php开发,人生的坎坷和辉煌的说说 曾经辉煌现在落魄的感慨
  9. hdoj1160【DP】
  10. 判断是否为日期类型(年月日格式)