Web自动化测试【分层架构设计与实现】四:结果驱动层

总纲、数据驱动层: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自带的日志库,可以很方便地记录各种等级的日志信息。另外,还可以自定义日志类,专门用来记录测试结果。

二、日志Logger记录

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()

运行结果:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷凝娇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值