2019-08-29

HtmlTestRunner自定义模版
使用jinja2语法,自定义html文件报告内容

Jinja官方文档地址:https://jinja.palletsprojects.com/en/2.10.x/
Jinja官方文档地址:https://jinja.palletsprojects.com/en/2.10.x/


1 html报告默认参数
title:          - This is the report title - by default this is "Unittests Results" but can be changed using the report_title kwarg
headers:        - This is a dict with 2 items:
  start_time:   - A datetime object representing when the test was run
  status:       - A dict of of the same form as the sub-dicts described below for summaries but for all tests combined
all_results:    - A dict - keys are the names of each test case and values are lists containing test result objects (see the source code or the template for what information these provide)
summaries:      - A dict - keys are the names of each test case and values are dicts containing:
  total:        - The total number of tests
  success:      - The number of passed tests
  failure:      - The number of failed tests
  error:        - The number of errored tests
  skip:         - The number of skipped tests
  duration:     - A string showing how long all these tests took to run in either seconds or milliseconds
2 报告生成时 : 携带自定义参数
template_args = {
    "user": getpass.getuser()
}
runner = HtmlTestRunner.HTMLTestRunner(template='path/to/template', template_args=template_args)
3 简单的html模版
<!DOCTYPE html>
<html>
<head>
    <title>{{ title }}</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
</head>
<body>
    <div class="container">
        <div class="row">
            <div class="col-xs-12">
                <h2 class="text-capitalize">{{ title }}</h2>
                <p class='attribute'><strong>Start Time: </strong>{{ header_info.start_time.strftime("%Y-%m-%d %H:%M:%S") }}</p>
                <p class='attribute'><strong>Duration: </strong>{{ header_info.duration }}</p>
                <p class='attribute'><strong>Summary: </strong>{{ header_info.status }}</p>
            </div>
        </div>
        {% for test_case_name, tests_results in all_results.items() %}
        {% if tests_results %}
        <div class="row">
            <div class="col-xs-12 col-sm-10 col-md-10">
                <table class='table table-hover table-responsive'>
                    <thead>
                        <tr>
                            <th>{{ test_case_name }}</th>
                            <th>Status</th>
                        </tr>
                    </thead>
                    <tbody>
                        {% for test_case in tests_results %}
                        <tr class='{{ status_tags[test_case.outcome] }}'>
                            <td class="col-xs-9">{{ test_case.test_description }}</td>
                            <td class="col-xs-3">
                                <span class="label label-{{ status_tags[test_case.outcome] }}">
                                    {% if test_case.outcome == test_case.SUCCESS %}
                                        Pass
                                    {% elif test_case.outcome == test_case.SKIP %}
                                        Skip
                                    {% elif test_case.outcome == test_case.FAILURE %}
                                        Fail
                                    {% else %}
                                        Error
                                    {% endif %}
                                </span>
                                {% if test_case.stdout or test_case.err %}
                                    &nbsp<button class="btn btn-default btn-xs">View</button>
                                {% endif %}
                            </td>
                        </tr>
                        {% if test_case.stdout or test_case.err or test_case.err %}
                            <tr style="display:none;">
                                <td class="col-xs-9">
                                    {% if test_case.stdout %}<p>{{ test_case.stdout }}</p>{% endif %}
                                    {% if test_case.err %}<p style="color:maroon;">{{ test_case.err[0].__name__ }}: {{ test_case.err[1] }}</p>{% endif %}
                                    {% if test_case.err %}<p style="color:maroon;">{{ test_case.test_exception_info }}</p>{% endif %}
                                </td>
                            </tr>
                        {% endif %}
                        {% endfor %}
                        <tr>
                            <td>
                               {{ summaries[test_case_name] }}
                            </td>
                        </tr>
                    </tbody>
                </table>
            </div>
        </div>
        {% endif %}
        {% endfor %}
    </div>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
    <script type="text/javascript">
        $(document).ready(function(){
            $('td').on('click', '.btn', function(e){
                e.preventDefault();
                var $this = $(this);
                var $nextRow = $this.closest('tr').next('tr');
                $nextRow.slideToggle("fast");
                $this.text(function(i, text){
                    if (text === 'View') {
                        return 'Hide';
                    } else {
                        return 'View';
                    };
                });
            });
        });
    </script>
</body>
</html>
4Vue+iview 自定义报告,报告截图如下

-- Github 地址 https://github.com/mingyuanHub/python-game-test

image.png

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容

  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    小迈克阅读 2,985评论 1 3
  • 解决Linux关闭终端(关闭SSH等)后运行的程序或者服务自动停止【后台运行程序】 问题描述:当SSH远程连接到服...
    Nazarite_0141阅读 272评论 0 0
  • 前些日子看了《小王子》 ,当然不是书,是电影。 铺天盖地的说这部电影如何如何,所以,我没有忍住,还是去影院看了三D...
    此狐修仙中阅读 283评论 0 0
  • 世界再大 朋友再多 人类永远是孤独的个体 有两只猫狗作陪 也许才是最美好而单纯的
    AliceHsiao阅读 189评论 0 0