简单实现接口自动化测试(基于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 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"}#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 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"}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,输出相应的coderaise 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_Loggerclass MyTestSuite(unittest.TestCase):"""docstring for MyTestSuite"""#@classmethoddef sedUp(self):print "start..."#图片匹配统计def test_image_match_001(self):url = cf.URL1querystring = {"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_encodingresults = 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.URL2querystring = {"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_encodingresults = 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): passif __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_successprint "fail case:",result_statistics.num_fail#unittest.main()
最终输出日志信息
Zj-Mac:unittest lazybone$ python image_test_3.py 
测试结果:通过.测试结果:不通过 
错误信息: 期望返回值:190 实际返回值:4522.
----------------------------------------------------------------------
Ran 2 tests in 0.889sOK
success case: 1
fail case: 1

后续改进建议

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习中的激活函数

给定一个线性变换可以把x的值映射到一条直线上,如下图 输出结果就是y1w1xb1 如果y1经过一个线性变换得到一个y2,那么x和y2的关系是什么? 答案,毫无疑问是一条直线,不管如何的线性变换,依旧是一个线性的问…

关于网络协议的若干问题(三)

1、当发送的报文出问题的时候,会发送一个 ICMP 的差错报文来报告错误,但是如果 ICMP 的差错报文也出问题了呢? 答:不会导致产生 ICMP 差错报文的有: ICMP 差错报文(ICMP 查询报文可能会产生 ICMP 差错报文…

UI自动化测试:Selenium+PO模式+Pytest+Allure整合

本人目前工作中未涉及到WebUI自动化测试,但为了提升自己的技术,多学习一点还是没有坏处的,废话不多说了,目前主流的webUI测试框架应该还是selenium,考虑到可维护性、拓展性、复用性等,我们采用PO模式去写我…

【ElasticSearch】更新es索引生命周期策略,策略何时对索引生效

大家好,我是好学的小师弟,今天和大家讨论下更新es索引生命周期策略后,策略何时对索引生效 结论: 若当前索引已应用策略A(旧),更新完策略A后,新的策略A会立即对原来的已经应用该策略的索引生效;若当前索引…

OPPO realme 真我 一加 刷机工具下载 ColorOS Upgrade Tool

Download Realme Upgrade Tool for Windows Download ColorOS Upgrade Tool for Windows Realme升级工具是由Realme开发的Windows应用程序,可帮助用户升级其Realme设备上的固件。此工具支持在Realme Ul 3.0或更高版本上运行的Realme 设备。OPPO realme 真我 一加 …

GienTech动态|入选软件和信息技术服务竞争力百强;参展世界计算大会、网络安全博览会

———— GienTech动态 ———— 中电金信参展广东省网络安全博览会、世界计算机大会 近期,中电金信跟随中国电子参展2023年广东省网络安全博览会(下简称“博览会”)和2023世界计算大会。在两大峰会上,中电金信展出了金融级数字底…

【虹科干货】Redis Enterprise 自动分层技术:大数据集高性能解决方案

越来越多的应用程序依赖于庞大的数据集合,而这些应用程序必须快速响应。借助自动分层,Redis Enterprise 7.2 帮助开发人员轻松创建超快的应用程序。何乐而不为? Redis将数据存储在内存中,因此应用程序能以最快的速度检索和处理数…

“过度炒作”的大模型巨亏,Copilot每月收10刀,倒赔20刀

大模型无论是训练还是使用,都比较“烧钱”,只是其背后的成本究竟高到何处?已经推出大模型商用产品的公司到底有没有赚到钱?事实上,即使微软、亚马逊、Adobe 这些大厂,距离盈利之路还有很远!同时…

精品Python的计算机科学研究话题管理系统-可视化大屏

《[含文档PPT源码等]精品Python的计算机科学研究话题管理系统设计与实现-爬虫》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等! 软件开发环境及开发工具: 开发语言:python 使用框架:Django 前端技术…

Vue 中 KeepAlive 内置缓存使用

KeepAlive 介绍及使用场景 KeepAlive 是 vue 中的内置组件&#xff0c;当多个组件动态切换时可以对实例状态进行缓存&#xff0c;用法如下 <router-view v-slot"{ Component }"><keep-alive><component :is"Component" /></keep-al…

让 Visual Studio 用上 ChatGPT

一、简介 Visual chatGPT Studio 是 Visual Studio 的一个免费扩展&#xff0c;它直接在 IDE 中添加了 chatGPT 功能。它允许用户以可以根据菜单功能的方式使用 chatGPT。 二、功能介绍 该扩展提供了一组使用 ChatGPT 命令&#xff0c;可以在编辑器中选择你需要处理的代码或…

火伞云Web应用防火墙的特点与优势

在前文中&#xff0c;我们已经介绍了Web应用防火墙&#xff08;WAF&#xff09;的基本原理和重要性。接下来&#xff0c;我们将深入探讨火伞云Web应用防火墙的特点与优势&#xff0c;了解它如何为企业提供更为完善和专业的网络安全保障。 一、强大的防御能力 火伞云Web应用防火…

SSM - Springboot - MyBatis-Plus 全栈体系(二十六)

第六章 SpringBoot 快速启动框架&#xff1a;SpringBoot3 实战 一、SpringBoot3 介绍 1. SpringBoot3 简介 SpringBoot 版本&#xff1a;3.0.5 到目前为止已经学习了多种配置 Spring 程序的方式。但是无论使用 XML、注解、Java 配置类还是他们的混合用法&#xff0c;都会觉…

Git版本控制管理

Git基础_环境配置 当安装Git后首先要做的事情是设置用户名称和email地址。这是非常重要的&#xff0c;因为每次Git提交都会使用该用户信息。 设置用户信息 git config --global user.name "Bandits" git config --global user.email "gb010704163.com"查…

【安全】linux audit审计使用入门

文章目录 1 audit简介2 auditctl的使用2 audit配置和规则3 工作原理4 audit接口调用4.1 获取和修改配置4.2 获取和修改规则4.3 获取审计日志 5 audit存在的问题5.1 内核版本5.2 审计日志过多造成的缓存队列和磁盘问题5.2 容器环境下同一个命令的日志存在差异 6 参考文档 1 audi…

【算法|双指针系列No.6】leetcode LCR 179. 查找总价格为目标值的两个商品

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

Rule-Engine-Starter V1.0.0

一个轻量级的规则引擎、搜索引擎&#xff0c;让条件匹配简单、优雅。 GIT地址 https://gitcode.cosmoplat.com/15011240224/rule-engine-starter 介绍 Rule-Engine-Starter 是一个轻量级规则引擎&#xff0c;V1.0.0主要解决条件匹配问题。比如飞书文档&#xff0c;每个文档都…

电脑系统升级Win11变卡顿?如何解决!

关于Win11系统更新的相关问题&#xff0c;Win11每一次更新之后会给大家带来更多功能&#xff01;但是每次更新也可能会出现掉驱动、无法打开应用、甚至是蓝屏或者进不去主页等问题&#xff01;所以为了帮助大家预防这些更新出现的后遗症&#xff0c;分享了一些小的方法&#xf…

[Error]在Swift项目Build Settings的Preprocessor Macros中定义的宏无效的问题

问题 如图&#xff0c;在Build Settings -> Preprocessor Macros中添加了ISADEMO1。但在代码中判断无效&#xff0c;还是会输出“isn’t ADemo” #if ISADEMOprint("is ADemo") #elseprint("isnt ADemo") #endif解决 如图&#xff0c;要让Preproces…

【已解决】MySQL:执行sql查询出错误数据(MySQL隐藏机制-类型转换导致)

目录 问题现象&#xff1a; 问题分析&#xff1a; 结论&#xff1a; 解决方法&#xff1a; 拓展&#xff1a; 问题现象&#xff1a; 今天在项目开发中发现了一个非常奇怪的bug&#xff1a; 如图&#xff0c;我在数据库中以“dept_id 1712651046956421123”为条件&#xff…