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

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

代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

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()

然后测试用例部分如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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"}

        ]

      ]

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

#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添加测试集的一个简单方法:

1

2

3

4

5

6

7

8

9

10

11

12

#添加测试集

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

​现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/231329.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WordPress限制搜索关键词实现搜索黑名单

昨天有位站长问我能不能限制WordPress的搜索关键词,因为有人利用他的网站搜索色情词汇,本来正常搜索没有影响的,但是在部分网站中,搜索关键词产生的搜索页会被搜索引擎收录,实现推广功能。 WordPress的关键词搜索限制实…

谈谈对OOA、OOD、OOP理解

1 前言 按照开发阶段排序,有如下排序: OOA阶段:面向对象分析,此阶段领域建模,需求分析。OOD阶段:面向对象设计,此阶段输出系统概要设计、系统详细设计。OOP阶段:面向对象编程&#…

原码、反码、补码、大端、小端

原码、反码、补码 计算机中的整数有三种2进制表示方法,即原码、反码和补码。 三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”, 而数值位: 正数的原、反、补码都相同。负整数的三种表…

【PHP】php发送邮箱验证码格式美化,样式美化

效果展示&#xff1a; 格式美化前 格式美化后 代码 大多数框架都自带有封装好的发送email方法&#xff0c;就不多赘述&#xff0c;主要写格式&#xff1a; <? php// 验证码过期时间 $expire 120; // 发件人邮箱 $from_email xx163.com; // 收件人 $to_email to163.com…

2、关于使用ajax验证绕过(实例2)

ajax原理我上一篇有写过&#xff0c;参考&#xff1a;1、关于前端js-ajax绕过-CSDN博客 一、实例环境&#xff1a; 为手机上的某一割韭菜app 二、目的&#xff1a; 实现绕过手机验证码&#xff0c;找回密码 三、工具&#xff1a; bp代理 四、验证步骤如下&#xff1a; …

医学影像PACS信息化数字平台源码

PACS系统对医院影像科意义重大&#xff0c;将业务量巨大的影像检验流程依托于信息化技术&#xff0c;对于进行信息化建设的医院而言&#xff0c;是十分必要的。 PACS系统源码&#xff0c;集成三维影像后处理功能&#xff0c;包括三维多平面重建、三维容积重建、三维表面重建、三…

【链表Linked List】力扣-83 删除排序链表中的重复元素

目录 题目描述 解题过程 题目描述 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2]示例 2&#xff1a; 输入&#xff1…

输入框的透明度影响placeholder的透明度怎么解决

有一个需求是需要写如上图所示的输入框。 首先想到的是调整输入的透明度 <div class"inputDiv"><img src"./images/search.png" /><input type"text" class"myInput" placeholder"请输入标题关键字"/> &…

LeetCode 1457. 二叉树中的伪回文路径||位运算 DFS

1457. 二叉树中的伪回文路径 给你一棵二叉树&#xff0c;每个节点的值为 1 到 9 。我们称二叉树中的一条路径是 「伪回文」的&#xff0c;当它满足&#xff1a;路径经过的所有节点值的排列中&#xff0c;存在一个回文序列。 请你返回从根到叶子节点的所有路径中 伪回文 路径的…

Vue:Vue的开发者工具不显示Vue实例中的data数据

一、情况描述 代码&#xff1a; 页面&#xff1a; 可以看到&#xff0c;input获取到了data数据&#xff0c;但是&#xff0c;vue-devtool没有获取到data数据 二、解决办法 解决办法1&#xff1a; data.name的值不能全是中文&#xff0c;比如改成aa尚硅谷 解决办法2&…

数据库系统概论期末经典大题讲解(范式提升、求闭包、求主码)

上一次我们介绍了数据库中关系代数查询&#xff0c;从选择、投影到连接等操作符&#xff0c;探索了数据库查询 大家可以移步我的文章&#xff1a;数据库系统概论期末经典大题讲解&#xff08;用关系代数进行查询&#xff09;-CSDN博客 今天&#xff0c;我们将继续沿着数据库系统…

ISNAS-DIP: Image-Specific Neural Architecture Search for Deep Image Prior

ISNAS-DIP&#xff1a;用于深度图像先验的图像特定神经架构搜索 论文链接&#xff1a;https://arxiv.org/abs/2111.15362v2 项目链接&#xff1a;https://github.com/ozgurkara99/ISNAS-DIP Abstract 最近的研究表明&#xff0c;卷积神经网络(CNN)架构在频谱上偏向较低频率&…

深入理解Os--调用劫持

1.调用劫持 以Linux系统为例&#xff0c;介绍三种可实现调用劫持的技术。 1.1.编译时调用劫持 以一个实例展开介绍 (1).main.cpp #include <stdio.h> #include <malloc.h> int main() {int* p (int*)malloc(32);free(p);return (0); }(2).mymalloc.cpp #inclu…

好代码资源网整站打包代码(包含了最新数据),集成了深度二开的ripro主题,非常适合做资源网站创业用

好代码资源网是基于wordpress开发的一个资源分享类网站&#xff0c;在开发者圈子里还算小有名气&#xff0c;这里分享婴整站打包代码&#xff08;包含了最新数据&#xff09;。网站本身集成了深度二开的ripro主题&#xff0c;非常适合做资源网站创业用。 资源下载类网站目前还…

使用条件格式突出显示单元格数据-sdk

使用条件格式突出显示单元格数据 2023 年 12 月 6 日 根据数据值将视觉提示应用于特定单元格、行或列&#xff0c;从而更轻松地识别模式和趋势。 网格中的条件格式允许用户根据单元格或范围包含的数据将视觉样式应用于单元格或范围。它通过以数据驱动的方式突出显示关键值、异常…

Servlet should have a mapping

第一种可能&#xff1a; 你就是没写Servlet <servlet><servlet-name>SpringMVC</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 配置springMVC需要加载的配置文件--><init-par…

【C语言】——函数递归,用递归简化并实现复杂问题

文章目录 前言一、什么是递归二、递归的限制条件三、递归举例1.求n的阶乘2. 举例2&#xff1a;顺序打印一个整数的每一位 四、递归的优劣总结 前言 不多废话了&#xff0c;直接开始。 一、什么是递归 递归是学习C语言函数绕不开的⼀个话题&#xff0c;那什么是递归呢&#xf…

gittee使用教学

一、git简介 Git是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效的处理任何大小项目的版本管理。 核心功能&#xff1a; 项目的版本管理 团队协同开发 二、准备工作 1、下载 Git 2、除了选择安装位置以外&#xff0c;其他都无脑安装 3、检查一下安装情况 win…

Qt 5.15.2 三维显示功能

Qt 5.15.2 三维显示功能 三维显示效果&#xff1a; .pro项目文件 QT core gui opengl 3dcore 3drender 3dinput 3dextrasgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You can make your code fail to compile if it uses deprecated APIs. # In ord…

【数据结构(九)】顺序存储二叉树(2)

文章目录 1. 相关概念2. 顺序存储二叉树的遍历 1. 相关概念 从数据存储来看&#xff0c;数组存储方式和树的存储方式可以相互转换&#xff0c;即数组可以转换成树&#xff0c;树也可以转换成数组&#xff0c;看右面的示意图。 转换原则:     1.上图的二叉树的结点&#xff…