当前位置: 首页 > news >正文

Python实现简单接口自动化测试

使用excel进行用例的管理,如图:

以下为此次根据公司所有接口以及返回的参数进行判断来实现的:

# coding:utf-8
import requests
import json
import xlrd
import os
from xlutils.copy import copy
import logging
import sys

# import Cookie
'''
简易版接口自动化测试
'''

defaultencoding = 'utf-8'
if sys.getdefaultencoding() != defaultencoding:
reload(sys)
sys.setdefaultencoding(defaultencoding) # 在eclipse里该报错不需要理会

# 获取token值
par1 = {"userName": "xxxxxxxxxx", "password": "xxxxxxxx"}

url1 = "http://xxxxxxxxxxxxxxx"

r1 = requests.get(url1, params=par1)
LOGIN_TOKEN = r1.cookies["authToken"]
# print LOGIN_TOKEN
# 创建日记
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(filename) s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S',
filename=r'C:\Users\admin\Desktop\TestLog.log',
filemode='w'
)
# 定义一个StreamHandler,将INFO级别或更高的日志信息打印到标准错误,并将其添加到当前的日志处理对象#
console = logging.StreamHandler()
console.setLevel(logging.INFO)
formatter = logging.Formatter('%(name)-12s:%(levelname)-8s %(message)s')
console.setFormatter(formatter)
logging.getLogger('').addHandler(console)

excel = r'C:\Users\admin\Desktop\test_case_yang1.xls' # 定义存放用例的excel路径,当前路径下
data = xlrd.open_workbook(excel)
logging.info("打开%s excel表格成功 " % data)

result = [] # 用来存放验证结果
responseValue = [] # 存放返回的数据
bidui = [] # 用来比对预期状态码和实际状态码
remark = [] # 用来存储outparam内嵌部分出现的异常情况
test_result = [] # 用来存放测试结果

table = data.sheet_by_index(0)
nrow = table.nrows # 获取行数
headers = {"Content-Type": "application/json;charset=utf-8"}
for i in range(1, nrow): # 循环获取每行中的数据
requestMethod = table.cell(i, 6).value
url = table.cell(i, 5).value # 拼接url
logging.info(url)
payload = eval(table.cell(i, 7).value) # 参数格式处理
logging.info('\n' + table.cell(i, 2).value + "请求报文:\n" + table.cell(i, 7).value + '\n')
ex = table.cell(i, 8).value # 获取期望的返回值
# 可以在这里做一个异常处理
if requestMethod == 'get': # 不同的方法发不同的请求
payload["authToken"] = LOGIN_TOKEN
r = requests.get(url, payload)
elif requestMethod == 'post':
payload["LOGIN_TOKEN"] = LOGIN_TOKEN
payload = json.dumps(payload)
r = requests.post(url, payload, headers=headers)
apicontent = r.json()
apicontent = json.dumps(apicontent, ensure_ascii=False)
logging.info('\n' + table.cell(i, 2).value + "接口返回结果:\n" + apicontent + '\n')
apicontent = json.loads(apicontent)

if apicontent["result"] == "SUCCESS" or apicontent["result"] == 0:
result.append('true')
# 获取接口返回内嵌outparam字段内容
# result_out=apicontent["outparam"]
if "outparam" in r.json():
result_out = r.json()["outparam"]
result_out1 = json.dumps(result_out, ensure_ascii=False)
result_outparam = json.loads(result_out1)
if "BUSI_RESULT" in result_outparam.keys():
if result_outparam["BUSI_RESULT"] == "ERROR":
remark.append(result_outparam["BUSI_RESULT_DESC"])
test_result.append(u'测试不通过')
else:
remark.append(u'——')
test_result.append(u'测试通过')
elif "RESULT" in result_outparam.keys():
# 针对outparam里有相同的RESULT字段,不同的DESC做判断
if result_outparam["RESULT"] == "ERROR":
if "BUSI_RESULT_DESC" in result_outparam.keys():
remark.append(result_outparam["BUSI_RESULT_DESC"])
test_result.append(u'测试不通过')
elif "RESULT_DESC" in result_outparam.keys():
remark.append(result_outparam["RESULT_DESC"])
test_result.append(u'测试不通过')
else:
pass
else:
remark.append(u'——')
test_result.append(u'测试通过')
else:
remark.append(u'——')
test_result.append(u'测试通过')
else:
remark.append(u'——')
test_result.append(u'测试通过')

else:
result.append('false')

logging.info(r)

if 'result_desc' in r.json().keys():
responseValue.append(r.json()['result_desc'])
elif 'errorMessage' in r.json().keys(): # 有些错误的信息描述是这个字段:针对于有些接口的get请求
if r.json()["result"] == 0:
responseValue.append(u'接口正常')
else:
responseValue.append(u'接口不正常')
# responseValue.append(r.json()['errorMessage'])
# 在列表上写入不能留有空,否则结果输出会报:IndexError: list index out of range
# remark.append(u'测试不通过')
remark.append(r.json()['errorMessage'])
test_result.append(u'测试不通过')
elif 'resultDesc' in r.json().keys():
responseValue.append(r.json()['resultDesc'])
else:
responseValue.append(u'接口正常')

# 预期结果和接口实际返回的结果比对
if r.json()["result"] == ex:
bidui.append(u"预期结果一致")
else:
bidui.append(u"预期结果不一致")
r.close()
print('共有%d个url,当第%d个执行完毕' % (nrow - 1, i))

book = copy(data)
sheet1 = book.get_sheet(0) # copy原来的excel

for j in range(1, nrow): # 将结果写入到对应的表格中 #将结果和response都写入到复制的工作表中
sheet1.write(j, 9, result[j - 1])
sheet1.write(j, 10, bidui[j - 1])
sheet1.write(j, 11, responseValue[j - 1])
sheet1.write(j, 12, remark[j - 1])
sheet1.write(j, 13, test_result[j - 1])
os.remove(excel)
logging.info(sheet1)
book.save(excel) # 移除原来的excel,保存新的excel
最后实现的结果如上图展示
声明:此代码是借鉴网上某位大神的代码,再根据现阶段公司的接口情况进行调试实现的

转载于:https://www.cnblogs.com/yang1208/p/7356939.html

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Codeforces Round #428 (Div. 2)
  • 【转】搜索算法的剪枝优化
  • vue.js过渡效果之--javascript钩子
  • 吓死猪队友 只用命令行登录Windows就问你怕不怕!
  • 从零开始学习Sencha Touch MVC应用之十四
  • 四 APPIUM GUI讲解(Windows版)(转)
  • net user使用
  • 如何在Ubuntu上使用Grafana监控Docker
  • 电脑快捷键
  • 字符合并[HAOI2016]
  • love——sir thomas browne
  • 开源 java CMS - FreeCMS2.6 积分记录
  • 个人记事本-介绍
  • 如何让Ubuntu在老旧设备上飞速运行!
  • Redis事件驱动库转
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 2018一半小结一波
  • android图片蒙层
  • Android优雅地处理按钮重复点击
  • ESLint简单操作
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Vue 2.3、2.4 知识点小结
  • yii2中session跨域名的问题
  • Zsh 开发指南(第十四篇 文件读写)
  • 阿里云前端周刊 - 第 26 期
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 从零开始学习部署
  • 番外篇1:在Windows环境下安装JDK
  • 前端技术周刊 2019-02-11 Serverless
  • 前端性能优化--懒加载和预加载
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 我的业余项目总结
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​queue --- 一个同步的队列类​
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #图像处理
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (1)Hilt的基本概念和使用
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (笔试题)分解质因式
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (十)Flink Table API 和 SQL 基本概念
  • (转)Google的Objective-C编码规范
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .net(C#)中String.Format如何使用
  • .net6 当连接用户的shell断掉后,dotnet会自动关闭,达不到长期运行的效果。.NET 进程守护
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)