feat: 军事科技每日资讯推送系统 - Docker部署 + 日志系统 + 数据目录重组
This commit is contained in:
@@ -0,0 +1,95 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
去重逻辑测试用例
|
||||
验证规则:
|
||||
1. 同一订阅源内标题相同的文章仅保留一篇
|
||||
2. 不同订阅源间标题相同的文章全部保留
|
||||
3. 援引类文章(不同源相同标题)不会被错误去重
|
||||
"""
|
||||
|
||||
def test_deduplicate():
|
||||
# 模拟测试文章数据
|
||||
test_articles = [
|
||||
# 场景1:同一源两篇相同标题的文章 → 只保留1篇
|
||||
{"title": "美军测试新型无人机", "source": "Defense One", "published": "2026-05-12 10:00"},
|
||||
{"title": "美军测试新型无人机", "source": "Defense One", "published": "2026-05-12 10:30"},
|
||||
# 场景2:不同源两篇相同标题的文章 → 都保留
|
||||
{"title": "俄军列装新型导弹", "source": "The War Zone", "published": "2026-05-12 09:00"},
|
||||
{"title": "俄军列装新型导弹", "source": "国防科技要闻", "published": "2026-05-12 09:10"},
|
||||
# 场景3:援引类文章 → 都保留
|
||||
{"title": "朝鲜试射洲际导弹", "source": "韩联社", "published": "2026-05-12 08:00"},
|
||||
{"title": "朝鲜试射洲际导弹", "source": "央视军事", "published": "2026-05-12 08:20"},
|
||||
{"title": "朝鲜试射洲际导弹", "source": "路透社", "published": "2026-05-12 08:30"},
|
||||
# 短标题过滤
|
||||
{"title": "快讯", "source": "海鹰资讯", "published": "2026-05-12 07:00"},
|
||||
]
|
||||
|
||||
# 复现程序中的去重逻辑
|
||||
seen = set()
|
||||
unique_articles = []
|
||||
for a in test_articles:
|
||||
title = a['title'].strip()
|
||||
if len(title) <= 5:
|
||||
continue
|
||||
key = (a['source'].strip(), title)
|
||||
if key not in seen:
|
||||
seen.add(key)
|
||||
unique_articles.append(a)
|
||||
|
||||
print("="*60)
|
||||
print("去重逻辑测试结果")
|
||||
print("="*60)
|
||||
print(f"输入文章总数:{len(test_articles)} 篇")
|
||||
print(f"去重后剩余:{len(unique_articles)} 篇")
|
||||
print("-"*60)
|
||||
|
||||
# 统计各源文章数验证结果
|
||||
source_count = {}
|
||||
for a in unique_articles:
|
||||
source = a['source']
|
||||
source_count[source] = source_count.get(source, 0) + 1
|
||||
print(f"[{source}] {a['title']}")
|
||||
|
||||
print("-"*60)
|
||||
|
||||
# 验证测试用例
|
||||
test_passed = True
|
||||
# 验证1:同一源Defense One的两篇相同标题 → 仅保留1篇
|
||||
if source_count.get("Defense One", 0) == 1:
|
||||
print("✅ 测试1通过:同一源相同标题仅保留1篇")
|
||||
else:
|
||||
print("❌ 测试1失败:同一源相同标题保留了%d篇(预期1篇)" % source_count.get("Defense One", 0))
|
||||
test_passed = False
|
||||
|
||||
# 验证2:不同源The War Zone和国防科技要闻相同标题 → 各保留1篇,共2篇
|
||||
if source_count.get("The War Zone", 0) == 1 and source_count.get("国防科技要闻", 0) == 1:
|
||||
print("✅ 测试2通过:不同源相同标题全部保留")
|
||||
else:
|
||||
print("❌ 测试2失败:不同源相同标题未全部保留")
|
||||
test_passed = False
|
||||
|
||||
# 验证3:3个不同源相同标题的援引类文章 → 都保留,共3篇
|
||||
if source_count.get("韩联社", 0) == 1 and source_count.get("央视军事", 0) == 1 and source_count.get("路透社", 0) == 1:
|
||||
print("✅ 测试3通过:援引类不同源相同标题全部保留,未被错误去重")
|
||||
else:
|
||||
print("❌ 测试3失败:援引类文章被错误去重")
|
||||
test_passed = False
|
||||
|
||||
# 验证4:短标题"快讯"被过滤
|
||||
if source_count.get("海鹰资讯", 0) == 0:
|
||||
print("✅ 测试4通过:长度<=5的短标题被正确过滤")
|
||||
else:
|
||||
print("❌ 测试4失败:短标题未被过滤")
|
||||
test_passed = False
|
||||
|
||||
print("-"*60)
|
||||
if test_passed:
|
||||
print("🎉 所有测试用例通过!去重逻辑符合要求")
|
||||
else:
|
||||
print("⚠️ 存在测试用例未通过,请检查逻辑")
|
||||
|
||||
return test_passed
|
||||
|
||||
if __name__ == "__main__":
|
||||
test_deduplicate()
|
||||
Reference in New Issue
Block a user