关于python:Unittest接口测试生成报告和日志方法

HTML报告

  1. 间接把HTMLTestRunner.py放入工程目录即可
  2. 报告脚本封装
#HTNL格局报告
    now = datetime.datetime.now().strftime('%Y-%m-%d_%H_%M_%S')
    htmlreport = reportpath + "/" + now + r"result.html"
    print("测试报告生成地址:%s"% htmlreport)
    fp = open(htmlreport, "wb")
    runner = HTMLTestRunner.HTMLTestRunner(stream=fp, 
                                           verbosity=2, 
                                           title="xxxx接口自动化测试报告", 
                                           description="用例执行状况")
    runner.run(case) # case为所有的测试用例
    fp.close()

LOG日志

  1. 应用Python自带的logging
  2. 间接援用即可
import logging
  1. log等级
<span class=”td-span”><span>级别</span></span> <span class=”td-span”><span>何时应用</span></span>
<span class=”td-span”><span>DEBUG</span></span> <span class=”td-span”><span>详细信息,典型地调试问题时会感兴趣。 具体的debug信息。</span></span>
<span class=”td-span”><span>INFO</span></span> <span class=”td-span”><span>证实事件按预期工作。 要害事件。</span></span>
<span class=”td-span”><span>WARNING</span></span> <span class=”td-span”><span>表明产生了一些意外,或者不久的未来会产生问题(如‘磁盘满了’)。软件还是在失常工作。</span></span>
<span class=”td-span”><span>ERROR</span></span> <span class=”td-span”><span>因为更重大的问题,软件已不能执行一些性能了。 个别谬误音讯。</span></span>
<span class=”td-span”><span>CRITICAL</span></span> <span class=”td-span”><span>严重错误,表明软件已不能持续运行了。</span></span>
<span class=”td-span”><span>NOTICE</span></span> <span class=”td-span”><span>不是谬误,然而可能须要解决。一般然而重要的事件。</span></span>
<span class=”td-span”><span>ALERT</span></span> <span class=”td-span”><span>须要立刻修复,例如零碎数据库损坏。</span></span>
<span class=”td-span”><span>EMERGENCY</span></span> <span class=”td-span”><span>紧急情况,零碎不可用(例如零碎解体),个别会告诉所有用户。</span></span>
  1. logging.basicConfig()函数蕴含参数阐明
<span class=”td-span”><span>参数名称                </span></span> <span class=”td-span”><span>形容</span></span>
<span class=”td-span”><span>filename</span></span> <span class=”td-span”><span>指定日志输入指标文件的文件名(能够写文件名也能够写文件的残缺的绝对路径,写文件名日志放执行文件目录下,写残缺门路依照残缺门路生成日志文件),指定该设置项后日志信念就不会被输入到控制台了</span></span>
<span class=”td-span”><span>filemode</span></span> <span class=”td-span”><span>指定日志文件的关上模式,默认为’a’。须要留神的是,该选项要在filename指定时才无效</span></span>
<span class=”td-span”><span>format</span></span> <span class=”td-span”><span>指定日志格局字符串,即指定日志输入时所蕴含的字段信息以及它们的程序。logging模块定义的格局字段上面会列出。</span></span>
<span class=”td-span”><span>datefmt</span></span> <span class=”td-span”><span>指定日期/工夫格局。须要留神的是,该选项要在format中蕴含工夫字段%(asctime)s时才无效</span></span>
<span class=”td-span”><span>level</span></span> <span class=”td-span”><span>指定日志器的日志级别</span></span>
<span class=”td-span”><span>stream</span></span> <span class=”td-span”><span>指定日志输入指标stream,如sys.stdout、sys.stderr以及网络stream。须要阐明的是,stream和filename不能同时提供,否则会引发 <span>ValueError<span>异样</span></span></span></span>
<span class=”td-span”><span>style</span></span> <span class=”td-span”><span>Python 3.2中新增加的配置项。指定format格局字符串的格调,可取值为’%’、'{‘和’$’,默认为’%'</span></span>
<span class=”td-span”><span>handlers</span></span> <span class=”td-span”><span>Python 3.3中新增加的配置项。该选项如果被指定,它应该是一个创立了多个Handler的可迭代对象,这些handler将会被增加到root logger。须要阐明的是:filename、stream和handlers这三个配置项只能有一个存在,不能同时呈现2个或3个,否则会引发ValueError异样。</span></span>
  1. logging模块中定义好的能够用于format格局字符串阐明
<span class=”td-span”><span>字段/属性名称</span></span> <span class=”td-span”><span>应用格局</span></span> <span class=”td-span”><span>形容</span></span>
<span class=”td-span”><span>asctime</span></span> <span class=”td-span”><span>%(asctime)s</span></span> <span class=”td-span”><span>将日志的工夫结构成可读的模式,默认状况下是‘2016-02-08 12:00:00,123’准确到毫秒</span></span>
<span class=”td-span”><span>name</span></span> <span class=”td-span”><span>%(name)s</span></span> <span class=”td-span”><span>所应用的日志器名称,默认是’root’,因为默认应用的是 rootLogger</span></span>
<span class=”td-span”><span>filename</span></span> <span class=”td-span”><span>%(filename)s</span></span> <span class=”td-span”><span>调用日志输入函数的模块的文件名; pathname的文件名局部,蕴含文件后缀</span></span>
<span class=”td-span”><span>funcName</span></span> <span class=”td-span”><span>%(funcName)s</span></span> <span class=”td-span”><span>由哪个function收回的log, 调用日志输入函数的函数名</span></span>
<span class=”td-span”><span>levelname</span></span> <span class=”td-span”><span>%(levelname)s</span></span> <span class=”td-span”><span>日志的最终等级(被filter批改后的)</span></span>
<span class=”td-span”><span>message</span></span> <span class=”td-span”><span>%(message)s</span></span> <span class=”td-span”><span>日志信息, 日志记录的文本内容</span></span>
<span class=”td-span”><span>lineno</span></span> <span class=”td-span”><span>%(lineno)d</span></span> <span class=”td-span”><span>以后日志的行号, 调用日志输入函数的语句所在的代码行</span></span>
<span class=”td-span”><span>levelno</span></span> <span class=”td-span”><span>%(levelno)s</span></span> <span class=”td-span”><span>该日志记录的数字模式的日志级别(10, 20, 30, 40, 50)</span></span>
<span class=”td-span”><span>pathname</span></span> <span class=”td-span”><span>%(pathname)s</span></span> <span class=”td-span”><span>残缺门路 ,调用日志输入函数的模块的残缺路径名,可能没有</span></span>
<span class=”td-span”><span>process</span></span> <span class=”td-span”><span>%(process)s</span></span> <span class=”td-span”><span>以后过程, 过程ID。可能没有</span></span>
<span class=”td-span”><span>processName</span></span> <span class=”td-span”><span>%(processName)s</span></span> <span class=”td-span”><span>过程名称,Python 3.1新增</span></span>
<span class=”td-span”><span>thread</span></span> <span class=”td-span”><span>%(thread)s</span></span> <span class=”td-span”><span>以后线程, 线程ID。可能没有</span></span>
<span class=”td-span”><span>threadName</span></span> <span class=”td-span”><span>%(thread)s</span></span> <span class=”td-span”><span>线程名称</span></span>
<span class=”td-span”><span>module</span></span> <span class=”td-span”><span>%(module)s</span></span> <span class=”td-span”><span>调用日志输入函数的模块名, filename的名称局部,不蕴含后缀即不蕴含文件后缀的文件名</span></span>
<span class=”td-span”><span>created</span></span> <span class=”td-span”><span>%(created)f</span></span> <span class=”td-span”><span>以后工夫,用UNIX规范的示意工夫的浮点数示意; 日志事件产生的工夫–工夫戳,就是过后调用time.time()函数返回的值</span></span>
<span class=”td-span”><span>relativeCreated</span></span> <span class=”td-span”><span>%(relativeCreated)d</span></span> <span class=”td-span”><span>输入日志信息时的,自Logger创立以 来的毫秒数; 日志事件产生的工夫绝对于logging模块加载工夫的绝对毫秒数</span></span>
<span class=”td-span”><span>msecs</span></span> <span class=”td-span”><span>%(msecs)d</span></span> <span class=”td-span”><span>日志事件产生事件的毫秒局部。logging.basicConfig()中用了参数datefmt,将会去掉asctime中产生的毫秒局部,能够用这个加上</span></span>
  1. 生成log脚本封装
#LOG日志记录
    logging.basicConfig(level=logging.DEBUG,
                        format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
                        datefmt='%a, %d %b %Y %H:%M:%S',
                        filename=log_path + '/' + now + r"result.log",
                        filemode='w')
    logger = logging.getLogger()
    logger.info(case)

Unittest函数入口集成报告和日志

# coding=utf-8
import unittest
import time,datetime
from common import HTMLTestRunner
from common.send_mail import sendmain
import os
import logging

now_path = os.path.dirname(os.path.realpath(__file__)) # 获取以后门路

report_path = os.path.join(now_path , "../report") # HTML报告存储门路
log_path = os.path.join(now_path , "../log") # LOG日志存储门路

if not os.path.exists(report_path): os.mkdir(report_path)
case_path = os.path.join(now_path , "../case") # 测试用例门路


def load_case(casepath=case_path, rule="test*.py"):
    '''加载所有的测试用例'''
    discover = unittest.defaultTestLoader.discover(casepath, pattern=rule,) # 定义discover办法的参数
    return discover

def run_case(test_case, reportpath=report_path):
    '''执行所有的用例, 并把后果写入测试报告'''

    #HTNL格局报告
    now = datetime.datetime.now().strftime('%Y-%m-%d_%H_%M_%S')
    report = reportpath + "/" + now + r"result.html"
    print("测试报告生成地址:%s"% report)
    fp = open(report, "wb")
    runner = HTMLTestRunner.HTMLTestRunner(stream=fp, verbosity=2, title="xxxx接口自动化测试报告", description="用例执行状况")

    #LOG日志记录
    logging.basicConfig(level=logging.DEBUG,
                        format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
                        datefmt='%a, %d %b %Y %H:%M:%S',
                        filename=log_path + '/' + now + r"result.log",
                        filemode='w')
    logger = logging.getLogger()
    logger.info(test_case)

    # 调用load_case函数返回值
    runner.run(test_case)
    fp.close()
    time.sleep(2)
    sendmain(report, mail_to=['yyyyyy@qq.com'])
    print("发送测试报告邮件OK")

if __name__ == "__main__":
    my_cases = load_case()
    run_case(my_cases)

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理