python+requests接口自动化测试实战

环境说明:

1.WIN 7, 64位
2.Python3.4.3 (pip-8.1.2)
3.Requests —>pip install requests
4.Unittest —>unittest 框架是python自带的单元测试框架,python2.1及其以后的版本已将unittest作为一个标准块放入python开发包中,所以unittest不用单独安装。
5.测试报告利用HTMLTestRunner生成。

测试思路:

1、先把每个http接口一个一个写脚本测试。(提交的json串直接放在data字典中,这里没有用到excel等写测试用例,测试用例直接用脚本实现。)
2、写完所有接口的测试脚本后,由于一个接口有好几个测试用例,所有要把同一个接口的py脚本封装成方法,每一个接口封装成一个接口类。
3、用testsuite直接调用这些接口类,构造测试集;或利用unittest自动识别测试用例,TestLoader类中提供的discover()方法。
(命名规则:接口名称要以test_XXX开头)
就好把所有的接口测试用例连起来构建自动化测试了。
4、最后利用HTMLTestRunner生成测试报告。

 
  1. PUT:上传指定的URL,一般是修改,可以理解为数据库中的update。

  2. DELETE:删除指定资源。

  3. 在接口测试中,一般来说,post创建数据,get获取创建成功后的所有数据和指定的数据,put可以对创建成功后的数据

  4. 进行修改,delete是指定的资源。

目录结构:

 
  1. ​现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。

  2. 如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受

  3. 可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛

  4. 分享他们的经验,还会分享很多直播讲座和技术沙龙

  5. 可以免费学习!划重点!开源的!!!

  6. qq群号:680748947【暗号:csdn11】

单个接口测试例子:

post(修改)

 
  1. import requests

  2. import json

  3. def get_token():

  4. url1 = "https://**********/Token/get"

  5. content = {'appId':'***','appSecret':'******'}

  6. web = requests.get(url=url1,params=content)

  7. print(web.url)

  8. print(web.text)

  9. ty = web.text

  10. a = json.loads(ty)

  11. b = a.get('Data')

  12. apptoken = b.get('Token')

  13. return apptoken

  14. if __name__ == '__main__':

  15. get_token()

get(查询)

 
  1. import requests

  2. import json

  3. def test_qualification_add():

  4. url = "http://xxx.xxx.xxx/audit/api/xxx/get" #测试的接口url

  5. headers = {"Content-Type":"application/json"}

  6. data = { #接口传送的参数

  7. "token": "abcdefg",

  8. "id": 1,

  9. "param": {

  10. "QuId":1

  11. }

  12. }

  13. r = requests.post(url = url,json = data,headers = headers) #发送请求

  14. #return r.json

  15. print (r.text) #获取响应报文

  16. print (r.status_code)

  17. if __name__=="__main__":

  18. test_qualification_add()

requests.post和requests.request两种写法,都可以实现请求。

在进行接口测试的过程中对传入的参数进行边界值测试、错误推导测试、等价类测试等测试方法进行测试。那么一个接口就要设很多测试用例。

下面是封装为接口类的例子:
(一个接口地址一个类,每一个方法是一条测试用例)
(setUp()、tearDown()方法会分别作用于每个测试用例的开始和结束,如果每个类中的setUp()、tearDown(),所做的事情一样,那么可以封装一个自己的测试类,如代码:)

 
  1. import requests

  2. import json

  3. import unittest

  4. class MyTest(unittest.TestCase): #封装测试环境的初始化和还原的类

  5. def setUp(self): #放对数据可操作的代码,如对mysql、momgodb的初始化等,这里不对数据库进行操作!

  6. print("start test")

  7. pass

  8. def tearDown(self): #与setUp()相对

  9. print("end test")

  10. pass

  11. class test_xxx_get(MyTest): #把这个接口封装一个类,下面的方法是具体的测试用例

  12. '''接口名称:获取资质''' #这个描述接口名称

  13. def test_xxx_get(self):

  14. '''测试用例1:哈哈''' #这个描述接口用例名称

  15. self.url = "http://xxx.xxx.xxx/audit/api/xxx/get" #请求url

  16. self.headers = {"Content-Type":"application/json"}

  17. self.data = { #请求参数

  18. "token": "abcdefg",

  19. "id": 1,

  20. "param": {

  21. "QuId": 14

  22. }

  23. } #self.用在方法属性中,表示是该方法的属性,不会影响其他方法的属性。

  24. r = requests.post(url = self.url,json = self.data,headers = self.headers)

  25. #return r.json()

  26. print (self.r.text)

  27. print (self.r.status_code)

  28. self.assertIn("true",self.r.text) #断言判断接口返回是否符合要求,可以写多个断言!

  29. if __name__=="__main__":

  30. unittest.main()

unittest提供了全局的main()方法,使用它可以方便的将一个单元测试木块变成可以直接运行的测试脚本;
main()方法使用TestLoader类来搜索所有包含在该木块中以“test”命名开头的测试方法,并自动执行它;

执行方法的默认顺序是:根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。所以以A开头的测试用例方法会优先执行,以a开头会后执行。
所以每一个接口类、测试用例要以test*命名,如下图:
(测试用例放在同一个文件夹:)

runtest.py写法:

 
  1. import unittest

  2. import json

  3. import requests

  4. from HTMLTestRunner import HTMLTestRunner

  5. import time

  6. #加载测试文件 (有几多个接口就加载几多个,一个一个加进来)

  7. import test_creative_add

  8. import test_creative_get

  9. import test_qualification_add

  10. import test_qualification_get

  11. import test_qualification_reflesh

  12. #构造测试集

  13. suite = unittest.TestSuite() #实例化

  14. #TestSuite类的addTest()方法把不同测试类中的测试方法组装到测试套件中。

  15. #增加测试用例==》接口文件名.接口类(方法也就是这个接口的其他用例),要把每一个测试用例都增加进来!!!

  16. suite.addTest(test_creative_add.test_creative_add("test_creative_add")) #增加创意

  17. suite.addTest(test_creative_get.test_creative_get("test_creative_get")) #获取创意

  18. suite.addTest(test_qualification_add.test_qualification_add("test_qualification_add"))#增加资质

  19. suite.addTest(test_qualification_get.test_qualification_get("test_qualification_get"))#获取资质

  20. suite.addTest(test_qualification_reflesh.test_qualification_reflesh("test_qualification_reflesh"))#更新资质

  21. if __name__=="__main__":

  22. testunit = unittest.TestSuite()

  23. testunit.addTest(suite)

  24. #按照一定的格式获取当前的时间

  25. now = time.strftime("%Y-%m-%d %H_%M_%S")

  26. #定义报告存放路径

  27. filename = './' + now + 'test_result.html'

  28. fp = open(filename,"wb")

  29. #定义测试报告

  30. runner = HTMLTestRunner(stream = fp,

  31. title = "xxx接口测试报告",

  32. description = "测试用例执行情况:")

  33. #运行测试

  34. runner.run(testunit)

  35. fp.close() #关闭文件对象把数据写进磁盘

如果有几百条测试用例,在runtest脚本中一个个增加测试用例,那么就很麻烦啦,其实用discover()一步就搞掂了。
discover函数介绍:
discover(start_dir,pattern=’test.py’,top_level_dir=None)
找到指定目录下所有测试模块,并可递归查到子目录下的测试木块,只有匹配到的文件名才会被加载。如果启动的不是顶层目录,那么顶层目录必然单独指定。
start_dir:要测试的木块名或测试用例的目录。
pattent=‘test.py’:表示用例文件名的匹配原则。此处匹配文件名一test开头的所有.py类型文件,表示任意多个字符。
top_level_dir=None :测试木块的顶层目录,如果没有顶层目录,默认为None。
这里测试用例都放在同一个目录,都以test.py的形式!!(如上图)

runtest2.py写法:

 
  1. import unittest

  2. import json

  3. import requests

  4. from HTMLTestRunner import HTMLTestRunner

  5. import time

  6. #定义测试用例的目录为当前目录

  7. test_dir = './'

  8. discover = unittest.defaultTestLoader.discover(test_dir,pattern = 'test*.py')

  9. if __name__=="__main__":

  10. #按照一定的格式获取当前的时间

  11. now = time.strftime("%Y-%m-%d %H-%M-%S")

  12. #定义报告存放路径

  13. filename = './' + now + 'test_result.html'

  14. fp = open(filename,"wb")

  15. #定义测试报告

  16. runner = HTMLTestRunner(stream = fp,

  17. title = "xxx接口测试报告",

  18. description = "测试用例执行情况:")

  19. #运行测试

  20. runner.run(discover)

  21. fp.close() #关闭报告文件

整合自动化测试发送测试报告:

runtest_mail.py

 
  1. import unittest

  2. import requests

  3. from HTMLTestRunner import HTMLTestRunner

  4. import time

  5. import os

  6. import smtplib

  7. from email.mime.text import MIMEText

  8. from email.header import Header

  9. #======定义发送邮件========

  10. def send_mail(file_new):

  11. f = open(file_new,'rb')

  12. mail_body = f.read()

  13. f.close()

  14. msg = MIMEText(mail_body,'html','utf-8')

  15. msg['Subject'] = Header('xxx接口自动化测试报告','utf-8')

  16. smtp = smtplib.SMTP()

  17. smtp.connect('smtp.sina.com')

  18. smtp.login('xxx@sina.com','xxx336..')

  19. smtp.sendmail('xxx@sina.com','10xxx6@qq.com',msg.as_string())

  20. smtp.quit()

  21. print('邮件已发出!注意查收。')

  22. #======查找测试目录,找到最新生成的测试报告======

  23. def new_report(test_report):

  24. lists = os.listdir(test_report)

  25. lists.sort(key=lambda fn:os.path.getmtime(test_report + '\\' + fn))

  26. file_new = os.path.join(test_report,lists[-1])

  27. print(file_new)

  28. return file_new

  29. if __name__ == "__main__":

  30. test_dir = "D:\\dsp_testpro\\test_case"

  31. test_report = "D:\\dsp_testpro\\test_report"

  32. discover = unittest.defaultTestLoader.discover(test_dir,

  33. pattern = 'test*.py')

  34. #按照一定的格式获取当前的时间

  35. now = time.strftime("%Y-%m-%d_%H-%M-%S-")

  36. #定义报告存放路径

  37. filename = test_report + "\\" + now + 'result.html'

  38. fp = open(filename,'wb')

  39. #定义测试报告

  40. runner = HTMLTestRunner(stream = fp,

  41. title = "xxx接口测试报告",

  42. description = "测试用例执行情况:")

  43. #运行测试

  44. runner.run(discover)

  45. fp.close() #关闭报告文件

  46. new_report = new_report(test_report)

  47. send_mail(new_report)

邮件如下:

 

 

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

  1. 文档获取方式:

  2. 加入我的软件测试交流群:680748947免费获取~(同行大佬一起学术交流,每晚都有大佬直播分享技术知识点)

这份文档,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

以上均可以分享,只需要你搜索vx公众号:程序员雨果,即可免费领取

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

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

相关文章

【GPT概念-03】:人工智能中的注意力机制

说明 注意力机制生成分数(通常使用输入函数),确定对每个数据部分的关注程度。这些分数用于创建输入的加权总和,该总和馈送到下一个网络层。这允许模型捕获数据中的上下文和关系,而传统的固定序列处理方法可能会遗漏这…

LeetCode:2617. 网格图中最少访问的格子数(优先级队列 Java)

目录 2617. 网格图中最少访问的格子数 题目描述: 实现代码与解析: 优先级队列 原理思路: 2617. 网格图中最少访问的格子数 题目描述: 给你一个下标从 0 开始的 m x n 整数矩阵 grid 。你一开始的位置在 左上角 格子 (0, 0) 。…

C语言数据结构基础————二叉树学习笔记(四)简单的OJ题目练习

1.单值二叉树 965. 单值二叉树 - 力扣(LeetCode) 建立一个新的函数,用函数传参的方法来记录val的值 如上一篇最后的对称二叉树的习题,建立新的函数来传参 多采用使用反对值的方法,因为如果是相等return true的话&am…

芯片公司SAP管理架构:科技与管理的完美融合

在当今日新月异的科技时代,芯片公司作为信息技术领域的核心力量,其运营管理的复杂性日益凸显。SAP管理架构作为一种高效的企业资源规划系统,为芯片公司提供了强大的管理支持。本文将为您科普芯片公司SAP管理架构的相关知识。 SAP管理架构是一…

leetcode每日一题1969

目录 一.题目原型: 二思路解析: 三.代码实现: 一.题目原型: 二思路解析: 灵神的做法非常让人惊叹: 理解就是,如果一个数大于另一个数要交换的1的权重,那么他们的乘积就变小。 那么一个大的数…

React 中的懒加载(Lazy Load)

React 中的懒加载(Lazy Load) 在大型的 React 应用中,为了提高页面加载速度和性能,我们经常会使用懒加载技术来延迟加载组件或资源。懒加载可以将页面初始加载的内容减少到最小,只在需要时再动态加载额外的组件或资源…

js实现hash路由原理

一、简单的上下布局&#xff0c;点击左侧导航&#xff0c;中间内容跟对变化&#xff0c;主要技术使用js检测路由的onhashchange事件 效果图 二、话不多说&#xff0c;直接上代码 <!DOCTYPE html> <html lang"zh"><head><meta charset"…

Wireshark 抓包工具与长ping工具pinginfoview使用,安装包

一、Wireshark使用 打开软件&#xff0c;选择以太网 1、时间设置时间显示格式 这个时间戳不易直观&#xff0c;我们修改 2、抓包使用的命令 1&#xff09;IP地址过滤 ip.addr192.168.1.114 //筛选出源IP或者目的IP地址是192.168.1.114的全部数据包。 ip.sr…

Win10中IIS服务如何部署c#服务

1、将项目打包发布 注意发布位置 2、打开搜索搜索计算机管理 3、点击服务和应用程序 4、点击internet information service 5、点击网站再点击添加网站 6、添加网站名称:opm 添加网站路径(即刚才发布路径) 输入ip地址:自己电脑ip 配置端口号5052 最后点击确认 7、…

vue3中如何实现多个侦听器(watch)

<body> <div id"app"><input type"button" value"更改名字" click"change"> </div> <script src"vue.js"></script> <script>new Vue({el: #app,data: {food: {id: 1,name: 冰激…

类型双关联合体(C++基础)

类型双关 类型双关就是在同样的一个内存中&#xff0c;存储的数据可以用做不同类型的表述。用在底层性能优化的时候&#xff0c;一般使用的时候要非常小心&#xff0c;因为不当的使用可能导致程序的不稳定和不可预测的行为。 int a 5;//double value (double)a;double value…

卷王的自述,我为什么这么卷?

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 前段时间去面试了一个公司&#xff0c;成功拿到了offer&#xf…

2024年3月22蚂蚁新村今日答案:以下哪一项是陕西省的非遗美食?

2024年3月22日蚂蚁新村今日问题的正确答案如下&#xff1a; 问题&#xff1a;以下哪一项是陕西省的非遗美食&#xff1f; 选项&#xff1a;驴肉火烧 水盆羊肉 答案&#xff1a;水盆羊肉 解析&#xff1a;水盆羊肉是陕西省的非遗美食。水盆羊肉是陕西省的一道传统著名饭食&a…

2024年Jira全面解析:从 Jira 的概念到优缺点、最新政策

Jira是澳大利亚的Atlassian公司开发的一款项目管理软件&#xff0c;名字来源于日文中“哥斯拉”的称呼“Gojira”。Jira不仅可以追踪缺陷和问题&#xff0c;还能管理项目。很多企业还将JIRA用于一些特殊的场景&#xff0c;比如作为仓库自动化工具、管理文档流程、优化费用等等。…

NCCL 简介

文章目录 前言1. NCCL简介2. 如何使用NCCL 前言 NCCL 源码解析总目录 简单写几个重点。 如有问题&#xff0c;请留言指正。 1. NCCL简介 NCCL主要用来集体通信的&#xff0c;提高多个CUDA设备的通信效率 发展&#xff0c;2.X 主要支持多个节点 NCCL中使用的通信总线…

最快的 Python API 框架之一:简单、现代、高性能 | 开源日报 No.207

tiangolo/fastapi Stars: 68.1k License: MIT fastapi 是一个现代、高性能、易学习、快速编码且适用于生产环境的框架。 其主要功能和核心优势包括&#xff1a; 高性能&#xff1a;与 NodeJS 和 Go 相当&#xff0c;是最快的 Python 框架之一。编码速度快&#xff1a;开发特性…

【CVTE 一面凉经Ⅰ】循环依赖如何解决

目录 一.&#x1f981; 开始前的废话二. &#x1f981; 什么是循环依赖&#xff1f;三. &#x1f981;Spring 容器解决循环依赖的原理是什么?五. &#x1f981; 三级缓存解决循环依赖的原理六. &#x1f981; 由有参构造方法注入属性的循环依赖如何解决&#xff1f;七.&#x…

微前端架构

介绍 微前端的概念是由ThoughtWorks在2016年提出的&#xff0c;它借鉴了微服务的架构理念&#xff0c;核心在于将一个庞大的前端应用拆分成多个独立灵活的小型应用&#xff0c;每个应用都可以独立开发、独立运行、独立部署&#xff0c;再将这些小型应用融合为一个完整的应用&am…

当内外网的域名相同时,如何在外网解析同域名的网址

当内部网络和外部网络存在相同的域名&#xff0c;并且希望内部用户通过内部DNS服务器解析到外部网络上的该域名对应的公网IP地址时&#xff0c;需要在内部DNS服务器上采取一些特殊配置策略来实现这一目标。以下是一种通用的解决方案&#xff1a; 条件转发&#xff08;Condition…

鸿蒙一次开发,多端部署(四)工程管理

DevEco Studio的基本使用&#xff0c;请参考DevEco Studio使用指南。本章主要介绍如何使用DevEco Studio进行多设备应用开发。 说明&#xff1a; 本章的内容基于DevEco Studio 3.1.1 Release版本进行介绍&#xff0c;如您使用DevEco Studio其它版本&#xff0c;可能存在文档与产…
最新文章