对python自动生成接口测试的示例讲解


Posted in Python onNovember 30, 2018

在python中Template可以将字符串的格式固定下来,重复利用。 同一套测试框架为了可以复用,所以我们可以将用例部分做参数化,然后运用到各个项目中。

代码如下:

coding=utf-8
'''
作者:大石
功能:自动生成pyunit框架下的接口测试用例
环境:python2.7.6
用法:将用户给的参数处理成对应格式,然后调用模块类生成函数,并将参数传入即可
'''
 
from string import Template
#动态生成单个测试用例函数字符串
def singleMethodCreate(MethodList,interfaceNamePara):
  code=Template('''\n  def test_${testcase}(self):
    u"""${testcaseName}"""
    headers = $headers
    data = $data
    re = requests.$method(url='$url',headers=headers,data=data)
    status_code = re.status_code
    s = str(status_code)
    json = re.text
    logging.info('-'*5+'返回状态码是'+s+'-'*5)
    logging.info('-'*5+'返回结果集是'+json+'-'*5)
    assert status_code == 200
    assert json['status'] == 'ok'
''')
 
  string = code.substitute(testcase=MethodList["testcase"],testcaseName=MethodList["TestcaseName"],
               method=MethodList['method'],url=MethodList['url'],headers=MethodList['headers'],data=MethodList['data'],
               )
  return string
 
#拼接单个的测试用例函数字符串为完整字符串并传回主函数
#MethodParaList获取测试用例部分list
def methodCreate(MethodParaList,interfaceNamePara):
  string = ""
  for MethodPara in MethodParaList:
    string2=singleMethodCreate(MethodPara,interfaceNamePara)
    string=string+string2
  return string
 
#构造单个测试集
def singleTestsuitCreate(MethodList,parameters):
  code = Template('''suite.addTest(${className}("test_${testcase}"))''')
  string = code.substitute(testcase = MethodList["testcase"],className = parameters[0])
  return string
 
#添加测试集
def addtestsuit(MethodParaList,interfaceNamePara):
  string = ""
  for MethodPara in MethodParaList:
    string2 = singleTestsuitCreate(MethodPara,interfaceNamePara)
    string=string+string2
  return string
 
#生成测试用例类函数字符串
def modelClassCreate(parameters):
  modelCode = methodCreate(parameters[2],parameters[1])
  adtestsuit = addtestsuit(parameters[2],parameters)
  code = Template('''#coding: utf-8
"""
作者:大石
功能:待执行的接口测试用例
环境:python2.7.6
用法:通过框架自动触发调用
"""
import unittest,requests,datetime,sys,logging,BSTestRunner,time,os
from Log import Log
class ${className}(unittest.TestCase):
  u"""待测试接口:${interfaceName}"""
  def setUp(self):
    logging.info('-'*5+"begin test"+"-"*5)
  def tearDown(self):
    logging.info('-'*5+"end test"+'-'*5)
  ${model}
if __name__ == "__main__":
  #解决UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 97: ordinal not in range(128)
  reload(sys)
  sys.setdefaultencoding('utf8')
  #构造测试集
  suite = unittest.TestSuite()
  ${testsuite}
  #定义date为日期,time为时间
  date=time.strftime("%Y%m%d")
  time1=time.strftime("%H%M%S")
  now=time.strftime("%Y-%m-%d-%H_%M_%S",time.localtime(time.time()))
  #创建路径
  path='F:/test/study/yaml/test_log/'+now+"/"
  #解决多次执行时报路径已存在的错误
  try:
    os.makedirs(path)
  except:
    if path!= None:
      logging.error(u'当前路径已经存在')
  filename=path+'Report.html'
  fp=file(filename,'wb')
  #日志记录
  Log.log()
  #执行测试
  runner =BSTestRunner.BSTestRunner(stream=fp,title=u'下单平台接口测试用例',description=u'接口用例列表:')
  runner.run(suite)
  fp.close()
''')
  fileStr = code.substitute(className=parameters[0],interfaceName=parameters[1],testsuite=adtestsuit,model=modelCode)
  f=open(parameters[0]+".py",'w')
  f.write(fileStr)
  f.close()

然后测试用例部分如下:

parameters=["Testcase_Orders",
        "/login",
        [
          {"TestcaseName":"测试登录","method":"post","url":"http://www.senbaba.cn/login","headers":{'content-type': 'application/json',
          'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko',
          'Accept':'application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*',
          'Accept-Language':'zh-CN'},"data":{"uname":"187071484771","pwd":"123456"},
            "testcase":"login"},
 
          {"TestcaseName":"测试登录","method":"post","url":"http://www.senbaba.cn/login1","headers":{'content-type': 'application/json',
          'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko',
          'Accept':'application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*',
          'Accept-Language':'zh-CN'},"data":{"uname":"187071484771","pwd":"123457"},
            "testcase":"login_failed"}
        ]
      ]

自动生成的测试用例如下:

#coding: utf-8
"""
作者:大石
功能:待执行的接口测试用例
环境:python2.7.6
用法:通过框架自动触发调用
"""
import unittest,requests,datetime,sys,logging,BSTestRunner,time,os
from Log import Log
class Testcase_Orders(unittest.TestCase):
  u"""待测试接口:/login"""
  def setUp(self):
    logging.info('-'*5+"begin test"+"-"*5)
 
  def tearDown(self):
    logging.info('-'*5+"end test"+'-'*5)
 
  
  def test_login(self):
    u"""测试登录"""
    headers = {'Accept-Language': 'zh-CN', 'content-type': 'application/json', 'Accept': 'application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko'}
    data = {'uname': '187071484771', 'pwd': '123456'}
    re = requests.post(url='http://www.senbaba.cn/login',headers=headers,data=data)
    status_code = re.status_code
    s = str(status_code)
    json = re.text
    logging.info('-'*5+'返回状态码是'+s+'-'*5)
    logging.info('-'*5+'返回结果集是'+json+'-'*5)
    assert status_code == 200
    assert json['status'] == 'ok'
 
  def test_login_failed(self):
    u"""测试登录"""
    headers = {'Accept-Language': 'zh-CN', 'content-type': 'application/json', 'Accept': 'application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko'}
    data = {'uname': '187071484771', 'pwd': '123457'}
    re = requests.post(url='http://www.senbaba.cn/login1',headers=headers,data=data)
    status_code = re.status_code
    s = str(status_code)
    json = re.text
    logging.info('-'*5+'返回状态码是'+s+'-'*5)
    logging.info('-'*5+'返回结果集是'+json+'-'*5)
    assert status_code == 200
    assert json['status'] == 'ok'
 
 
if __name__ == "__main__":
  #解决UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 97: ordinal not in range(128)
  reload(sys)
  sys.setdefaultencoding('utf8')
  #构造测试集
  suite = unittest.TestSuite()
  
  suite.addTest(Testcase_Orders("test_login"))
 
  suite.addTest(Testcase_Orders("test_login_failed"))
 
  #定义date为日期,time为时间
  date=time.strftime("%Y%m%d")
  time1=time.strftime("%H%M%S")
  now=time.strftime("%Y-%m-%d-%H_%M_%S",time.localtime(time.time()))
  #创建路径
  path='F:/test/study/yaml/test_log/'+now+"/"
  #解决多次执行时报路径已存在的错误
  try:
    os.makedirs(path)
  except:
    if path!= None:
      logging.error(u'当前路径已经存在')
  filename=path+'Report.html'
  fp=file(filename,'wb')
  #日志记录
  Log.log()
  #执行测试
  runner =BSTestRunner.BSTestRunner(stream=fp,title=u'下单平台接口测试用例',description=u'接口用例列表:')
  runner.run(suite)
  fp.close()

20171019添加测试集的一个简单方法:

#添加测试集
def addtestsuit(parameters):
  string = ""
  temp = Template('''\n  suite.addTest(${className}("test_${testcase}"))
''')
  l = len(parameters[2])
  for i in range(0,l):
    testcase1 = parameters[2][i]['testcase']
    string2 = temp.substitute(className = parameters[0],testcase = testcase1)
    string=string+string2
    print string
  return string

以上这篇对python自动生成接口测试的示例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python是编译运行的验证方法
Jan 30 Python
python使用Image处理图片常用技巧分析
Jun 01 Python
python实现机械分词之逆向最大匹配算法代码示例
Dec 13 Python
Anaconda入门使用总结
Apr 05 Python
python opencv实现旋转矩形框裁减功能
Jul 25 Python
Python的iOS自动化打包实例代码
Nov 22 Python
django项目登录中使用图片验证码的实现方法
Aug 15 Python
Python 读取 YUV(NV12) 视频文件实例
Dec 09 Python
Python建造者模式案例运行原理解析
Jun 29 Python
python logging模块的使用
Sep 07 Python
pytorch通过训练结果的复现设置随机种子
Jun 01 Python
Python实现为PDF去除水印的示例代码
Apr 03 Python
在unittest中使用 logging 模块记录测试数据的方法
Nov 30 #Python
浅谈python在提示符下使用open打开文件失败的原因及解决方法
Nov 30 #Python
python2与python3的print及字符串格式化小结
Nov 30 #Python
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
Nov 30 #Python
Python3 jupyter notebook 服务器搭建过程
Nov 30 #Python
解决Python2.7中IDLE启动没有反应的问题
Nov 30 #Python
python实现停车管理系统
Nov 30 #Python
You might like
用mysql内存表来代替php session的类
2009/02/01 PHP
php几个预定义变量$_SERVER用法小结
2014/11/07 PHP
php实现算术验证码功能
2018/12/05 PHP
JS 图片缩放效果代码
2010/06/09 Javascript
基于jquery的3d效果实现代码
2011/03/23 Javascript
JQuery动态创建DOM、表单元素的实现代码
2011/08/09 Javascript
JavaScript表单验证开发
2016/11/23 Javascript
Asp.Net之JS生成分页条的方法
2016/11/23 Javascript
原生Javascript插件开发实践
2017/01/09 Javascript
关于vue.js过渡css类名的理解(推荐)
2017/04/10 Javascript
vue组件jsx语法的具体使用
2018/05/21 Javascript
彻底弄懂 JavaScript 执行机制
2018/10/23 Javascript
JavaScript时间与时间戳的转换操作实例分析
2018/12/07 Javascript
nodejs中内置模块fs,path常见的用法说明
2020/11/07 NodeJs
微信小程序实现自定义底部导航
2020/11/18 Javascript
[02:05]2014DOTA2国际邀请赛 BBC外卡赛赛后总结
2014/07/09 DOTA
Python正则抓取网易新闻的方法示例
2017/04/21 Python
使用python实现快速搭建简易的FTP服务器
2018/09/12 Python
解决pyttsx3无法封装的问题
2018/12/24 Python
python使用writerows写csv文件产生多余空行的处理方法
2019/08/01 Python
Keras:Unet网络实现多类语义分割方式
2020/06/11 Python
python实现数学模型(插值、拟合和微分方程)
2020/11/13 Python
挪威太阳镜和眼镜网上商城:SmartBuyGlasses挪威
2016/08/20 全球购物
苏宁红孩子母婴商城:redbaby
2017/02/12 全球购物
Roxy荷兰官方网站:冲浪、滑雪板、服装和配件
2019/10/22 全球购物
应用电子专业学生的自我评价
2013/10/16 职场文书
仓库管理专业个人自我评价范文
2013/11/11 职场文书
幼儿园新学期寄语
2014/01/18 职场文书
生日宴会策划方案
2014/06/03 职场文书
中国梦口号
2014/06/13 职场文书
2014年民主评议党员个人总结
2014/09/24 职场文书
交通事故一次性赔偿协议书范本
2014/11/02 职场文书
MySQL锁机制
2021/04/05 MySQL
Python基于Opencv识别两张相似图片
2021/04/25 Python
Pandas数据类型之category的用法
2021/06/28 Python
根德5570型九灯四波段立体声收音机是电子管收音机的楷模 ? 再论5570
2022/04/05 无线电