文件
nahaichuan/tests/test_site_images.py

145 行
8.1 KiB
Python

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

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

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
站点配图与视觉丰富度自动化测试 (TDD)
验证:
1. 所有核心配图资产物理存在、非空且格式正确
2. PC 首页与移动端首页正确展示服务、产品、案例等丰富配图
3. 独立服务页、产品页、案例页包含深度高保真系统与业务界面配图
4. 关于我们页面包含专家徽章与资质认证图
5. CSS 针对配图有严格的响应式(max-width: 100%、圆角、细线边框、悬停微光)控制
6. 无破损路径或 404 资源引用
"""
import os
import re
import unittest
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
class SiteImagesTest(unittest.TestCase):
def setUp(self):
self.img_dir = os.path.join(BASE_DIR, 'public', 'assets', 'addons', 'official', 'images', 'showcases')
self.pc_home_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_home', 'index.html')
self.mobile_home_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_home', 'index_e.html')
self.service_page_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_product', 'service_page.html')
self.product_page_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_product', 'product_page.html')
self.case_page_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_case_show', 'list.html')
self.case_mobile_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_case_show', 'list_e.html')
self.about_page_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_home', 'single.html')
self.about_mobile_path = os.path.join(BASE_DIR, 'addons', 'official', 'view', 'web', 'official_home', 'single_e.html')
self.css_path = os.path.join(BASE_DIR, 'public', 'assets', 'addons', 'official', 'css', 'modern_nhc.css')
def test_01_image_assets_exist_and_non_empty(self):
"""核心配图资源必须物理存在且内容非空"""
required_images = [
# 服务类配图
'service_middle.svg',
'service_app.svg',
'service_agent.svg',
# 产品类配图
'product_mall.svg',
'product_pos.svg',
'product_erp.svg',
'product_saas.svg',
# 案例类配图
'case_distrib.svg',
'case_catering.svg',
'case_gov_agent.svg',
'case_manufacture.svg',
# 专家与资质徽标
'team_architect.svg',
'team_fullstack.svg',
'team_ai.svg',
'team_security.svg',
'cert_hi_tech.svg',
'cert_iso9001.svg'
]
self.assertTrue(os.path.isdir(self.img_dir), f"图片目录 {self.img_dir} 必须存在")
for img_name in required_images:
img_path = os.path.join(self.img_dir, img_name)
self.assertTrue(os.path.isfile(img_path), f"图片文件 {img_name} 必须存在于 showcases 目录下")
size = os.path.getsize(img_path)
self.assertGreater(size, 100, f"图片文件 {img_name} 大小不能过小")
def test_02_pc_and_mobile_homepage_service_images(self):
"""首页服务卡片必须包含对应的服务系统配图"""
with open(self.pc_home_path, 'r', encoding='utf-8') as f:
pc_content = f.read()
with open(self.mobile_home_path, 'r', encoding='utf-8') as f:
mobile_content = f.read()
for content, page_name in [(pc_content, "PC 首页"), (mobile_content, "移动端首页")]:
self.assertIn('service_middle.svg', content, f"{page_name} 应包含软件中台服务配图")
self.assertIn('service_app.svg', content, f"{page_name} 应包含APP小程序定制服务配图")
self.assertIn('service_agent.svg', content, f"{page_name} 应包含智能体定制服务配图")
def test_03_pc_and_mobile_homepage_product_images(self):
"""首页产品卡片必须包含产品界面示意配图"""
with open(self.pc_home_path, 'r', encoding='utf-8') as f:
pc_content = f.read()
with open(self.mobile_home_path, 'r', encoding='utf-8') as f:
mobile_content = f.read()
for content, page_name in [(pc_content, "PC 首页"), (mobile_content, "移动端首页")]:
self.assertIn('product_mall.svg', content, f"{page_name} 应包含商城产品配图")
self.assertIn('product_pos.svg', content, f"{page_name} 应包含收银产品配图")
self.assertIn('product_erp.svg', content, f"{page_name} 应包含进销存产品配图")
self.assertIn('product_saas.svg', content, f"{page_name} 应包含SaaS产品配图")
def test_04_cases_pages_have_preview_images(self):
"""标杆案例卡片必须配有真实的业务系统视窗图"""
with open(self.case_page_path, 'r', encoding='utf-8') as f:
case_pc = f.read()
with open(self.case_mobile_path, 'r', encoding='utf-8') as f:
case_mobile = f.read()
for content, page_name in [(case_pc, "PC 案例独立页"), (case_mobile, "移动端案例独立页")]:
self.assertIn('case_distrib.svg', content, f"{page_name} 应包含分销订货中台界面图")
self.assertIn('case_catering.svg', content, f"{page_name} 应包含连锁餐饮收银界面图")
self.assertIn('case_gov_agent.svg', content, f"{page_name} 应包含政务智能体界面图")
self.assertIn('case_manufacture.svg', content, f"{page_name} 应包含工业制造进销存界面图")
def test_05_service_and_product_pages_have_showcases(self):
"""独立服务页与产品页必须嵌入高质量系统拓扑与界面大图"""
with open(self.service_page_path, 'r', encoding='utf-8') as f:
service_content = f.read()
with open(self.product_page_path, 'r', encoding='utf-8') as f:
product_content = f.read()
self.assertIn('service_middle.svg', service_content)
self.assertIn('service_app.svg', service_content)
self.assertIn('service_agent.svg', service_content)
self.assertIn('product_mall.svg', product_content)
self.assertIn('product_pos.svg', product_content)
self.assertIn('product_erp.svg', product_content)
self.assertIn('product_saas.svg', product_content)
def test_06_about_pages_have_expert_and_cert_badges(self):
"""关于我们页必须包含专家团队专业徽标与资质认证图"""
with open(self.about_page_path, 'r', encoding='utf-8') as f:
about_pc = f.read()
with open(self.about_mobile_path, 'r', encoding='utf-8') as f:
about_mobile = f.read()
for content, page_name in [(about_pc, "PC 关于我们页"), (about_mobile, "移动端关于我们页")]:
self.assertIn('team_architect.svg', content, f"{page_name} 应包含首席架构师徽章")
self.assertIn('team_fullstack.svg', content, f"{page_name} 应包含全栈研发总监徽章")
self.assertIn('team_ai.svg', content, f"{page_name} 应包含AI智能体专家徽章")
self.assertIn('team_security.svg', content, f"{page_name} 应包含质量安全合规专家徽章")
self.assertIn('cert_hi_tech.svg', content, f"{page_name} 应包含高新技术企业认证图")
self.assertIn('cert_iso9001.svg', content, f"{page_name} 应包含ISO9001认证图")
def test_07_responsive_image_styles_in_css(self):
"""CSS 必须具备严谨的配图自适应与质感样式定义"""
with open(self.css_path, 'r', encoding='utf-8') as f:
css = f.read()
self.assertIn('.nhc-card-thumb', css, "CSS 应定义 .nhc-card-thumb 图片容器类")
self.assertIn('object-fit', css, "CSS 应规范图片的适应展示模式")
self.assertIn('.nhc-case-img-wrap', css, "CSS 应定义案例图视窗包装器")
self.assertIn('.nhc-service-media-box', css, "CSS 应定义服务媒体容器")
if __name__ == '__main__':
unittest.main()