Python+Requests实现接口自动化测试_discover = unittest

自动搜索项目根目录下的所有case,构造测试集;返回TestSuite对象

discover = unittest.defaultTestLoader.discover(test_dir, pattern=‘test_*.py’)

实例化TextTestRunner类

runner = unittest.TextTestRunner(verbosity=2)

now = time.strftime(‘%Y-%m-%d %H_%M_%S’) # 获取当前日期
result = test_dir+ ‘\result\’+now + ‘_result.html’ # 测试报告的完整路径
log = test_dir+‘\result\’+now+‘_log.txt’ #日志的完整路径

logging.basicConfig(filename=log,level=logging.INFO,format = ‘%(asctime)s - %(name)s - %(levelname)s - %(message)s’) #filename 日志文件路径 level 日志的级别 format 格式

fp = open(result, ‘wb’) # wb方式写入
runner = HTMLTestRunner(stream=fp, title=‘测试报告’, description=‘aguest_master项目用例执行情况’,verbosity=2) #构造runner

使用run()方法运行测试套件(即运行测试套件中的所有用例)

runner.run(discover)


**3.3 测试用例和lib库**


1) 由于总共只有5个接口,所以设计为5个代码文件,分别为:test\_add\_event,py,test\_add\_guest.py,test\_get\_event\_list.py,test\_get\_guest\_list.py,test\_user\_sign.py。


![](https://img-blog.csdnimg.cn/img_convert/ab8dc9ef3dec6fc207edf3c9f4f88584.png)


2)我们使用python的requests测试接口,这个库大名鼎鼎,而且官网还有中文。


官网网址:[http://docs.python-requests.org/zh\_CN/latest/]( )


3)每个代码文件都是一个接口,接口的url地址是固定的,所以设计成类属性,方便后续测试用例使用。


![](https://img-blog.csdnimg.cn/img_convert/11385fdc53686438c0f369faabc49f6b.png)


4)每个测试用例都写明代码逻辑,方便以后调试。  
 5)如果遇到经常调用的东西,如获取最新发布会ID,获取添加发布会body数据,都封装成库。  
 6)最后根据出参的状态码断言是否成功  
 7)使用[http://logging.info]( ) 记录每个测试用例的日志情况


![](https://img-blog.csdnimg.cn/img_convert/77ed44dd4f0d8b1fbe6d3e274f8949d2.png)


添加发布会接口代码文件:test\_add\_event.py



import requests
import unittest
import logging
import addEventDataTemplate
import getNewID
from urllib import parse #使用requests发送post请求,body的汉字会进行url编码,即%xx形式。想看到原始body,需要使用parse.unquote进入url解码
class Test_addEvent(unittest.TestCase):
‘’‘添加发布会接口’‘’
@classmethod
def setUpClass(cls):
cls.url=“http://127.0.0.1:8000/api/add_event/”
@classmethod
def tearDownClass(cls):
pass
def setUp(self):
pass
def tearDown(self):
pass
def test_00(self): #代码逻辑::获取当前最新发布会ID,设置入参,eid置空,发送post请求
‘’‘添加发布会-eid为空’‘’
id=getNewID.getNewID() #获取当前最新发布会ID
data=addEventDataTemplate.getEventData(id) #获取添加发布会的数据模板
data[‘eid’]=‘’ #eid为空,即参数错误
r=requests.post(self.url,data=data)
status=r.json()[‘status’]
self.assertEqual(10021,status)
logging.info(f"case:添加发布会,eid为空\n请求地址:{r.url}\t请求方式:{r.request.method}\n请求头:{r.request.headers}\n请求正文:{parse.unquote(r.request.body)}\n响应头:{r.headers}\n响应正文:{r.text}\n")

def test_01(self):    #代码逻辑::获取当前最新发布会ID,设置入参,发送post请求
    '''添加发布会-成功'''
    id = getNewID.getNewID()  # 获取当前最新发布会ID
    data = addEventDataTemplate.getEventData(id)#获取添加最新发布会的数据模板
    r=requests.post(self.url,data=data)
    status=r.json()['status']
    self.assertEqual(10000,status)
    logging.info(f"case:添加发布会,成功\n请求地址:{r.url}\t请求方式:{r.request.method}\n请求头:{r.request.headers}\n请求正文:{parse.unquote(r.request.body)}\n响应头:{r.headers}\n响应正文:{r.text}\n")

def test_02(self):   #代码逻辑::获取当前最新发布会ID,ID-1即为发布会已经存在的ID(发布会ID是递增加1)
    '''添加发布会-发布会ID已存在'''
    id = getNewID.getNewID()  # 获取当前最新发布会ID
    data=addEventDataTemplate.getEventData(id)#获取添加最新发布会的数据模板
    data['eid']=data['eid']-1  #最新模板ID减一即为重复ID
    r=requests.post(self.url,data=data)
    status = r.json()['status']
    self.assertEqual(10022, status)
    logging.info(f"case:添加发布会,发布会ID已存在\n请求地址:{r.url}\t请求方式:{r.request.method}\n请求头:{r.request.headers}\n请求正文:{parse.unquote(r.request.body)}\n响应头:{r.headers}\n响应正文:{r.text}\n")
def test_03(self):   #代码逻辑::先新增发布会,再获取最新发布会ID,设置入参的name为重复。
    '''添加发布会-发布会标题已存在'''
    #新增发布会
    id = getNewID.getNewID()  # 获取当前最新发布会ID
    r=requests.post(self.url,data=addEventDataTemplate.getEventData(id))  #先新增一个发布会

    id = getNewID.getNewID()  # 获取当前最新发布会ID
    data = addEventDataTemplate.getEventData(id)#获取添加最新发布会的数据模板
    data['name']=f'发布会测试标题{id}' #最新模板ID减一,标题即为重复
    r=requests.post(self.url,data=data)
    status = r.json()['status']
    self.assertEqual(10023,status)
    logging.info(f"case:添加发布会,发布会标题已存在\n请求地址:{r.url}\t请求方式:{r.request.method}\n请求头:{r.request.headers}\n请求正文:{parse.unquote(r.request.body)}\n响应头:{r.headers}\n响应正文:{r.text}\n")
def test_04(self):   #代码逻辑::获取最新发布会ID,设置入参,开始时间:改为-,再提交请求
    '''添加发布会-发布会时间错误'''
    id = getNewID.getNewID()  # 获取当前最新发布会ID
    data = addEventDataTemplate.getEventData(id)#获取添加最新发布会的数据模板
    data['start_time']=data['start_time'].replace(':','-')  #时间 : 改为 - ,即为时间错误
    r = requests.post(self.url, data=data)
    status = r.json()['status']
    self.assertEqual(10024,status)
    logging.info(f"case:添加发布会,发布会时间错误\n请求地址:{r.url}\t请求方式:{r.request.method}\n请求头:{r.request.headers}\n请求正文:{parse.unquote(r.request.body)}\n响应头:{r.headers}\n响应正文:{r.text}\n")

if name == ‘main’:
unittest.main(verbosity=2)
lib库 getNewID.py:

def getNewID():
‘’‘获取最新的(最大的)发布会编号id’‘’
import sqlite3
con=sqlite3.connect(r’D:\backup\guest2-master\db.sqlite3’)
cur=con.cursor()
cur.execute(“select max(id) from sign_event”)
new_id=cur.fetchone()
new_id=new_id[0]
cur.close()
con.close()
return new_id
lib库 addEventDataTemplate.py:

import datetime
def getEventData(id):
‘’‘添加发布会 body模板’‘’
startTime=(datetime.datetime.now()+datetime.timedelta(days=30)).strftime(“%Y-%m-%d %H:%M:00”) #获得当前时间,并往后30天为发布会时间

data={
      'eid':id+1,
      'name':f"发布会测试标题{id+1}",  #当前发布会编号加1
      'limit':100,    #默认值
      'status':1,    #默认值
      'address':'新街口金鹰',    #默认值
      'start_time':startTime  #%格式   Y-%m-%d %H:%M:00
    }
return data

由于篇幅的原因,其它的代码省略。


做了那么多年开发,自学了很多门编程语言,我很明白学习资源对于学一门新语言的重要性,这些年也收藏了不少的Python干货,对我来说这些东西确实已经用不到了,但对于准备自学Python的人来说,或许它就是一个宝藏,可以给你省去很多的时间和精力。



别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。

我先来介绍一下这些东西怎么用,文末抱走。

* * *



**(1)Python所有方向的学习路线(新版)**

这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。



最近我才对这些路线做了一下新的更新,知识体系更全面了。



![在这里插入图片描述](https://img-blog.csdnimg.cn/8fc093dcfa1f476694c574db1242c05b.png)



**(2)Python学习视频**



包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。



![在这里插入图片描述](https://img-blog.csdnimg.cn/d66e3ad5592f4cdcb197de0dc0438ec5.png#pic_center)



**(3)100多个练手项目**

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。



![在这里插入图片描述](https://img-blog.csdnimg.cn/f5aeb4050ab547cf90b1a028d1aacb1d.png#pic_center)



**(4)200多本电子书**  

  

这些年我也收藏了很多电子书,大概200多本,有时候带实体书不方便的话,我就会去打开电子书看看,书籍可不一定比视频教程差,尤其是权威的技术书籍。



基本上主流的和经典的都有,这里我就不放图了,版权问题,个人看看是没有问题的。



**(5)Python知识点汇总**

知识点汇总有点像学习路线,但与学习路线不同的点就在于,知识点汇总更为细致,里面包含了对具体知识点的简单说明,而我们的学习路线则更为抽象和简单,只是为了方便大家只是某个领域你应该学习哪些技术栈。



![在这里插入图片描述](https://img-blog.csdnimg.cn/c741a91b05a542ba9dc8abf2f2f4b1af.png)



**(6)其他资料**



还有其他的一些东西,比如说我自己出的Python入门图文类教程,没有电脑的时候用手机也可以学习知识,学会了理论之后再去敲代码实践验证,还有Python中文版的库资料、MySQL和HTML标签大全等等,这些都是可以送给粉丝们的东西。



![在这里插入图片描述](https://img-blog.csdnimg.cn/9fa77af248b84885a6ec779b2ead064d.png)

**这些都不是什么非常值钱的东西,但对于没有资源或者资源不是很好的学习者来说确实很不错,你要是用得到的话都可以直接抱走,关注过我的人都知道,这些都是可以拿到的。**


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值