feat(report): resolve Chinese test names from docstring in cn report
Test case docstring 【P0】 prefix is stripped for display. 报告中的用例名现在显示为: 司机APP接单到管理端核算打款完整流程
This commit is contained in:
+42
-5
@@ -73,7 +73,7 @@ def shipper_ios_config(config):
|
||||
# ═══════════════════════════════════════════════════════════════════
|
||||
|
||||
def pytest_sessionfinish(session):
|
||||
"""测试会话结束后,从 junit.xml 生成一份简洁的中文 HTML 报告。"""
|
||||
"""测试会话结束后,生成中文 HTML 报告。"""
|
||||
from datetime import datetime
|
||||
from xml.etree import ElementTree as ET
|
||||
|
||||
@@ -99,19 +99,56 @@ def pytest_sessionfinish(session):
|
||||
for suite in root:
|
||||
for case in suite:
|
||||
total += 1
|
||||
name = case.attrib.get("name", "")
|
||||
func_name = case.attrib.get("name", "")
|
||||
cn_name = _resolve_cn_name(session, func_name)
|
||||
time_elapsed = case.attrib.get("time", "0")
|
||||
failure = case.find("failure")
|
||||
if failure is not None:
|
||||
failed += 1
|
||||
msg = failure.attrib.get("message", "")[:300]
|
||||
cases.append((name, "失败", time_elapsed, msg))
|
||||
cases.append((cn_name, "失败", time_elapsed, msg))
|
||||
elif case.find("skipped") is not None:
|
||||
skipped += 1
|
||||
cases.append((name, "跳过", time_elapsed, ""))
|
||||
cases.append((cn_name, "跳过", time_elapsed, ""))
|
||||
else:
|
||||
passed += 1
|
||||
cases.append((name, "通过", time_elapsed, ""))
|
||||
cases.append((cn_name, "通过", time_elapsed, ""))
|
||||
|
||||
pass_rate = (passed / total * 100) if total > 0 else 0
|
||||
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
|
||||
html = _build_cn_report_html(total, passed, failed, skipped, pass_rate, cases, now)
|
||||
(report_dir / "report_cn.html").write_text(html, encoding="utf-8")
|
||||
|
||||
|
||||
def _resolve_cn_name(session, func_name: str) -> str:
|
||||
"""从 pytest session 中查找函数的中文 display_name。
|
||||
|
||||
策略:
|
||||
1) 查找测试函数上的 display_name 属性 (test_xxx.display_name = "中文名")
|
||||
2) 使用 item.name (含 nodeid),提取函数名并取 docstring 第一行去掉 【P0】 前缀
|
||||
3) 兜底返回原始函数名
|
||||
"""
|
||||
for item in session.items:
|
||||
item_func_name = getattr(item, "originalname", None) or item.name.rsplit("::", 1)[-1]
|
||||
if item_func_name == func_name:
|
||||
test_cls = item.cls if hasattr(item, "cls") else None
|
||||
test_func = getattr(test_cls, item_func_name, None) if test_cls else None
|
||||
# 策略1: display_name 属性
|
||||
if test_func and hasattr(test_func, "display_name"):
|
||||
return test_func.display_name
|
||||
# 策略2: docstring 第一行
|
||||
doc = (test_func.__doc__ or "") if test_func else ""
|
||||
if doc:
|
||||
first_line = doc.strip().split("\n")[0].strip()
|
||||
if first_line.startswith("【"):
|
||||
idx = first_line.find("】")
|
||||
if idx > 0:
|
||||
first_line = first_line[idx + 1:]
|
||||
if first_line and len(first_line) > 2:
|
||||
return first_line
|
||||
break
|
||||
return func_name
|
||||
|
||||
pass_rate = (passed / total * 100) if total > 0 else 0
|
||||
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
|
||||
Reference in New Issue
Block a user