TravelContentCreator/tests/test_full_flow.py

299 lines
8.5 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
完整业务流程测试
测试选题生成 内容生成 海报生成的完整链路
"""
import requests
import json
import time
from typing import Dict, Any, List
BASE_URL = "http://localhost:8001"
# ========== 测试数据 ==========
SCENIC_SPOT = {
"id": 1,
"name": "天津冒险湾",
"description": "天津最大的水上乐园,拥有多种刺激水上项目和亲子设施,包括水上过山车、漂流河、儿童戏水区、海浪池等。园区占地面积大,设施齐全,是夏季避暑戏水的绝佳去处。",
"address": "天津市滨海新区海滨大道168号",
"location": "天津市",
"traffic_info": "地铁9号线直达自驾可走津滨高速",
"highlights": ["水上过山车", "儿童戏水区", "漂流河", "海浪池", "温泉SPA"],
"opening_hours": "09:00-18:00 (夏季延长至21:00)",
"ticket_info": "成人票 199 元,儿童票 99 元",
"tips": "建议自带泳衣,园区内也有售卖;建议避开周末高峰;可提前在线购票享优惠"
}
PRODUCT = {
"id": 10,
"name": "家庭套票",
"price": 299,
"original_price": 399,
"description": "含2大1小门票赠送储物柜一个适合三口之家出游",
"includes": ["2张成人票", "1张儿童票", "储物柜1个", "免费停车"],
"valid_period": "2025-01-01 至 2025-03-31",
"usage_rules": "需提前1天预约入园当日有效不可退改"
}
STYLE = {
"id": "gonglue",
"name": "攻略风"
}
AUDIENCE = {
"id": "qinzi",
"name": "亲子向"
}
def print_section(title: str):
print("\n" + "=" * 60)
print(f" {title}")
print("=" * 60)
def print_json(data: Any, title: str = None):
if title:
print(f"\n{title}:")
print(json.dumps(data, ensure_ascii=False, indent=2))
def test_health():
"""测试服务健康状态"""
print_section("1. 健康检查")
resp = requests.get(f"{BASE_URL}/")
print(f"状态码: {resp.status_code}")
print(f"响应: {resp.json()}")
return resp.status_code == 200
def test_config_api():
"""测试配置 API"""
print_section("2. 配置 API")
# 风格
resp = requests.get(f"{BASE_URL}/api/v2/aigc/config/styles")
styles = resp.json()
print(f"风格列表: {[s['name'] for s in styles['styles']]}")
# 人群
resp = requests.get(f"{BASE_URL}/api/v2/aigc/config/audiences")
audiences = resp.json()
print(f"人群列表: {[a['name'] for a in audiences['audiences']]}")
return True
def test_topic_generate():
"""测试选题生成"""
print_section("3. 选题生成")
request_body = {
"engine": "topic_generate",
"params": {
"month": "2025-01",
"num_topics": 3,
"scenic_spot": SCENIC_SPOT,
"product": PRODUCT,
"style": STYLE,
"audience": AUDIENCE
},
"async_mode": False
}
print("\n请求参数:")
print(f" 景区: {SCENIC_SPOT['name']}")
print(f" 产品: {PRODUCT['name']}")
print(f" 风格: {STYLE['name']}")
print(f" 人群: {AUDIENCE['name']}")
print(f" 数量: 3")
print("\n正在调用 LLM 生成选题... (可能需要 30-60 秒)")
start_time = time.time()
resp = requests.post(
f"{BASE_URL}/api/v2/aigc/execute",
json=request_body,
timeout=120
)
elapsed = time.time() - start_time
result = resp.json()
print(f"\n耗时: {elapsed:.1f}")
print(f"成功: {result.get('success')}")
if result.get('success'):
data = result.get('data', {})
topics = data.get('topics', [])
print(f"生成选题数: {len(topics)}")
for i, topic in enumerate(topics, 1):
print(f"\n选题 {i}:")
print(f" 日期: {topic.get('date', 'N/A')}")
print(f" 标题: {topic.get('title', topic.get('object', 'N/A'))}")
print(f" 逻辑: {topic.get('logic', 'N/A')[:50]}...")
return topics
else:
print(f"错误: {result.get('error')}")
return None
def test_content_generate(topic: Dict[str, Any]):
"""测试内容生成"""
print_section("4. 内容生成")
request_body = {
"engine": "content_generate",
"params": {
"topic": topic,
"scenic_spot": SCENIC_SPOT,
"product": PRODUCT,
"style": STYLE,
"audience": AUDIENCE,
"enable_judge": False # 先不审核,加快测试
},
"async_mode": False
}
print(f"\n选题: {topic.get('title', topic.get('object', 'N/A'))}")
print("\n正在调用 LLM 生成内容... (可能需要 30-60 秒)")
start_time = time.time()
resp = requests.post(
f"{BASE_URL}/api/v2/aigc/execute",
json=request_body,
timeout=180
)
elapsed = time.time() - start_time
result = resp.json()
print(f"\n耗时: {elapsed:.1f}")
print(f"成功: {result.get('success')}")
if result.get('success'):
data = result.get('data', {})
content = data.get('content', {})
print(f"\n生成内容:")
print(f" 标题: {content.get('title', 'N/A')}")
print(f" 正文长度: {len(content.get('content', ''))} 字符")
print(f" 标签: {content.get('tag', 'N/A')}")
# 显示正文预览
body = content.get('content', '')
if body:
print(f"\n正文预览:")
print(f" {body[:200]}...")
return content
else:
print(f"错误: {result.get('error')}")
return None
def test_poster_generate(content: Dict[str, Any]):
"""测试海报生成"""
print_section("5. 海报生成")
request_body = {
"engine": "poster_generate",
"params": {
"template_id": "vibrant",
"content": {
"title": content.get('title', '寒假特惠'),
"content": content.get('content', ''),
"tag": content.get('tag', ''),
"subtitle": f"{SCENIC_SPOT['name']} {PRODUCT['name']}",
"price": str(PRODUCT['price']),
"original_price": str(PRODUCT['original_price']),
"slogan": "限时优惠,错过等一年!"
},
"scenic_spot": SCENIC_SPOT,
"product": PRODUCT,
"image_urls": [] # 暂无图片
},
"async_mode": False
}
print(f"\n海报内容:")
print(f" 标题: {request_body['params']['content']['title']}")
print(f" 副标题: {request_body['params']['content']['subtitle']}")
print(f" 价格: {request_body['params']['content']['price']}")
print("\n正在生成海报...")
start_time = time.time()
resp = requests.post(
f"{BASE_URL}/api/v2/aigc/execute",
json=request_body,
timeout=180
)
elapsed = time.time() - start_time
result = resp.json()
print(f"\n耗时: {elapsed:.1f}")
print(f"成功: {result.get('success')}")
if result.get('success'):
data = result.get('data', {})
print(f"海报路径: {data.get('poster_path', 'N/A')}")
return data
else:
print(f"错误: {result.get('error')}")
return None
def main():
print("\n" + "=" * 60)
print(" TravelContentCreator 完整业务流程测试")
print("=" * 60)
print(f" 服务地址: {BASE_URL}")
print(f" 时间: {time.strftime('%Y-%m-%d %H:%M:%S')}")
# 1. 健康检查
if not test_health():
print("\n❌ 服务不可用,请先启动服务")
return
# 2. 配置 API
test_config_api()
# 3. 选题生成
topics = test_topic_generate()
if not topics:
print("\n❌ 选题生成失败,终止测试")
return
# 4. 内容生成 (使用第一个选题)
content = test_content_generate(topics[0])
if not content:
print("\n⚠️ 内容生成失败,跳过海报生成")
else:
# 5. 海报生成
test_poster_generate(content)
# 汇总
print_section("测试结果汇总")
print(f" ✅ 健康检查: 通过")
print(f" ✅ 配置 API: 通过")
print(f" {'' if topics else ''} 选题生成: {'通过' if topics else '失败'}")
print(f" {'' if content else ''} 内容生成: {'通过' if content else '失败'}")
print(f"\n完整流程测试完成!")
if __name__ == "__main__":
main()