python自带的logging实在是不好用,推荐使用logbook
思路如下:
1.创建path.py文件,获取工程根路径
2.创建log.py文件,在工程根路径下创建日志文件(文件名称按日期命名),并设置log输出等级
3.执行测试用例,调用log文件
具体实现如下:
1. path.py文件如下: 获取项目的根路径
os.path.abspath(path) 返回path规范化的绝对路径
os.path.dirname(__file__) 获取当前运行脚本的绝对路径
因为os.path.dirname(__file__)返回脚本的路径,存在的问题:
1)必须是实际存在的.py文件,如果在命令行执行,则会引发异常NameError: name '__file__' is not defined
2)在运行的时候如果输入完整的执行的路径,则返回.py文件的全路径如:
Python c:/test/test.py 则返回路径 c:/test ,如果是python test.py 则返回空
所以 结合os.path.abspath用,效果会好
os.path.dirname(os.path.abspath(__file__)),os.path.abspath(__file__)返回的是.py文件的绝对路径
这就是os.path.dirname(__file__)的用法,其主要总结起来有:
1)不要已命令行的形式来进行os.path.dirname(__file__)这种形式来使用这个函数
2)结合os.path.abspath()使用
importosdeffile_path():
root_path= os.path.dirname(os.path.abspath(__file__))
project_path= root_path[:root_path.rfind("requests") + len("requests")]return project_path
2.log.py文件如下:
os.path.join(path, 'log') 是指将path和 log字符串组合成文件目录,比如最终结果为 F:\requests\log
importlogbookimportosfrom logbook.more importColorizedStderrHandlerfrom tools.path importfile_path
path=file_path()
LOG_DIR= os.path.join(path, 'log')if notos.path.exists(LOG_DIR):
os.makedirs(LOG_DIR)#如果log不存在,在当前路径下创建一个log文件夹,
def get_logger(name='Test', file_log=True, level=''):
logbook.set_datetime_format('local')
ColorizedStderrHandler(bubble=False, level=level).push_thread()iffile_log:
logbook.TimedRotatingFileHandler(os.path.join(LOG_DIR,'%s.log' %name),
date_format='%Y-%m-%d-%H', bubble=True, encoding='utf-8').push_thread()returnlogbook.Logger(name)
LOG= get_logger(file_log=True, level='INFO')if __name__ == "__main__":
LOG.error('Log-info')
3. 接口用例执行中调用log文件
此处先说一个接口调用,有两种类库,urllib2 和requests
urllib2 处理编码太麻烦,比起来还是选择简洁明快的requests
Requests 使用的是 urllib3,继承了urllib2的所有特性。Requests支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自 动确定响应内容的编码,支持国际化的 URL 和 POST 数据自动编码。
Requests的使用相当简单,直接用requests.post(url,data),可见下面的例子
importrequestsdefold_login():#登陆接口
url = "https://*****/api/login"params={"cc": "86","phone": "1771019****","password": "12345678"}
res= requests.post(url, data=params)print(res.text)#登陆后查看账号信息
url2 = "https://*****/api/account"r=requests.get(url2)print("账号信息是:", r.text)
old_login()#返回结果如下:{"code":0,"msg":null,"data":{"uid":"5adf5c6a267f40448bb5b0022db94af7","name":"王元元","type":"NORMAL"}}#账号信息是: {"code":-4001,"msg":"登录token无效","data":null}#第二条因为没有获取到session,登陆态,导致报错
可以看到,当第二条请求的接口需要登录态,但是无法获取,此时requests有个特别棒的功能是 可以直接使用
requests.session() 保存登录态
具体可见下面:
importrequestsfrom tools importlogclassMsg:def __init__(self):
self.Log=log.LOG
self.session=requests.session()defmsg_get(self,url):
get_msg= self.session.get(url=url)
self.Log.info("code:"+str(get_msg.status_code))
self.Log.info("time:"+str(get_msg.elapsed.microseconds/1000)+"ms") # 获取接口响应的时间
self.Log.info(get_msg.text)defmsg_post(self, url, data):
post_msg= self.session.post(url=url, data=data)
self.Log.info("code:"+str(post_msg.status_code))
self.Log.info("time:"+str(post_msg.elapsed.microseconds/1000)+"ms")
self.Log.info(post_msg.text)
msg=Msg()
data={"cc": "86","phone": "1771019***","password": "1q2"}
msg.msg_post(url= "https://*****/api/login",data=data )
msg.msg_get(url="https://****/api/account")
以上,over ~