总纲、数据驱动层:https://blog.csdn.net/ak739105231/article/details/102409810
定位符驱动层:https://blog.csdn.net/ak739105231/article/details/102517323
页面操作层:https://blog.csdn.net/ak739105231/article/details/102544527
结果驱动层主要是用来记录测试结果及过程log的;包括:用例成功、失败的信息(异常信息)以及测试过程中上下文的信息;主要使用python自带的日志库,可以很方便地记录各种等级的日志信息。另外,还可以自定义日志类,专门用来记录测试结果。
python中记录日志的模块是logging,是python的内置模块,无须安装即可调用。logging模块输出的日志包含多种等级,从高到低依次为:critical>error>warning>info>debug;其中,等级warning是logging模块的默认等级(意思是:warning及其之上打印出来,info、debug就不打印出来);如图:
为了是所有level的log都打印出来,日志的基本等级是可以调整的(可以调整为debug,即所有日志都打印出来);另外,上面的日志结果的格式很不好,不明朗,所以,接下来的内容就是如何修改等级和修改格式。
# -*-CODING:UTF-8 -*-
import logging,time
import logging.config
##修改log的等级、格式、内容、日志文件名称
logging.basicConfig(level=logging.DEBUG,
format="%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s %(message)s",
datefmt=time.strftime("%Y--%m--%d %H:%M:%S",time.localtime()),
filename="test.log",
filemode="a")
#%(asctime)s:当前时间的占位符
#%(filename)s:打印日志语句所在文件名
#%(lineno)d:日志语句所在行数
#%(levelname)s:日志等级
#%(message)s:日志内容
##每个示例进行打印
logging.critical("the critical message")
logging.error("the error message")
logging.warning("the warning message")
logging.info("the info message")
logging.debug("the debug message")
截图看一下日志(test.log):格式飘飘多了
现在还不是真正的结果驱动层,只是打印结果的优化;为了达到使用logging模块所支持的多日志记录功能来达到效果,即:日志显示在一个.log文件和控制台,用例结果显示在另一个.log文件;下面介绍如何成功构造成日志驱动层;
第一:配置logging,形成一个配置文件(.conf文件);命名:logger.conf
#logger.conf
##################################################################################
[loggers]
keys=root,result,information
[logger_root]
level=DEBUG
handlers=infohandler,resulthandler
[logger_result]
level=DEBUG
handlers=resulthandler,consolehandler
qualname=result
propagate=0
[logger_information]
level=DEBUG
handlers=infohandler,consolehandler
qualname=information
propagate=0
##################################################################################
[handlers]
keys=resulthandler,infohandler,consolehandler
[handler_resulthandler]
class=FileHandler
formatter=form01
args=('testresult.log',"a")
[handler_infohandler]
class=FileHandler
formatter=form02
args=("testinfo.log","a")
[handler_consolehandler]
class=StreamHandler
formatter=form02
args=(sys.stderr,)
###################################################################################
[formatters]
keys=form01,form02
[formatter_form01]
format=%(asctime)s %(message)s::%(filename)s.%(funcName)s
datefmt=%Y--%m--%d %H:%M:%S
[formatter_form02]
format=%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s %(message)s
datefmt=%Y--%m--%d %H:%M:%S
该配置文件配置了两个自定义的logger---->result和information,分别用来记录测试结果、日志结果。配置了resulthandler、infohandler、consolehandler共三个handler;分别用来记录结果文件、日志文件、输出到控制台;截图说明一下:
第二、利用配置文件、logging本身,封装到自动化框架中,形成结果驱动层
#!usr/bin/env python
# -*-coding:utf-8 -*-
import logging
import logging.config
import sys,os
def findcal(func):
def wrapper(*args):
f=sys._getframe()
filename=f.f_back.f_code.co_filename #当前目录路径
funcname=f.f_back.f_code.co_name #功能名称
lineno=f.f_back.f_lineno #行号
args=list(args)
args.append("%s.%s.%s"% (os.path.basename(filename),funcname,lineno))#os.path.basename(filename)表示当前文件名
func(*args)
return wrapper
class Result(object):
def __init__(self):
logging.config.fileConfig("logger.conf")#指定配置文件,注意文件名必须与自己创建的配置文件名称一致
#下面分别指定结果(result)、日志(information)这样能结合配置文件将其放入不同文件;
self.resulter = logging.getLogger("result")
self.infor= logging.getLogger("information")
@findcal
def log_pass(self,more_msg=""):
self.resulter.info("PASS::"+more_msg)
@findcal
def log_fail(self,more_msg=""):
self.resulter.critical("FAIL::"+more_msg)
@findcal
def log_debug(self,msg,more_msg=""):
self.infor.debug("[%s] %s"% (more_msg, msg))
@findcal
def log_info(self,msg,more_msg=""):
self.infor.info("[%s] %s"% (more_msg, msg))
@findcal
def log_warning(self,msg,more_msg=""):
self.infor.warning("[%s] %s"% (more_msg, msg))
@findcal
def log_error(self,msg,more_msg=""):
self.infor.error("[%s] %s"% (more_msg, msg))
@findcal
def log_critical(self,msg,more_msg=""):
self.infor.critical("[%s] %s"% (more_msg, msg))
接下来,结合之前的数据驱动层、定位符驱动层、页面操作层,与现在的结果驱动层一起;检验测试脚本:
#!usr/bin/env python
# -*-coding:utf-8 -*-
'''
数据驱动层、定位符驱动层、页面操作层、结果驱动层解释
'''
from selenium import webdriver
import time
from data import DataPool as dp
from DBLocator import Locator #导入Locator的读取csv的函数
from baidufisrtpage import BaiduFisrtPage #导入页面层的操作类
from result import Result #导入结果驱动层
dp=dp("test_baidu")
locator=Locator("baidufirst")
result = Result()
"""
以百度,搜索一个关键词举例
:return:
"""
driver = webdriver.Chrome()
bfp = BaiduFisrtPage(driver)
time.sleep(1)
driver.maximize_window()
result.log_info("OPEN_URL:%s" % dp.get("url")) #插入日志
bfp.goto(dp.get("url"))
bfp.input_keywords(dp.get("kw"))
bfp.click_search_btn()
result.log_info("搜索字符:%s" % dp.get("kw")) #插入日志
time.sleep(1)
assert dp.get("kw") in driver.title
result.log_pass() #插入用例结果
driver.close()
运行结果: