自动搜索项目根目录下的所有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)
**这些都不是什么非常值钱的东西,但对于没有资源或者资源不是很好的学习者来说确实很不错,你要是用得到的话都可以直接抱走,关注过我的人都知道,这些都是可以拿到的。**