python3 BeautifulReport测试报告 及 报告中增加日志输出
https://blog.csdn.net/chenmozhe22/article/details/82888060#2python_19
原生的HTMLTestRunner很容易找到,偶尔又发现一个更炫酷一点的HTMLTestRunner_PY3,具体详见Github
https://github.com/huilansame/HTMLTestRunner_PY3
BeautifulReport
https://github.com/TesterlifeRaymond/BeautifulReport
BeautifulReport 报告展示中增加日志输出:
1. 在项目初始化时加入logger,设置日志容器名称要与自己设置的一致
class ReportTestResult(unittest.TestResult): """ override""" def __init__(self, suite, stream=sys.stdout): """ pass """ super(ReportTestResult, self).__init__() self.begin_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) self.start_time = 0 self.stream = stream self.end_time = 0 self.failure_count = 0 self.error_count = 0
# add loggor_name self.loggor = logging.getLogger('kkb')
2. 在stertTest函数中初始化logging Handler,记录到内存中
def startTest(self, test) -> None: """ 当测试用例测试即将运行时调用 :return: """ unittest.TestResult.startTest(self, test) stdout_redirector.fp = self.outputBuffer stderr_redirector.fp = self.outputBuffer self.sys_stdout = sys.stdout self.sys_stderr = sys.stderr sys.stdout = stdout_redirector sys.stderr = stderr_redirector self.start_time = time.time() # ----add logging output----- self.log_cap = StringIO() self.ch = logging.StreamHandler(self.log_cap) self.ch.setLevel(logging.DEBUG) myfmt = logging.Formatter( '%(asctime)s - %(name)s - "%(filename)s: %(lineno)d" - %(funcName)s - %(levelname)s - %(message)s') self.ch.setFormatter(myfmt) self.loggor.addHandler(self.ch)
3. 在complete_output函数的返回值中加入logging存在内存中的输出,用换行符隔开
def complete_output(self): """ Disconnect output redirection and return buffer. Safe to call multiple times. """ if self.sys_stdout: sys.stdout = self.sys_stdout sys.stderr = self.sys_stdout self.sys_stdout = None self.sys_stdout = None # add log out put -------- return self.outputBuffer.getvalue() + '\n' + self.log_cap.getvalue()
4. 每个用例执行完后,最好清除handler,在stopTest函数中加入
def stopTest(self, test) -> None: """ 当测试用力执行完成后进行调用 :return: """ self.end_time = '{0:.3} s'.format((time.time() - self.start_time)) self.result_list.append(self.get_all_result_info_tuple(test)) # 清除log的handle-------- self.complete_output() self.loggor.removeHandler(self.ch)
使用方法后,每个用例都有单独的logging记录,不会重复
记得在前面引入logging模块 import logging