问题关键点,版本pytest-html==2.1.1
# 设置用例描述表头
def pytest_html_results_table_header(cells):
cells.insert(2, html.th('Description'))
cells.pop()
# 设置用例描述表格
def pytest_html_results_table_row(report, cells):
try:
cells.insert(2, html.td(report.description))
except Exception:
cells.insert(2, html.td("用例报错了"))
cells.pop()
# @pytest.mark.hookwrapper
@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item):
"""
用于向测试用例中添加用例的开始时间、内部注释,和失败截图等.
:param item:
"""
pytest_html = item.config.pluginmanager.getplugin('html')
outcome = yield
report = outcome.get_result()
report.description = description_html(item.function.__doc__)
# report.description = str(item.function.__doc__)
extra = getattr(report, 'extra', [])
# page = item.funcargs["page"]
if report.when == 'call':
xfail = hasattr(report, 'wasxfail')
if (report.skipped and xfail) or (report.failed and not xfail):
case_path = report.nodeid.replace("::", "_") + ".png"
if "[" in case_path:
case_name = case_path.split("-")[0] + "].png"
else:
case_name = case_path
capture_screenshots(case_name, page)
# img_path = "image/" + case_name.split("/")[-1]
img_path = os.path.join("image", case_name.split("/")[-1])
if img_path:
html = '<div><img src="%s" alt="screenshot" style="width:304px;height:228px;" ' \
'onclick="window.open(this.src)" align="right"/></div>' % img_path
extra.append(pytest_html.extras.html(html))
report.extra = extra
report.description = str(item.function.__doc__)
# 加下面这句控制台输出用例的地方中文显示不了【case 的ids】,注释了 html报告test列中文乱码
report.nodeid = report.nodeid.encode("unicode_escape").decode("utf-8")
def description_html(desc):
"""
将用例中的描述转成HTML对象
:param desc: 描述
:return:
"""
if desc is None:
return "No case description"
desc_ = ""
for i in range(len(desc)):
if i == 0:
pass
elif desc[i] == '\n':
desc_ = desc_ + ";"
else:
desc_ = desc_ + desc[i]
desc_lines = desc_.split(";")
desc_html = html.html(
html.head(
html.meta(name="Content-Type", value="text/html; charset=latin1")),
html.body(
[html.p(line) for line in desc_lines]))
return desc_html
def capture_screenshots(case_name, page):
"""
配置用例失败截图路径
:param case_name: 用例名
:return:
"""
global driver
file_name = case_name.split("/")[-1]
if RunConfig.NEW_REPORT is None:
raise NameError('没有初始化测试报告目录')
else:
image_dir = os.path.join(RunConfig.NEW_REPORT, "image", file_name)
page.screenshot(path=image_dir)
def pytest_collection_modifyitems(items):
# 解决pytest执行用例,标题有中文时显示编码不正确的问题
for item in items:
item.name = item.name.encode("utf-8").decode("unicode_escape")
item._nodeid = item.nodeid.encode("utf-8").decode("unicode_escape")