自动化测试框架搭建-日志-2
在上一节的自动化测试框架搭建-【配置】的基础上为框架加上日志log,既然用到了log类,可以学习Python-logging进行学习,在utils中创建一个log.py文件,Python有很方便的logging库,对其进行简单的封装,使框架可以很简单地打印日志(输出到控制台以及日志文件)。
对于logger模块,有几篇自己在学习过程中觉得可以值得学习的博客:Python logging模块详解和logger模块详解;值得学习和借鉴。
#coding:utf-8
'''log.py output the log'''import logging
from logging.handlers import TimedRotatingFileHandler
from Framework.utils.config import LOG_PATHclass Logger():def __init__(self,logger_name = 'framework'):#创建一个logger实例,如果参数为空则返回root loggerself.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=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.loggerlogger = Logger().get_logger()if __name__ == '__main__':print logger
修改test_baidu3.py模块,将输出日志功能加入到方法中,同时为了使用类方法实现测试方法的共享测试数据初始化和回收工作,从而使用@classmethod只需要初始化一次测试环境并且在测试用例执行完成后进行环境恢复。
#coding:utf-8
'''test_baidu3 This moudle has a logger function'''import time
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
from Framework.utils.config import Config,DRIVER_PATH
from Framework.utils.log1 import loggerclass 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')@classmethod#def setUp(self):def setUp(cls):cls.driver = webdriver.Chrome(executable_path=DRIVER_PATH + '\chromedriver.exe')cls.driver.get(cls.URL)@classmethod#def tearDown(self):def tearDown(cls):cls.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:#print(link.text)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:#print(link.text)logger.info(link.text)if __name__ == '__main__':unittest.main()
在工程Framework下生成了一个logtest.log日志,输出结果:
之后,由于log.py模块中有很多设置,将其放置到config.yaml中
URL: http://www.baidu.com
log:file_name: test.logbackup: 5console_level: WARNINGfile_level: DEBUGpattern: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
同时修改log1.py,读取config,如果config中有,则采用文件中的设置,否则,采用默认设置
#coding:utf-8
'''log1.py output the log'''
"""
日志类。通过读取配置文件,定义日志级别、日志文件名、日志格式等。
一般直接把logger import进去
from utils.log import logger
logger.info('test log')
"""import logging
from logging.handlers import TimedRotatingFileHandler
from Framework.utils.config import LOG_PATH,Configclass Logger():def __init__(self,logger_name = 'framework'):#创建一个logger实例,如果参数为空则返回root loggerself.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=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.loggerlogger = Logger().get_logger()if __name__ == '__main__':print logger
由于这里的日志模块为log1.py,因此在test_baidu3.py做如下修改
from Framework.utils.log1 import logger
自动化测试框架搭建-日志-2相关推荐
- 自动化测试框架搭建-报告-4
unittest在命令行可以直接输出测试结果.但是可能需要生生一个所有测试的执行结果作为报告或者把测试报告发送给相关人员,给其发送命令行日志不是一个明智的选择.他们需要格式格式更加友好的测试报告,既能 ...
- Python+unittest+requests 接口自动化测试框架搭建 完整的框架搭建过程 实战
一.Python+unittest+requests+HTMLTestRunner 完整的接口自动化测试框架搭建_00--框架结构简解 首先配置好开发环境,下载安装Python并下载安装pycharm ...
- API接口自动化测试框架搭建(一)-总体需求
(一)-总体需求 1 实现目的 2 功能需求 3 其他要求 4 适用人员 5 学习周期 6 学习建议 7 内容直达 8 反馈联系 1 实现目的 API接口自动化测试,主要针对http接口协议: 便于回 ...
- 接口自动化测试框架搭建总结
自动化测试框架搭建: 个人自动化测试框架的gitlab地址:https://gitee.com/wangxinbo112/ApiTestDemo.git 框架搭建思想:采用数据驱动和分层设计的思想,即 ...
- python安装robotframework报错_Python3+RIDE+RobotFramework自动化测试框架搭建过程详解
Python2.7已于2020年1月1日开始停用,之前RF做自动化都是基于Python2的版本. 没办法,跟随时代的脚步,我们也不得不升级以应用新的控件与功能. 升级麻烦,直接全新安装. 一.Pyth ...
- python web自动化测试框架搭建(功能接口)——功能测试模块
功能测试使用selenium,模块有: 1.futil: 公共方法,如元素高亮显示 # coding=utf-8 """高亮显示元素""" ...
- APP自动化测试框架搭建(五)--Python+Appium+pytest-html
第一章 APP自动化环境搭建(Mac版) 第二章 APP自动化环境搭建(Windows版) 第三章 adb命令 第四章 元素定位.元素操作 第五章 APP自动化测试框架搭建 Python+Appium ...
- WEB UI自动化测试框架搭建(一)_公用方法Utils
本栏目内的所有项目使用的都是PyCharm 2020.1专业版,可以下载后自行在网上找教程破解. WEB UI自动化测试框架搭建(一)~(七)源代码:https://download.csdn.net ...
- APP自动化测试框架搭建(八)--ATX Server2多设备集群环境搭建
第一章 APP自动化环境搭建(Mac版) 第二章 APP自动化环境搭建(Windows版) 第三章 adb命令 第四章 元素定位.元素操作 第五章 APP自动化测试框架搭建 Python+Appium ...
最新文章
- BT:胞外酶-化腐朽为神奇的催化剂
- python中的arange函数_Python 中的range,以及numpy包中的arange函数
- 【学术相关】专家:硕博研究生阶段还是要发SCI,取消了学生就不干活了
- 常用 API 函数(5): 文本和字体函数
- python交互模式设置及VIM的tab补齐
- Mendix发布全球低代码报告,中国软件与低代码发展远超全球
- vs2013 编译libevent32和64bit
- binlog日志_mysql的binlog日志的自动定时清理
- HDU2966 In case of failure(浅谈k-d tree)
- 在windows上传一个新的项目到GitHub上
- 深度学习:卷积神经网络CNN
- java session 使用_浅谈Session的使用(原创)
- Google Chrome Frame 谷歌浏览器框架
- 【sketchup 2021】草图大师的高级工具使用3【复杂贴图制作实例(山体和球面贴图、全景天空绘制、吊顶添加光带)、图层(标记)工具使用、视图与样式工具的常规使用与高级使用说明】
- 数学建模(NO.9斯皮尔曼相关系数)
- 花瓣图片采集工具研究
- 1KB文件夹快捷方式病毒清除(转)
- 《沉默的大多数》 - 王小波
- 计算机cpu一直超频,电脑卡顿怎么办,CPU超频让老电脑起死回生,大神带你玩转CPU!...
- 海归35岁,阿里P7offer, 是否接受?
热门文章
- 1154:LETTERS
- 8.图片组件和动画效果--从零起步实现基于Html5的WEB设计器Jquery插件(含源码)...
- MySQL中用decimal的原因
- Google搜索引擎的十大应用
- 错误 C2664 “int WideCharToMultiByte......”: 无法将参数 3 从“CString”转换为“LPCWCH” 的问题解决
- 纠结的STM32 RTC时钟源LSE
- STL源代码分析(ch 1)组态1
- (chap1 网络基础知识)通信类型
- 深度学习的数学 (4)张量、矩阵、导数
- 操作系统课设--NACHOS试验环境准备、安装与MAKEFILE分析