geo/backend/tests/test_content_pipeline/test_seo_optimizer.py

212 lines
6.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""SEO优化器测试"""
import pytest
from app.services.content.seo_optimizer import SEOOptimizer, OptimizationResult
class TestSEOOptimizer:
"""SEO优化器测试"""
def test_get_keyword_density_basic(self):
"""关键词密度基本计算"""
optimizer = SEOOptimizer()
content = "华为手机华为手机华为手机"
density = optimizer.get_keyword_density(content, "华为手机")
assert density > 0
assert isinstance(density, float)
def test_get_keyword_density_zero_content(self):
"""空内容密度计算"""
optimizer = SEOOptimizer()
density = optimizer.get_keyword_density("", "华为")
assert density == 0.0
def test_get_keyword_density_zero_keyword(self):
"""空关键词密度计算"""
optimizer = SEOOptimizer()
density = optimizer.get_keyword_density("内容", "")
assert density == 0.0
def test_get_keyword_density_no_match(self):
"""关键词不匹配时密度"""
optimizer = SEOOptimizer()
content = "这是一篇关于苹果的文章"
density = optimizer.get_keyword_density(content, "华为")
assert density == 0.0
def test_optimize_with_keyword(self):
"""带关键词的SEO优化"""
optimizer = SEOOptimizer()
result = optimizer.optimize(
content="华为手机是知名的手机品牌,华为手机性能出色。",
title="华为手机评测",
platform="zhihu",
keyword="华为手机"
)
assert isinstance(result, OptimizationResult)
assert isinstance(result.density, float)
assert isinstance(result.suggestions, list)
assert isinstance(result.tips, list)
def test_optimize_without_keyword(self):
"""不带关键词的SEO优化"""
optimizer = SEOOptimizer()
result = optimizer.optimize(
content="这是一篇关于手机评测的文章",
title="手机评测",
platform="zhihu"
)
assert result.optimized_content is not None
assert result.density == 0.0
def test_optimize_density_too_low(self):
"""关键词密度过低建议"""
optimizer = SEOOptimizer()
result = optimizer.optimize(
content="这是一篇简短的内容",
title="标题",
platform="zhihu",
keyword="华为手机"
)
# 密度过低应有建议
if result.density < 1.0:
assert len(result.suggestions) > 0
def test_optimize_density_too_high(self):
"""关键词密度过高建议"""
optimizer = SEOOptimizer()
result = optimizer.optimize(
content="华为华为华为华为华为华为华为华为华为华为",
title="华为",
platform="zhihu",
keyword="华为"
)
# 密度过高应有建议
if result.density > 3.0:
assert any("超过" in s for s in result.suggestions)
def test_optimize_keyword_in_title(self):
"""关键词在标题中的检查"""
optimizer = SEOOptimizer()
result = optimizer.optimize(
content="手机内容",
title="华为手机评测",
platform="zhihu",
keyword="华为手机"
)
# 关键词在标题中应有通过的建议
assert isinstance(result.suggestions, list)
def test_optimize_keyword_in_first_paragraph(self):
"""关键词在前100字的检查"""
optimizer = SEOOptimizer()
result = optimizer.optimize(
content="华为手机是本文的主题...",
title="评测",
platform="zhihu",
keyword="华为手机"
)
assert isinstance(result.suggestions, list)
def test_optimize_different_platforms(self):
"""不同平台SEO优化"""
optimizer = SEOOptimizer()
platforms = ["zhihu", "wechat", "xiaohongshu", "baijiahao"]
for platform in platforms:
result = optimizer.optimize(
content="测试内容",
title="测试标题",
platform=platform,
keyword="测试"
)
assert isinstance(result, OptimizationResult)
def test_optimization_result_structure(self):
"""优化结果结构完整性"""
optimizer = SEOOptimizer()
result = optimizer.optimize(
content="华为手机是知名品牌",
title="华为评测",
platform="zhihu",
keyword="华为"
)
assert isinstance(result, OptimizationResult)
assert isinstance(result.optimized_content, str)
assert isinstance(result.density, float)
assert isinstance(result.suggestions, list)
assert isinstance(result.tips, list)
def test_optimize_returns_suggestions(self):
"""优化建议列表返回"""
optimizer = SEOOptimizer()
result = optimizer.optimize(
content="内容过短",
title="标题",
platform="zhihu",
keyword="关键词"
)
assert isinstance(result.suggestions, list)
def test_optimize_returns_tips(self):
"""优化提示列表返回"""
optimizer = SEOOptimizer()
result = optimizer.optimize(
content="测试内容",
title="标题",
platform="zhihu"
)
assert isinstance(result.tips, list)
def test_density_calculation_accuracy(self):
"""密度计算准确性"""
optimizer = SEOOptimizer()
# "华为" 4个字符出现2次 = 8 / 总字符数 * 100
content = "华为手机华为"
total_chars = len(content) # 6
keyword = "华为"
keyword_count = content.count(keyword) # 2
expected_density = (len(keyword) * keyword_count) / total_chars * 100
actual_density = optimizer.get_keyword_density(content, keyword)
assert abs(actual_density - round(expected_density, 2)) < 0.1
def test_optimize_empty_content(self):
"""空内容优化"""
optimizer = SEOOptimizer()
result = optimizer.optimize(
content="",
title="标题",
platform="zhihu",
keyword="关键词"
)
assert result.density == 0.0
def test_optimize_invalid_platform(self):
"""无效平台优化"""
optimizer = SEOOptimizer()
result = optimizer.optimize(
content="测试内容",
title="标题",
platform="invalid_platform",
keyword="关键词"
)
# 无效平台应返回空建议和提示
assert isinstance(result.suggestions, list)
assert isinstance(result.tips, list)