first commit
This commit is contained in:
212
tests/run_tests.py
Normal file
212
tests/run_tests.py
Normal file
@@ -0,0 +1,212 @@
|
||||
"""
|
||||
智能算法展示平台 - 测试运行脚本
|
||||
|
||||
此脚本用于运行各种类型的测试,包括单元测试、集成测试和端到端测试。
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import subprocess
|
||||
import argparse
|
||||
import unittest
|
||||
import time
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def run_unit_tests():
|
||||
"""运行单元测试"""
|
||||
print("🚀 开始运行单元测试...")
|
||||
|
||||
# 查找所有测试文件
|
||||
test_dir = Path(__file__).parent
|
||||
backend_dir = test_dir.parent / "backend"
|
||||
|
||||
# 运行Python单元测试
|
||||
try:
|
||||
result = subprocess.run([
|
||||
sys.executable, "-m", "unittest", "discover",
|
||||
str(backend_dir), "-p", "*_test.py", "-v"
|
||||
], cwd=str(test_dir.parent), capture_output=True, text=True)
|
||||
|
||||
print("单元测试输出:")
|
||||
print(result.stdout)
|
||||
if result.stderr:
|
||||
print("单元测试错误:")
|
||||
print(result.stderr)
|
||||
|
||||
return result.returncode == 0
|
||||
except Exception as e:
|
||||
print(f"运行单元测试时出错: {e}")
|
||||
return False
|
||||
|
||||
|
||||
def run_integration_tests():
|
||||
"""运行集成测试"""
|
||||
print("⚙️ 开始运行集成测试...")
|
||||
|
||||
test_file = Path(__file__).parent / "integration_tests.py"
|
||||
|
||||
if not test_file.exists():
|
||||
print("⚠️ 集成测试文件不存在,跳过...")
|
||||
return True
|
||||
|
||||
try:
|
||||
result = subprocess.run([
|
||||
sys.executable, str(test_file)
|
||||
], cwd=str(test_file.parent), capture_output=True, text=True)
|
||||
|
||||
print("集成测试输出:")
|
||||
print(result.stdout)
|
||||
if result.stderr:
|
||||
print("集成测试错误:")
|
||||
print(result.stderr)
|
||||
|
||||
return result.returncode == 0
|
||||
except Exception as e:
|
||||
print(f"运行集成测试时出错: {e}")
|
||||
return False
|
||||
|
||||
|
||||
def run_e2e_tests():
|
||||
"""运行端到端测试"""
|
||||
print("🌐 开始运行端到端测试...")
|
||||
|
||||
# 检查服务是否运行
|
||||
import requests
|
||||
from integration_test_config import get_test_config
|
||||
|
||||
config = get_test_config()
|
||||
health_url = config.get_api_url("/monitoring/health")
|
||||
|
||||
try:
|
||||
response = requests.get(health_url, headers=config.get_auth_headers(), timeout=10)
|
||||
if response.status_code == 200:
|
||||
print("✅ 服务正在运行,可以执行端到端测试")
|
||||
|
||||
# 这里可以添加实际的端到端测试逻辑
|
||||
print("正在进行端到端测试...")
|
||||
|
||||
# 示例:测试API的基本功能
|
||||
algorithms_url = config.get_api_url("/algorithms")
|
||||
response = requests.get(algorithms_url, headers=config.get_auth_headers())
|
||||
|
||||
if response.status_code == 200:
|
||||
print("✅ 端到端测试 - 算法API访问正常")
|
||||
return True
|
||||
else:
|
||||
print(f"❌ 端到端测试失败 - 状态码: {response.status_code}")
|
||||
return False
|
||||
else:
|
||||
print("⚠️ 服务未运行,跳过端到端测试")
|
||||
return True # 不将此视为失败,因为可能是预期的
|
||||
except requests.exceptions.ConnectionError:
|
||||
print("⚠️ 无法连接到服务,跳过端到端测试")
|
||||
return True # 不将此视为失败
|
||||
except Exception as e:
|
||||
print(f"运行端到端测试时出错: {e}")
|
||||
return False
|
||||
|
||||
|
||||
def run_load_tests():
|
||||
"""运行负载测试"""
|
||||
print("📈 开始运行负载测试...")
|
||||
|
||||
# 这里可以集成如locust等负载测试工具
|
||||
print("负载测试通常需要单独的工具,如Locust或JMeter")
|
||||
print("当前环境跳过负载测试...")
|
||||
return True
|
||||
|
||||
|
||||
def generate_test_report(results):
|
||||
"""生成测试报告"""
|
||||
print("\n" + "="*60)
|
||||
print("📊 测试报告")
|
||||
print("="*60)
|
||||
|
||||
total_tests = len(results)
|
||||
passed_tests = sum(1 for result in results.values() if result)
|
||||
failed_tests = total_tests - passed_tests
|
||||
|
||||
print(f"总测试类别: {total_tests}")
|
||||
print(f"通过: {passed_tests}")
|
||||
print(f"失败: {failed_tests}")
|
||||
|
||||
for test_name, result in results.items():
|
||||
status = "✅ PASS" if result else "❌ FAIL"
|
||||
print(f"- {test_name}: {status}")
|
||||
|
||||
print("="*60)
|
||||
|
||||
if failed_tests == 0:
|
||||
print("🎉 所有测试都通过了!")
|
||||
return True
|
||||
else:
|
||||
print(f"⚠️ 有 {failed_tests} 个测试类别失败")
|
||||
return False
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description='运行智能算法展示平台测试')
|
||||
parser.add_argument('--unit', action='store_true', help='运行单元测试')
|
||||
parser.add_argument('--integration', action='store_true', help='运行集成测试')
|
||||
parser.add_argument('--e2e', action='store_true', help='运行端到端测试')
|
||||
parser.add_argument('--load', action='store_true', help='运行负载测试')
|
||||
parser.add_argument('--all', action='store_true', help='运行所有测试')
|
||||
parser.add_argument('--verbose', '-v', action='store_true', help='详细输出')
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
# 如果没有指定任何测试类型,则运行所有测试
|
||||
if not any([args.unit, args.integration, args.e2e, args.load, args.all]):
|
||||
args.all = True
|
||||
|
||||
print("🧪 智能算法展示平台测试运行器")
|
||||
print("-" * 40)
|
||||
|
||||
results = {}
|
||||
|
||||
# 根据参数决定运行哪些测试
|
||||
test_functions = []
|
||||
|
||||
if args.all or args.unit:
|
||||
test_functions.append(("单元测试", run_unit_tests))
|
||||
|
||||
if args.all or args.integration:
|
||||
test_functions.append(("集成测试", run_integration_tests))
|
||||
|
||||
if args.all or args.e2e:
|
||||
test_functions.append(("端到端测试", run_e2e_tests))
|
||||
|
||||
if args.all or args.load:
|
||||
test_functions.append(("负载测试", run_load_tests))
|
||||
|
||||
# 运行测试
|
||||
for test_name, test_func in test_functions:
|
||||
print(f"\n{'='*20} {test_name} {'='*20}")
|
||||
start_time = time.time()
|
||||
|
||||
try:
|
||||
result = test_func()
|
||||
elapsed_time = time.time() - start_time
|
||||
|
||||
results[test_name] = result
|
||||
status = "✅ 通过" if result else "❌ 失败"
|
||||
print(f"\n{test_name}结果: {status} (耗时: {elapsed_time:.2f}秒)")
|
||||
|
||||
except KeyboardInterrupt:
|
||||
print("\n⚠️ 测试被用户中断")
|
||||
results[test_name] = False
|
||||
break
|
||||
except Exception as e:
|
||||
print(f"\n❌ {test_name}执行时发生错误: {e}")
|
||||
results[test_name] = False
|
||||
|
||||
# 生成报告
|
||||
all_passed = generate_test_report(results)
|
||||
|
||||
# 设置退出码
|
||||
sys.exit(0 if all_passed else 1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user