文件
nahaichuan/tests/test_vivid_banners.py

82 行
3.7 KiB
Python

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

"""
测试首页高端主视觉系统 (Test Premium Home Hero Visual)
验证宽幅首屏摄影的高清画质、桌面与移动端响应式图片源、
两端模板一致引用、优先加载与有效替代文本、
渐变处理、响应式断点与减少动态效果适配。
"""
import os
import unittest
from PIL import Image
ROOT_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
HERO_IMAGE_DIR = os.path.join(
ROOT_DIR, "public", "assets", "addons", "official", "images", "home"
)
CSS_PATH = os.path.join(
ROOT_DIR, "public", "assets", "addons", "official", "css", "home-v3.css"
)
PC_HOME_PATH = os.path.join(
ROOT_DIR, "addons", "official", "view", "web", "official_home", "index.html"
)
M_HOME_PATH = os.path.join(
ROOT_DIR, "addons", "official", "view", "web", "official_home", "index_e.html"
)
class PremiumHeroBannerTest(unittest.TestCase):
"""验证首页宽幅主视觉"""
def test_01_hero_image_high_quality(self):
"""1. 验证桌面与移动端首屏摄影物理存在、分辨率高、画质饱满"""
hero_images = {
"ai-computing-v4.jpg": (1983, 793),
"ai-computing-mobile-v4.jpg": (1024, 1536),
}
for filename, (minimum_width, minimum_height) in hero_images.items():
with self.subTest(hero=filename):
hero_path = os.path.join(HERO_IMAGE_DIR, filename)
self.assertTrue(os.path.exists(hero_path), f"首屏宽幅摄影不存在: {filename}")
self.assertGreater(os.path.getsize(hero_path), 100 * 1024, f"首屏摄影文件过小: {filename}")
with Image.open(hero_path) as hero:
width, height = hero.size
self.assertGreaterEqual(width, minimum_width, f"首屏摄影宽度不足要求: {filename}")
self.assertGreaterEqual(height, minimum_height, f"首屏摄影高度不足要求: {filename}")
def test_02_css_uses_responsive_hero_and_accessible_motion(self):
"""2. 验证专属 CSS 提供首屏布局、响应式断点与减少动态效果适配"""
with open(CSS_PATH, encoding="utf-8") as stream:
css_content = stream.read()
self.assertIn(".hn-hero-picture", css_content, "CSS 未正确定义首屏图片容器")
self.assertIn("object-fit", css_content, "CSS 应规范首屏图片的适应展示模式")
self.assertIn("linear-gradient", css_content, "CSS 应使用渐变为文字保留可读区域")
self.assertIn("@media(max-width:768px)", css_content, "CSS 缺少移动端首屏适配断点")
self.assertIn("prefers-reduced-motion", css_content, "CSS 应支持减少动态效果")
def test_03_pc_and_mobile_template_integrity(self):
"""3. 验证 PC 与移动端模板引用桌面与移动端两套响应式首屏图片"""
for page_path in [PC_HOME_PATH, M_HOME_PATH]:
with open(page_path, encoding="utf-8") as stream:
html = stream.read()
self.assertEqual(html.count("hn-hero-picture"), 1, f"首屏图片容器数量应为 1:{page_path}")
for filename in (
"ai-computing-v4.webp",
"ai-computing-v4.jpg",
"ai-computing-mobile-v4.webp",
"ai-computing-mobile-v4.jpg",
):
self.assertIn(filename, html, f"页面缺少首屏图片资源 {filename}:{page_path}")
self.assertIn('fetchpriority="high"', html, f"首屏图片应优先加载:{page_path}")
self.assertRegex(
html,
r'<img[^>]+alt="[^"]{4,}"',
f"首屏图片应包含有效替代文本:{page_path}",
)
if __name__ == "__main__":
unittest.main()