Python寫靜態(tài)HTML

背景

因為近期工作需要倍试,常常要將測試結果/數(shù)據(jù)統(tǒng)計耿芹、匯總和展示峦嗤,因此會有寫靜態(tài)HTML的需求嬉荆,本文記錄下python寫靜態(tài)HTML的小技巧

靈感

靈感時來源于unittest測試框架最常用的報告插件:HTMLTestRunner,該插件本身基于python2且已經(jīng)更新了响蓉,好在@蟲師一直在維護和更新這個插件硕勿,使得它能繼續(xù)被大家所使用,了解詳情請移步:SeldomQA/HTMLTestRunner

回到HTMLTestRunner報告插件厕妖,閱讀源碼發(fā)現(xiàn)首尼,作者只用了一個python文件便巧妙的將寫HTML、頁面繪制和數(shù)據(jù)嵌入搞定了言秸。進一步分析可以看到软能,作者先是在Template基類中定義了測試報告的HTML結構模板和各個模塊/表格模板,然后再以格式化輸入的形式給每一個模板中填充目標數(shù)據(jù)举畸,再將填充好的模板以格式化輸入的形式填充到HTML結構模板中查排,最后再將所有內容寫成一個HTML文件即可。

class Template_mixin(object):
    """
    Define a HTML template for report customerization and generation.
    Overall structure of an HTML report
    HTML
    +------------------------+
    |<html>                  |
    |  <head>                |
    |                        |
    |   STYLESHEET           |
    |   +----------------+   |
    |   |                |   |
    |   +----------------+   |
    |                        |
    |  </head>               |
    |                        |
    |  <body>                |
    |                        |
    |   HEADING              |
    |   +----------------+   |
    |   |                |   |
    |   +----------------+   |
    |                        |
    |   REPORT               |
    |   +----------------+   |
    |   |                |   |
    |   +----------------+   |
    |                        |
    |   ENDING               |
    |   +----------------+   |
    |   |                |   |
    |   +----------------+   |
    |                        |
    |  </body>               |
    |</html>                 |
    +------------------------+
    """

可以看到抄沮,這樣的設計其實優(yōu)點在于非常小巧和輕量跋核,缺點在于可維護和可移植性差,數(shù)據(jù)量小還尚可叛买,不太適合大量數(shù)據(jù)的統(tǒng)計和繪制砂代。

技巧

這種設計的關鍵在于建模板,然后按需填充數(shù)據(jù)率挣,最后再寫HTML刻伊,通常我的做法是:

  1. 網(wǎng)上找到想要的頁面或著表格,copy其HTML結構椒功,將變動的部分(需要動態(tài)填充數(shù)據(jù)的部分)提取出來捶箱,并用格式化輸入形式替代,如:%(style)s, %(rows)s
HTML_TMPL = r"""
<!DOCTYPE html>
<html lang="en">
<head>
<title>Overview</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
%(style)s
</head>
<body>
    <h1> 總覽 </h1>
    <table class="pure-table pure-table-bordered">
        <thead>
            <tr>
                <th>#</th>
                <th>設備</th>
                <th>環(huán)境</th>
                <th>耗時</th>
                <th>結果</th>
                <th>統(tǒng)計</th>
                <th>報告</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                %(rows)s
            </tr>
            <tr>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
                <td>&nbsp;</td>
            </tr>
            <tr>
                %(total)s
            </tr>
        </tbody>
    </table>
</body>
</html>
"""     # style, rows, total
  1. 將變動的部分單拎出來动漾,形成模板丁屎,依然用格式化輸入形式替代
TBODY_TOTAL_TMPL = """
                <tr>
                <th> 合計 </th>
                <th colspan="6"> 通過率: {passing_rate}% &nbsp;&nbsp; 失敗率: {failure_rate}% 
                &nbsp;&nbsp; 錯誤率: {error_rate}%  &nbsp;&nbsp; 跳過率: {skip_rate}% </th>
                </tr>
"""
  1. 按照模板格式,組裝數(shù)據(jù)并填充
total += TBODY_TOTAL_TMPL.format(
        passing_rate=np.mean(p_rates).round(2),
        failure_rate=np.mean(f_rates).round(2),
        error_rate=np.mean(e_rates).round(2),
        skip_rate=np.mean(s_rates).round(2))
  1. 最后將所有數(shù)據(jù)填充到主模板旱眯,并寫HTML
# write reporter
with open(filepath, 'w', encoding='utf-8') as wf:
    wf.write(HTML_TMPL % dict(rows=rows, total=total, style=STYLE_TMPL))

擴展

  • 目前python自動化測試常用的報告插件還有晨川,allure
  • 除過本文介紹寫HTML的方法之外,還可以使用删豺,jinjia2
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末础爬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子吼鳞,更是在濱河造成了極大的恐慌,老刑警劉巖叫搁,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赔桌,死亡現(xiàn)場離奇詭異供炎,居然都是意外死亡,警方通過查閱死者的電腦和手機疾党,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門音诫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人雪位,你說我怎么就攤上這事竭钝。” “怎么了雹洗?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵香罐,是天一觀的道長。 經(jīng)常有香客問我时肿,道長庇茫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任螃成,我火速辦了婚禮旦签,結果婚禮上,老公的妹妹穿的比我還像新娘寸宏。我一直安慰自己宁炫,他們只是感情好,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布氮凝。 她就那樣靜靜地躺著羔巢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪覆醇。 梳的紋絲不亂的頭發(fā)上朵纷,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音永脓,去河邊找鬼袍辞。 笑死,一個胖子當著我的面吹牛常摧,可吹牛的內容都是我干的搅吁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼落午,長吁一口氣:“原來是場噩夢啊……” “哼谎懦!你這毒婦竟也來了?” 一聲冷哼從身側響起溃斋,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤界拦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后梗劫,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體享甸,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡截碴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蛉威。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片日丹。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蚯嫌,靈堂內的尸體忽然破棺而出哲虾,到底是詐尸還是另有隱情,我是刑警寧澤择示,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布束凑,位于F島的核電站,受9級特大地震影響对妄,放射性物質發(fā)生泄漏湘今。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一剪菱、第九天 我趴在偏房一處隱蔽的房頂上張望摩瞎。 院中可真熱鬧,春花似錦孝常、人聲如沸旗们。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽上渴。三九已至,卻和暖如春喜颁,著一層夾襖步出監(jiān)牢的瞬間稠氮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工半开, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留隔披,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓寂拆,卻偏偏與公主長得像奢米,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子纠永,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內容