1. 程式人生 > >pytest-21-pytest-html報告優化(nodeid中文顯示[u6350u52a9u6211u4eec]問題解決)

pytest-21-pytest-html報告優化(nodeid中文顯示[u6350u52a9u6211u4eec]問題解決)

ble 參數化 ttr 聲明 logs [] head screen ber

pytest-html報告中當用到參數化時候,獲取用例的nodeid裏面有中文時候,會顯示[\u6350\u52a9\u6211\u4eec]這種編碼(再次聲明,這個不叫亂碼,這是unicode編碼)
關於python2和python3裏面Unicode編碼轉化可以參考之前寫的一篇【python筆記6-%u60A0和\u60a0類似unicode解碼】
本篇以python3.6版本為例

遇到問題

技術分享圖片

官網文檔https://github.com/pytest-dev/pytest-html上說明如下:
註意ANSI代碼支持取決於ansi2html包,此包不作為依賴項包含在內。如果你安裝了這個軟件包,那麽ANSI代碼會在你的報告中被轉換成HTML。
試過了,安裝ansi2html包也無法解決問題,於是只有自己解碼,重新優化報告內容了

編碼轉化

相關轉化參考這篇【python筆記6-%u60A0和\u60a0類似unicode解碼】

# coding:utf-8
# a是str類型
a = r"case/test_houtai.py::TestHouTai::()::test_aboutzenta[\u6350\u52a9\u6211\u4eec]"
print(type(a))
# 轉碼
print(a.encode("utf-8").decode("unicode_escape"))

運行結果

<class ‘str‘>
case/test_houtai.py::TestHouTai::()::test_aboutzenta[捐助我們]

pytest-html報告優化

源碼地址【https://github.com/pytest-dev/pytest-html/blob/master/pytest_html/plugin.py】

Test這一列顯示的內容是用例的nodeid,nodeid獲取方法從源碼可以看出是通過report.nodeid獲取到的

技術分享圖片

於是我們可以在conftest.py裏面新增一列,重新命名Test_nodeid,然後刪除原有的Test列,具體參考前面一篇內容【pytest文檔20-pytest-html報告優化(添加Description)】

技術分享圖片

from datetime import datetime
from py.xml import html
import pytest

@pytest.mark.hookwrapper
def pytest_runtest_makereport(item):
    """
    當測試失敗的時候,自動截圖,展示到html報告中
    :param item:
    """
    pytest_html = item.config.pluginmanager.getplugin(‘html‘)
    outcome = yield
    report = outcome.get_result()
    extra = getattr(report, ‘extra‘, [])

    if report.when == ‘call‘ or report.when == "setup":
        xfail = hasattr(report, ‘wasxfail‘)
        if (report.skipped and xfail) or (report.failed and not xfail):
            file_name = report.nodeid.replace("::", "_")+".png"
            screen_img = _capture_screenshot()
            if file_name:
                html = ‘<div><img src="data:image/png;base64,%s" alt="screenshot" style="width:600px;height:300px;" ‘                        ‘onclick="window.open(this.src)" align="right"/></div>‘ % screen_img
                extra.append(pytest_html.extras.html(html))
        report.extra = extra
        report.description = str(item.function.__doc__)
        report.nodeid = report.nodeid.encode("utf-8").decode("unicode_escape")


@pytest.mark.optionalhook
def pytest_html_results_table_header(cells):
    cells.insert(1, html.th(‘Description‘))
    cells.insert(2, html.th(‘Test_nodeid‘))
    # cells.insert(1, html.th(‘Time‘, class_=‘sortable time‘, col=‘time‘))
    cells.pop(2)

@pytest.mark.optionalhook
def pytest_html_results_table_row(report, cells):
    cells.insert(1, html.td(report.description))
    cells.insert(2, html.td(report.nodeid))
    # cells.insert(1, html.td(datetime.utcnow(), class_=‘col-time‘))
    cells.pop(2)

結果展示

修改之後結果展示如下

技術分享圖片

pytest-21-pytest-html報告優化(nodeid中文顯示[\u6350\u52a9\u6211\u4eec]問題解決)