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

news2024/11/23 20:02:36

在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%无套路免费领取】

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GPT-4 变懒了?官方回复

你是否注意到,最近使用 ChatGPT 的时候,当你向它提出一些问题,却得到的回应似乎变得简短而敷衍了?对于这一现象,ChatGPT 官方给出了回应。 译文:我们听到了你们所有关于 GPT4 变得更懒的反馈!我…

记录 | vscode设置自动换行

右上菜单栏 -> 查看 -> 打开自动换行 或者还有种方式,如下, 左下角小齿轮,点击设置 然后输入 Editor: Word Wrap ,把开关打开为 on

web前端开发html/css练习

目标图&#xff1a; 素材&#xff1a; 代码&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"…

【ET8】2.ET8入门-ET框架解析

菜单栏相关&#xff1a;ENABLE_DLL选项 ET->ChangeDefine->ADD_ENABLE_DLL/REMOVE_ENABLE_DLL 一般在开发阶段使用Editor时需要关闭ENABLE_DLL选项。该选项关闭时&#xff0c;修改脚本之后&#xff0c;会直接重新编译所有的代码&#xff0c;Editor在运行时会直接使用最…

【Vue3+Ts项目】硅谷甄选 — 路由配置+登录模块+layout组件+路由鉴权

一、路由配置 项目一共需要4个一级路由&#xff1a;登录&#xff08;login&#xff09;、主页&#xff08;home&#xff09;、404、任意路由&#xff08;重定向到404&#xff09;。 1.1 安装路由插件 pnpm install vue-router 1.2 创建路由组件 在src目录下新建views文件…

STM32F1之CAN介绍

目录 ​编辑 1. CAN 是什么&#xff1f; 2. 总线拓扑图 3. CAN 的特点 4. CAN 协议的基本概念 1. CAN 是什么&#xff1f; CAN 是 Controller Area Network 的缩写&#xff08;以下称为 CAN&#xff09;&#xff0c;是 ISO*1 国际标准化的串行通信协议。 在当前的汽车产…

FPGA时序分析与约束(0)——目录与传送门

一、简介 关于时序分析和约束的学习似乎是学习FPGA的一道分水岭&#xff0c;似乎只有理解了时序约束才能算是真正入门了FPGA&#xff0c;对于FPGA从业者或者未来想要从事FPGA开发的工程师来说&#xff0c;时序约束可以说是一道躲不过去的坎&#xff0c;所以这个系列我们会详细介…

vertica主键列能插入重复值的处理办法

问题描述 开发同事反馈在vertica中创建含主键列的表中插入重复数据时没有进行校验&#xff0c;插入重复值成功。经过测试着实可以插入重复值&#xff0c;这个坑有些不一样。 创建表和插入语句如下&#xff1a; --创建表 CREATE TABLE dhhtest(ID VARCHAR(64) PRIMARY KEY );…

2024年度AI投资策略报告:AI三要素共振,AIGC云到端加速推进

今天分享的AI系列深度研究报告&#xff1a;《2024年度AI投资策略报告&#xff1a;AI三要素共振&#xff0c;AIGC云到端加速推进》。 &#xff08;报告出品方&#xff1a;中国银河证券研究院&#xff09; 报告共计&#xff1a;103页 核心观点:行业热度将持续&#xff0c;积极把…

Git版本控制---入门学习

1.简介 是一个免费的开源分布式版本控制系统工具&#xff0c;旨在快速高效地处理从小型到大型的所有项目。 它是由 Linus Torvalds 在2005年创建的&#xff0c;用于开发 Linux 内核。 Git具有大多数团队和开发人员所需的功能、性能、安全性和灵活性。 它还用作重要的分布式版本…

深度学习——第3章 Python程序设计语言(3.8 深度学习框架PyTorch)

3.8 深度学习框架PyTorch 目录 1. PyTorch简介 2. PyTorch的安装 3. PyTorch相关资源 4. 张量 5. 自动求导 6. 并行计算简介 7. AI硬件加速设备 PyTorch简介 PyTorch是由Meta AI(Facebook)人工智能研究小组开发的一种基于Lua编写的Torch库的Python实现的深度学习库&…

Gemini 能够拯救的谷歌吗?

没有人会记住第二个登上月球的人&#xff0c;除了他自己。 谷歌现在处于尴尬的地位&#xff0c;在 2022 年之前&#xff0c;他以 Chrome Google 搜索确立搜索领域绝对霸主之位&#xff0c;全球市场份额高达 90% 之多&#xff0c;FireFox、Opera 等等浏览器都难以匹敌。而随着 …

枚举 LeetCode2048. 下一个更大的数值平衡数

如果整数 x 满足&#xff1a;对于每个数位 d &#xff0c;这个数位 恰好 在 x 中出现 d 次。那么整数 x 就是一个 数值平衡数 。 给你一个整数 n &#xff0c;请你返回 严格大于 n 的 最小数值平衡数 。 如果n的位数是k&#xff0c;n它的下一个大的平衡数一定不会超过 k1个k1…

JS中的模糊查询功能

什么是模糊查询 模糊查询是指可以在不明确指定查询条件的情况下&#xff0c;自动查找与指定字符串相似的内容。例如&#xff0c;我们在搜索引擎中输入关键字时&#xff0c;就会出现相关的搜索结果&#xff0c;这就是利用了模糊查询功能。 在JS中&#xff0c;我们可以利用一些…

Python:核心知识点整理大全9-笔记

目录 ​编辑 5.2.4 比较数字 5.2.5 检查多个条件 1. 使用and检查多个条件 2. 使用or检查多个条件 5.2.6 检查特定值是否包含在列表中 5.2.7 检查特定值是否不包含在列表中 banned_users.py 5.2.8 布尔表达式 5.3 if 语句 5.3.1 简单的 if 语句 5.3.2 if-else 语句 …

中间件系列 - Redis入门到实战(基础篇)

前言 1.学习视频&#xff1a; 黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 2. 本内容仅用于个人学习笔记&#xff0c;如有侵扰&#xff0c;联系删除 3. 本章学习目标&#xff1a; 初始Redis 认识NoSQL认识Redi…

SpringCloud Gateway

目录 一、gateway简介二、gateway快速入门2.1 引入依赖2.2 编写启动类2.3 编写基础配置和路由规则 三、断言工厂四、过滤器工厂4.1 路由过滤器的种类4.2 请求头过滤器4.3 默认过滤器 五、全局过滤器5.1 全局过滤器作用5.2 自定义全局过滤器5.3 过滤器执行顺序 六、跨域问题6.1 …

超越极限!如何进行高效分布式性能测试,让Jmeter揭示并发下系统的真正实力

一、为什么要进行分布式性能测试 当进行高并发性能测试的时候&#xff0c;受限于Jmeter工具本身和电脑硬件的原因&#xff0c;无法满足我们对大并发性能测试的要求。 基于这种场景下&#xff0c;我们就需要采用分布式的方式来实现我们高并发的性能测试要求。 二、分布式性能测…

短视频ai剪辑分发矩阵系统源码3年技术团队开发搭建打磨

如果您需要搭建这样的系统&#xff0c;建议您寻求专业的技术支持&#xff0c;以确保系统的稳定性和安全性。 在搭建短视频AI剪辑分发矩阵系统时&#xff0c;您需要考虑以下几个方面&#xff1a; 1. 技术实现&#xff1a;您需要选择适合您的需求和预算的技术栈&#xff0c;例如使…

调用win32 api获取电脑名字和系统目录

学习一下几个函数的功能&#xff0c;和调用方式&#xff1b; void CBasenameView::OnDraw(CDC* pDC) {CBasenameDoc* pDoc GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCString str1;TCHAR myname1[50], myname2[50], mydirname1[50], myd…