pytest-21-pytest-html報告優化(nodeid中文顯示[u6350u52a9u6211u4eec]問題解決)
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]問題解決)