整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

如何用python生成简单的html report报告

提:

用python写了一个简单的log分析,主要也就是查询一些key,value出来,后面也可以根据需求增加。查询出来后,为了好看,搞个html 表格来显示。

需要的组件: jinja2 flask 的模板。

先说下设计思路,主要是练习python代码玩,高手略过

模拟scrapy,搞个管线


每个管线分预处理,分析器,和后处理。预处理的话,可以筛选下数据,分析器提取关键信息,然后把结果丢给后处理。html报表就是在后处理生成。

再搞个manger类,管理很多个管线,虽然现在单路pipeLine就完成了,说不定以后还能扩展呢。



我们可以定义预处理,比如过滤一些不关注的关键字,或者关注一些特定关键字的行


预处理的话,只处理QtiDCT-C关键字的日志行。

然后把经过预处理后的数据丢给分析器

主要查询行数据行里面是否有keyword,然后根据分隔符,和结束符来提取内容

keyword delimiter xxxxxendwith 这样个模式

获取最终结果存储到字典里面 result[keyword]=xxxx。这里会trim,去掉 \r\n.

这样就有了结果集result.最后丢给posthandler 后处理。完成报表输出。


后处理主要是用jinja2的模板,然后传递参数,生成最终的html文件。

这里的jinja_template.temple, 内容如下



有了模板,就可以在渲染模板的时候提供字典,变量,在模板里面显示。最终完成报表的输出。


最终使用


最终在main 方法中,通过-d参数传入log所在目录,然后迭代所有的文件,使用input 把文本文件转换成行数据的list,丢给管线,最后把管线丢给manager,调用process ,完成txt日志的分析,到最后html的生产。

码功能:

每周一、每周五会有一个shell从数据库中查询相关数据统计报告到一个record记录中,这个python程序就是负责分析record并以表格形式发送邮件给相关人员。

用的时候需要修改的地方:file_mon/file_fri 这两个文件路径,还有发送邮件的邮件服务器账号密码,以及收件人列表

效果预览:正常状态(复制代码时注意缩进,头条这个地方比较坑,发的时候是带缩进的,但是发布成功缩进就没了)

非正常状态,邮件中会提示异常原因(检测爬虫采集数据的变化量)

正常状态请点击此处输入图片描述

# -*- coding:utf-8 -*-
import os
from datetime import datetime, time
from datetime import timedelta
from email.mime.multipart import MIMEMultipart
from email.mime.multipart import MIMEBase
from email.mime.text import MIMEText
import smtplib
"""
 AUTHOR: tommy.yu
 Email: xxx 下面str_mon/str_fri 分别是每周一跟每周五记录的数据格式,放到服务器上的时候就可以用文件来记录,这里方便调试用的变量
"""
str_mon = "2123332,11,2017-12-16 10:00:00,2017-12-16 10:00:11"
str_fri = "8804324,2223332,11,2017-12-18 10:00:00,2017-12-19 10:00:11"
file_mon = "/mnt/167_tmp/data_Monday"
file_fri = "/mnt/167_tmp/data_Friday"
if os.path.exists(file_mon):
str_mon = open(file_mon).read().split("\n")[1]
else:
print("%s不存在" % file_mon)
if os.path.exists(file_fri):
str_fri = open(file_fri).read().split("\n")[1]
else:
print("%s不存在" % file_fri)
now = datetime.now()
list_mon = str_mon.split(",")
list_fri = str_fri.split(",")
# 周一统计的url提交数量
data_mon = list_mon[0]
# 周五统计的url提交数量
data_fri = list_fri[1]
# 本周工作日提交数量
data_diff = int(data_fri) - int(data_mon)
if len(list_fri) == 5:
# 舆情临时库记录总量
content = list_fri[0]
# 获取从数据库中查出来的最近记录写入时间
end = list_fri[3].split(" ")[0]
# 获取当前周的周五
# 0,1,2,3,4,5,6 分别代表周一到周日
cur_monday = now - timedelta(datetime.now().weekday() - 0)
cur_friday = now - timedelta(datetime.now().weekday() - 4)
monday = cur_monday.strftime("%Y-%m-%d")
friday = cur_friday.strftime("%Y-%m-%d")
print("时间范围:%s~%s" % (monday, friday))
if friday != end:
spider_status = "异常"
weekday = now.strftime("%A")
spider_status_content = "异常原因:爬虫状态不正常,数据库中存储的最近一条信息创建时间为: " + str(list_fri[3]) + " 当前时间为: " + str(now) + weekday
else:
spider_status = "正常"
spider_status_content = ""
print("爬虫状态正常")
def send_mail(to_list, sub):
me = mail_user
msg = MIMEMultipart()
msg['Subject'] = sub
msg['From'] = me
msg['To'] = ",".join(to_list)
# 构造html
html = """\
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>运维日常数据统计报告</title>
<body>
<div id="container">
 <p><strong>运维日常数据统计报告</strong></p>
 <p>采集时间: """ + monday + "~" + friday + """</p>
 <div id="content">
 <table border="1" bordercolor="black" >
 <tr>
 <td>舆情临时库记录总量(截止到周末的数量)</td>
 <td>关键词导入状态</td>
 <td>URL提交数量(周一)</td>
 <td>URL提交数量(周五)</td>
 <td>本周提交url总数</td>
 <td>本周工作日平均url数量</td>
 </tr>
 <tr>
 <td>""" + content + """</td>
 <td>""" + spider_status + """</td>
 <td>""" + data_mon + """</td>
 <td>""" + data_fri + """</td>
 <td>""" + str(data_diff) + """</td>
 <td>""" + str(data_diff / 5) + """</td>
 </tr>
</table>
 </div>
</div>
<p><strong>""" + spider_status_content + """</strong> </p>
</div>
</body>
</html>
 """ context = MIMEText(html, _subtype='html', _charset='utf-8') # 解决乱码
msg.attach(context)
try:
send_smtp = smtplib.SMTP()
send_smtp.connect(mail_host)
send_smtp.login(mail_user, mail_pass)
send_smtp.sendmail(me, to_list, msg.as_string())
send_smtp.close()
return True
 except Exception as e:
print(e)
return False
""""""
if __name__ == '__main__':
# 设置服务器名称、用户名、密码以及邮件后缀
mail_host = 'xxx'
mail_user = 'xxx'
mail_pass = '123456'
# mailto_lists = sys.argv[1]
 # mailto_list = mailto_lists.split(',') #发送多人
 # sub= sys.argv[2]
mailto_list = ['xxx@xxx.com', ]
sub = "运维日常数据统计报告--" + "采集时间:" + monday + "~" + friday
# send_mail(mailto_list, sub)
if send_mail(mailto_list, sub):
print("Send Mail Success !!!")
else:
print("Send mail Failed !!!")

欢迎指正。

今天笔者想和大家聊聊Python+selenium自动化生成测试报告,批量执行完用例后,生成的测试报告是文本形式的,不够直观,为了更好的展示测试报告,最好是生成HTML格式的。

unittest里面是不能生成html格式报告的,需要导入一个第三方的模块:HTMLTestRunner

一、导入HTMLTestRunner

1.这个模块下载不能通过pip安装了,只能下载后手动导入。

2.Download下HTMLTestRunner.py文件就是我们需要下载的包。

3.下载后复制到Python安装文件的Lib目录下

二、生成html测试报告

1.这里主要有三个参数:

stream:测试报告写入文件的存储区域

title:测试报告的主题

description:测试报告的描述

2. report_path是存放测试报告的地址

运行脚本后在F盘指定位置就能找到这个测试报告文件,这时候如果文件多了,不知道测试报告在哪天生成的?能否在文件名上显示一个日期和时间呢?当然是可以的

备注:

%Y-%m-%d为年月日

%H-%M为时分 注意:时间之间不能使用冒号(:)因为文件名不能使用冒号

三、测试报告详情

1.找到测试报告文件,用浏览器打开,点开View里的Detail可以查看详情描述。

红框中内容显是英文,我们不能直观看出是什么测试用例,可以在测试代码中添加中文注释,注释前面要加字母u,代码修改如下:

四、再次运行run_all_case脚本文件后,查看HTML测试报告

五 unittest断言

Python在 unittest.TestCase 类中提供了很多断言方法。断言方法检查你认为应该满足的条件是否确实满足。如果该条件确实满足,你对程序行为的假设就得到了确认,你就可以确信其中没有错误。如果你认为应该满足的条件实际上并不满足,Python将引发异常。下表描述了6个常用的断言方法。使用这些方法可核实返回的值等于或不等于预期的值、返回的值为 True 或 False 、返回的值在列表中或不在列表中。你只能在继承 unittest.TestCase 的类中使用这些方法。

unittest常用的断言方法

方法

用途

assertEqual(a, b)

核实 a == b

assertNotEqual(a, b)

核实 a != b

assertTrue(x)

核实 x 为 True

assertFalse(x)

核实 x 为 False

assertIn( item , list )

核实 item 在 list 中

assertNotIn( item , list )

核实 item 不在 list 中

六、unittest常用的断言方法

1.assertEqual(self, first, second, msg=None)

--判断两个参数相等:first == second

2.assertNotEqual(self, first, second, msg=None)

--判断两个参数不相等:first != second

3.assertIn(self, member, container, msg=None)

--判断是字符串是否包含:member in container

4.assertNotIn(self, member, container, msg=None)

--判断是字符串是否不包含:member not in container

5.assertTrue(self, expr, msg=None)

--判断是否为真:expr is True

6.assertFalse(self, expr, msg=None)

--判断是否为假:expr is False

7.assertIsNone(self, obj, msg=None)

--判断是否为None:obj is None

8.assertIsNotNone(self, obj, msg=None)--判断是否不为None:obj is not None

实例:assertEqual(a, b),其它的断言方法请自行尝试)

总结

今天的这篇文章就分享到这里了,喜欢的小伙伴记得点赞评论收藏加关注哟,关注我每天给大家不同的惊喜。