对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根据文件大小打log日志
Oct 09 Python
Python实现拷贝多个文件到同一目录的方法
Sep 19 Python
详解Python3操作Mongodb简明易懂教程
May 25 Python
关于Python中浮点数精度处理的技巧总结
Aug 10 Python
Python网络爬虫与信息提取(实例讲解)
Aug 29 Python
python 实现数组list 添加、修改、删除的方法
Apr 04 Python
Python双向循环链表实现方法分析
Jul 30 Python
Python多线程应用于自动化测试操作示例
Dec 06 Python
Python3中列表list合并的四种方法
Apr 19 Python
python实现nao机器人手臂动作控制
Apr 29 Python
Python实现七个基本算法的实例代码
Oct 08 Python
Pytorch distributed 多卡并行载入模型操作
Jun 05 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
php横向重复区域显示二法
2008/09/25 PHP
兼容性最强的PHP生成缩略图的函数代码(修改版)
2011/01/18 PHP
PHP OPP机制和模式简介(抽象类、接口和契约式编程)
2014/06/09 PHP
PHP基于自定义类随机生成姓名的方法示例
2017/08/05 PHP
PHP使用Session实现上传进度功能详解
2019/08/06 PHP
指定js可访问其它域名的cookie的方法
2007/09/18 Javascript
jQuery操作select的实例代码
2012/06/14 Javascript
JavaScript仿商城实现图片广告轮播实例代码
2016/02/06 Javascript
15个值得开发人员关注的jQuery开发技巧和心得总结【经典收藏】
2016/05/25 Javascript
值得收藏的vuejs安装教程
2017/11/21 Javascript
Angular开发实践之服务端渲染
2018/03/29 Javascript
React实现评论的添加和删除
2020/10/20 Javascript
详解vite+ts快速搭建vue3项目以及介绍相关特性
2021/02/25 Vue.js
[05:04]DOTA2上海特级锦标赛主赛事第二日TOP10
2016/03/04 DOTA
Python中使用dom模块生成XML文件示例
2015/04/05 Python
python简单商城购物车实例代码
2018/03/15 Python
深入解析python中的实例方法、类方法和静态方法
2019/03/11 Python
Python检查 云备份进程是否正常运行代码实例
2019/08/22 Python
tensorflow 实现自定义梯度反向传播代码
2020/02/10 Python
Python编程快速上手——PDF文件操作案例分析
2020/02/28 Python
python爬虫基础知识点整理
2020/06/02 Python
详解Python IO编程
2020/07/24 Python
详解canvas绘图时遇到的跨域问题
2018/03/22 HTML / CSS
Notino匈牙利:购买香水和化妆品
2019/04/12 全球购物
Sisley法国希思黎美国官方网站:享誉全球的奢华植物美容品牌
2020/06/27 全球购物
统计每一学生的平均成绩
2014/06/06 面试题
给海归自荐信的建议
2013/12/13 职场文书
小学庆六一活动总结
2014/08/28 职场文书
卫生院艾滋病宣传活动总结
2015/05/09 职场文书
小学教师读书笔记
2015/07/01 职场文书
少先队中队工作总结
2015/08/14 职场文书
php TP5框架生成二维码链接
2021/04/01 PHP
SqlServer: 如何更改表的文件组?(进而改变存储位置)
2021/04/05 SQL Server
解决Jenkins集成SonarQube遇到的报错问题
2021/07/15 Java/Android
深入解析MySQL索引数据结构
2021/10/16 MySQL
node快速搭建后台的实现步骤
2022/02/18 NodeJs