Log文件及html格式的报告文件生成方法
使用HTMLTestRunner模块生成HTML格式的测试报告文件
使⽤HTMLTestRunner模块⽣成HTML格式的测试报告⽂件1.下载HTMLTestRunner.py(2)点击进⼊⽬标⽂件后,右键另存于即可。
(3)python3中⽤HTMLTestRunner.py报ImportError: No module named ‘StringIO‘的解决⽅法:第94⾏,将import StringIO修改成import io第539⾏,将self.outputBuffer = StringIO.StringIO()修改成self.outputBuffer = io.StringIO()第642⾏,将if not rmap.has_key(cls):修改成if not cls in rmap:第766⾏,将uo = o.decode(‘latin-1‘)修改成uo = e第772⾏,将ue = e.decode(‘latin-1‘)修改成ue = e第631⾏,将print >> sys.stderr, '\nTime Elapsed: %s' % (self.stopTime-self.startTime)修改成print(sys.stderr, '\nTime Elapsed: %s' % (self.stopTime-self.startTime))Windows :将下载的⽂件放⼊Python34的安装⽬录...\Python34\Lib ⽬录下2.导⼊ htmltestrunner 模块包1from HTMLTestRunner import HTMLTestRunner2import unittest3from time import strftime 或者import time,datetime4import os5from email.mime.text import MIMEText67from email.mime.multipart import MIMEMultipart # 邮件格式89from email.mime.image import MIMEImage # 发送带图⽚邮件3.定义测试⽤例路径test_dir = './testcase/'或者list_1 = 'test_case\\testcase'4.查找元素(testcase)discover = unittest.defaultTestLoader.discover(test_dir,'*case.py')5.定义测试报告⽂件名以及取前⾯时间加⼊到测试报告⽂件名中# 定义报告存放路径,⽀持相对路径file_name = './report/' + strftime('%Y_%m_%d_%H_%M_%S') + '.html'6.创建⽂件fp = open(file_name,'wb')HTMLTestRunner(stream=fp,description='描述',title='标题').run(discover)7.关闭⽂件fp.close()附件:# -*- coding: utf-8 -*-import unittestfrom HTMLTestRunner import HTMLTestRunnerimport time,os,datetimeimport smtplibfrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipartfrom email.mime.image import MIMEImage# 取test_case⽂件夹下所有⽤例⽂件def creatsuitel(lists):testunit = unittest.TestSuite()# discover ⽅法定义discover = unittest.defaultTestLoader.discover(lists, pattern='start_*.py', top_level_dir=None) #discover ⽅法筛选出来的⽤例,循环添加到测试套件中for test_suite in discover:for test_case in test_suite:testunit.addTests(test_case)print(testunit)return testunitlist_1 = 'test_case\\test_case_1'alltestnames = creatsuitel(list_1)#取前⾯时间加⼊到测试报告⽂件名中now = time.strftime("%Y-%m-%M-%H_%M_%S", time.localtime(time.time()))filename = "report\\"+now+'result.html'#定义个报告存放路径,⽀持相对路径。
log日志的三种方式
log⽇志的三种⽅式day19笔记⼀、 log⽇志1. low版(简易版)import logginglogging.basicConfig(# level=logging.DEBUG #level控制⽇志的显⽰或写⼊的等级(内容的多少)level=30,format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',filename=r'test.log')logging.debug("debug message")("info message")logging.warning("waring message")logging.error("error message")logging.critical("critical message")def func():print(1)logging.debug("正常执⾏")func()2. 标准版import logging#创建⼀个logging对象logger = logging.getLogger()#创建⼀个⽂件对象fh = logging.FileHandler("标准版.log", encoding="utf-8")#创建⼀个屏幕对象sh = logging.StreamHandler()配置显⽰格式formatter1 = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s') formatter2 = logging.Formatter('%(asctime)s %(message)s')fh.setFormatter(formatter1)sh.setFormatter(formatter2)logger.addHandler(fh)logger.addHandler(sh)logger.setLevel(10)fh.setLevel(10)sh.setLevel(40)logging.debug("调试模式")("正常模式")logging.warning("警告信息")logging.error("错误信息")logging.critical("严重错误信息")3. 旗舰版import logging.config# 定义三种⽇志输出格式开始standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \ '[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字# [2019-07-01 20:02:48,600][MainThread:7276][task_id:博客园][⽇志.py:123][INFO][正常运转]simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'id_simple_format = '[%(levelname)s][%(asctime)s][%(message)s]'# [DEBUG][2019-07-01 20:24:21,173][⽇志.py:134]正常运⾏# 定义⽇志输出格式结束# logfile_name = 'login.log' # log⽂件名logfile_path_staff = r'G:\课上练习\day19\log_file\staff.log'logfile_path_boss = r'G:\课上练习\day19\log_file\boss.log'LOGGING_DIC = {'version': 1,'disable_existing_loggers': False,'formatters': {'standard': {'format': standard_format},'simple': {'format': simple_format},'id_simple': {'format': id_simple_format},},'filters': {},'handlers': {#打印到终端的⽇志'sh': {'level': 'DEBUG','class': 'logging.StreamHandler', # 打印到屏幕'formatter': 'simple'},#打印到⽂件的⽇志,收集info及以上的⽇志'staff_fh': {'level': 'DEBUG','class': 'logging.handlers.RotatingFileHandler', # 保存到⽂件'formatter': 'standard','filename': logfile_path_staff, # ⽇志⽂件'maxBytes': 1024*1024*5, # ⽇志⼤⼩ 5M'backupCount': 5,'encoding': 'utf-8', # ⽇志⽂件的编码,再也不⽤担⼼中⽂log乱码了},'boss_fh': {'level': 'DEBUG','class': 'logging.handlers.RotatingFileHandler', # 保存到⽂件'formatter': 'id_simple','filename': logfile_path_boss, # ⽇志⽂件'maxBytes': 1024*1024*5, # ⽇志⼤⼩ 5M'backupCount': 5,'encoding': 'utf-8', # ⽇志⽂件的编码,再也不⽤担⼼中⽂log乱码了},},'loggers': {#logging.getLogger(__name__)拿到的logger配置'': {'handlers': ['sh', 'boss_fh', 'staff_fh'], # 这⾥把上⾯定义的两个handler都加上,即log数据既写⼊⽂件⼜打印到屏幕 'level': 'DEBUG','propagate': True, # 向上(更⾼level的logger)传递},},}# logging.config.dictConfig(LOGGING_DIC) #导⼊上⾯定义的logging配置# logger = logging.getLogger() #⽣成⼀个Log实例# logger.debug('正常运转') #记录改⽂件的运⾏状态def func():logging.config.dictConfig(LOGGING_DIC)logger = logging.getLogger()return loggerdef login():func().debug('正常运⾏')login()。
用java生成html文件实现原理及代码
⽤java⽣成html⽂件实现原理及代码原理跟⽤java⽣成jsp的servlet差不多。
我们可以⽤printStream来向html⽂件⾥输出数据。
先创建⼀个StringBuilder对象,通过append⽅法来为其添加html语句。
如下⾯例⼦所⽰:复制代码代码如下:StringBuilder sb = new StringBuilder();Properties fileProperties = getProperties("file");Properties sqlProperties = getProperties("sql");PrintStream printStream = new PrintStream(new FileOutputStream("report.html"));sb.append("<html>");sb.append("<head>");sb.append("<title>每⽇运营报表</title>");sb.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />");sb.append("<style type=\"text/css\">");sb.append("TABLE{border-collapse:collapse;border-left:solid 1 #000000; border-top:solid 1 #000000;padding:5px;}"); sb.append("TH{border-right:solid 1 #000000;border-bottom:solid 1 #000000;}");sb.append("TD{font:normal;border-right:solid 1 #000000;border-bottom:solid 1 #000000;}");sb.append("</style></head>");sb.append("<body bgcolor=\"#FFF8DC\">");sb.append("<div align=\"center\">");sb.append("<br/>");sb.append("<br/>");List<Map<String, Object>> result1 = getRpt(sqlProperties.getProperty("sql1"));for (Map.Entry<String, Object> m : result1.get(0).entrySet()) {sb.append(fileProperties.getProperty("file1"));sb.append(m.getValue());}sb.append("<br/><br/>");输出的话,也很简单。
Jmeter非GUI运行,生成html报告
Jmeter⾮GUI运⾏,⽣成html报告⼀、JMete执⾏⽅式JMeter执⾏⽅式有2种,⼀种是GUI模式,⼀种是⾮GUI模式。
GUI模式就是界⾯模式,⾮GUI模式就是命令⾏模式。
界⾯模式主要⽤来编写和调试脚本⽤的,项⽬的真正执⾏最好是采⽤命令⾏模式,因为采⽤命令⾏模式可以和持续集成或者其它框架进⾏对接,做成⾃动化回归测试平台。
⼆、JMete⾮GUI运⾏优点JMeter可视化界⾯及监听器动态展⽰结果都⽐较消耗负载机资源,在⼤并发情况下GUI⽅式往往会导致负载机资源紧张,会对性能测试结果造成影响。
我们就只有多加机器来运⾏测试计划(分布式测试),这样⼀台负载机变为两台。
所以推荐⽤⾮GUI的⽅式来运⾏测试计划。
虽然⾮GUI⽅式不显⽰界⾯,但也会以字符形式周期性显⽰执⾏结果,对负载机的资源消耗会⼩⼀些,所有同等条件下⾮GUI⽅式的jmeter机器能够产⽣的负载会⽐GUI⽅式的jmeter产⽣的负载⼤⼀些。
三、jmeter⾮GU运⾏参数 -n 命令⾏模式 -t 指定jmx脚本地址(地址可以是相对路径,可以是绝对路径) -h 查看帮助 -v 查看版本 -p 指定读取jmeter属性⽂件,⽐如jmeter.properties⽂件中设置的 -l 记录测试结果的⽂件,通常结果⽂件为jtl格式(⽂件可以是相对路径,可以是绝对路径) -s 以服务器⽅式运⾏(也是远程⽅式,启动Agent) -H 设置代理,⼀般填写代理IP -P 设置代理端⼝ -u 代理账号 -a 代理⼝令 -J 定义jmeter属性,等同于在jmeter.properties中进⾏设置 -G 定义jmeter全局属性,等同于在Global.properties中进⾏设置,线程间可以共享) -D 定义系统属性,等同于在system.properties中进⾏设置 -S 加载系统属性⽂件,可以通过此参数指定加载⼀个系统属性⽂件,此⽂件可以⽤户⾃⼰定义 -L 定义jmeter⽇志级别,如debug、info、error等 -j 制定执⾏⽇志路径。
JMeter命令行执行+生成HTML报告
JMeter命令⾏执⾏+⽣成HTML报告1、为什么⽤命令⾏模式使⽤GUI⽅式启动jmeter,运⾏线程较多的测试时,会造成内存和CPU的⼤量消耗,导致客户机卡死;所以⼀般采⽤的⽅式是在GUI模式下调整测试脚本,再⽤命令⾏模式执⾏;命令⾏⽅式⽀持在多个环境下使⽤,windosw的dos环境下,也可以在linux环境上执⾏。
注意:使⽤命令执⾏jmeter脚本必须使⽤jmeter 3.0及以上版本。
2、怎么⽤2.1、执⾏命令jmeter -n -t <testplan filename> -l <listener filename>⽰例: jmeter -n -t testplan.jmx -l test.jtl⽰例含义:表⽰以命令⾏模式运⾏testplan.jmx⽂件,输出的⽇志⽂件为test.jtl2.2、参数介绍Jmeter官⽅⼿册给的介绍如下:-h, –help -> prints usage information and exit-n, –nongui -> run JMeter in nongui mode-t, –testfile <argument> -> the jmeter test(.jmx) file to run-l, –logfile <argument> -> the file to log samples to-r, –runremote -> Start remote servers (as defined in remote_hosts)-H, –proxyHost <argument> -> Set a proxy server for JMeter to use-P, –proxyPort <argument> -> Set proxy server port for JMeter to use中⽂释义:-h 帮助 -> 打印出有⽤的信息并退出-n ⾮ GUI 模式 -> 在⾮ GUI 模式下运⾏ JMeter-t 测试⽂件 -> 要运⾏的 JMeter 测试脚本⽂件-l ⽇志⽂件 -> 记录结果的⽂件-R 远程执⾏ -> 远程执⾏机的IP(ip地址)如果有多个ip时,使⽤-R 192.168.2.170,192.168.2.171(分布式使⽤)-r 远程执⾏ -> 在Jmter.properties⽂件中指定的所有远程服务器(分布式使⽤)-H 代理主机 -> 设置 JMeter 使⽤的代理主机-P 代理端⼝ -> 设置 JMeter 使⽤的代理主机的端⼝号2.3、执⾏过程命令:jmeter -n -t C:\Users\yzs\Desktop\Unione_performance.jmx -l report\03-result.jtl不在jmeter安卓⽬录执⾏脚本的前提是配置了jmeter的环境变量。
HTML文档怎么生成的-编写HTML网页的方法
HTML文档怎么生成的-编写HTML网页的方法在网页〔制定〕中的生成HTML文档主要有这些途径:一是手工直接编写;二是通过某些格式转换工具将现有的其他格式文档;三是由Web服务器(或称HTTP服务器)实时动态地生成。
一、HTML文档怎么生成的HTML文档(即Homepage的源文件)是一个放置了标记的ASCll 文本文件,通常它带有.html或.htm的文件扩大名。
生成一个HTML 文档主要有以下三种途径:(1)手工直接编写(例如用你所喜爱的ASCIl文本编辑器或其他HTML的编辑工具)。
(2)通过某些格式转换工具将现有的其他格式文档(如Word文档)转换成HTML文档。
(3)由Web服务器(或称HTTP服务器)实时动态地生成。
二、编写HTML网页的方法1.HTML网页文件的命名规则(1)只能使用英文字母、数字和下划线,不能包涵空格与特别符号。
(2)名称区分大小写。
(3)网站主页文件名为index.htm或index.html。
2.使用HTML编写网页步骤(1)手工编写,只要装有Windows系统,使用记事本即可直接编写出HTML代码。
(2)使用可视化的HTML编辑工具软件,例如DreamWeaver等。
(3)通过编写程序,由Web服务器实时动态地生成网页。
属于动态网页制作方法。
三、HTML文档编写工具1.一般文本编辑器HTML文件是标准的ASCIH文本文件,用户可以使用Windows所附带的记事本、写字板,也可以使用常用的文档编辑软件如Word、WPS等。
但要注意的是在存盘时要把扩大名改成.hum或.html。
2.专门编写HIML的编辑器比如HotDog、IstPage、40tude HTML等都是很好的HTML编辑器,这类专门编辑HTML文件的软件使网页制定者无必须记住控制标记,只必须单击一下软件中的控制标记按钮就可以将控制标记显示出来。
3.自动产生HIML文件的网页制定软件如FrontPage、Dreamweaver等,这类制定软件采纳一种所见即所得的制定模式,制定者只要输入文字、插入图像或声音,并在软件中布局排版,存盘后就会自动转成HTML文件。
log数据研究报告
log数据研究报告1. 引言本报告旨在研究和分析log数据,以深入了解系统的运行情况,从而为系统的优化和问题排查提供数据支持。
log数据是通过记录系统运行过程中的事件和状态而生成的日志文件,其中包含了系统运行的各种信息。
通过分析log数据,我们可以发现系统中的异常行为、性能瓶颈以及潜在的问题。
2. 数据采集log数据的采集是研究的第一步。
根据研究目标和系统特点,我们需要选择适合的数据采集工具和方法,并设计合理的采集方案。
常见的log数据采集方法包括但不限于:•日志记录器:在系统的关键代码段中插入记录器,用于在发生关键事件时生成日志条目。
•事件触发器:根据系统定义的事件规则,当特定事件发生时自动生成日志条目。
•摄像头图像分析:在视频监控系统中,通过分析摄像头图像中的运动和特定目标的出现次数来生成日志数据。
•性能监控工具:使用性能监控工具来记录系统在不同负载下的性能指标,例如响应时间、CPU利用率和内存使用等。
3. 数据存储与处理log数据的存储和处理是研究的关键环节。
我们需要选择合适的存储方式和处理工具来高效地存储和分析大量的log数据。
常用的存储方式包括:•数据库:使用关系型数据库或非关系型数据库存储log数据,便于索引和查询。
•分布式文件系统:通过分布式文件系统来存储log数据,可以实现高容量和高可扩展性。
•日志集中化平台:使用日志集中化平台来统一管理和存储log数据,方便查询和分析。
log数据的处理通常包括以下几个步骤:•数据清洗:去除不需要的字段和异常数据,保留有效的数据。
•数据转换:对数据进行转换和标准化,以便后续的分析和计算。
•数据聚合:根据需求将数据进行聚合,生成汇总信息和统计报告。
4. 数据分析与可视化log数据分析主要包括对数据的统计、挖掘和建模,以从中发现有价值的信息和模式。
常用的log数据分析方法包括:•统计分析:对log数据的关键指标进行统计分析,例如事件发生次数、响应时间分布和异常占比等。
Python单元测试框架之pytest--生成测试报告
Python单元测试框架之pytest--⽣成测试报告 继续pytest单元测试框架的学习,pytest可以⽣成多种类型的测试报告。
这⼀节就来学习pytest如何⽣成测试报告。
创建test_calss.py 测试⽤例⽂件,这⾥以测试该⽂件为例。
#coding=utf-8class TestClass:def test_one(self):x = "this"assert"h"in xdef test_two(self):x = "hello"assert x == "hi"⽣成resultlog⽂件创建普通的结果⽂件:> py.test test_class.py --resultlog=./log.txt 指定当前路径下⽣成log.txt⽂件,打开⽂件,内容如下:. test_class.py::TestClass::()::test_oneF test_class.py::TestClass::()::test_twoself = <test_class.TestClass instance at 0x000000000307C788>def test_two(self):x = "hello"> assert x == "hi"E assert 'hello' == 'hi'E - helloE + hitest_class.py:11: AssertionError⽣成JunitXML⽂件> py.test test_class.py --junitxml=./log.xml 同样指定在当前⽬录下⽣成log.xml⽂件,打开⽂件内容如下:<?xml version="1.0" encoding="utf-8"?><testsuite errors="0" failures="1" name="pytest" skips="0" tests="2" time="0.015"><testcase classname="test_class.TestClass" name="test_one" time="0.0"/><testcase classname="test_class.TestClass" name="test_two" time="0.00300002098083"><failure message="assert 'hello' == 'hi'- hello+ hi">self = <test_class.TestClass instance at 0x000000000309C948>def test_two(self):x = "hello"> assert x == "hi"E assert 'hello' == 'hi'E - helloE + hitest_class.py:11: AssertionError</failure></testcase></testsuite> 创建这样的XML⽂件有有什么⽤?主要是为了⽅便Jenkin或其它的持续集成⼯具俱读取。
【IT专家】【Jmeter】Jmeter生成详细HTML报告
本文由我司收集整编,推荐下载,如有疑问,请与我司联系【Jmeter】Jmeter生成详细HTML报告2017/06/29 1 Jmeter生成详细HTML报告 一、前提在阅读此篇文章的时候,默认你是对于jmeter持续集成有了一定了解的。
如果没有接触过,请移步:blog.csdn/qi_lin7/article/details/52045713 文中提到的jmeter.results.shanhe.me.xsl文件(生产本文提到的HTML报告需要的模板文件,等同于jmeter-results-detail-report_21.xsl的作用),该文件下载之后,请放到jmeter安装目录的extras 目录下,请移步资源页下载download.csdn/detail/qi_lin7/9884043 二、步骤先上效果图吧 1、修改Jmeter.properties 1 针对Response的编码处理,需要修改统一为UTF-8,避免部分Reponse乱码问题 2 由于HTML报告的需要,针对jmeter生成的jtl文件所包含的数据需要做新的配置,以满足测试需求 修改生成的jtl文件为xml 式存储数据 3 修改jtl报告文件需要存储的数据种类(例如针对Response_data是否存储) 具体各种数据不做详细介绍,例如: jmeter.save.saveservice.response_code 为HTTP响应代码(404、502之类) jmeter.save.saveservice.response_data为Reponse详细信息 2、修改build文件 1 修改build主要是修改报告模板,将之前的jmeter-results-detail-report_21.xsl或者jmeter-results-report_21.xsl替换成本文提到的jmeter.results.shanhe.me.xsl(见附件)。
Log文件及html格式的报告文件生成方法
2、显示控制面板界面选中“工具”(Tools)栏后,左键 单击“诊断”(Diagnostics)。
3、获取Log文件 31.选”FILE”>“Saveas”
32.选择Log文件的存储路径,并存储。
33.存储后的Log文件为*.log文件。缺省文件名为 SBDiagnostics.log。文件可使用windows记事本程序打开,示例如 下:
2显示控制面板界面选中工具tools栏后左键单击诊断diagnostics
SB480 Log文件及html格式的报告文件生成方法
1、确认所需检测的SMART交互设备已成功连接至电脑。鼠标移 至右下角,右键单击“SMARTBoard工具图标”。 显示SMARTBoard菜单,选择“控制面板”(Controlpanel)。
4、ReportLog,即本地计算机和所连接的SMART交互式设备信息 41.选”Report”>“Local” >“Saveas”
42.选择ReportLog文件的存储路径,并存储。
43.存储后的ReportLog文件为*.html文件。缺省文件名 ReportLog.html。文件示例如下:
python生成HTmL报告页面
python⽣成HTmL报告页⾯计划做⼀个html页⾯py3.4代码:# -*- coding=utf-8 -*-#import time,osclass Template_mixin(object):"""html报告"""HTML_TMPL = r"""<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>⾃动化测试报告</title><link href="/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet"><h1 style="font-family: Microsoft YaHei">⾃动化测试报告</h1><p class='attribute'><strong>测试结果 : </strong> %(value)s</p><style type="text/css" media="screen">body { font-family: Microsoft YaHei,Tahoma,arial,helvetica,sans-serif;padding: 20px;}</style></head><body><table id='result_table' class="table table-condensed table-bordered table-hover"><colgroup><col align='left' /><col align='right' /><col align='right' /><col align='right' /></colgroup><tr id='header_row' class="text-center success" style="font-weight: bold;font-size: 14px;"><th>版本</th><th>操作步骤</th><th>⽤例执⾏结果</th><th>操作时间</th></tr>%(table_tr)s</table></body></html>"""TABLE_TMPL = """<tr class='failClass warning'><td>%(version)s</td><td>%(step)s</td><td>%(runresult)s</td><td>%(runtime)s</td></tr>"""if __name__ == '__main__':table_tr0 = ''numfail = 1numsucc = 9html = Template_mixin()table_td = html.TABLE_TMPL % dict(version = '3.8.8',step='输⼊正确的⽤户名,密码进⾏登录',runresult='登录成功',runtime = time.strftime('%Y-%m-%d %H:%M:%S'),) table_tr0 += table_tdtotal_str = '共 %s,通过 %s,失败 %s' % (numfail + numsucc, numsucc, numfail)output = html.HTML_TMPL % dict(value = total_str,table_tr = table_tr0,)#print('output',output)# ⽣成html报告filename='{date}_TestReport.html'.format(date=time.strftime('%Y%m%d%H%M%S'))print(filename)#获取report的路径dir= os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))),'report')filename=os.path.join(dir,filename)with open(filename, 'wb') as f: #f.write(output)f.write(output.encode('utf8'))刚开始执⾏时,会报错加了f.write(output.encode('utf8')),后可以执⾏。
【网站开发】用PHP生成自己的LOG文件
【网站开发】用PHP生成自己的LOG文件如果你的服务器不容许你读他的LOG文件,那你只好停下来分析你的访问者?做你自己的LOG文件吧!你仅需做的事情是用PHP计算实际的点击次数,没有错误,没有象'304 Not Modified' 和'Internal Server Error' 一样的错误。
你的代码将生成自己的LOG文件。
<?PHP/* 用户定义变量*/$logfile = "clf.log"; /*LOG文件写到那里*/$timezone = "+0100"; /* Timezone correction */$lookup_size = true; /* 设置文件的权限*/$document_root = "/usr/local/apache/share/htdocs";/* 他可能或不可能对相同的客户端记数* 一定要对$document_root 这个变量进行设置才可以工作*/function write_to_log($str) {if($fd = @fopen($GLOBALS[ "logfile"], "a")) {fputs($fd, $str);fclose($fd);}}function get_var($name,$default) {if($var = getenv($name)) {return $var;} else {return $default;}}if($remote_host = get_var( "REMOTE_HOST", false)) { $remote_host = get_var( "REMOTE_ADDR", "-");}$remote_user = get_var( "REMOTE_USER", "-");$remote_ident = get_var( "REMOTE_IDENT", "-"); $server_port = get_var( "SERVER_PORT", 80);if($server_port!=80) {$server_port = ":" . $server_port;} else {$server_port = "";}$server_name = get_var( "SERVER_NAME", "-"); $request_method = get_var( "REQUEST_METHOD", "GET"); $request_uri = get_var( "REQUEST_URI", "");$user_agent = get_var( "HTTP_USER_AGENT", "");if($lookup_size == true && $document_root) {$filename = ereg_replace( "?.*", "", $request_uri);$filename = "$document_root$filename";if(!$size = filesize($filename)) {$size = 0;}} else {$size = 0;}$date = gmdate( "d/M/Y:H:i:s");$log = "$remote_host $remote_ident $remote_user [$date $timezone] "". "$request_method http://$server_name$server_port$request_uri" 200 $sizen"; write_to_log($log);?>`。
如何制作html文件
如何制作html文件
对于刚学习网站开发的小伙伴来说,掌握了比较简单的HTML语言基础后,会迫不及待地想着手制作自己的第一个html文件。
那你知道如何制作html文件吗?下面是由店铺分享的如何制作html文件的方法,希望对你有用。
制作html文件的步骤
在电脑桌面或者在文件夹中点击:鼠标右键-->新建-->文本文档,一般新建好的文档名字叫“新建文本文档.txt”。
如果您创建的文档没有后缀名“txt”,请不要急,下面的步骤将教您如何显示“txt”后缀名。
在文件资源管理器中点击:工具-->文件夹选项。
初始是“常规”卡,切换到“查看“卡,拖动滚动条,找到”隐藏已知文件类型的扩展名“,去掉单选框的钩,点击确认。
这样就会有后缀名显示了。
双击“新建文本文档.txt”,可以写入代码如图所示:
右键“新建文本文档.txt”-->重命名,将文件改名为“helloWorld.html”。
将弹出一个警告框:
点击确认。
如果你设置有默认浏览器,文档图标将变成浏览器图标,然后双击”helloWorld.html“,显示出第一个html网页。
大功告成,如果您想在第一个网页里面加入css、js代码,或者引入js文件等问题,可以为我投票,然后提问,我可以帮你解答。
请不要吝啬您的赞哟!
以上是店铺与大家分享的如何制作html文件,希望能给大家带来帮助!。
HTMLTestRunner生成测试报告
HTMLTestRunner⽣成测试报告1、测试报告⽣成案例2、测试报告⽣成代码1# -*- coding: UTF-8 -*-2"""3A TestRunner for use with the Python unit testing framework. It4generates a HTML report to show the result at a glance.5The simplest way to use this is to invoke its main method. E.g.6 import unittest7 import HTMLTestRunner8 ... define your tests ...9 if __name__ == '__main__':10 HTMLTestRunner.main()11For more customization options, instantiates a HTMLTestRunner object.12HTMLTestRunner is a counterpart to unittest's TextTestRunner. E.g.13 # output to a file14 fp = file('my_report.html', 'wb')15 runner = HTMLTestRunner.HTMLTestRunner(16 stream=fp,17 title='My unit test',18 description='This demonstrates the report output by HTMLTestRunner.'19 )20 # Use an external stylesheet.21 # See the Template_mixin class for more customizable options22 runner.STYLESHEET_TMPL = '<link rel="stylesheet" href="my_stylesheet.css" type="text/css">'23 # run the test24 runner.run(my_test_suite)25------------------------------------------------------------------------26Copyright (c) 2004-2007, Wai Yip Tung27All rights reserved.28Redistribution and use in source and binary forms, with or without29modification, are permitted provided that the following conditions are30met:31* Redistributions of source code must retain the above copyright notice,32 this list of conditions and the following disclaimer.33* Redistributions in binary form must reproduce the above copyright34 notice, this list of conditions and the following disclaimer in the35 documentation and/or other materials provided with the distribution.36* Neither the name Wai Yip Tung nor the names of its contributors may be37 used to endorse or promote products derived from this software without38 specific prior written permission.39THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 40IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED41TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A42PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 43OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,44EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,45PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR46PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 47LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING48NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS49SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.50"""5152# URL: /software/HTMLTestRunner.html53# URL: https:///Gelomen/HTMLTestReportCN-ScreenShot5455__author__ = "Wai Yip Tung, Findyou, boafantasy, Gelomen"56__version__ = "1.2.0"5758"""59Change History60Version 1.2.0 -- Gelomen61* 优化⽤例说明显⽰62* 错误和失败报告⾥可以放⼊多张截图63Version 1.1.0 -- Gelomen64* 优化报告截图写⼊⽅式65Version 1.0.2 -- Gelomen66* 新增测试结果统计饼图67* 优化筛选时只显⽰预览68Version 1.0.1 -- Gelomen69* 修复报告存⼊⽂件夹的bug70* 优化报告的命名⽅式71Version 1.0.0 -- Gelomen72* 修改测试报告⽂件夹路径的获取⽅式73* 修改截图获取⽂件夹路径的获取⽅式74Version 0.9.9 -- Gelomen75* 优化报告⽂件夹命名76* 优化截图存放的⽬录77* 增加图⽚阴影边框以突出图⽚78* 优化失败⽤例合集和错误⽤例合集显⽰的颜⾊79Version 0.9.8 -- Gelomen80* 优化回到顶部按钮的显⽰⽅式81Version 0.9.7 -- Gelomen82* 优化截图显⽰,滚动页⾯会固定居中83Version 0.9.6 -- Gelomen84* 新增打开图⽚的特效,可以直接在当前页⾯看截图85Version 0.9.5 -- Gelomen86* heading新增失败和错误测试⽤例合集87Version 0.9.4 -- Gelomen88* 修复失败和错误⽤例⾥对应按钮的颜⾊89Version 0.9.3 -- Gelomen90* 修复点击失败或错误按钮后,浏览器版本和截图的列不会隐藏的bug91Version 0.9.2 -- Gelomen92* 美化浏览器版本和截图的显⽰93Version 0.9.1 -- Gelomen94* 使⽤UI⾃动化测试时,增加错误、失败详细信息的浏览器类型和版本95Version 0.9.0 -- Gelomen96* 可通过 `need_screenshot=1` 作为开关,将报告开启截图功能97* 增加失败和错误详细信息的截图链接98Version 0.8.4 -- Gelomen99* 删除失败模块的显⽰100Version 0.8.3 -- Gelomen101* 修复测试结果的筛选102* 优化失败、错误⼩图标的颜⾊103* 增加表格最后⼀列的显⽰,以美化表格104Version 0.8.2.1 -Findyou105* 改为⽀持python3106Version 0.8.2.1 -Findyou107* ⽀持中⽂,汉化108* 调整样式,美化(需要连⼊⽹络,使⽤的百度的Bootstrap.js)109* 增加通过分类显⽰、测试⼈员、通过率的展⽰110* 优化“详细”与“收起”状态的变换111* 增加返回顶部的锚点112Version 0.8.2113* Show output inline instead of popup window (Viorel Lupu).114Version in 0.8.1115* Validated XHTML (Wolfgang Borgert).116* Added description of test classes and test cases.117Version in 0.8.0118* Define Template_mixin class for customization.119* Workaround a IE 6 bug that it does not treat <script> block as CDATA. 120Version in 0.7.1121* Back port to Python 2.3 (Frank Horowitz).122* Fix missing scroll bars in detail log (Podi).123"""124125# TODO: color stderr126# TODO: simplify javascript using ,ore than 1 class in the class attribute? 127128import datetime129import io130import time131import unittest132from xml.sax import saxutils133import sys134import os135import re136137# 全局变量 -- Gelomen138 _global_dict = {}139140141# 让新建的报告⽂件夹路径存⼊全局变量 -- Gelomen142class GlobalMsg(object):143def__init__(self):144global _global_dict145 _global_dict = {}146147 @staticmethod148def set_value(name, value):149 _global_dict[name] = value150151 @staticmethod152def get_value(name):153try:154return _global_dict[name]155except KeyError:156return None157158159# ------------------------------------------------------------------------160# The redirectors below are used to capture output during testing. Output 161# sent to sys.stdout and sys.stderr are automatically captured. However 162# in some cases sys.stdout is already cached before HTMLTestRunner is 163# invoked (e.g. calling logging.basicConfig). In order to capture those164# output, use the redirectors for the cached stream.165#166# e.g.167# >>> logging.basicConfig(stream=HTMLTestRunner.stdout_redirector) 168# >>>169170171class OutputRedirector(object):172""" Wrapper to redirect stdout or stderr """173174def__init__(self, fp):175 self.fp = fp176177def write(self, s):178 self.fp.write(s)179180def writelines(self, lines):181 self.fp.writelines(lines)182183def flush(self):184 self.fp.flush()185186187 stdout_redirector = OutputRedirector(sys.stdout)188 stderr_redirector = OutputRedirector(sys.stderr)189190191# ----------------------------------------------------------------------192# Template193194195class Template_mixin(object):196"""197 Define a HTML template for report customerization and generation.198 Overall structure of an HTML report199 HTML200 +------------------------+201 |<html> |202 | <head> |203 | |204 | STYLESHEET |205 | +----------------+ |206 | | | |207 | +----------------+ |208 | |209 | </head> |210 | |211 | <body> |212 | |213 | HEADING |214 | +----------------+ |215 | | | |216 | +----------------+ |217 | |218 | REPORT |219 | +----------------+ |220 | | | |221 | +----------------+ |222 | |223 | ENDING |224 | +----------------+ |225 | | | |226 | +----------------+ |227 | |228 | </body> |229 |</html> |230 +------------------------+231"""232233 STATUS = {234 0: '通过',235 1: '失败',236 2: '错误',237 }238239 DEFAULT_TITLE = 'UI测试报告'240 DEFAULT_DESCRIPTION = ''241 DEFAULT_TESTER = '华'242243# ------------------------------------------------------------------------244# HTML Template245246 HTML_TMPL = r"""<?xml version="1.0" encoding="UTF-8"?>247<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "/TR/xhtml1/DTD/xhtml1-strict.dtd"> 248<html xmlns="/1999/xhtml">249<head>250 <title>%(title)s</title>251 <meta name="generator" content="%(generator)s"/>252 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>253 <link href="/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet"> 254 <script src="/jquery/2.0.0/jquery.min.js"></script>255 <script src="/bootstrap/3.0.3/js/bootstrap.min.js"></script>256 <script src="https:///highcharts/highcharts.js"></script>257 <script src="https:///highcharts/modules/exporting.js"></script>258 %(stylesheet)s259</head>260<body >261<script language="javascript" type="text/javascript">262 $(function(){263 // 修改失败和错误⽤例⾥对应按钮的颜⾊ClassName为动态加载 -- Gelomen264 $("button").each(function () {265 var text = $(this).text();266 if(text == "失败"){267 $(this).addClass("btn-danger")268 }else if(text == "错误") {269 $(this).addClass("btn-warning")270 }271 });272 // 给失败和错误合集加样式 -- Gelomen273 var p_attribute = $("p.attribute");274 p_attribute.eq(4).addClass("failCollection");275 p_attribute.eq(5).addClass("errorCollection");276 // 打开截图,放⼤,点击任何位置可以关闭图⽚ -- Gelomen277 $(".screenshot").click(function(){278 var img = $(this).attr("img");279 $('.pic_show img').attr('src', img);280 $('.pic_looper').fadeIn(200);281 $('.pic_show').fadeIn(200);282 var browserHeight = $(window).height();283 var pic_boxHeight = $(".pic_box").height();284 var top = (browserHeight - pic_boxHeight)/2;285 $('.pic_box').css("margin-top", top + "px")286 });287 $('.pic_looper, .pic_show').click(function(){288 $('.pic_looper').fadeOut(200);289 $('.pic_show').fadeOut(200)290 });291 var browserWidth = $(window).width();292 var margin_left = browserWidth/2 - 450;293 if(margin_left <= 240){294 $("#container").css("margin", "auto");295 }else {296 $("#container").css("margin-left", margin_left + "px");297 }298 $(window).resize(function(){299 // 改变窗⼝⼤⼩时,⾃动改变图⽚与顶部的距离 -- Gelomen300 var browserHeight = $(window).height();301 var pic_boxHeight = $(".pic_box").height();302 var top = (browserHeight - pic_boxHeight)/2;303 $('.pic_box').css("margin-top", top + "px");304 // 改变窗⼝⼤⼩时,⾃动改变饼图的边距 -- Gelomen305 var browserWidth = $(window).width();306 var margin_left = browserWidth/2 - 450;307 if(margin_left <= 240){308 $("#container").css("margin", "auto");309 }else {310 $("#container").css("margin-left", margin_left + "px");311 }312 });313 // 距离顶部超过浏览器窗⼝⼀屏时,回到顶部按钮才出现 -- Gelomen314 $(window).scroll(function(){315 var browserHeight = $(window).height();316 var top = $(window).scrollTop();317 if(top >= browserHeight){318 $("#toTop").css("display", "block")319 }else {320 $("#toTop").css("display", "none")321 }322 })323 // 增加回到顶部过程的动画,以看上去不会那么⽣硬 -- Gelomen324 $("#toTop").click(function() {325 $("html,body").animate({"scrollTop":0}, 700)326 })327 // 增加饼状图 -- Gelomen328 $('#container').highcharts({329 chart: {330 plotBackgroundColor: null,331 plotBorderWidth: null,332 plotShadow: false,333 spacing : [0, 0, 0, 0]334 },335 credits: {336 enabled: false337 },338 navigation: {339 buttonOptions: {340 enabled: false341 }342 },343 title: {344 floating:true,345 text: '测试结果占⽐'346 },347 tooltip: {348 pointFormat: '{}: <b>{point.percentage:.1f}%%</b>'349 },350 plotOptions: {351 pie: {352 allowPointSelect: true,353 cursor: 'pointer',354 colors: ['#81ca9d', '#f16d7e', '#fdc68c'],355 dataLabels: {356 enabled: true,357 format: '<b>{}</b>: {point.percentage:.1f} %%',358 style: {359 color: (Highcharts.theme && Highcharts.theme.contrastTextColor) || 'black' 360 }361 },362 point: {363 events: {364 mouseOver: function(e) { // ⿏标滑过时动态更新标题365 chart.setTitle({366 text: + '\t'+ e.target.y + ' 个'367 });368 }369 }370 }371 }372 },373 series: [{374 type: 'pie',375 innerSize: '80%%',376 name: '⽐例',377 data: [378 ['通过', %(Pass)s],379 {380 name: '失败',381 y: %(fail)s,382 sliced: true,383 selected: true384 },385 ['错误', %(error)s]386 ]387 }]388 }, function(c) {389 // 环形图圆⼼390 var centerY = c.series[0].center[1],391 titleHeight = parseInt(c.title.styles.fontSize);392 c.setTitle({393 y:centerY + titleHeight/2394 });395 chart = c;396 });397 // 查看失败和错误合集链接⽂字切换 -- Gelomen398 $(".showDetail").click(function () {399 if($(this).html() == "点击查看"){400 $(this).html("点击收起")401 }else {402 $(this).html("点击查看")403 }404 })405 });406output_list = Array();407/*level 调整增加只显⽰通过⽤例的分类 --Findyou / 修复筛选显⽰bug --Gelomen 4080:Summary //all hiddenRow4091:Failed //pt&et hiddenRow, ft none4102:Pass //pt none, ft&et hiddenRow4113:Error //pt&ft hiddenRow, et none4124:All //all none413*/414function showCase(level) {415 trs = document.getElementsByTagName("tr");416 for (var i = 0; i < trs.length; i++) {417 tr = trs[i];418 id = tr.id;419 if (id.substr(0,2) == 'ft') {420 if (level == 2 || level == 0 || level == 3) {421 tr.className = 'hiddenRow';422 }423 else {424 tr.className = '';425 // 切换筛选时只显⽰预览 -- Gelomen426 $("div[id^='div_ft']").attr("class", "collapse");427 $("div[id^='div_et']").attr("class", "collapse");428 }429 }430 if (id.substr(0,2) == 'pt') {431 if (level == 1 || level == 0 || level == 3) {432 tr.className = 'hiddenRow';433 }434 else {435 tr.className = '';436 // 切换筛选时只显⽰预览 -- Gelomen437 $("div[id^='div_ft']").attr("class", "collapse");438 $("div[id^='div_et']").attr("class", "collapse");439 }440 }441 if (id.substr(0,2) == 'et') {442 if (level == 1 || level == 0 || level == 2) {443 tr.className = 'hiddenRow';444 }445 else {446 tr.className = '';447 // 切换筛选时只显⽰预览 -- Gelomen448 $("div[id^='div_ft']").attr("class", "collapse");449 $("div[id^='div_et']").attr("class", "collapse");450 }451 }452 }453 //加⼊【详细】切换⽂字变化 --Findyou454 detail_class=document.getElementsByClassName('detail');455 //console.log(detail_class.length)456 if (level == 3) {457 for (var i = 0; i < detail_class.length; i++){458 detail_class[i].innerHTML="收起"459 }460 }461 else{462 for (var i = 0; i < detail_class.length; i++){463 detail_class[i].innerHTML="详细"464 }465 }466}467function showClassDetail(cid, count) {468 var id_list = Array(count);469 var toHide = 1;470 for (var i = 0; i < count; i++) {471 //ID修改点为下划线 -Findyou472 tid0 = 't' + cid.substr(1) + '_' + (i+1);473 tid = 'f' + tid0;474 tr = document.getElementById(tid);475 if (!tr) {476 tid = 'p' + tid0;477 tr = document.getElementById(tid);478 if (!tr) {479 tid = 'e' + tid0;480 tr = document.getElementById(tid);481 }482 }483 id_list[i] = tid;484 if (tr.className) {485 toHide = 0;486 }487 }488 for (var i = 0; i < count; i++) {489 tid = id_list[i];490 //修改点击⽆法收起的BUG,加⼊【详细】切换⽂字变化 --Findyou 491 if (toHide) {492 document.getElementById(tid).className = 'hiddenRow';493 document.getElementById(cid).innerText = "详细"494 }495 else {496 document.getElementById(tid).className = '';497 document.getElementById(cid).innerText = "收起"498 }499 }500}501function html_escape(s) {502 s = s.replace(/&/g,'&');503 s = s.replace(/</g,'<');504 s = s.replace(/>/g,'>');505 return s;506}507</script>508%(heading)s509%(report)s510%(ending)s511</body>512</html>513"""514# variables: (title, generator, stylesheet, heading, report, ending)515516# ------------------------------------------------------------------------517# Stylesheet518#519# alternatively use a <link> for external style sheet, e.g.520# <link rel="stylesheet" href="$url" type="text/css">521522 STYLESHEET_TMPL = """523<style type="text/css" media="screen">524body { font-family: Microsoft YaHei;padding: 20px; font-size: 100%; } 525table { font-size: 100%; }526.table tbody tr td{527 vertical-align: middle;528 }529/* -- heading ---------------------------------------------------------------------- */ 530.heading .description, .attribute {531 clear: both;532}533/* --- 失败和错误合集样式 -- Gelomen --- */534.failCollection, .errorCollection {535 width: 100px;536 float: left;537}538#failCaseOl li {539 color: red540}541#errorCaseOl li {542 color: orange543}544/* --- 打开截图特效样式 -- Gelomen --- */545.data-img{546 cursor:pointer547}548.pic_looper{549 width:100%;550 height:100%;551 position: fixed;552 left: 0;553 top:0;554 opacity: 0.6;555 background: #000;556 display: none;557 z-index: 100;558}559.pic_show{560 width:100%;561 position:fixed;562 left:0;563 top:0;564 right:0;565 bottom:0;566 margin:auto;567 text-align: center;568 display: none;569 z-index: 100;570}571.pic_box{572 padding:10px;573 width:90%;574 height:90%;575 margin:40px auto;576 text-align: center;577 overflow: hidden;578}579.pic_box img{580 width: auto;581 height: 100%;582 -moz-box-shadow: 0px 0px 20px 0px #000;583 -webkit-box-shadow: 0px 0px 20px 0px #000;584 box-shadow: 0px 0px 20px 0px #000;585}586/* --- 饼状图div样式 -- Gelomen --- */587#container {588 width: 450px;589 height: 300px;590 float: left;591}592/* -- report ------------------------------------------------------------------------ */ 593#total_row { font-weight: bold; }594.passCase { color: #5cb85c; }595.failCase { color: #d9534f; font-weight: bold; }596.errorCase { color: #f0ad4e; font-weight: bold; }597.hiddenRow { display: none; }598.testcase { margin-left: 2em; }599.screenshot:link { text-decoration: none;color: deeppink; }600.screenshot:visited { text-decoration: none;color: deeppink; }601.screenshot:hover { text-decoration: none;color: darkcyan; }602.screenshot:active { text-decoration: none;color: deeppink; }603</style>604"""605606# ------------------------------------------------------------------------607# Heading608#609610# 添加显⽰截图和饼状图的div -- Gelomen611 HEADING_TMPL = """<div class='pic_looper'></div> <div class='pic_show'><div class='pic_box'><img src=''/></div> </div> 612<div class='heading'>613<div style="width: 650px; float: left;">614 <h2 style="font-family: Microsoft YaHei">%(title)s</h2>615 <font size="1">%(parameters)s</font>616 <p class='description'><strong><font size="1">%(description)s</font></strong></p>617</div>618<div id="container"></div>619</div>620"""# variables: (title, parameters, description)621622 HEADING_ATTRIBUTE_TMPL = """<p class='attribute'><strong>%(name)s:</strong> %(value)s </p>623"""# variables: (name, value)624625# ------------------------------------------------------------------------626# Report627#628# 汉化,加美化效果 --Findyou629 REPORT_TMPL = """630<div style="width: 550px; clear: both;">631<p id='show_detail_line'>632<a class="btn btn-primary" href='javascript:showCase(0)'>概要:[ %(passrate)s ]</a>633<a class="btn btn-success" href='javascript:showCase(2)'>通过:[ %(Pass)s ]</a>634<a class="btn btn-danger" href='javascript:showCase(1)'>失败:[ %(fail)s ]</a>635<a class="btn btn-warning" href='javascript:showCase(3)'>错误:[ %(error)s ]</a>636<a class="btn btn-info" href='javascript:showCase(4)'>所有:[ %(count)s ]</a>637</p>638</div>639<table id='result_table' class="table table-condensed table-bordered table-hover">640<colgroup>641<col align='left' style="width: 300px;"/>642<col align='right' style="width: 300px;"/>643<col align='right' />644<col align='right' />645<col align='right' />646<col align='right' />647<col align='right' />648<col align='right' style="width: 200px;"/>649</colgroup>650<tr id='header_row' class="text-center success" style="font-weight: bold;font-size: 14px;">651 <td>⽤例集/测试⽤例</td>652 <td>说明</td>653 <td>总计</td>654 <td>通过</td>655 <td>失败</td>656 <td>错误</td>657 <td>耗时</td>658 <td>详细</td>659</tr>660%(test_list)s661<tr id='total_row' class="text-center active">662 <td colspan='2'>总计</td>663 <td>%(count)s</td>664 <td>%(Pass)s</td>665 <td>%(fail)s</td>666 <td>%(error)s</td>667 <td>%(time_usage)s</td>668 <td>通过率:%(passrate)s</td>669</tr>670</table>671"""# variables: (test_list, count, Pass, fail, error ,passrate)672673 REPORT_CLASS_TMPL = r"""674<tr class='%(style)s warning'>675 <td class="text-center">%(name)s</td>676 <td>%(doc)s</td>677 <td class="text-center">%(count)s</td>678 <td class="text-center">%(Pass)s</td>679 <td class="text-center">%(fail)s</td>680 <td class="text-center">%(error)s</td>681 <td class="text-center">%(time_usage)s</td>682 <td class="text-center"><a href="javascript:showClassDetail('%(cid)s',%(count)s)" class="detail" id='%(cid)s'>详细</a></td>683</tr>684"""# variables: (style, desc, count, Pass, fail, error, cid)685686# 失败的样式,去掉原来JS效果,美化展⽰效果 -Findyou / 美化类名上下居中,有截图列 -- Gelomen687 REPORT_TEST_WITH_OUTPUT_TMPL_1 = r"""688<tr id='%(tid)s' class='%(Class)s'>689 <td class='%(style)s' style="vertical-align: middle"><div class='testcase'>%(name)s</div></td>690 <td style="vertical-align: middle">%(doc)s</td>691 <td colspan='5' align='center'>692 <!--默认收起错误信息 -Findyou693 <button id='btn_%(tid)s' type="button" class="btn btn-xs collapsed" data-toggle="collapse" data-target='#div_%(tid)s'>%(status)s</button>694 <div id='div_%(tid)s' class="collapse"> -->695 <!-- 默认展开错误信息 -Findyou / 修复失败按钮的颜⾊ -- Gelomen -->696 <button id='btn_%(tid)s' type="button" class="btn btn-xs" data-toggle="collapse" data-target='#div_%(tid)s,#div_%(tid)s_screenshot'>%(status)s </button>697 <div id='div_%(tid)s' class="collapse in">698 <pre style="text-align:left">699 %(script)s700 </pre>701 </div>702 </td>703 <td class="text-center" style="vertical-align: middle"><div id='div_%(tid)s_screenshot' class="collapse in">浏览器版本:<div style="color: brown;" >%(browser)s</div></br>截图:%(screenshot)s</div></td>704</tr>705"""# variables: (tid, Class, style, desc, status)706707# 失败的样式,去掉原来JS效果,美化展⽰效果 -Findyou / 美化类名上下居中,⽆截图列 -- Gelomen708 REPORT_TEST_WITH_OUTPUT_TMPL_0 = r"""709 <tr id='%(tid)s' class='%(Class)s'>710 <td class='%(style)s' style="vertical-align: middle"><div class='testcase'>%(name)s</div></td>711 <td style="vertical-align: middle">%(doc)s</td>712 <td colspan='5' align='center'>713 <!--默认收起错误信息 -Findyou714 <button id='btn_%(tid)s' type="button" class="btn btn-xs collapsed" data-toggle="collapse" data-target='#div_%(tid)s'>%(status)s</button>715 <div id='div_%(tid)s' class="collapse"> -->716 <!-- 默认展开错误信息 -Findyou / 修复失败按钮的颜⾊ -- Gelomen -->717 <button id='btn_%(tid)s' type="button" class="btn btn-xs" data-toggle="collapse" data-target='#div_%(tid)s'>%(status)s</button>718 <div id='div_%(tid)s' class="collapse in">719 <pre style="text-align:left">720 %(script)s721 </pre>722 </div>723 </td>724 <td class='%(style)s' style="vertical-align: middle"></td>725 </tr>726"""# variables: (tid, Class, style, desc, status)727728# 通过的样式,加标签效果 -Findyou / 美化类名上下居中 -- Gelomen729 REPORT_TEST_NO_OUTPUT_TMPL = r"""730<tr id='%(tid)s' class='%(Class)s'>731 <td class='%(style)s' style="vertical-align: middle"><div class='testcase'>%(name)s</div></td>732 <td style="vertical-align: left">%(doc)s</td>733 <td colspan='5' align='center'><span class="label label-success success">%(status)s</span></td>734 <td class='%(style)s' style="vertical-align: middle"></td>735</tr>736"""# variables: (tid, Class, style, desc, status)737738 REPORT_TEST_OUTPUT_TMPL = r"""739%(id)s: %(output)s740"""# variables: (id, output)741742# ------------------------------------------------------------------------。
pytest运行测试类,以及生成报告并且生产html文件
pytest运⾏测试类,以及⽣成报告并且⽣产html⽂件import pytestfrom Lib.taxBeauty.login import Loginfrom untils.getYamlData import get_yaml_dataimport allure@allure.feature('登录模块')class TestTaxBeautyLogin:data=[get_yaml_data()['shuimeiren'],get_yaml_data()['shuimeiren'],]@pytest.mark.parametrize('para',data)@allure.story('登录')def test_login(self,para):res = Login().checkUser(para)assert res['state'] == 0if__name__ == '__main__':import ospytest.main(['test_appEdition.py', '-s', '-k', 'test', '--alluredir', f'{os.path.dirname(os.path.dirname(os.path.dirname(__file__)))}/report/apiReport/tep']) #'-s':打印出代码中的print信息。
'-k', 'test',:-k模糊搜索。
搜索包含test的⽅法。
'--alluredir',f'{os.path.dirname(os.path.dirname(os.path.dirname(__file__)))}/report/apiReport/tep':⽣成allure报告的地址os.system('allure serve ../../report/apiReport/tep')#⾃动起服务,打开allure报告或者⽣成html报告# os.system('allure generate allure报告⽂件地址 -o ⽣成报告的值')tep= f'{os.path.dirname(os.path.dirname(os.path.dirname(__file__)))}/report/apiReport/tep'html = f'{os.path.dirname(os.path.dirname(os.path.dirname(__file__)))}/report/apiReport/html'os.system(f'allure generate {tep} -o {html}')第⼆种在控制台:1.⽣成allure报告2.起服务3.⽣成html报告。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3、获取Log文件 31.选”FILE”>“Saveas”
32.选择Log文件的存储路径,并存储。
33.存储后的Log文件为*.log文件。缺省文件名为 SBDiagnostics.log。文件可使用windows记事本程序打开,示例如 下:
பைடு நூலகம்
SB480 Log文件及html格式的报告文件生成方法
1、确认所需检测的SMART交互设备已成功连接至电脑。鼠标移 至右下角,右键单击“SMARTBoard工具图标”。 显示SMARTBoard菜单,选择“控制面板”(Controlpanel)。
2、显示控制面板界面选中“工具”(Tools)栏后,左键 单击“诊断”(Diagnostics)。
4、ReportLog,即本地计算机和所连接的SMART交互式设备信息 41.选”Report”>“Local” >“Saveas”
42.选择ReportLog文件的存储路径,并存储。
43.存储后的ReportLog文件为*.html文件。缺省文件名 ReportLog.html。文件示例如下: