HTML报告直接把HTMLTestRunner.py放到项目目录下报告脚本打包#HTNL格式reportnow=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日志Python自带的logging可以直接引用。importlogging日志级别levelWHENTOUSEDEBUGdetails,typical在调试一个问题的时候,你会觉得兴趣详细的调试信息。INFO证明事情按预期工作.关键事件。WARNING表示发生了意外情况,或者不久的将来会出现问题(例如“磁盘已满”)。该软件仍在正常运行。ERROR由于比较严重的问题,该软件的某些功能无法再执行。一般错误消息。CRITICAL严重错误表明软件是不再继续运行。注意不是错误,但可能需要行动。普通但重要的事件。ALERT需要立即维修,例如系统数据库损坏。EMERGENCY紧急情况,系统不可用(如系统崩溃),通常会通知所有用户。logging.basicConfig()函数包含参数说明参数名称描述filename指定日志输出目标文件的文件名(可以写文件名或者文件的完整绝对路径,写文件名和日志放在执行文件目录下,写完整路径根据完整生成日志文件path),指定该设置项后,日志置信度将不会输出到控制台filemode指定日志文件的打开方式,默认为'a'。需要注意的是,该选项仅在指定文件名时有效format指定日志格式字符串,即指定日志输出中包含的字段信息及其顺序。下面列出了日志模块定义的格式字段。datefmt指定日期/时间格式。需要注意的是,该选项仅在格式中包含时间字段%(asctime)s时有效level指定logger的日志级别stream指定日志输出目标流,如sys.stdout、sys.stderr和网络流。需要注意的是stream和filename不能同时提供,否则会抛出ValueError异常stylePython3.2新增配置项。指定格式字符串的样式,可能的值为'%'、'{'和'$',默认为'%'handlersPython3.3新增的配置项。如果指定了这个选项,它应该是一个可迭代的对象,它创建多个将被添加到根记录器的处理程序。需要注意的是,filename、stream、handlers这三个配置项只能存在一个,不能同时出现两个或三个,否则会抛出ValueError异常。logging模块中定义的可用于format格式字符串描述字段/属性名使用格式描述asctime%(asctime)s将日志的时间构造成可读的形式,默认为'2016-02-0812:00:00,123',精确到毫秒name%(name)s使用的logger的名字,默认是'root',因为默认使用rootLoggerfilename跨度><spanclass="td-span">%(filename)s调用日志的模块的文件名输出函数;pathname的文件名部分,包括文件后缀funcName%(funcName)s哪个函数发送日志,调用日志输出函数的函数名levelname%(levelname)s日志的最终级别(由过滤器修改)message%(message)s<span>日志信息,日志记录的文本内容lineno%(lineno)d当前日志的行号,调用日志输出的语句所在的代码行函数位于levelno%(levelno)s/span>Numberloglevelforthislogrecord(10,20,30,40,50)路径名%(pathname)s全路径,调用日志输出函数的模块全路径名,可以没有处理%(process)s当前进程,进程ID可以不processName%(processName)s进程名称,Python3.1新增thread%(thread)s当前线程,线程ID。可能没有threadName%(thread)s线程名称模块%(module)s调用日志的模块名输出函数,filename的name部分,不包含后缀,即没有文件后缀的文件名created%(created)f当前时间,表示为UNIX标准浮点数;log事件发生的时间--时间戳,就是当时调用time.time()函数返回的值相对创建</span>%(relativeCreated)d在输出日志信息时,自创建Logger以来的毫秒数;日志事件发生时相对于日志模块加载时间的毫秒数msecsspanclass="td-span">%(msecs)d日志事件发生事件的毫秒部分logging.basicConfig()中使用了参数datefmt,会去掉asctime中产生的毫秒部分。可以使用这个添加生成日志脚本包#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函数入口整合报告和Log#coding=utf-8importunittestimporttime,datetimefromcommonimportHTMLTestRunnerfromcommon.send_mailimportsendmainimportosimportloggingnow_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日志存储路径ifnotos.path.exists(report_path):os.mkdir(report_path)case_path=os.path.join(now_path,"../case")#测试用例路径defload_case(casepath=case_path,rule="test*.py"):'''加载所有测试用例'''discover=unittest.defaultTestLoader.discover(casepath,pattern=rule,)#定义discover方法的参数returndiscoverdefrun_case(test_case,reportpath=report_path):'''执行所有用例并将结果写入测试报告'''#HTNLformatreportnow=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="用例执行")#LOGlogginglogging.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("SendtestreportemailOK")if__name__=="__main__":my_cases=load_case()run_case(my_cases)