整合營銷服務(wù)商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          如何用python生成簡單的html report報告

          提:

          用python寫了一個簡單的log分析,主要也就是查詢一些key,value出來,后面也可以根據(jù)需求增加。查詢出來后,為了好看,搞個html 表格來顯示。

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

          先說下設(shè)計思路,主要是練習python代碼玩,高手略過

          模擬scrapy,搞個管線


          每個管線分預(yù)處理,分析器,和后處理。預(yù)處理的話,可以篩選下數(shù)據(jù),分析器提取關(guān)鍵信息,然后把結(jié)果丟給后處理。html報表就是在后處理生成。

          再搞個manger類,管理很多個管線,雖然現(xiàn)在單路pipeLine就完成了,說不定以后還能擴展呢。



          我們可以定義預(yù)處理,比如過濾一些不關(guān)注的關(guān)鍵字,或者關(guān)注一些特定關(guān)鍵字的行


          預(yù)處理的話,只處理QtiDCT-C關(guān)鍵字的日志行。

          然后把經(jīng)過預(yù)處理后的數(shù)據(jù)丟給分析器

          主要查詢行數(shù)據(jù)行里面是否有keyword,然后根據(jù)分隔符,和結(jié)束符來提取內(nèi)容

          keyword delimiter xxxxxendwith 這樣個模式

          獲取最終結(jié)果存儲到字典里面 result[keyword]=xxxx。這里會trim,去掉 \r\n.

          這樣就有了結(jié)果集result.最后丟給posthandler 后處理。完成報表輸出。


          后處理主要是用jinja2的模板,然后傳遞參數(shù),生成最終的html文件。

          這里的jinja_template.temple, 內(nèi)容如下



          有了模板,就可以在渲染模板的時候提供字典,變量,在模板里面顯示。最終完成報表的輸出。


          最終使用


          最終在main 方法中,通過-d參數(shù)傳入log所在目錄,然后迭代所有的文件,使用input 把文本文件轉(zhuǎn)換成行數(shù)據(jù)的list,丟給管線,最后把管線丟給manager,調(diào)用process ,完成txt日志的分析,到最后html的生產(chǎn)。

          碼功能:

          每周一、每周五會有一個shell從數(shù)據(jù)庫中查詢相關(guān)數(shù)據(jù)統(tǒng)計報告到一個record記錄中,這個python程序就是負責分析record并以表格形式發(fā)送郵件給相關(guān)人員。

          用的時候需要修改的地方:file_mon/file_fri 這兩個文件路徑,還有發(fā)送郵件的郵件服務(wù)器賬號密碼,以及收件人列表

          效果預(yù)覽:正常狀態(tài)(復(fù)制代碼時注意縮進,頭條這個地方比較坑,發(fā)的時候是帶縮進的,但是發(fā)布成功縮進就沒了)

          非正常狀態(tài),郵件中會提示異常原因(檢測爬蟲采集數(shù)據(jù)的變化量)

          正常狀態(tài)請點擊此處輸入圖片描述

          # -*- 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 分別是每周一跟每周五記錄的數(shù)據(jù)格式,放到服務(wù)器上的時候就可以用文件來記錄,這里方便調(diào)試用的變量
          """
          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(",")
          # 周一統(tǒng)計的url提交數(shù)量
          data_mon = list_mon[0]
          # 周五統(tǒng)計的url提交數(shù)量
          data_fri = list_fri[1]
          # 本周工作日提交數(shù)量
          data_diff = int(data_fri) - int(data_mon)
          if len(list_fri) == 5:
          # 輿情臨時庫記錄總量
          content = list_fri[0]
          # 獲取從數(shù)據(jù)庫中查出來的最近記錄寫入時間
          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 = "異常原因:爬蟲狀態(tài)不正常,數(shù)據(jù)庫中存儲的最近一條信息創(chuàng)建時間為: " + str(list_fri[3]) + " 當前時間為: " + str(now) + weekday
          else:
          spider_status = "正常"
          spider_status_content = ""
          print("爬蟲狀態(tài)正常")
          def send_mail(to_list, sub):
          me = mail_user
          msg = MIMEMultipart()
          msg['Subject'] = sub
          msg['From'] = me
          msg['To'] = ",".join(to_list)
          # 構(gòu)造html
          html = """\
          <html xmlns="http://www.w3.org/1999/xhtml">
          <head>
          <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
          <title>運維日常數(shù)據(jù)統(tǒng)計報告</title>
          <body>
          <div id="container">
           <p><strong>運維日常數(shù)據(jù)統(tǒng)計報告</strong></p>
           <p>采集時間: """ + monday + "~" + friday + """</p>
           <div id="content">
           <table border="1" bordercolor="black" >
           <tr>
           <td>輿情臨時庫記錄總量(截止到周末的數(shù)量)</td>
           <td>關(guān)鍵詞導(dǎo)入狀態(tài)</td>
           <td>URL提交數(shù)量(周一)</td>
           <td>URL提交數(shù)量(周五)</td>
           <td>本周提交url總數(shù)</td>
           <td>本周工作日平均url數(shù)量</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__':
          # 設(shè)置服務(wù)器名稱、用戶名、密碼以及郵件后綴
          mail_host = 'xxx'
          mail_user = 'xxx'
          mail_pass = '123456'
          # mailto_lists = sys.argv[1]
           # mailto_list = mailto_lists.split(',') #發(fā)送多人
           # sub= sys.argv[2]
          mailto_list = ['xxx@xxx.com', ]
          sub = "運維日常數(shù)據(jù)統(tǒng)計報告--" + "采集時間:" + monday + "~" + friday
          # send_mail(mailto_list, sub)
          if send_mail(mailto_list, sub):
          print("Send Mail Success !!!")
          else:
          print("Send mail Failed !!!")

          歡迎指正。

          今天筆者想和大家聊聊Python+selenium自動化生成測試報告,批量執(zhí)行完用例后,生成的測試報告是文本形式的,不夠直觀,為了更好的展示測試報告,最好是生成HTML格式的。

          unittest里面是不能生成html格式報告的,需要導(dǎo)入一個第三方的模塊:HTMLTestRunner

          一、導(dǎo)入HTMLTestRunner

          1.這個模塊下載不能通過pip安裝了,只能下載后手動導(dǎo)入。

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

          3.下載后復(fù)制到Python安裝文件的Lib目錄下

          二、生成html測試報告

          1.這里主要有三個參數(shù):

          stream:測試報告寫入文件的存儲區(qū)域

          title:測試報告的主題

          description:測試報告的描述

          2. report_path是存放測試報告的地址

          運行腳本后在F盤指定位置就能找到這個測試報告文件,這時候如果文件多了,不知道測試報告在哪天生成的?能否在文件名上顯示一個日期和時間呢?當然是可以的

          備注:

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

          %H-%M為時分 注意:時間之間不能使用冒號(:)因為文件名不能使用冒號

          三、測試報告詳情

          1.找到測試報告文件,用瀏覽器打開,點開View里的Detail可以查看詳情描述。

          紅框中內(nèi)容顯是英文,我們不能直觀看出是什么測試用例,可以在測試代碼中添加中文注釋,注釋前面要加字母u,代碼修改如下:

          四、再次運行run_all_case腳本文件后,查看HTML測試報告

          五 unittest斷言

          Python在 unittest.TestCase 類中提供了很多斷言方法。斷言方法檢查你認為應(yīng)該滿足的條件是否確實滿足。如果該條件確實滿足,你對程序行為的假設(shè)就得到了確認,你就可以確信其中沒有錯誤。如果你認為應(yīng)該滿足的條件實際上并不滿足,Python將引發(fā)異常。下表描述了6個常用的斷言方法。使用這些方法可核實返回的值等于或不等于預(yù)期的值、返回的值為 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)

          --判斷兩個參數(shù)相等:first == second

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

          --判斷兩個參數(shù)不相等: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),其它的斷言方法請自行嘗試)

          總結(jié)

          今天的這篇文章就分享到這里了,喜歡的小伙伴記得點贊評論收藏加關(guān)注喲,關(guān)注我每天給大家不同的驚喜。


          主站蜘蛛池模板: 日韩视频一区二区在线观看 | 国产在线精品一区二区在线看| 无码av免费一区二区三区| 亚洲男女一区二区三区| 伊人久久大香线蕉av一区| 精品国产一区二区麻豆| 国产精品合集一区二区三区| 高清国产AV一区二区三区| 精品一区二区三区免费视频| 亚洲av日韩综合一区久热| 文中字幕一区二区三区视频播放 | 精品一区二区三区在线成人| 精品免费久久久久国产一区| 婷婷亚洲综合一区二区| 国产乱码精品一区二区三区| 国产经典一区二区三区蜜芽| 国产精品揄拍一区二区| 亚洲熟女www一区二区三区| 日韩精品无码一区二区三区 | 国产午夜精品一区二区三区小说| 波多野结衣一区二区三区高清av| 成人区人妻精品一区二区三区 | 人妻夜夜爽天天爽一区| 免费高清av一区二区三区| 理论亚洲区美一区二区三区| 国产一国产一区秋霞在线观看| 八戒久久精品一区二区三区| 国产日韩综合一区二区性色AV| 国产一区二区三区日韩精品| 成人在线视频一区| 精品国产亚洲一区二区在线观看 | 欧洲亚洲综合一区二区三区| 欧洲精品免费一区二区三区| 国产一区二区三区免费看| 能在线观看的一区二区三区| 国产亚洲欧洲Aⅴ综合一区| 中文字幕Av一区乱码| 日韩精品中文字幕无码一区 | 欧洲亚洲综合一区二区三区| 一区二区三区AV高清免费波多 | 日韩伦理一区二区|