fix: 批量匹配跳过画像待补录教师 + render-html 按行重建 + 金标准 fixtures 业务化(P0+P1)
- run_match 新增 skip_incomplete:批量缺省跳过画像不完整教师并记录 skipped,指定单教师仍 PROFILE_INCOMPLETE;汇总页出"画像待补录"行 - render-html 补 --report-id 行上下文(inputMapping $row.$pk),CLI 容错解析回退最近 10 份 - report_service 日志改容错 _log(),修复未 setup 时单跑测试崩溃的顺序依赖 - fixtures 替换为教师画像/赛道/期望结论金标准样例,新增 sample_tracks.json - 新增 4 个批量跳过用例(314 项,除 3 个已知 jsonschema 环境失败外全绿) - tests/README 增补本机无共享 runtime 的测试方式;TUTORIAL/ACTIONS.md 同步表述
This commit is contained in:
@@ -167,5 +167,48 @@ class TestKernelAndPersistence(MatchRuleTestBase):
|
||||
self.assertEqual(payload["tracks_by_year"].get("2027"), 4)
|
||||
|
||||
|
||||
class TestBatchSkipIncomplete(MatchRuleTestBase):
|
||||
"""批量缺省跳过画像不完整教师(E1),指定单教师保持严格失败。"""
|
||||
|
||||
def test_batch_skips_incomplete_teacher(self) -> None:
|
||||
from service.match_service import run_match
|
||||
|
||||
incomplete = _teacher(teacherName="王讲师", researchTags="", recentPapers="")
|
||||
payload = run_match([_teacher(), incomplete], _tracks(), "2027")
|
||||
self.assertEqual(payload["ok"], True)
|
||||
self.assertEqual(payload["count"], 1)
|
||||
self.assertEqual(len(payload["skipped"]), 1)
|
||||
skipped = payload["skipped"][0]
|
||||
self.assertEqual(skipped["teacher_name"], "王讲师")
|
||||
self.assertIn("E1", skipped["reason"])
|
||||
# 正常教师仍有报告
|
||||
self.assertEqual(len(payload["reports"]), 1)
|
||||
self.assertEqual(payload["reports"][0]["teacher_name"], "张教授")
|
||||
|
||||
def test_batch_brief_marks_skipped_teacher(self) -> None:
|
||||
from service.match_service import run_match
|
||||
|
||||
incomplete = _teacher(teacherName="王讲师", researchTags="", recentPapers="")
|
||||
payload = run_match([_teacher(), incomplete], _tracks(), "2027")
|
||||
with open(payload["brief_file"], encoding="utf-8") as f:
|
||||
html_text = f.read()
|
||||
self.assertIn("画像待补录", html_text)
|
||||
self.assertIn("王讲师", html_text)
|
||||
|
||||
def test_all_skipped_still_returns_success_payload(self) -> None:
|
||||
from service.match_service import run_match
|
||||
|
||||
payload = run_match([_teacher(researchTags="", recentPapers="")], _tracks(), "2027")
|
||||
self.assertEqual(payload["ok"], True)
|
||||
self.assertEqual(payload["count"], 0)
|
||||
self.assertEqual(len(payload["skipped"]), 1)
|
||||
|
||||
def test_strict_mode_raises_for_incomplete(self) -> None:
|
||||
from service.match_service import run_match
|
||||
|
||||
with self.assertRaises(ValueError):
|
||||
run_match([_teacher(researchTags="", recentPapers="")], _tracks(), "2027", skip_incomplete=False)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
Reference in New Issue
Block a user