怎樣從0開始搭建一個測試框架_2
這部分需要預先了解Python的內置庫logging,不會用的可以先看下博主的 【Python logging 模塊】學習下logging使用
接下來我們爲我們的框架加上log,在utils中創建一個log.py文件,Python有很方便的logging庫,我們對其進行簡單的封裝,使框架可以很簡單地打印日誌(輸出到控制檯以及日誌文件)。
import os
import logging
from logging.handlers import TimedRotatingFileHandler
from utils.config import LOG_PATH
class Logger(object):
def __init__(self, logger_name='framework'):
self.logger = logging.getLogger(logger_name)
logging.root.setLevel(logging.NOTSET)
self.log_file_name = 'test.log'
self.backup_count = 5
# 日誌輸出級別
self.console_output_level = 'WARNING'
self.file_output_level = 'DEBUG'
# 日誌輸出格式
self.formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
def get_logger(self):
"""在logger中添加日誌句柄並返回,如果logger已有句柄,則直接返回"""
if not self.logger.handlers: # 避免重複日誌
console_handler = logging.StreamHandler()
console_handler.setFormatter(self.formatter)
console_handler.setLevel(self.console_output_level)
self.logger.addHandler(console_handler)
# 每天重新創建一個日誌文件,最多保留backup_count份
file_handler = TimedRotatingFileHandler(filename=os.path.join(LOG_PATH, self.log_file_name),
when='D',
interval=1,
backupCount=self.backup_count,
delay=True,
encoding='utf-8'
)
file_handler.setFormatter(self.formatter)
file_handler.setLevel(self.file_output_level)
self.logger.addHandler(file_handler)
return self.logger
logger = Logger().get_logger()
然後修改test_baidu.py,將輸出改到log中:
import time
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
from utils.config import Config, DRIVER_PATH
from utils.log import logger
class TestBaiDu(unittest.TestCase):
URL = Config().get('URL')
locator_kw = (By.ID, 'kw')
locator_su = (By.ID, 'su')
locator_result = (By.XPATH, '//div[contains(@class, "result")]/h3/a')
def setUp(self):
self.driver = webdriver.Chrome(executable_path=DRIVER_PATH + '\chromedriver.exe')
self.driver.get(self.URL)
def tearDown(self):
self.driver.quit()
def test_search_0(self):
self.driver.find_element(*self.locator_kw).send_keys('selenium 灰藍')
self.driver.find_element(*self.locator_su).click()
time.sleep(2)
links = self.driver.find_elements(*self.locator_result)
for link in links:
logger.info(link.text)
def test_search_1(self):
self.driver.find_element(*self.locator_kw).send_keys('Python selenium')
self.driver.find_element(*self.locator_su).click()
time.sleep(2)
links = self.driver.find_elements(*self.locator_result)
for link in links:
logger.info(link.text)
if __name__ == '__main__':
unittest.main()
執行後,可以看到在log文件夾下創建了test.log文件,打印的信息都輸出到了文件中:
2017-07-26 16:00:59,457 - framework - INFO - Python selenium —— 一定要會用selenium的等待,三種..._CSDN博客
2017-07-26 16:00:59,487 - framework - INFO - Selenium - 灰藍 - CSDN博客
2017-07-26 16:00:59,515 - framework - INFO - ...教你在Windows上搭建Python+Selenium環境 - 灰藍 - CSDN博客...
2017-07-26 16:00:59,546 - framework - INFO - Python selenium —— 父子、兄弟、相鄰節點定位方式詳..._CSDN博客
2017-07-26 16:00:59,572 - framework - INFO - Selenium - 灰藍 - CSDN博客
2017-07-26 16:00:59,595 - framework - INFO - selenium之 時間日期控件的處理 - 灰藍 - CSDN博客
...
我們還可以把log的設置放到config中,修改config.yml,將幾項重要的設置都寫進去:
URL: http://www.baidu.com
log:
file_name: test.log
backup: 5
console_level: WARNING
file_level: DEBUG
pattern: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
同時修改log.py,讀取config,如果config中有,則採用文件中的設置,否則,採用默認設置
"""
日誌類。通過讀取配置文件,定義日誌級別、日誌文件名、日誌格式等。
一般直接把logger import進去
from utils.log import logger
logger.info('test log')
"""
import os
import logging
from logging.handlers import TimedRotatingFileHandler
from utils.config import LOG_PATH, Config
class Logger(object):
def __init__(self, logger_name='framework'):
self.logger = logging.getLogger(logger_name)
logging.root.setLevel(logging.NOTSET)
c = Config().get('log')
self.log_file_name = c.get('file_name') if c and c.get('file_name') else 'test.log' # 日誌文件
self.backup_count = c.get('backup') if c and c.get('backup') else 5 # 保留的日誌數量
# 日誌輸出級別
self.console_output_level = c.get('console_level') if c and c.get('console_level') else 'WARNING'
self.file_output_level = c.get('file_level') if c and c.get('file_level') else 'DEBUG'
# 日誌輸出格式
pattern = c.get('pattern') if c and c.get('pattern') else '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
self.formatter = logging.Formatter(pattern)
def get_logger(self):
"""在logger中添加日誌句柄並返回,如果logger已有句柄,則直接返回
我們這裏添加兩個句柄,一個輸出日誌到控制檯,另一個輸出到日誌文件。
兩個句柄的日誌級別不同,在配置文件中可設置。
"""
if not self.logger.handlers: # 避免重複日誌
console_handler = logging.StreamHandler()
console_handler.setFormatter(self.formatter)
console_handler.setLevel(self.console_output_level)
self.logger.addHandler(console_handler)
# 每天重新創建一個日誌文件,最多保留backup_count份
file_handler = TimedRotatingFileHandler(filename=os.path.join(LOG_PATH, self.log_file_name),
when='D',
interval=1,
backupCount=self.backup_count,
delay=True,
encoding='utf-8'
)
file_handler.setFormatter(self.formatter)
file_handler.setLevel(self.file_output_level)
self.logger.addHandler(file_handler)
return self.logger
logger = Logger().get_logger()
現在,我們已經可以很方便地輸出日誌了,並且可以通過配置config.yml來修改log的設置。
所有的代碼我都放到了GITHUB上傳送,可以自己下載去學習,有什麼好的建議或者問題,可以留言或者加我的QQ羣:455478219討論。