python自帶的logging實在是很差用,推薦使用logbookpython
思路以下:api
1.建立path.py文件,獲取工程根路徑cookie
2.建立log.py文件,在工程根路徑下建立日誌文件(文件名稱按日期命名),並設置log輸出等級session
3.執行測試用例,調用log文件函數
具體實現以下:post
1. path.py文件以下: 獲取項目的根路徑 測試
os.path.abspath(path) 返回path規範化的絕對路徑ui
os.path.dirname(__file__) 獲取當前運行腳本的絕對路徑 編碼
由於os.path.dirname(__file__)返回腳本的路徑,存在的問題:url
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()使用
import os def file_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
import logbook import os from logbook.more import ColorizedStderrHandler from tools.path import file_path path = file_path() LOG_DIR = os.path.join(path, 'log') if not os.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() if file_log: logbook.TimedRotatingFileHandler(os.path.join(LOG_DIR, '%s.log' % name), date_format='%Y-%m-%d-%H', bubble=True, encoding='utf-8').push_thread() return logbook.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),可見下面的例子
import requests def old_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() 保存登陸態
具體可見下面:
import requests from tools import log class Msg: def __init__(self): self.Log = log.LOG self.session = requests.session() def msg_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) def msg_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 ~