一个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程序和Flask框架中使用SQLAlchemy的教程
Jun 06 Python
python万年历实现代码 含运行结果
May 20 Python
python回调函数中使用多线程的方法
Dec 25 Python
Windows下anaconda安装第三方包的方法小结(tensorflow、gensim为例)
Apr 05 Python
详解Python3 基本数据类型
Apr 19 Python
Python中常用的8种字符串操作方法
May 06 Python
Python检测数据类型的方法总结
May 20 Python
解决Django中多条件查询的问题
Jul 18 Python
python 字符串追加实例
Jul 20 Python
解决django同步数据库的时候app models表没有成功创建的问题
Aug 09 Python
python 公共方法汇总解析
Sep 16 Python
python使用HTMLTestRunner导出饼图分析报告的方法
Dec 30 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动态变静态原理
2006/11/25 PHP
php随机显示图片的简单示例
2014/02/15 PHP
深入理解PHP中的count函数
2016/05/31 PHP
PHP实现多图上传(结合uploadify插件)思路分析
2016/11/30 PHP
phpstorm最新激活码分享亲测phpstorm2020.2.3版可用
2020/11/22 PHP
清空上传控件input file的值
2010/07/03 Javascript
javascript对数组的常用操作代码 数组方法总汇
2011/01/27 Javascript
Extjs中使用extend(js继承) 的代码
2012/03/15 Javascript
JS截取字符串常用方法详细整理
2013/10/28 Javascript
js图片向右一张张滚动效果实例代码
2013/11/23 Javascript
javascript中验证大写字母、数字和中文
2014/01/15 Javascript
使用JSON.parse将json字符串转换成json对象的时候会出错
2014/09/04 Javascript
nodejs批量修改文件编码格式
2015/01/22 NodeJs
创建你的第一个AngularJS应用的方法
2015/06/16 Javascript
javascript简单比较日期大小的方法
2016/01/05 Javascript
过期软件破解办法实例详解
2017/01/04 Javascript
详解webpack分包及异步加载套路
2017/06/29 Javascript
详解如何构建Angular项目目录结构
2017/07/13 Javascript
什么时候不能在 Node.js 中使用 Lock Files
2019/06/24 Javascript
ES6 Generator函数的应用实例分析
2019/06/26 Javascript
使用vue实现多规格选择实例(SKU)
2019/08/23 Javascript
vue-iview动态新增和删除的方法
2020/06/17 Javascript
[01:27]DOTA2电竞之夜 今夜共饮庆功酒
2014/08/02 DOTA
Flask实现图片的上传、下载及展示示例代码
2018/08/03 Python
python学习--使用QQ邮箱发送邮件代码实例
2019/04/16 Python
Python可变和不可变、类的私有属性实例分析
2019/05/31 Python
Django中的AutoField字段使用
2020/05/18 Python
python爬虫beautifulsoup库使用操作教程全解(python爬虫基础入门)
2021/02/19 Python
HTML5中的postMessage API基本使用教程
2016/05/20 HTML / CSS
Sport-Thieme荷兰:购买体育用品
2019/08/25 全球购物
如何通过 CSS 写出火焰效果
2021/03/24 HTML / CSS
应届毕业生个人求职信范文
2014/01/29 职场文书
《花木兰》教学反思
2014/04/09 职场文书
小学语文教学经验交流材料
2014/06/02 职场文书
大学生实习介绍信
2015/05/05 职场文书
社会主义核心价值观主题教育活动总结
2015/05/07 职场文书