Files
novalon-website/e2e-tests/scripts/run_tests.py
T
张翔 f14002559e feat(e2e-tests): 添加端到端测试框架及测试用例
refactor(components): 调整头部和页脚布局样式
style(hero-section): 更新徽章动画效果

docs: 添加测试框架README文档
test: 实现首页、导航和联系表单的测试用例
ci: 添加CI测试脚本和配置
2026-02-02 19:36:33 +08:00

226 lines
5.0 KiB
Python

#!/usr/bin/env python3
"""
测试运行脚本
提供便捷的测试执行命令
"""
import os
import sys
import argparse
from pathlib import Path
# 添加项目路径
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))
from config.settings import get_settings
from utils.logger import get_logger
def parse_arguments():
"""解析命令行参数"""
parser = argparse.ArgumentParser(
description="Novalon Website E2E 测试运行器"
)
parser.add_argument(
"-b", "--browser",
default="chromium",
choices=["chromium", "firefox", "webkit", "all"],
help="指定浏览器 (默认: chromium)"
)
parser.add_argument(
"-h", "--headless",
action="store_true",
default=False,
help="以无头模式运行 (默认: False)"
)
parser.add_argument(
"-m", "--marker",
default="",
help="运行指定标记的测试 (例如: -m smoke)"
)
parser.add_argument(
"-k", "--keyword",
default="",
help="运行包含关键字的测试 (例如: -k home)"
)
parser.add_argument(
"-v", "--verbose",
action="store_true",
default=False,
help="显示详细输出"
)
parser.add_argument(
"--html",
action="store_true",
default=False,
help="生成HTML测试报告"
)
parser.add_argument(
"--video",
action="store_true",
default=False,
help="录制测试视频"
)
parser.add_argument(
"--screenshot",
action="store_true",
default=False,
help="失败时截图"
)
parser.add_argument(
"--parallel",
action="store_true",
default=False,
help="并行执行测试"
)
parser.add_argument(
"--workers",
type=int,
default=4,
help="并行工作数 (默认: 4)"
)
parser.add_argument(
"--report-dir",
default="reports",
help="报告目录 (默认: reports)"
)
parser.add_argument(
"--env",
default="development",
choices=["development", "staging", "production"],
help="测试环境 (默认: development)"
)
parser.add_argument(
"test_paths",
nargs="*",
default=["tests"],
help="测试路径 (默认: tests)"
)
return parser.parse_args()
def build_pytest_args(args):
"""构建pytest参数"""
pytest_args = []
# 配置文件
pytest_args.append("-c")
pytest_args.append(str(project_root / "pytest.ini"))
# 浏览器参数
os.environ["PLAYWRIGHT_BROWSER"] = args.browser
# 无头模式
if args.headless:
os.environ["PLAYWRIGHT_HEADLESS"] = "1"
# 标记过滤
if args.marker:
pytest_args.append(f"-m={args.marker}")
# 关键字过滤
if args.keyword:
pytest_args.append(f"-k={args.keyword}")
# 详细输出
if args.verbose:
pytest_args.append("-v")
pytest_args.append("--tb=short")
# HTML报告
if args.html:
pytest_args.append("--html=reports/test_report.html")
pytest_args.append("--self-contained-html")
# 视频录制
if args.video:
os.environ["PLAYWRIGHT_VIDEO"] = "1"
# 失败截图
if args.screenshot:
os.environ["PLAYWRIGHT_SCREENSHOT"] = "1"
# 并行执行
if args.parallel:
pytest_args.append(f"-n={args.workers}")
pytest_args.append("--dist=loadscope")
# 报告目录
if args.report_dir:
pytest_args.append(f"--report-dir={args.report_dir}")
# 测试路径
pytest_args.extend(args.test_paths)
# 覆盖率(可选)
pytest_args.append("--cov=e2e-tests")
pytest_args.append("--cov-report=term-missing")
return pytest_args
def run_tests(args):
"""运行测试"""
logger = get_logger()
logger.section("开始 E2E 测试")
logger.info(f"浏览器: {args.browser}")
logger.info(f"无头模式: {args.headless}")
logger.info(f"测试路径: {args.test_paths}")
if args.marker:
logger.info(f"测试标记: {args.marker}")
if args.keyword:
logger.info(f"关键字过滤: {args.keyword}")
# 构建pytest参数
pytest_args = build_pytest_args(args)
# 导入pytest
import pytest
# 运行测试
exit_code = pytest.main(pytest_args)
logger.section("测试运行完成")
return exit_code
def main():
"""主函数"""
args = parse_arguments()
# 设置环境
os.environ["ENVIRONMENT"] = args.env
try:
exit_code = run_tests(args)
sys.exit(exit_code)
except KeyboardInterrupt:
print("\n测试被用户中断")
sys.exit(130)
except Exception as e:
print(f"测试运行出错: {e}")
sys.exit(1)
if __name__ == "__main__":
main()