212 lines
6.8 KiB
Python
212 lines
6.8 KiB
Python
"""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)
|