app软件包:通常用于移动端测试时,进行测试包的管理 放置不同的测试包 如果是web自动化测试框架则不需要设置该路径
pages软件包:basepage.py该模块封装了一个类(BasePage) 该类封装最基本的方法 BasePage类:初始化driver(__init__(self.driver)) 基本方法封装(find_element(),find_elements(),get_window_size() 其他跟driver相关的基本方法,会用到的都可以封装起来) 其他page类,一个页面对应一个page类(存放业务逻辑操作对象) login_page(定义LoginPage类封装登录操作相关元素和方法) member_manage_page(定义MemberManagePage类封装会员管理操作相关元素和方法)
日志收集
在自动化脚本运行过程中,IDE控制台一般都会输出运行日志。但是如果测试项目是在linux服务器上面运行,没有IDE控制台输出log,该如何采集日志?
日志作用
不管是在项目开发还是测试过程中,项目运行一旦出现问题日志信息就非常重要。日志是定位问题的重要手段
日志级别
脚本运行会有很多的情况,比如调试信息、报错异常信息等。日志要根据这些不同的情况来继续分级管理,不然对于排查问题的筛选会有比较大的干扰
日志需要按照info、debug、error等级别来进行区分,级别可以自己去设置。一般情况下普通的输出我们使用info类型,调试的时候用debug类型,预计有错误时需要使用error类型
日志格式
日志格式化是为了提高日志的可阅读性,比如:时间+模块+行数+日志具体信息的内容格式。如果日志信息杂乱无章的全部数出来,不利于定位问题。日志格式化输出,非常便于阅读查看
日志位置
一个项目中会有很多的日志采集点,而且日志采集点必须结合业务属性来设置。比如在登录代码执行前可以插入"准备登录.." 日志信息,如果登录完成之后,再设置登录的提示日志就会给人造成误解,无法判断到底是登录之前的问题还是登录之后的问题,因此日志采集点的位置很重要
logging模块
Python的logging模块提供了通用的日志系统,这个模块提供不同的日志级别,并可以采用不同的方式记录日志,最常见的方式就是通过文件来记录日志
#导入logging模块
import logging
logging模块包括logger,Handler,Filter,Formatter四个部分
Logger记录器,用于记录日志
Handler处理器,将日志记录发送至合适的路径
Filter过滤器,提供了更好的粒度控制,它可以决定输出哪些日志记录
Formatter格式化器,指明了最终输出中日志的格式
Logger记录器
Logger是一个树形层级结构,在使用接口debug,info,warn,error,critical;使用之前必须创建Logger实例,即创建一个记录器,如果没有显式的进行创建,则默认创建一个root logger,并应用默认的日志级别(warn),Handler和Formatter
basicConfig(**kwargs) 为日志记录系统做基本配置
部分参数
filename 指定日志文件名称
filemode 指定打开文件的模式,如果指定了filename(如果文件默认未指定,则默认为'a')
文件读写模式:w 以写方式打开 W 文件若存在,首先要清空,然后重新创建 a以追加模式打开(从EOF开始,必要时创建新文件) r+ 以读写模式打开 w+以读写模式打开 a+以读写模式打开
format 为处理程序使用指定的格式字符串
datefmt 使用指定的日期/时间格式 样式如果指定了格式字符串,则使用它来指定 格式字符串的类型
level 将根记录器级别设置为指定级别
Handler处理器
Handler处理器,将日志记录发送至合适的路径,Handler处理器类型有很多种,比较常用的有三个:
1.StreamHandler 将日志记录输出发送到诸如sys.stdout,sys.stderr或任何类似文件流的对象。输出到控制台
2.FileHandler 将日志 记录输出发送到磁盘文件。它继承了StreamHandler的输出功能
3.NullHandler 不做任何格式化或输出
import logging
# logging.basicConfig(level=logging.INFO)
logging.basicConfig(filename='temp.log',level=logging.INFO)
logging.error('hello')
Formatter 使用Formatter对象设置日志信息显示的规则、结构和内容,默认的时间格式为%Y-%m-%d %H:%M:%S
import logging
logging.basicConfig(filename='run.log',level=logging.DEBUG,format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
logging.error('hello')
在一个文件中配置的logger只能在这个文件中使用,如果一个项目中很多文件都要使用logger,如何统一管理?
将这些日志配置的参数抽离出来,各个模块需要使用则直接引用即可,方便统一维护和管理
日志格式配置
将log输出格式,输出路径等参数抽离出来作为一个配置表
logger.config
[loggers]
keys=root,infoLogger
[logger_root]
level=DEBUG #控制整体的日志输出级别
handlers= consoleHandler,fileHandler
[logger_infoLogger]
handlers=consoleHandler,fileHandler
qualname=infoLogger
propagae=0 #0表示输出日志,但不往更高级别的日志进行传递,比如不往root logger传递
[handlers]
keys=consoleHandler,fileHandler
[handler_consoleHandler]
class=StreamHandler
level=INFO #在控制台中会输出的日志级别,注意,仅作用于控制台,不作用于其他handler
formatter=form02
args=(sys.stdout,)
[handler_fileHandler]
class=FileHandler
level=INFO #在日志文件中会输出的日志级别,注意,仅作用于日志文件,不作用于其他handler
formatter=form01
args=('runlog.log','a')
[formatters]
keys=form01,form02
[formatter_form01]
format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s
[formatter_form02]
format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s
logger_config.py
import logging.config
conf_file='logger.conf'
logging.config.fileConfig(conf_file)
logger=logging.getLogger()
logger.py
from logging_demo.logger_config import logger
logger.info('hello')