一个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读写文件操作示例程序
Dec 02 Python
Python获取脚本所在目录的正确方法
Apr 15 Python
Python的SQLAlchemy框架使用入门
Apr 29 Python
Python实现分割文件及合并文件的方法
Jul 10 Python
Scrapy爬虫实例讲解_校花网
Oct 23 Python
Python学生成绩管理系统简洁版
Apr 05 Python
Python中property属性实例解析
Feb 10 Python
python实战之实现excel读取、统计、写入的示例讲解
May 02 Python
解决phantomjs截图失败,phantom.exit位置的问题
May 17 Python
selenium使用chrome浏览器测试(附chromedriver与chrome的对应关系表)
Nov 29 Python
Python环境Pillow( PIL )图像处理工具使用解析
Sep 12 Python
python处理json数据文件
Apr 11 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性能的编码技巧以及性能优化详细解析
2013/08/24 PHP
PHP实现的方程求解示例分析
2016/11/11 PHP
PHP设计模式之模板方法模式实例浅析
2018/12/20 PHP
PHP连接及操作PostgreSQL数据库的方法详解
2019/01/30 PHP
一个简单的jQuery插件制作 学习过程及实例
2010/04/25 Javascript
判断目标是否是window,document,和拥有tagName的Element的代码
2010/05/31 Javascript
鼠标滑在标题上显示图片的JS代码
2013/11/19 Javascript
js操作css属性实现div层展开关闭效果的方法
2015/05/11 Javascript
JavaScript的类型、值和变量小结
2015/07/09 Javascript
jQuery toggle 代替方法
2016/03/22 Javascript
Vue.js路由组件vue-router使用方法详解
2016/12/02 Javascript
基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果
2018/01/09 Javascript
node中的session的具体使用
2018/09/14 Javascript
详解JavaScript中精度失准问题及解决方法
2020/02/04 Javascript
Python加pyGame实现的简单拼图游戏实例
2015/05/15 Python
pandas实现选取特定索引的行
2018/04/20 Python
详解Python连接MySQL数据库的多种方式
2019/04/16 Python
python原类、类的创建过程与方法详解
2019/07/19 Python
Python中的相关分析correlation analysis的实现
2019/08/29 Python
Python-Flask:动态创建表的示例详解
2019/11/22 Python
python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例
2020/03/06 Python
Python常用编译器原理及特点解析
2020/03/23 Python
关于CSS Tooltips(鼠标经过时显示)的效果
2013/04/10 HTML / CSS
使用html2canvas实现浏览器截图的示例代码
2018/01/26 HTML / CSS
End Clothing美国站:英国男士潮牌商城
2018/04/20 全球购物
Gretna Green中文官网:苏格兰格林小镇
2019/10/16 全球购物
Pottery Barn阿联酋:购买家具、家居装饰及更多
2019/12/08 全球购物
什么是数据抽象
2016/11/26 面试题
中学门卫岗位职责
2013/12/26 职场文书
中文专业学生自我评价范文
2014/02/06 职场文书
企业党建工作汇报材料
2014/08/19 职场文书
2015年全国科普日活动总结
2015/03/23 职场文书
2016年“11.11”光棍节活动总结
2016/04/05 职场文书
Django项目配置Memcached和Redis, 缓存选择哪个更有优势
2021/04/06 Python
js中Object.create实例用法详解
2021/10/05 Javascript
Redis高并发防止秒杀超卖实战源码解决方案
2021/11/01 Redis