一个Python最简单的接口自动化框架


Posted in Python onJanuary 02, 2018

故事背景

读取一个Excel中的一条数据用例,请求接口,然后返回结果并反填到excel中。过程中会生成请求回来的文本,当然还会生成一个xml文件。具体的excel文件如下:

一个Python最简单的接口自动化框架

代码方案

# -*- coding: UTF-8 -*- 
from xml.dom import minidom
import xlrd
import openpyxl
import requests
import json
import sys
import HTMLParser
import os
import re
import codecs
import time
import datetime

reload(sys)
sys.setdefaultencoding('utf-8')

class OptionExcelData(object):
  """对Excel进行操作,包括读取请求参数,和填写操作结果"""
  def __init__(self, excelFile,excelPath=''):
    self.excelFile = excelFile
    self.excelPath = excelPath
    self.caseList = []

  """
  传入:传入用例Excel名称
  返回:[],其中元素为{},每个{}包含行号、城市、国家和期望结果的键值对
  """
  def getCaseList(self,excelFile,excelPath=''):
    readExcel = xlrd.open_workbook(fileName)              #读取指定的Excel
    try:
      table = readExcel.sheet_by_index(0)               #获取Excel的第一个sheet
      trows = table.nrows                       #获取Excel的行数
      for n in range(1,trows):
        tmpdict = {}                        #把一行记录写进一个{}
        tmpdict['id'] = n                      #n是Excel中的第n行
        tmpdict['CityName'] = table.cell(n,2).value
        tmpdict['CountryName'] = table.cell(n,3).value
        tmpdict['Rspect'] = table.cell(n,4).value
        self.caseList.append(tmpdict)
    except Exception, e:
      raise
    finally:
      pass
    return self.caseList

  """
  传入:请求指定字段结果,是否通过,响应时间
  返回:
  """
  def writeCaseResult(self,resultBody,isSuccess,respTime,\
    excelFile,theRow,theCol=5):
    writeExcel = openpyxl.load_workbook(excelFile)           #加载Excel,后续写操作
    try:
      wtable = writeExcel.get_sheet_by_name('Sheet1')         #获取名为Sheet1的sheet
      wtable.cell(row=theRow+1,column=theCol+1).value = resultBody  #填写实际值
      wtable.cell(row=theRow+1,column=theCol+2).value = isSuccess   #填写是否通过
      wtable.cell(row=theRow+1,column=theCol+3).value = respTime   #填写响应时间
      writeExcel.save(excelFile)
    except Exception, e:
      raise
    finally:
      pass


class GetWeather(object):
  """获取天气的http请求"""
  def __init__(self, serviceUrl,requestBody,headers):
    self.serviceUrl = serviceUrl
    self.requestBody = requestBody
    self.headers = headers
    self.requestResult = {}

  """
  传入:请求地址,请求体,请求头
  返回:返回{},包含响应时间和请求结果的键值对
  """
  def getWeath(self,serviceUrl,requestBody,headers):
    timebefore = time.time()                      #获取请求开始的时间,不太严禁
    tmp = requests.post(serviceUrl,data=requestBody,\
      headers=headers)
    timeend = time.time()                        #获取请求结束的时间
    tmptext = tmp.text
    self.requestResult['text'] = tmptext                #记录响应回来的内容
    self.requestResult['time'] = round(timeend - timebefore,2)     #计算响应时间
    return self.requestResult

class XmlReader:
  """操作XML文件"""
  def __init__(self,testFile,testFilePath=''):
    self.fromXml = testFile
    self.xmlFilePath = testFilePath
    self.resultList = []

  def writeXmlData(self,resultBody,testFile,testFilePath=''):
    tmpXmlFile = codecs.open(testFile,'w','utf-16')           #新建xml文件
    tmpLogFile = codecs.open(testFile+'.log','w','utf-16')       #新建log文件

    tmp1 = re.compile(r'\<.*?\>')                   #生成正则表达式:<*?>
    tmp2 = tmp1.sub('',resultBody['text'])               #替换相应结果中的<*?>
    html_parser = HTMLParser.HTMLParser()
    xmlText = html_parser.unescape(tmp2)                #转换html编码

    try:
      tmpXmlFile.writelines(xmlText.strip())             #去除空行并写入xml
      tmpLogFile.writelines('time: '+\
        str(resultBody['time'])+'\r\n')               #把响应时间写入log
      tmpLogFile.writelines('text: '+resultBody['text'].strip())   #把请求回来的文本写入log
    except Exception, e:
      raise
    finally:
      tmpXmlFile.close()
      tmpLogFile.close()

  """返回一个list"""
  def readXmlData(self,testFile,testFilePath=''):
    tmpXmlFile = minidom.parse(testFile)
    root = tmpXmlFile.documentElement
    tmpValue = root.getElementsByTagName('Status')[0].\
    childNodes[0].data
    return tmpValue                           #获取特定字段并返回结果,此处选取Status


if __name__ == '__main__':

  requesturl = 'http://www.webservicex.net/globalweather.asmx/GetWeather'
  requestHeadrs = {"Content-Type":"application/x-www-form-urlencoded"}
  fileName = u'用例内容.xlsx'

  ed = OptionExcelData(fileName) 
  testCaseList = ed.getCaseList(ed.excelFile)

  for caseDict in testCaseList:
    caseId = caseDict['id']
    cityName = caseDict['CityName']
    countryName = caseDict['CountryName']
    rspect = caseDict['Rspect']
    requestBody = 'CityName='+cityName+'&CountryName='+countryName

    getWeather = GetWeather(requesturl,requestBody,requestHeadrs)
    #获取请求结果
    tmpString = getWeather.getWeath(getWeather.serviceUrl,\
      getWeather.requestBody,getWeather.headers)

    xd = XmlReader(str(caseId) + '.xml')
    #把请求内容写入xml和log
    xd.writeXmlData(tmpString,xd.fromXml)
    response = xd.readXmlData(str(caseId) + '.xml')
    respTime = tmpString['time']
    if response == rspect:
      theResult = 'Pass'
    else:
      theResult = 'False'
   ed.writeCaseResult(response,theResult,respTime,fileName,caseId)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python Matplotlib库入门指南
May 18 Python
Python编程中的异常处理教程
Aug 21 Python
Ruby使用eventmachine为HTTP服务器添加文件下载功能
Apr 20 Python
Python生成数字图片代码分享
Oct 31 Python
Python3中的列表,元组,字典,字符串相关知识小结
Nov 10 Python
pandas全表查询定位某个值所在行列的方法
Apr 12 Python
解决PyCharm的Python.exe已经停止工作的问题
Nov 29 Python
对Python多线程读写文件加锁的实例详解
Jan 14 Python
Python在Matplotlib图中显示中文字体的操作方法
Jul 29 Python
Django model 中设置联合约束和联合索引的方法
Aug 06 Python
Python flask框架如何显示图像到web页面
Jun 03 Python
Python利器openpyxl之操作excel表格
Apr 17 Python
利用Hyperic调用Python实现进程守护
Jan 02 #Python
python实现TF-IDF算法解析
Jan 02 #Python
python实现xlsx文件分析详解
Jan 02 #Python
Python实现KNN邻近算法
Jan 28 #Python
Python+matplotlib+numpy绘制精美的条形统计图
Jan 02 #Python
基于Python实现的ID3决策树功能示例
Jan 02 #Python
python实现基于SVM手写数字识别功能
May 27 #Python
You might like
php实现redis数据库指定库号迁移的方法
2015/01/14 PHP
PHP设计模式之适配器模式定义与用法详解
2018/04/03 PHP
JavaScript更改class和id的方法
2008/10/10 Javascript
jQuery学习3:操作元素属性和特性
2010/02/07 Javascript
jQuery Ajax请求状态管理器打包
2012/05/03 Javascript
Jquery加载时从后台读取数据绑定到dropdownList实例
2013/06/09 Javascript
javascript 判断字符串是否包含某字符串及indexOf使用示例
2013/10/18 Javascript
JavaScript实现按Ctrl键打开新页面
2014/09/04 Javascript
详解JavaScript ES6中的Generator
2015/07/28 Javascript
jQuery+AJAX实现遮罩层登录验证界面(附源码)
2020/09/13 Javascript
javascript数据类型详解
2017/02/07 Javascript
windows下vue-cli导入bootstrap样式
2017/04/25 Javascript
NodeJs安装npm包一直失败的解决方法
2017/04/28 NodeJs
JS简单生成随机数(随机密码)的方法
2017/05/11 Javascript
vue使用stompjs实现mqtt消息推送通知
2017/06/22 Javascript
使用vue构建一个上传图片表单
2017/07/04 Javascript
基于JS实现移动端左滑删除功能
2017/07/28 Javascript
js如何找出字符串中的最长回文串
2018/06/04 Javascript
vue elementUI使用tabs与导航栏联动
2019/06/21 Javascript
vue-router懒加载的3种方式汇总
2021/02/28 Vue.js
Python中的测试模块unittest和doctest的使用教程
2015/04/14 Python
python 将字符串转换成字典dict的各种方式总结
2018/03/23 Python
python识别图像并提取文字的实现方法
2019/06/28 Python
python 使用plt画图,去除图片四周的白边方法
2019/07/09 Python
django框架forms组件用法实例详解
2019/12/10 Python
使用opencv将视频帧转成图片输出
2019/12/10 Python
Python使用进程Process模块管理资源
2020/03/05 Python
python中str内置函数用法总结
2020/12/27 Python
英国珠宝钟表和家居礼品精品店:David Shuttle
2018/02/24 全球购物
2014年中班下学期工作总结
2014/12/11 职场文书
万能检讨书开头与结尾怎么写
2015/02/17 职场文书
2015年妇幼保健工作总结
2015/05/19 职场文书
看古人们是如何赞美老师的?
2019/07/08 职场文书
pandas中DataFrame检测重复值的实现
2021/05/26 Python
Docker下安装Oracle19c
2022/04/13 Servers
Python可视化动图组件ipyvizzu绘制惊艳的可视化动图
2022/04/21 Python